[
  {
    "path": ".gitattributes",
    "content": "*.sol linguist-language=Solidity"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "* @uniswap/protocols\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/BUG_REPORT.yml",
    "content": "name: Bug report\ndescription: File a bug report to help us improve the code\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\n\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Please check that the bug is not already being tracked.\n  - type: textarea\n    attributes:\n      label: Describe the bug\n      description: Provide a clear and concise description of what the bug is and which contracts it affects.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Expected Behavior\n      description: Provide a clear and concise description of the desired fix.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: To Reproduce\n      description: If you have written tests to showcase the bug, what can we run to reproduce the issue?\n      placeholder: \"git checkout <branchname> / forge test --isolate --mt <testName>\"\n  - type: textarea\n    attributes:\n      label: Additional context\n      description: If there is any additional context needed like a dependency or integrating contract that is affected please describe it below.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/FEATURE_IMPROVEMENT.yml",
    "content": "name: Feature Improvement\ndescription: Suggest an improvement to v4-core.\nlabels: [\"triage\"]\n\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Please ensure that the feature has not already been requested.\n  - type: dropdown\n    attributes:\n      label: Component\n      description: Which area of code does your idea improve?\n      multiple: true\n      options:\n        - Hooks\n        - Singleton\n        - Lock and Call\n        - Delta accounting\n        - 1155 Balances\n        - Pool Actions (swap, modifyLiquidity, donate, take, settle, mint)\n        - Gas Optimization\n        - General design optimization (improving efficiency, cleanliness, or developer experience)\n        - Documentation\n  - type: textarea\n    attributes:\n      label: Describe the suggested feature and problem it solves.\n      description: Provide a clear and concise description of what feature you would like to see, and what problems it solves.\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: Describe the desired implementation.\n      description: If possible, provide a suggested architecture change or implementation.\n  - type: textarea\n    attributes:\n      label: Describe alternatives.\n      description: If possible, describe the alternatives you've considered, or describe the current functionality and how it may be sub-optimal.\n  - type: textarea\n    attributes:\n      label: Additional context.\n      description: Please list any additional dependencies or integrating contacts that are affected.\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "## Related Issue\n\nWhich issue does this pull request resolve?\n\n## Description of changes\n"
  },
  {
    "path": ".github/workflows/deploy.yaml",
    "content": "name: Release\non:\n  # manual trigger\n  workflow_dispatch:\n\njobs:\n  deploy:\n    name: release\n    runs-on:\n      group: npm-deploy\n    environment:\n      name: release\n    permissions:\n      id-token: write\n      contents: write\n    steps:\n      - uses: bullfrogsec/bullfrog@1831f79cce8ad602eef14d2163873f27081ebfb3 # v0.8.4\n\n      - name: Checkout\n        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0\n\n      - name: Setup Node\n        uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0\n        with:\n          node-version: \"20.x\"\n          registry-url: \"https://registry.npmjs.org\"\n          scope: \"@uniswap\"\n\n      - name: Install Foundry\n        uses: foundry-rs/foundry-toolchain@50d5a8956f2e319df19e6b57539d7e2acb9f8c1e # v1.5.0\n        with:\n          version: v1.3.6\n\n      - name: Install dependencies\n        run: |\n          git submodule update --init --recursive\n\n      - name: Compile\n        run: forge build\n\n      - name: Install npm\n        run: npm install -g npm@latest\n\n      - name: Release\n        run: |\n          npm publish --access public\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: Lint\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n\njobs:\n  run-linters:\n    name: Run linters\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: bullfrogsec/bullfrog@1831f79cce8ad602eef14d2163873f27081ebfb3 # v0.8.4\n\n      - name: Check out Git repository\n        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0\n\n      - name: Install Foundry\n        uses: foundry-rs/foundry-toolchain@50d5a8956f2e319df19e6b57539d7e2acb9f8c1e # v1.5.0\n        with:\n          version: v1.3.6\n\n      - name: Lint\n        run: forge fmt --check\n\n      - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0\n        name: Configure npm caching\n        with:\n          path: ~/.npm\n          key: ${{ runner.os }}-npm-${{ hashFiles('**/workflows/prettier.yml') }}\n          restore-keys: |\n            ${{ runner.os }}-npm-\n\n      - name: Check code formatting\n        run: |-\n          npx prettier --check .\n"
  },
  {
    "path": ".github/workflows/mythx.yml",
    "content": "name: Mythx\n\non:\n  workflow_dispatch:\n\njobs:\n  mythx:\n    name: Submit to Mythx\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: bullfrogsec/bullfrog@1831f79cce8ad602eef14d2163873f27081ebfb3 # v0.8.4\n\n      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0\n\n      - name: Set up node\n        uses: actions/setup-node@f1f314fca9dfce2769ece7d933488f076716723e # v1.4.6\n        with:\n          node-version: 16\n\n      - name: Set up Python 3.8\n        uses: actions/setup-python@e9aba2c848f5ebd159c070c61ea2c4e2b122355e # v2.3.4\n        with:\n          python-version: 3.8\n\n      - name: Install node dependencies\n        run: yarn install --frozen-lockfile\n\n      - name: Install pip3\n        run: |\n          python -m pip install --upgrade pip\n\n      - name: Install mythx CLI\n        run: |\n          pip3 install mythx-cli\n\n      - name: Install solc-select\n        run: |\n          pip3 install solc-select\n\n      - name: Install solc 0.8.20\n        run: |\n          solc-select install 0.8.20\n          solc-select use 0.8.20\n\n      - name: Submit code to Mythx\n        run: |\n          mythx --api-key ${{ secrets.MYTHX_API_KEY }} \\\n            --yes \\\n            analyze \\\n            --mode deep \\\n            --async \\\n            --create-group \\\n            --group-name \"@uniswap/core-next@${{ github.sha }}\" \\\n            --solc-version 0.8.20 \\\n            --check-properties \\\n            --remap-import \"@openzeppelin/contracts/=$(pwd)/node_modules/@openzeppelin/contracts/\" \\\n            contracts/test/TickBitmapEchidnaTest.sol --include TickBitmapEchidnaTest \\\n            contracts/test/TickMathEchidnaTest.sol --include TickMathEchidnaTest \\\n            contracts/test/SqrtPriceMathEchidnaTest.sol --include SqrtPriceMathEchidnaTest \\\n            contracts/test/SwapMathEchidnaTest.sol --include SwapMathEchidnaTest \\\n            contracts/test/TickEchidnaTest.sol --include TickEchidnaTest \\\n            contracts/test/TickOverflowSafetyEchidnaTest.sol --include TickOverflowSafetyEchidnaTest \\\n            contracts/test/OracleEchidnaTest.sol --include OracleEchidnaTest \\\n            contracts/test/BitMathEchidnaTest.sol --include BitMathEchidnaTest \\\n            contracts/test/UnsafeMathEchidnaTest.sol --include UnsafeMathEchidnaTest \\\n            contracts/test/FullMathEchidnaTest.sol --include FullMathEchidnaTest\n"
  },
  {
    "path": ".github/workflows/tests-merge.yml",
    "content": "name: Tests\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  forge-tests:\n    name: Forge Tests\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: bullfrogsec/bullfrog@1831f79cce8ad602eef14d2163873f27081ebfb3 # v0.8.4\n\n      - uses: actions/checkout@v5 # v5.0.0\n        with:\n          submodules: recursive\n\n      - name: Install Foundry\n        uses: foundry-rs/foundry-toolchain@50d5a8956f2e319df19e6b57539d7e2acb9f8c1e # v1.5.0\n        with:\n          version: v1.3.6\n\n      - name: Build\n        run: forge build\n        env:\n          FOUNDRY_PROFILE: ci\n\n      - name: Run tests\n        run: forge test --isolate -vvv\n        env:\n          FOUNDRY_PROFILE: ci\n          FORGE_SNAPSHOT_CHECK: true\n"
  },
  {
    "path": ".github/workflows/tests-pr.yml",
    "content": "name: Tests\n\non:\n  pull_request:\n    branches:\n      - main\n      - dev\n      - audit/*\n\njobs:\n  forge-tests:\n    name: Forge Tests\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: bullfrogsec/bullfrog@1831f79cce8ad602eef14d2163873f27081ebfb3 # v0.8.4\n\n      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0\n        with:\n          submodules: recursive\n\n      - name: Install Foundry\n        uses: foundry-rs/foundry-toolchain@50d5a8956f2e319df19e6b57539d7e2acb9f8c1e # v1.5.0\n        with:\n          version: v1.3.6\n\n      - name: Show Forge version\n        run: |\n          forge --version\n\n      - name: Build\n        run: forge build\n        env:\n          FOUNDRY_PROFILE: pr\n\n      - name: Run tests\n        run: forge test --isolate -vvv\n        env:\n          FOUNDRY_PROFILE: pr\n          FORGE_SNAPSHOT_CHECK: true\n"
  },
  {
    "path": ".gitignore",
    "content": "# if you add a file here, add it to `.npmignore` too\nartifacts/\ncache/\ncrytic-export/\nnode_modules/\ntypechain/\nfoundry-out/\n.vscode/\nout/\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"lib/forge-std\"]\n\tpath = lib/forge-std\n\turl = https://github.com/foundry-rs/forge-std\n[submodule \"lib/solmate\"]\n\tpath = lib/solmate\n\turl = https://github.com/transmissions11/solmate\n[submodule \"lib/openzeppelin-contracts\"]\n\tpath = lib/openzeppelin-contracts\n\turl = https://github.com/openzeppelin/openzeppelin-contracts\n"
  },
  {
    "path": ".npmignore",
    "content": "artifacts/\ncache/\ncrytic-export/\nnode_modules/\ntypechain/\nfoundry-out/\n.vscode/\n"
  },
  {
    "path": ".prettierignore",
    "content": ".prettierrc\nfoundry.toml\nout\nlib/\ncache/\n*.sol\ndist/\nsnapshots/\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"printWidth\": 120,\n  \"tabWidth\": 2,\n  \"useTabs\": false,\n  \"singleQuote\": false,\n  \"bracketSpacing\": true,\n  \"trailingComma\": \"all\",\n  \"embeddedLanguageFormatting\": \"off\",\n  \"overrides\": [\n    {\n      \"files\": \"*.sol\",\n      \"options\": {\n        \"printWidth\": 120,\n        \"tabWidth\": 4,\n        \"useTabs\": false,\n        \"singleQuote\": false,\n        \"bracketSpacing\": false\n      }\n    },\n    {\n      \"files\": \"*.json\",\n      \"options\": {\n        \"tabWidth\": 2\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".solhint.json",
    "content": "{\n  \"plugins\": [\"prettier\"],\n  \"rules\": {\n    \"prettier/prettier\": \"error\"\n  }\n}\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contribution Guidelines\n\nThanks for your interest in contributing to v4 of the Uniswap Protocol! The contracts in this repo are in early stages - we are releasing the draft code now so that v4 can be built in public, with open feedback and meaningful community contribution. We expect this will be a months-long process, and we appreciate any kind of contribution, no matter how small.\n\nIf you need to get in contact with the repository maintainers, please reach out in our [Discord](https://discord.com/invite/FCfyBSbCU5).\n\n## Types of Contributing\n\nThere are many ways to contribute, but here are a few if you want a place to start:\n\n1. **Opening an issue.** Before opening an issue, please check that there is not an issue already open. If there is, feel free to comment more details, explanations, or examples within the open issue rather than duplicating it. Suggesting changes to the open development process are within the bounds of opening issues. We are always open to feedback and receptive to suggestions!\n2. **Resolving an issue.** You can resolve an issue either by showing that it is not an issue or by fixing the issue with code changes, additional tests, etc. Any pull request fixing an issue should reference that issue.\n3. **Reviewing open PRs.** You can provide comments, standards guidance, naming suggestions, gas optimizations, or ideas for alternative designs on any open pull request.\n\n## Opening an Issue\n\nWhen opening an [issue](https://github.com/Uniswap/v4-core/issues/new/choose), choose a template to start from: Bug Report or Feature Improvement. For bug reports, you should be able to reproduce the bug through tests or proof of concept implementations. For feature improvements, please title it with a concise problem statement and check that a similar request is not already open or already in progress. Not all issues may be deemed worth resolving, so please follow through with responding to any questions or comments that others may have regarding the issue.\n\nFeel free to tag the issue as a “good first issue” for any clean-up related issues, or small scoped changes to help encourage pull requests from first time contributors!\n\n## Opening a Pull Request\n\nAll pull requests should be opened against the `main` branch. In the pull request, please reference the issue you are fixing.\n\nPull requests can be reviewed by community members, but to be merged they will need approval from the repository maintainers. Please understand it will take time to receive a response, although the maintainers will aim to respond and comment as soon as possible.\n\n**For larger, more substantial changes to the code, it is best to open an issue and start a discussion with the maintainers to align on the change before spending time on the development.**\n\nFinally, before opening a pull request please do the following:\n\n- Check that the code style follows the [standards](#standards).\n- Run the tests and snapshots. Commands are outlined in the [tests](#tests) section.\n- Document any new functions, structs, or interfaces following the natspec standard.\n- Add tests! For smaller contributions, they should be tested with unit tests, and fuzz tests where possible. For bigger contributions, they should be tested with integration tests and invariant tests where possible.\n- Make sure all commits are [signed](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification)\n\n## Standards\n\nAll contributions must follow the below standards. Maintainers will close out PRs that do not adhere to these standards.\n\n1. All contracts should be formatted with the default forge fmt config. Run `forge fmt`.\n2. These contracts follow the [solidity style guide](https://docs.soliditylang.org/en/v0.8.17/style-guide.html) with one minor exception of using the \\_prependUnderscore style naming for internal contract functions, internal top-level parameters, and function parameters with naming collisions.\n3. All external facing contracts should inherit from interfaces, which specify and document its functions with natspec.\n4. Picking up stale issues by other authors is fine! Please just communicate with them ahead of time and it is best practice to include co-authors in any commits.\n5. Squash commits where possible to make reviews clean and efficient. PRs that are merged to main will be squashed into 1 commit.\n\n## Setup\n\n`forge build` to get contract artifacts and dependencies for forge\n\n`forge test --isolate` to run forge tests and update snapshots\n\n## Code of Conduct\n\nAbove all else, please be respectful of the people behind the code. Any kind of aggressive or disrespectful comments, issues, and language will be removed.\n\nIssues and PRs that are obviously spam and unhelpful to the development process or unrelated to the core code will also be closed.\n"
  },
  {
    "path": "README.md",
    "content": "# Uniswap v4 Core\n\n[![Lint](https://github.com/Uniswap/v4-core/actions/workflows/lint.yml/badge.svg)](https://github.com/Uniswap/v4-core/actions/workflows/lint.yml)\n[![Tests](https://github.com/Uniswap/v4-core/actions/workflows/tests-merge.yml/badge.svg)](https://github.com/Uniswap/v4-core/actions/workflows/tests-merge.yml)\n\nUniswap v4 is a new automated market maker protocol that provides extensible and customizable pools. `v4-core` hosts the core pool logic for creating pools and executing pool actions like swapping and providing liquidity.\n\nThe contracts in this repo are in early stages - we are releasing the draft code now so that v4 can be built in public, with open feedback and meaningful community contribution. We expect this will be a months-long process, and we appreciate any kind of contribution, no matter how small.\n\n## Contributing\n\nIf you’re interested in contributing please see our [contribution guidelines](./CONTRIBUTING.md)!\n\n## Whitepaper\n\nA more detailed description of Uniswap v4 Core can be found in the draft of the [Uniswap v4 Core Whitepaper](./docs/whitepaper/whitepaper-v4.pdf).\n\n## Architecture\n\n`v4-core` uses a singleton-style architecture, where all pool state is managed in the `PoolManager.sol` contract. Pool actions can be taken after an initial call to `unlock`. Integrators implement the `unlockCallback` and proceed with any of the following actions on the pools:\n\n- `swap`\n- `modifyLiquidity`\n- `donate`\n- `take`\n- `settle`\n- `mint`\n- `burn`\n\nNote that pool initialization can happen outside the context of unlocking the PoolManager.\n\nOnly the net balances owed to the user (positive) or to the pool (negative) are tracked throughout the duration of an unlock. This is the `delta` field held in the unlock state. Any number of actions can be run on the pools, as long as the deltas accumulated during the unlock reach 0 by the unlock’s release. This unlock and call style architecture gives callers maximum flexibility in integrating with the core code.\n\nAdditionally, a pool may be initialized with a hook contract, that can implement any of the following callbacks in the lifecycle of pool actions:\n\n- {before,after}Initialize\n- {before,after}AddLiquidity\n- {before,after}RemoveLiquidity\n- {before,after}Swap\n- {before,after}Donate\n\nThe callback logic, may be updated by the hooks dependent on their implementation. However _which_ callbacks are executed on a pool cannot change after pool initialization.\n\n## Repository Structure\n\nAll contracts are held within the `v4-core/src` folder.\n\nNote that helper contracts used by tests are held in the `v4-core/src/test` subfolder within the `src` folder. Any new test helper contracts should be added here, but all foundry tests are in the `v4-core/test` folder.\n\n```markdown\nsrc/\n----interfaces/\n    | IPoolManager.sol\n    | ...\n----libraries/\n    | Position.sol\n    | Pool.sol\n    | ...\n----test\n----PoolManager.sol\n...\ntest/\n----libraries/\n    | Position.t.sol\n    | Pool.t.sol\n```\n\n## Local deployment and Usage\n\nTo utilize the contracts and deploy to a local testnet, you can install the code in your repo with forge:\n\n```markdown\nforge install https://github.com/Uniswap/v4-core\n```\n\nTo integrate with the contracts, the interfaces are available to use:\n\n```solidity\n\nimport {IPoolManager} from 'v4-core/contracts/interfaces/IPoolManager.sol';\nimport {IUnlockCallback} from 'v4-core/contracts/interfaces/callback/IUnlockCallback.sol';\n\ncontract MyContract is IUnlockCallback {\n    IPoolManager poolManager;\n\n    function doSomethingWithPools() {\n        // this function will call `unlockCallback` below\n        poolManager.unlock(...);\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        // disallow arbitrary caller\n        if (msg.sender != address(poolManager) revert Unauthorized();\n        // perform pool actions\n        poolManager.swap(...)\n    }\n}\n\nerror Unauthorized();\n```\n\n## License\n\nUniswap V4 Core is licensed under the Business Source License 1.1 (`BUSL-1.1`), see [BUSL_LICENSE](https://github.com/Uniswap/v4-core/blob/main/licenses/BUSL_LICENSE), and the MIT License (`MIT`), see [MIT_LICENSE](https://github.com/Uniswap/v4-core/blob/main/licenses/MIT_LICENSE). Each file in Uniswap V4 Core states the applicable license type in the header.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Uniswap Labs Security\n\n## Vulnerability Disclosure and Bug Bounty\n\nBug bounty details can be found in https://uniswap.org/bug-bounty\n\n## Careers\n\nSee our available job openings in https://boards.greenhouse.io/uniswaplabs\n\n## Security Team Contact Details\n\nPlease contact us through the bug bounty https://uniswap.org/bug-bounty or directly via [security@uniswap.org](mailto:security@uniswap.org)\n"
  },
  {
    "path": "docs/whitepaper/latex/main-zh.tex",
    "content": "\\documentclass[sigconf,nonacm,prologue,table]{acmart}\n\\usepackage{ctex}\n\n\\usepackage{listings}\n\n%% labels\n%% sections:    \"sec\"\n%% definitions: \"def\"\n%% equations:   \"eq\"\n%% figures:     \"fig\"\n%% tables:      \"tab\"\n\n%% packages\n\\usepackage{amsmath}\n\\usepackage{pgfplots}\n\\usepackage{subcaption}\n\\usepackage{commath}\n\\usepackage[utf8]{inputenc}\n\\usetikzlibrary{positioning, arrows.meta, shapes, calc}\n%% \\usepackage{tikz}\n\n\\pagenumbering{arabic}\n\n%% hide ACM reference\n\\settopmatter{printacmref=false}\n\n%% hide copyright\n\\renewcommand\\footnotetextcopyrightpermission[1]{}\n\n%% \\pagestyle{plain}\n\\settopmatter{printfolios=true}\n\n\\numberwithin{equation}{section}\n\n\\theoremstyle{definition}\n\\newtheorem{definition}{Definition}\n\n\\theoremstyle{remark}\n\\newtheorem*{remark}{Remark}\n\n\\captionsetup[subfigure]{\n    labelfont=bf,\n    textfont=normalfont,\n}\n\\renewcommand{\\thesubfigure}{\\Roman{subfigure}}\n\n\\definecolor{rowA}{gray}{0.9}\n\\definecolor{rowB}{gray}{0.8}\n\n\\newcommand{\\rplus}{\\mathbb{R}_{\\geq 0}}\n\\newcommand{\\rpos}{\\mathbb{R}_{>0}}\n\n\\begin{document}\n\\title{Uniswap v4 核心 [草稿]}\n\\subtitle{June 2023}\n\\date{June 2023}\n\n\\author{Hayden Adams}\n\\affiliation{}\n\\email{hayden@uniswap.org}\n\n\\author{Moody Salem}\n\\affiliation{}\n\\email{moody.salem@gmail.com}\n\n\\author{Noah Zinsmeister}\n\\affiliation{}\n\\email{noah@uniswap.org}\n\n\\author{Sara Reynolds}\n\\affiliation{}\n\\email{sara@uniswap.org}\n\n\\author{Austin Adams}\n\\affiliation{}\n\\email{austin@uniswap.org}\n\n\\author{Will Pote}\n\\affiliation{}\n\\email{pote@uniswap.org}\n\n\\author{Mark Toda}\n\\affiliation{}\n\\email{mark@uniswap.org}\n\n\\author{Alice Henshaw}\n\\affiliation{}\n\\email{alice@uniswap.org}\n\n\\author{Emily Williams}\n\\affiliation{}\n\\email{emily@uniswap.org}\n\n\\author{Dan Robinson}\n\\affiliation{}\n\\email{dan@paradigm.xyz}\n\n\\titlenote{Uniswap v4 核心白皮书的中文翻译由 WTF Academy 贡献。}\n\n\\begin{teaserfigure}\n\\caption*{\n    \\hspace{\\textwidth}\n    }\n\\end{teaserfigure}\n\n\\renewcommand{\\shortauthors}{Adams et al.}\n\n\\begin{abstract}\n\n\\textsc{Uniswap v4}是一种实现在以太坊虚拟机上的非托管自动做市商。通过任意代码Hooks，\\textsc{Uniswap v4}提供了可自定义性，允许开发人员在\\textsc{Uniswap v3}中引入的集中流动性模型中增加新功能。在\\textsc{Uniswap v4}中，任何人都可以创建一个带有指定Hooks的新池，该Hooks可以在预定的池操作之前或之后运行。Hooks可用于实现之前内置于协议中的功能，如预言机，以及以前需要在协议层面独立实现的新功能。\\textsc{Uniswap v4}还通过单例模式(singleton)、闪电记账(flash accounting)和对原生ETH的支持，提高了gas效率和开发者体验。\n\\end{abstract}\n\n\\maketitle\n\n\\section{介绍} \\label{sec:introduction}\n\\textsc{Uniswap v4}是一种实现在以太坊虚拟机（EVM）上的自动做市商（AMM），用于实现价值的高效交换。与\\textsc{Uniswap Protocol}的先前版本一样，\\textsc{Uniswap v4}是非托管、不可升级和无需许可的。 \\textsc{Uniswap v4}的重点是通过可定制性和gas效率升级的体系结构变化，在\\textsc{Uniswap v1}和\\textsc{v2}中构建的AMM模型和\\textsc{Uniswap v3}中引入的集中流动性模型的基础上进行改进。\n\n\\textsc{Uniswap v1} \\cite{Adams18}和\\textsc{v2} \\cite{Adams20}是\\textsc{Uniswap Protocol}的前两个版本，分别实现了ERC-20 <> ETH和ERC-20 <> ERC-20的交易，两者都使用了常量乘积做市商（CPMM）模型。 \\textsc{Uniswap v3} \\cite{Adams21}通过使用在有限价格范围内提供流动性的仓位，提供了更高资本效率的流动性，并引入了多个费用层级。\n\n尽管集中流动性和费用层级增加了流动性提供者的灵活性，并允许实施新的策略，但\\textsc{Uniswap v3}不足以支持随着AMM和市场的发展而出现的新功能。\n\n一些功能，例如最初在\\textsc{Uniswap v2}中引入的价格预言机，允许集成者利用去中心化的链上定价数据，但这以增加交易者的gas成本为代价，并且对集成者而言不具有可定制性。其他增强功能的想法，包括通过时间加权平均价格做市商（TWAMM） \\cite{White2021} 实现的时间加权平均价格订单（TWAP）、波动率预言机、限价订单或动态费用，需要重新实现核心协议，无法由第三方开发者添加到\\textsc{Uniswap v3}中。\n\n此外，在以前的\\textsc{Uniswap}版本中，部署新的池需要部署新的合约，其成本随着合约字节码的大小而增加。另外，涉及到与多个\\textsc{Uniswap}池的交易涉及到多个合约之间的转账和冗余状态更新。自\\textsc{Uniswap v2}以来，\\textsc{Uniswap}要求ETH被包装成ERC-20，而不是支持原生ETH。这些都带来了gas成本。\n\n在\\textsc{Uniswap v4}中，我们通过一些值得注意的功能改进了这一点：\n\\begin{itemize}\n    \\item \\emph{Hooks}：\\textsc{Uniswap v4}允许任何人使用自定义功能部署新的集中流动性池。对于每个池，创建者可以定义一个“Hooks合约”，该合约在调用的生命周期的关键点执行逻辑。这些Hooks也可以管理池的交换费用以及向流动性提供者收取的提款费用。\n    \\item \\emph{单例模式}：\\textsc{Uniswap v4}摒弃了先前版本中使用的工厂模型，而是实现了一个包含所有池的单个合约。单例模式降低了池的创建成本和多跳交易（multi-hop trade）的成本。\n    \\item \\emph{闪电记账}：单例使用“闪电记账”机制，要求在锁定结束时池或调用者没有代币欠款。在调用过程中，代币可以用于单例内外的任意数量的操作。通过EIP-1153 \\cite{Akhunov2018}中提议的瞬态存储操作码，这种功能将变得高效。闪电记账进一步降低了跨多个池的交易的gas成本，并支持与\\textsc{Uniswap v4}的更复杂集成。\n    \\item \\emph{原生ETH}：\\textsc{Uniswap v4}恢复了对原生ETH的支持，并支持在\\textsc{v4}池中使用原生代币进行配对。ETH交换者和流动性提供者从转账成本更低和去除额外包装成本中受益。\n\\end{itemize}\n%% \\ref{sec:liquidity-oracle}）。\n\n以下章节详细解释了这些变化，与成就它们的架构变化。\n\n\\section{Hooks} \n\\label{sec:Hooks}\n\n\\emph{Hooks}是在池的执行过程中在指定点执行一些开发者定义的逻辑的外部部署合约。这些Hooks允许集成者创建具有灵活和可定制执行的集中流动性池。\n\nHooks可以修改池的参数，或添加新特性和功能。可以使用Hooks实现的示例功能包括：\n\\begin{itemize}\n\\item 在一段时间通过TWAMM执行大型订单\n\\item 按指定价格成交的链上限价订单\n\\item 随波动率变化的动态费用\n\\item 流动性提供者的内部化MEV分配机制\n\\item 实现中位数、截断或其他自定义预言机\n\\end{itemize}\n\n我们预计在未来为特定的Hooks设计撰写独立的白皮书，因为许多Hooks的复杂性与协议本身一样。\n\n\\begin{figure*}[ht!]\n    \\centering\n    \\scalebox{.65}{\n    \\begin{tikzpicture}[\n            every node/.style = {inner sep = 2ex},\n            flow/.style = {thick, arrows = {-To[scale=2]}},\n            decision/.style = {\n                draw,\n                rectangle split,\n                rectangle split horizontal,\n                rectangle split parts = 2,\n                rectangle split draw splits = false,\n                align = left,\n                rounded corners = 3ex\n            },\n            block/.style = {\n                draw,\n                rectangle split,\n                rectangle split horizontal,\n                rectangle split parts = 2,\n                rectangle split draw splits = false,\n                align = left\n            },\n            universal/.style = {draw, diamond, inner sep = .5ex},\n        ]\n\n        \\node (start) [universal] at (0,0) {开始 swap};\n\n        \\node [decision, below=3em of start] (S0) {\n            S0.\n            \\nodepart{two}\n            检查 beforeSwap flag\n        };\n\n        \\node (H1) [block, right=4em of S0] {\n            H1.\n            \\nodepart{two}\n            运行 beforeSwap Hook\n        };\n\n        \\node [block, below=3em of S0] (S1) {\n            S1.\n            \\nodepart{two}\n            执行 swap\n        };\n\n        \\node (S2) [decision, below=3em of S1] {\n            S2.\n            \\nodepart{two}\n            检查 afterSwap flag\n        };\n\n        \\node (H2) [block, right=4em of S2] {\n            H2.\n            \\nodepart{two}\n            运行 afterSwap Hook\n        };\n\n        \\node (stop) [universal, below=3em of S2] {\n            结束 swap\n        };\n\n        \\draw [flow] (start) -- (S0);\n        \\draw [flow] (S0) -- node[midway, above] {True} (H1);\n        \\draw [flow] (S0) -- node[midway, right] {False} (S1);\n        \\draw [flow] (H1) .. controls + (0,-2) .. node[near end, above] {Return} (S1);\n        \\draw [flow] (S1) -- (S2);\n        \\draw [flow] (S2) -- node[midway, above] {True} (H2);\n        \\draw [flow] (S2) -- node[midway, right] {False} (stop);\n        \\draw [flow] (H2) .. controls + (0,-2.5) .. node[near end, above] {Return} (stop);\n    \\end{tikzpicture}\n    }\n    \\caption{Swap Hook 流程图}\n    \\label{fig:swapflow}\n\\end{figure*}\n\n\\subsection{操作Hooks} \n\\label{actionhooks}\n\n当有人在\\textsc{Uniswap v4}上创建一个池时，他们可以指定一个Hooks合约。该Hooks合约实现了在池的执行过程中池将调用的自定义逻辑。 \\textsc{Uniswap v4}目前支持八个此类Hooks回调：\n\n\\begin{itemize}\n\\item beforeInitialize/afterInitialize\n\\item beforeAddLiquidity/afterAddLiquidity\n\\item beforeRemoveLiquidity/afterRemoveLiquidity\n\\item beforeSwap/afterSwap\n\\item beforeDonate/afterDonate\n\\end{itemize}\n\nHooks合约的地址决定了哪些Hooks回调会被执行。这一方法高效且表达力强，并确保即使是可升级的挂钩也遵守某些不变量。创建有效Hooks时有最低准则需要遵守。在图 \\ref{fig:swapflow} 中，我们描述了beforeSwap和afterSwapHooks在交换执行流程部分的工作原理。\n\n\\subsection{Hooks管理费用} \n\\label{hookfees}\n\n\\textsc{Uniswap v4}允许对交换和提取流动性收取费用。\n\n交换费用可以是静态的，也可以由Hooks合约动态管理。Hooks合约还可以选择将一定比例的交换费用分配给自己。提款费用不能在池中进行本地设置。要设置提款费用，池创建者必须设置一个Hooks合约来管理该费用，并且，收取的提款费用会支付给Hooks合约。支付给Hooks合约的费用可以由Hooks合约的代码任意分配，包括支付给流动性提供者、交换者、Hooks创建者或任何其他方。\n\nHooks的功能受创建池时选择的不可变标志（flag）的限制。池创建者可以选择的费用设置有：\n\\begin{itemize}\n    \\item 池收取静态费用（以及该费用是多少）还是动态费用\n    \\item Hooks是否具有收取交换费用的权限\n    \\item Hooks是否具有收取提款费用的权限\n\\end{itemize}\n\n治理可以从交换费用或提款费用中收取一定费用，如下面的治理部分所讨论的。 \n\n\\section{单例和闪电记账} \n\\label{flashaccounting}\n\n\\textsc{Uniswap Protocol}的先前版本使用工厂/池模式，其中工厂为新的代币对创建单独的合约。 \\textsc{Uniswap v4}使用单例设计模式，所有池都由单个合约管理，使得池的部署成本降低约99\\%。\n\n单例设计与\\textsc{v4}中的另一个体系结构变化\\emph{闪电记账}相辅相成。在\\textsc{Uniswap Protocol}的先前版本中，每个操作（例如交换或向池中添加流动性）都以代币转移结束。在\\textsc{v4}中，每个操作都会更新一个称为\\verb|delta|的内部净余额，仅在锁定结束时进行外部转账。新的\\newline \\verb|take()|和\\verb|settle()|函数分别用于从池中借资金和存入资金到池中。通过要求池或调用者没有代币欠款，确保了池的偿付能力。\n\n闪电记账简化了复杂的池操作，例如原子交换和原子添加。与单例模式结合使用时，它还简化了多跳交易。\n\n在当前的执行环境中，闪电记账架构是昂贵的，因为它要在每次余额变化时进行存储更新。尽管合约保证了内部会计数据实际上从未序列化到存储中，但当超过存储退款上限，用户仍然需要支付费用 \\cite{Buterin2021}。但是，由于余额必须在事务结束时为0，因此可以使用瞬态存储实现对这些余额的记账，正如EIP-1153 \\cite{Akhunov2018}中所描绘的。\n\n单例和闪电记账使得在多个\\textsc{v4}池之间更高效地进行路由成为可能，降低了流动性碎片化的成本。引入Hooks将大大增加池的数量，这个特性会非常有用。\n\n\\section{原生ETH} \n\\label{nativeeth}\n\n\\textsc{Uniswap v4}将原生ETH带回交易对中。虽然\\textsc{Uniswap v1}严格将ETH与ERC-20代币配对，但由于实施复杂性和在WETH和ETH配对之间的流动性碎片化的担忧，\\textsc{Uniswap v2}中删除了原生ETH配对。单例和闪电记账减轻了这些问题，因此\\textsc{Uniswap v4}允许同时支持WETH和ETH配对。\n\n原生ETH转账的gas成本约为ERC-20转账的一半（ETH为21k gas，ERC-20约为40k gas）。目前，\\textsc{Uniswap v2}和\\textsc{v3}要求绝大多数用户在在Uniswap Protocol上交易之前（之后）将他们的ETH包装（解包装）为WETH，这需要额外的gas。\n\n\\section{其他值得注意的功能} \n\\label{other}\n\n\\subsection{ERC1155记账} \n\\textsc{Uniswap v4}将支持通过单例实现的ERC-1155代币的铸造/销毁，用于额外的代币记账。用户现在可以将代币保留在单例合约中，避免ERC-20转入或转出合约的。这一点对于频繁交换者或流动性提供者非常有价值，因为它们会在多个区块或交易中连续使用相同的代币。\n\n\\subsection{治理更新} \n\\textsc{Uniswap v4}具有两种单独的治理费用机制，交换费用和提款费用，有着不同的机制。首先，与\\textsc{Uniswap v3}类似，治理可以选择在特定池上获取特定百分比的交换费用。对于\\textsc{v4}，如果Hooks最初选择为池打开提款费用，治理还可以获取特定百分比的提款费用。与\\textsc{Uniswap v3}不同，治理不控制可允许的费用层级或价格刻度间距。\n\n\\subsection{Gas减少}\n正如上面所讨论的，\\textsc{Uniswap v4}通过闪电记账、单例模式和对原生ETH的支持引入了有意义的gas优化。此外，引入了Hooks使得协议内嵌的价格预言机（在\\textsc{Uniswap v2}和\\textsc{Uniswap v3}中包含）变得不再必要，这也意味着一些池可以完全放弃预言机，并在每个区块中的第一次池交换中节省约15k gas。\n\n\\subsection{donate()}\n\\verb|donate()|允许用户、集成者和Hooks直接支付给特定范围内的流动性提供者，支付的方式可以是池中的任意一种或两种代币。此功能依赖于费用记账系统以实现高效支付，而费用支付系统仅支持池中的代币。可能的用例包括在TWAMM订单上给范围内的流动性提供者打赏或新类型的费用系统。\n\n\\section{总结}\n总之，\\textsc{Uniswap v4}是一个非托管、不可升级且无需许可的AMM协议。它基于\\textsc{Uniswap v3}中引入的集中流动性模型，通过Hooks实现了可定制的池。与Hooks相辅相成的还有其他体系结构变化，如单例合约，它将所有的池状态保存在一个合约中，以及闪电记账，它有效地确保池的偿付能力。其他改进包括对原生ETH的支持，ERC-1155余额记账，新的费用机制以及向范围内流动性提供者捐赠的能力。\n\n\\bibliographystyle{ACM-Reference-Format}\n\\bibliography{main}\n\n\\section*{免责声明}\n\n本文仅供一般信息目的。它不构成投资建议或购买或销售任何投资的推荐或招揽，也不应用于评估做出任何投资决策的价值。不应依赖本文提供会计、法律或税务建议或投资建议。本文反映了作者当前的观点，并不代表Uniswap Labs、Paradigm或其关联公司的观点，也不一定反映Uniswap Labs、Paradigm、其关联公司或与之相关的个人的观点。所反映的观点可能会随时更改，而无需进行更新。\n\n\\end{document}\n"
  },
  {
    "path": "docs/whitepaper/latex/main.bib",
    "content": "@online{Adams18,\n  author =       \"Hayden Adams\",\n  year =         \"2018\",\n  month =        nov,\n  title =        \"Uniswap v1 Core\",\n  url =          \"https://hackmd.io/@HaydenAdams/HJ9jLsfTz\",\n  lastaccessed = \"Jun 12, 2023\",\n}\n\n@online{Adams20,\n  author =       \"Hayden Adams and Noah Zinsmeister and Dan Robinson\",\n  year =         \"2020\",\n  month =        mar,\n  title =        \"Uniswap v2 Core\",\n  url =          \"https://uniswap.org/whitepaper.pdf\",\n  lastaccessed = \"Jun 12, 2023\",\n}\n\n@online{Adams21,\n  author =       \"Hayden Adams and Noah Zinsmeister and Moody Salem and River Keefer and Dan Robinson\",\n  year =         \"2021\",\n  month =        mar,\n  title =        \"Uniswap v3 Core\",\n  url =          \"https://uniswap.org/whitepaper-v3.pdf\",\n  lastaccessed = \"Jun 12, 2023\",\n}\n\n@online{White2021,\n  author =       \"Dave White and Dan Robinson and Hayden Adams\",\n  year =         \"2021\",\n  month =        jul,\n  title =        \"TWAMM\",\n  url =          \"https://www.paradigm.xyz/2021/07/twamm\",\n  lastaccessed = \"Jun 12, 2023\",\n}\n\n@online{Akhunov2018,\n  author =       \"Alexey Akhunov and Moody Salem\",\n  year =         \"2018\",\n  month =        jun,\n  title =        \"EIP-1153: Transient storage opcodes\",\n  url =          \"https://eips.ethereum.org/EIPS/eip-1153\",\n  lastaccessed = \"Jun 12, 2023\",\n}\n\n@online{Buterin2021,\n  author =       \"Vitalik Buterin and Martin Swende\",\n  year =         \"2021\",\n  month =        apr,\n  title =        \"EIP-3529: Reduction in refunds\",\n  url =          \"https://eips.ethereum.org/EIPS/eip-3529\",\n  lastaccessed = \"Jun 12, 2023\",\n}\n\n@article{adams2024amm,\n  title={am-AMM: An Auction-Managed Automated Market Maker},\n  author={Adams, Austin and Moallemi, Ciamac and Reynolds, Sara and Robinson, Dan},\n  journal={arXiv preprint arXiv:2403.03367},\n  year={2024}\n}\n\n@online{riley2023,\n  author =       \"JT Riley and Dillon and Sara and Vectorized and Neodaoist\",\n  year =         \"2023\",\n  month =        apr,\n  title =        \"ERC-6909: Minimal Multi-Token Interface\",\n  url =          \"https://eips.ethereum.org/EIPS/eip-6909\",\n  lastaccessed = \"Aug 26, 2024\",\n}\n"
  },
  {
    "path": "docs/whitepaper/latex/main.tex",
    "content": "\\documentclass[sigconf,nonacm,prologue,table]{acmart}\n\\usepackage{listings}\n\n%% labels\n%% sections:    \"sec\"\n%% definitions: \"def\"\n%% equations:   \"eq\"\n%% figures:     \"fig\"\n%% tables:      \"tab\"\n\n%% packages\n\\usepackage{amsmath}\n\\usepackage{pgfplots}\n\\usepackage{subcaption}\n\\usepackage{commath}\n\\usepackage[utf8]{inputenc}\n\\usetikzlibrary{positioning, arrows.meta, shapes, calc}\n%% \\usepackage{tikz}\n\n\\pagenumbering{arabic}\n\n%% hide ACM reference\n\\settopmatter{printacmref=false}\n\n%% hide copyright\n\\renewcommand\\footnotetextcopyrightpermission[1]{}\n\n%% \\pagestyle{plain}\n\\settopmatter{printfolios=true}\n\n\\numberwithin{equation}{section}\n\n\\theoremstyle{definition}\n\\newtheorem{definition}{Definition}\n\n\\theoremstyle{remark}\n\\newtheorem*{remark}{Remark}\n\n\\captionsetup[subfigure]{\n    labelfont=bf,\n    textfont=normalfont,\n}\n\\renewcommand{\\thesubfigure}{\\Roman{subfigure}}\n\n\\definecolor{rowA}{gray}{0.9}\n\\definecolor{rowB}{gray}{0.8}\n\n\\newcommand{\\rplus}{\\mathbb{R}_{\\geq 0}}\n\\newcommand{\\rpos}{\\mathbb{R}_{>0}}\n\n\\begin{document}\n\\title{Uniswap v4 Core}\n\\subtitle{August 2024}\n\\date{August 2024}\n\n\\author{Hayden Adams}\n\\affiliation{}\n\\email{hayden@uniswap.org}\n\n\\author{Moody Salem}\n\\affiliation{}\n\\email{moody.salem@gmail.com}\n\n\\author{Noah Zinsmeister}\n\\affiliation{}\n\\email{noah@uniswap.org}\n\n\\author{Sara Reynolds}\n\\affiliation{}\n\\email{sara@uniswap.org}\n\n\\author{Austin Adams}\n\\affiliation{}\n\\email{me@aada.ms}\n\n\\author{Will Pote}\n\\affiliation{}\n\\email{willpote@gmail.com}\n\n\\author{Mark Toda}\n\\affiliation{}\n\\email{mark@uniswap.org}\n\n\\author{Alice Henshaw}\n\\affiliation{}\n\\email{alice@uniswap.org}\n\n\\author{Emily Williams}\n\\affiliation{}\n\\email{emily@uniswap.org}\n\n\\author{Dan Robinson}\n\\affiliation{}\n\\email{dan@paradigm.xyz}\n\n\\begin{teaserfigure}\n\\caption*{\n    \\hspace{\\textwidth}\n    }\n\\end{teaserfigure}\n\n\\renewcommand{\\shortauthors}{Adams et al.}\n\n\\begin{abstract}\n\n\\textsc{Uniswap v4} is a non-custodial automated market maker implemented for the Ethereum Virtual Machine. \\textsc{Uniswap v4} offers customizability via arbitrary code hooks, allowing developers to augment the concentrated liquidity model introduced in \\textsc{Uniswap v3} with new functionality. In \\textsc{Uniswap v4}, anyone can create a new pool with a specified hook, which can run before or after pre-determined pool actions. Hooks can be used to implement features that were previously built into the protocol, like oracles, as well as new features that previously would have required independent implementations of the protocol. \\textsc{Uniswap v4} also offers improved gas efficiency and developer experience through a singleton implementation, flash accounting, and support for native ETH.\n\\end{abstract}\n\n\\maketitle\n\n\\section{Introduction} \\label{sec:introduction}\n\\textsc{Uniswap v4} is an automated market maker (AMM) facilitating efficient exchange of value on the Ethereum Virtual Machine (EVM). As with previous versions of the \\textsc{Uniswap Protocol}, it is non-custodial, non-upgradable, and permissionless. The focus of \\textsc{Uniswap v4} is on additional customization for developers and architectural changes for gas efficiency improvements, building on the AMM model built by \\textsc{Uniswap v1} and \\textsc{v2} and the concentrated liquidity model introduced in \\textsc{Uniswap v3}.\n\n\\textsc{Uniswap v1} \\cite{Adams18} and \\textsc{v2} \\cite{Adams20} were the first two iterations of the \\textsc{Uniswap Protocol}, facilitating ERC-20 <> ETH and ERC-20 <> ERC-20 swaps, respectively, both using a constant product market maker (CPMM) model. \\textsc{Uniswap v3} \\cite{Adams21} introduced concentrated liquidity, enabling more capital efficient liquidity through positions that provide liquidity within a limited price range, and multiple fee tiers.\n\nWhile concentrated liquidity and fee tiers increased flexibility for liquidity providers and allowed for new liquidity provision strategies, \\textsc{Uniswap v3} lacks flexibility to support new functionalities invented as AMMs and DeFi have evolved.\n\nSome features, like the price oracle originally introduced in \\textsc{Uniswap v2} and included in \\textsc{Uniswap v3}, allow integrators to utilize decentralized onchain pricing data, at the expense of increased gas costs for swappers and without customizability for integrators. Other possible enhancements, such as time-weighted average price orders (TWAP) through a time-weighted average market maker (TWAMM) \\cite{White2021}, volatility oracles, limit orders, or dynamic fees, require reimplementations of the core protocol, and can not be added to \\textsc{Uniswap v3} by third-party developers.\n\nAdditionally, in previous versions of \\textsc{Uniswap}, deployment of new pools involves deploying a new contract—where cost scales with the size of the bytecode—and trades with multiple \\textsc{Uniswap} pools involve transfers and redundant state updates across multiple contracts. Additionally since \\textsc{Uniswap v2}, \\textsc{Uniswap} has required ETH to be wrapped into an ERC-20, rather than supporting native ETH. These design choices came with increased gas costs for end users.\n\nIn \\textsc{Uniswap v4}, we improve on these inefficiencies through a few notable features:\n\\begin{itemize}\n    \\item \\emph{Hooks}: \\textsc{Uniswap v4} allows anyone to deploy new concentrated liquidity pools with custom functionality. For each pool, the creator can define a “hook contract” that implements logic executed at specific points in a call’s lifecycle. These hooks can also manage the swap fee of the pool dynamically, implement custom curves, and adjust fees charged to liquidity providers and swappers though \\emph{Custom Accounting}.\n    \\item \\emph{Singleton}: \\textsc{Uniswap v4} moves away from the factory model used in previous versions, instead implementing a single contract that holds all pools. The singleton model reduces the cost of pool creation and multi-hop trades.\n    \\item \\emph{Flash accounting}:  The singleton uses “flash accounting,” which allows a caller to lock the pool and access any of its tokens, as long as no tokens are owed to or from the caller by the end of the lock. This functionality is made efficient by the transient storage opcodes described in EIP-1153 \\cite{Akhunov2018}. Flash accounting further reduces the gas cost of trades that cross multiple pools and supports more complex integrations with \\textsc{Uniswap v4}.\n    \\item \\emph{Native ETH}: \\textsc{Uniswap v4} brings back support for native ETH, with support for pairs with native tokens inside \\textsc{v4} pools. ETH swappers and liquidity providers benefit from gas cost reductions from cheaper transfers and removal of additional wrapping costs.\n   \\item \\emph{Custom Accounting}: The singleton supports both augmenting and bypassing the native concentrated liquidity pools through hook-returned deltas, utilizing the singleton as an immutable settlement layer for connected pools. This feature can support use-cases like hook withdrawal fees, wrapping assets, or constant product market maker curves like \\textsc{Uniswap v2}.\n\\end{itemize}\n\nThe following sections provide in-depth explanations of these changes and the architectural changes that help make them possible.\n\n\\section{Hooks} \n\\label{sec:Hooks}\n\n\\emph{Hooks} are externally deployed contracts that execute some developer-defined logic at a specified point in a pool’s execution. These hooks allow integrators to create a concentrated liquidity pool with flexible and customizable execution. Optionally, hooks can also return custom deltas that allow the hook to change the behavior of the swap — described in detail in the \\emph{Custom Accounting} section (\\ref{customaccounting}).\n\nHooks can modify pool parameters, or add new features and functionality. Example functionalities that could be implemented with hooks include: \n\\begin{itemize}\n\\item Executing large orders over time through TWAMM \\cite{White2021}\n\\item Onchain limit orders that fill at tick prices\n\\item Volatility-shifting dynamic fees\n\\item Mechanisms to internalize MEV for liquidity providers \\cite{adams2024amm}\n\\item Median, truncated, or other custom oracle implementations\n\\item Constant Product Market Makers (Uniswap v2 functionality)\n\\end{itemize}\n\n\\begin{figure*}[ht!]\n    \\centering\n    \\scalebox{.7225}{\n    \\begin{tikzpicture}[\n            every node/.style = {inner sep = 2ex},\n            flow/.style = {thick, arrows = {-To[scale=2]}},\n            decision/.style = {\n                draw,\n                rectangle split,\n                rectangle split horizontal,\n                rectangle split parts = 2,\n                rectangle split draw splits = false,\n                align = left,\n                rounded corners = 3ex\n            },\n            block/.style = {\n                draw,\n                rectangle split,\n                rectangle split horizontal,\n                rectangle split parts = 2,\n                rectangle split draw splits = false,\n                align = left\n            },\n            universal/.style = {draw, diamond, inner sep = .5ex},\n        ]\n\n        \\node (start) [universal] at (0,0) {Start swap};\n\n        \\node [decision, below=3em of start] (S0) {\n            S0.\n            \\nodepart{two}\n            Check beforeSwap flag\n        };\n\n        \\node (H1) [block, right=4em of S0] {\n            H1.\n            \\nodepart{two}\n            Run beforeSwap Hook\n        };\n\n        \\node [block, below=3em of S0] (S1) {\n            S1.\n            \\nodepart{two}\n            Execute swap\n        };\n\n        \\node (S2) [decision, below=3em of S1] {\n            S2.\n            \\nodepart{two}\n            Check afterSwap flag\n        };\n\n        \\node (H2) [block, right=4em of S2] {\n            H2.\n            \\nodepart{two}\n            Run afterSwap Hook\n        };\n\n        \\node (stop) [universal, below=3em of S2] {\n            End swap\n        };\n\n        \\draw [flow] (start) -- (S0);\n        \\draw [flow] (S0) -- node[midway, above] {True} (H1);\n        \\draw [flow] (S0) -- node[midway, right] {False} (S1);\n        \\draw [flow] (H1) .. controls + (0,-2) .. node[near end, above] {Return} (S1);\n        \\draw [flow] (S1) -- (S2);\n        \\draw [flow] (S2) -- node[midway, above] {True} (H2);\n        \\draw [flow] (S2) -- node[midway, right] {False} (stop);\n        \\draw [flow] (H2) .. controls + (0,-2.5) .. node[near end, above] {Return} (stop);\n    \\end{tikzpicture}\n    }\n    \\caption{Swap Hook Flow}\n    \\label{fig:swapflow}\n\\end{figure*}\n\n\\subsection{Action Hooks} \n\\label{actionhooks}\n\nWhen someone creates a pool on \\textsc{Uniswap v4}, they can specify a hook contract. This hook contract implements custom logic that the pool will call out to during its execution. \n\\textsc{Uniswap v4} currently supports ten such hook callbacks:\n\n\\begin{itemize}\n\\item beforeInitialize/afterInitialize\n\\item beforeAddLiquidity/afterAddLiquidity\\footnote{Having separate permissions for `beforeAddLiquidity` and `beforeRemoveLiquidity` reflects the difference in security assumptions between those two actions. Hooks that can affect minting but not burning of liquidity are safer for liquidity providers, since they are guaranteed to be able to withdraw their liquidity.}\n\\item beforeRemoveLiquidity/afterRemoveLiquidity\n\\item beforeSwap/afterSwap\n\\item beforeDonate/afterDonate\n\\end{itemize}\n\nThe address of the hook contract determines which of these hook callbacks are executed. This creates a gas efficient and expressive methodology for determining the desired callbacks to execute, and ensures that even upgradeable hooks obey certain invariants. There are minimal requirements for creating a working hook. In Figure \\ref{fig:swapflow}, we describe how the beforeSwap and afterSwap hooks work as part of swap execution flow.\n\n\n\\subsection{Hook-managed fees} \\label{hookfees}\n\n\\textsc{Uniswap v4} allows fees to be taken on swapping by the hook. \n\nSwap fees can be either static, or dynamically managed by a hook contract. The hook contract can also choose to allocate a percentage of the swap fees to itself. Fees that accrue to hook contracts can be allocated arbitrarily by the hook’s code, including to liquidity providers, swappers, hook creators, or any other party. \n\nThe capabilities of the hook are limited by immutable flags chosen when the pool is created. For example, a pool creator can choose whether a pool has a static fee (and what that fee is) or dynamic fees.\n\nGovernance also can take a capped percentage of swap fees, as discussed below in the Governance section (\\ref{gov}). \n\n\\section{Singleton and Flash Accounting} \\label{flashaccounting}\n\nPrevious versions of the \\textsc{Uniswap Protocol} use the factory/pool pattern, where the factory creates separate contracts for new token pairs. \\textsc{Uniswap v4} uses a \\emph{singleton} design pattern where all pools are managed by a single contract, making pool deployment ~99\\% cheaper. \n\nThe singleton design complements another architectural change in \\textsc{v4}: \\emph{flash accounting}. In previous versions of the \\textsc{Uniswap Protocol}, most operations (such as swapping or adding liquidity to a pool) ended by transferring tokens. In \\textsc{v4}, each operation updates an internal net balance, known as a \\verb|delta|, only making external transfers at the end of the lock. The new \\verb|take()| and  \\verb|settle()| functions can be used to borrow or deposit funds to the pool, respectively. By requiring that no tokens are owed to the pool manager or to the caller by the end of the call, the pool's solvency is enforced. \n\nFlash accounting simplifies complex pool operations, such as atomic swapping and adding. When combined with the singleton model, it also simplifies multi-hop trades or compound operations like swapping before adding liquidity.\n\nBefore the Cancun hard fork, the flash accounting architecture was expensive because it required storage updates at every balance change. Even though the contract guaranteed that internal accounting data is never actually serialized to storage, users would still pay those same costs once the storage refund cap was exceeded \\cite{Buterin2021}. But, because balances must be 0 by the end of the transaction, accounting for these balances can be implemented with transient storage, as specified by EIP-1153 \\cite{Akhunov2018}.\n\nTogether, singleton and flash accounting enable more efficient routing across multiple \\textsc{v4} pools, reducing the cost of liquidity fragmentation. This is especially useful given the introduction of hooks, which will greatly increase the number of pools. \n\n\\section{Native ETH} \n\\label{nativeeth}\n\n\\textsc{Uniswap v4} is bringing back native ETH in trading pairs. While \\textsc{Uniswap v1} was strictly ETH paired against ERC-20 tokens, native ETH pairs were removed in \\textsc{Uniswap v2} due to implementation complexity and concerns of liquidity fragmentation across WETH and ETH pairs. Singleton and flash accounting mitigate these problems, so \\textsc{Uniswap v4} allows for both WETH and ETH pairs.\n\nNative ETH transfers are about half the gas cost of ERC-20 transfers (21k gas for ETH and around 40k gas for ERC-20s). Currently \\textsc{Uniswap v2} and \\textsc{v3} require the vast majority of users to wrap (unwrap) their ETH to (from) WETH before (after) trading on the Uniswap Protocol, requiring extra gas. According to transaction data, the majority of users start or end their transactions in ETH, adding this additional unneeded complexity.\n\n\\section{Custom Accounting} \n\\label{customaccounting}\n\nNewly introduced in \\textsc{Uniswap v4} is custom accounting - which allows hook developers to alter end user actions utilizing hook-returned deltas, token amounts that are debited/credited to the user and credited/debited to the hook, respectively. This allows hook developers to potentially add withdrawal fees on LP positions, customized LP fee models, or match against some flow, all while ultimately utilizing the internal concentrated liquidity native to \\textsc{Uniswap v4}. \n\nImportantly, hook developers can also forgo the concentrated liquidity model entirely, creating custom curves from the \\textsc{v4} swap parameters. This creates interface composability for integrators - allowing the hook to map the swap parameters to their internal logic.\n\nIn \\textsc{Uniswap v3}, users were required to utilize the concentrated liquidity AMM introduced in the same version. Since their introduction, concentrated liquidity AMMs have become widely used as the base liquidity provision strategy in the decentralized finance markets. While concentrated liquidity is able to support most arbitrary liquidity provision strategies, it may require increased gas overhead to implement specific strategies.\n\nOne possible example is a \\textsc{Uniswap v2} on \\textsc{Uniswap v4} hook, which bypasses the internal concentrated liquidity model entirely - utilizing a constant product market maker fully inside of the hook. Using custom accounting is cheaper than creating a similar strategy in the concentrated liquidity math.\n\nThe benefit of custom accounting for developers - compared to rolling a custom AMM - is the \\textsc{singleton}, \\textsc{flash accounting}, and \\textsc{ERC-6909}. These features support cheaper multi-hop swaps, security benefits, and easier integration for flow. Developers should also benefit from a well-audited code-base for the basis of their AMM.\n\nCustom accounting will also support experimentation in liquidity provision strategies, which historically requires the creation of an entirely new AMM. Creating a custom AMM requires significant technical resources and investment, which may not be economically viable for many. \n\n\\section{Other Notable Features} \n\\label{other}\n\n\\subsection{ERC-6909 Accounting} \n\\textsc{Uniswap v4} supports the minting/burning of singleton-implemented ERC-6909 tokens for additional token accounting, described in the ERC-6909 specification \\cite{riley2023}. Users can now keep tokens within the singleton and avoid ERC-20 transfers to and from the contract. This will be especially valuable for users and hooks who continually use the same tokens over multiple blocks or transactions, like frequent swappers, liquidity providers, or custom accounting hooks.\n\n\n\\subsection{Governance updates} \\label{gov}\nSimilar to \\textsc{Uniswap v3}, \\textsc{Uniswap v4} allows governance the ability to take up to a capped percentage of the swap fee on a particular pool, which are additive to LP fees. Unlike in \\textsc{Uniswap v3}, governance does not control the permissible fee tiers or tick spacings.\n\n\\subsection{Gas reductions}\nAs discussed above, \\textsc{Uniswap v4} introduces meaningful gas optimizations through flash accounting, the singleton model, and support for native ETH. Additionally, the introduction of hooks makes the protocol-enshrined price oracle that was included in \\textsc{Uniswap v2} and \\textsc{Uniswap v3} unnecessary, which also means base pools forgo the oracle altogether and save around 15k gas on the first swap on a pool in each block. \n\n\\subsection{donate()}\n\\verb|donate()| allows users, integrators, and hooks to directly pay in-range liquidity providers in either or both of the tokens of the pool. This functionality relies on the fee accounting system to facilitate efficient payments. The fee payment system can only support either of the tokens in the token pair for the pool. Potential use-cases could be tipping in-range liquidity providers on TWAMM orders or new types of fee systems.\n\n\\section{Summary}\nIn summary, \\textsc{Uniswap v4} is a non-custodial, non-upgradeable, and permissionless AMM protocol. It builds upon the concentrated liquidity model introduced in \\textsc{Uniswap v3} with customizable pools through hooks. Complementary to hooks are other architectural changes like the singleton contract which holds all pool state in one contract, and flash accounting which enforces pool solvency across each pool efficiently. Additionally, hook developers can elect to bypass the concentrated liquidity entirely, utilizing the \\textsc{v4} singleton as an arbitrary delta resolver. Some other improvements are native ETH support, ERC-6909 balance accounting, new fee mechanisms, and the ability to donate to in-range liquidity providers.\n\n\\bibliographystyle{ACM-Reference-Format}\n\\bibliography{main}\n\n\\section*{Disclaimer}\n\nThis paper is for general information purposes only. It does not constitute investment advice or a recommendation or solicitation to buy or sell any investment and should not be used in the evaluation of the merits of making any investment decision. It should not be relied upon for accounting, legal or tax advice or investment recommendations.  This paper reflects current opinions of the authors and is not made on behalf of Uniswap Labs, Paradigm, or their affiliates and does not necessarily reflect the opinions of Uniswap Labs, Paradigm, their affiliates or individuals associated with them. The opinions reflected herein are subject to change without being updated. \n\n\\end{document}\n\\endinput"
  },
  {
    "path": "echidna.config.yml",
    "content": "#format can be \"text\" or \"json\" for different output (human or machine readable)\nformat: \"text\"\n#checkAsserts checks assertions\ncheckAsserts: true\n#coverage controls coverage guided testing\ncoverage: false\n# #psender is the sender for property transactions; by default intentionally\n# #the same as contract deployer\n# psender: \"0x00a329c0648769a73afac7f9381e08fb43dbea70\"\n# #prefix is the prefix for Boolean functions that are properties to be checked\n# prefix: \"echidna_\"\n# #propMaxGas defines gas cost at which a property fails\n# propMaxGas: 8000030\n# #testMaxGas is a gas limit; does not cause failure, but terminates sequence\n# testMaxGas: 8000030\n# #maxGasprice is the maximum gas price\n# maxGasprice: 100000000000\n# #testLimit is the number of test sequences to run\n# testLimit: 50000\n# #stopOnFail makes echidna terminate as soon as any property fails and has been shrunk\n# stopOnFail: false\n# #estimateGas makes echidna perform analysis of maximum gas costs for functions (experimental)\n# estimateGas: false\n# #seqLen defines how many transactions are in a test sequence\n# seqLen: 100\n# #shrinkLimit determines how much effort is spent shrinking failing sequences\n# shrinkLimit: 5000\n# #contractAddr is the address of the contract itself\n# contractAddr: \"0x00a329c0648769a73afac7f9381e08fb43dbea72\"\n# #deployer is address of the contract deployer (who often is privileged owner, etc.)\n# deployer: \"0x00a329c0648769a73afac7f9381e08fb43dbea70\"\n# #sender is set of addresses transactions may originate from\n# sender: [\"0x10000\", \"0x20000\", \"0x00a329c0648769a73afac7f9381e08fb43dbea70\"]\n# #balanceAddr is default balance for addresses\n# balanceAddr: 0xffffffff\n# #balanceContract overrides balanceAddr for the contract address\n# balanceContract: 0\n# #solcArgs allows special args to solc\n# solcArgs: \"\"\n# #solcLibs is solc libraries\n# solcLibs: []\n# #cryticArgs allows special args to crytic\n# cryticArgs: []\n# #quiet produces (much) less verbose output\n# quiet: false\n# #initialize the blockchain with some data\n# initialize: null\n# #whether or not to use the multi-abi mode of testing\n# multi-abi: false\n# #benchmarkMode enables benchmark mode\n# benchmarkMode: false\n# #timeout controls test timeout settings\n# timeout: null\n# #seed not defined by default, is the random seed\n# #seed: 0\n# #dictFreq controls how often to use echidna's internal dictionary vs random\n# #values\n# dictFreq: 0.40\n# maxTimeDelay: 604800\n# #maximum time between generated txs; default is one week\n# maxBlockDelay: 60480\n# #maximum number of blocks elapsed between generated txs; default is expected increment in one week\n# # timeout:\n# #campaign timeout (in seconds)\n# # list of methods to filter\n# filterFunctions: []\n# # by default, blacklist methods in filterFunctions\n# filterBlacklist: true\n# #directory to save the corpus; by default is disabled\n# corpusDir: null\n# # constants for corpus mutations (for experimentation only)\n# mutConsts: [100, 1, 1]\n# # maximum value to send to payable functions\n# maxValue: 100000000000000000000 # 100 eth\n"
  },
  {
    "path": "foundry.toml",
    "content": "[profile.default]\noptimizer_runs = 44444444\nvia_ir = true\nffi = true\nfs_permissions = [{ access = \"read-write\", path = \".forge-snapshots/\"}, { access = \"read\", path = \"./out\"}, {access = \"read\", path = \"./test/bin\"}]\nsolc = \"0.8.26\"\nevm_version = \"cancun\"\ngas_limit = \"300000000\"\nbytecode_hash = \"none\"\nallow_internal_expect_revert = true\n\n[profile.default.fuzz]\nruns = 1000\nseed = \"0x4444\"\n\n[profile.pr.fuzz]\nruns = 10000\n\n[profile.ci.fuzz]\nruns = 100000\n\n[profile.debug]\nvia_ir = false\noptimizer_runs = 200\nfuzz.runs = 100\n\n# See more config options https://github.com/foundry-rs/foundry/tree/master/config\n"
  },
  {
    "path": "justfile",
    "content": "\ntest *args: (test-forge args)\nbuild *args: (build-forge args)\nprep *args: fix (test-forge args)\n\n\ntest-forge *args: build-forge\n    forge test --isolate {{args}}\n\n\nbuild-forge *args: install-forge\n    forge build {{args}}\n\ninstall-forge:\n    forge install\n\nfix:\n    forge fmt\n\n"
  },
  {
    "path": "licenses/BUSL_LICENSE",
    "content": "Business Source License 1.1\n\nLicense text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.\n\"Business Source License\" is a trademark of MariaDB Corporation Ab.\n\n-----------------------------------------------------------------------------\n\nParameters\n\nLicensor:             Universal Navigation Inc.\n\nLicensed Work:        Uniswap V4 Core\n                      The Licensed Work is (c) 2023 Universal Navigation Inc.\n\nAdditional Use Grant: Any uses listed and defined at\n                      v4-core-license-grants.uniswap.eth\n\nChange Date:          The earlier of 2027-06-15 or a date specified at\n                      v4-core-license-date.uniswap.eth\n\nChange License:       MIT License\n\n-----------------------------------------------------------------------------\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative works, redistribute, and make non-production use of the Licensed Work. The Licensor may make an Additional Use Grant, above, permitting limited production use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly available distribution of a specific version of the Licensed Work under this License, whichever comes first, the Licensor hereby grants you rights under the terms of the Change License, and the rights granted in the paragraph above terminate.\n\nIf your use of the Licensed Work does not comply with the requirements currently in effect as described in this License, you must purchase a commercial license from the Licensor, its affiliated entities, or authorized resellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works of the Licensed Work, are subject to this License. This License applies separately for each version of the Licensed Work and the Change Date may vary for each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy of the Licensed Work. If you receive the Licensed Work in original or modified form from a third party, the terms and conditions set forth in this License apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically terminate your rights under this License for the current and all other versions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of Licensor or its affiliates (provided that you may use a trademark or logo of Licensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN \"AS IS\" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE.\n\nMariaDB hereby grants you permission to use this License’s text to license your works, and to refer to it using the trademark \"Business Source License\", as long as you comply with the Covenants of Licensor below.\n\n-----------------------------------------------------------------------------\n\nCovenants of Licensor\n\nIn consideration of the right to use this License’s text and the \"Business Source License\" name and trademark, Licensor covenants to MariaDB, and to all other recipients of the licensed work to be provided by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,    or a license that is compatible with GPL Version 2.0 or a later version,    where \"compatible\" means that software provided under the Change License can    be included in a program with software provided under GPL Version 2.0 or a    later version. Licensor may specify additional Change Licenses without    limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not    impose any additional restriction on the right granted in this License, as    the Additional Use Grant; or (b) insert the text \"None\".\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\n\n-----------------------------------------------------------------------------\n\nNotice\n\nThe Business Source License (this document, or the \"License\") is not an Open Source license. However, the Licensed Work will eventually be made available under an Open Source License, as stated in this License.\n"
  },
  {
    "path": "licenses/MIT_LICENSE",
    "content": "Copyright 2023 Universal Navigation Inc. \n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@uniswap/v4-core\",\n  \"version\": \"1.0.2\",\n  \"description\": \"🦄 Core smart contracts of Uniswap v4\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Uniswap/v4-core.git\"\n  },\n  \"license\": \"BUSL-1.1\",\n  \"keywords\": [\n    \"uniswap\",\n    \"core\",\n    \"v4\"\n  ],\n  \"bugs\": {\n    \"url\": \"https://uniswap.org/bug-bounty\"\n  },\n  \"homepage\": \"https://github.com/Uniswap/v4-core#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"provenance\": true\n  }\n}\n"
  },
  {
    "path": "remappings.txt",
    "content": "@ensdomains/=node_modules/@ensdomains/\n@openzeppelin/=lib/openzeppelin-contracts/\nds-test/=lib/forge-std/lib/ds-test/src/\nforge-std/=lib/forge-std/src/\nhardhat/=node_modules/hardhat/\nsolmate/=lib/solmate/\n"
  },
  {
    "path": "snapshots/ClearTest.json",
    "content": "{\n  \"clear\": \"1717\"\n}"
  },
  {
    "path": "snapshots/CustomAccountingTest.json",
    "content": "{\n  \"addLiquidity CA fee\": \"170695\",\n  \"removeLiquidity CA fee\": \"141199\",\n  \"swap CA custom curve + swap noop\": \"124402\",\n  \"swap CA fee on unspecified\": \"154572\"\n}"
  },
  {
    "path": "snapshots/ERC6909ClaimsTest.json",
    "content": "{\n  \"ERC6909Claims approve\": \"46323\",\n  \"ERC6909Claims burn\": \"29389\",\n  \"ERC6909Claims mint\": \"46603\",\n  \"ERC6909Claims transfer\": \"51756\",\n  \"ERC6909Claims transferFrom as operator\": \"54437\",\n  \"ERC6909Claims transferFrom with approval\": \"59939\",\n  \"ERC6909Claims transferFrom with infinite approval\": \"56770\"\n}"
  },
  {
    "path": "snapshots/ExtsloadTest.json",
    "content": "{\n  \"sparse external sload\": \"22164\"\n}"
  },
  {
    "path": "snapshots/ModifyLiquidityTest.json",
    "content": "{\n  \"add liquidity to already existing position with salt\": \"144401\",\n  \"create new liquidity to a position with salt\": \"292593\"\n}"
  },
  {
    "path": "snapshots/PoolManagerInitializeTest.json",
    "content": "{\n  \"initialize\": \"51532\"\n}"
  },
  {
    "path": "snapshots/PoolManagerTest.json",
    "content": "{\n  \"addLiquidity with empty hook\": \"274012\",\n  \"addLiquidity with native token\": \"135001\",\n  \"donate gas with 1 token\": \"106214\",\n  \"donate gas with 2 tokens\": \"145510\",\n  \"erc20 collect protocol fees\": \"57728\",\n  \"native collect protocol fees\": \"59371\",\n  \"poolManager bytecode size\": \"24009\",\n  \"poolManager initcode hash (without constructor params, as uint256)\": \"19281018184167079101887460999643277467915809731640262058315305465805214934776\",\n  \"removeLiquidity with empty hook\": \"130613\",\n  \"removeLiquidity with native token\": \"112523\",\n  \"simple addLiquidity\": \"161276\",\n  \"simple addLiquidity second addition same range\": \"98731\",\n  \"simple removeLiquidity\": \"85099\",\n  \"simple removeLiquidity some liquidity remains\": \"92986\",\n  \"simple swap\": \"123144\",\n  \"simple swap with native\": \"108434\",\n  \"swap against liquidity\": \"116527\",\n  \"swap against liquidity with native token\": \"105569\",\n  \"swap burn 6909 for input\": \"129285\",\n  \"swap burn native 6909 for input\": \"118672\",\n  \"swap mint native output as 6909\": \"139620\",\n  \"swap mint output as 6909\": \"154985\",\n  \"swap with hooks\": \"132165\"\n}"
  },
  {
    "path": "snapshots/ProtocolFeesTest.json",
    "content": "{\n  \"set protocol fee\": \"31730\"\n}"
  },
  {
    "path": "snapshots/SkipCallsTest.json",
    "content": "{\n  \"swap skips hook call if hook is caller\": \"206030\"\n}"
  },
  {
    "path": "snapshots/SqrtPriceMathTest.json",
    "content": "{\n  \"getAmount0Delta_gasCostForAmount0WhereRoundUpIsFalse\": \"243\",\n  \"getAmount0Delta_gasCostForAmount0WhereRoundUpIsTrue\": \"360\",\n  \"getAmount1Delta_gasCostForAmount1WhereRoundUpIsFalse\": \"229\",\n  \"getAmount1Delta_gasCostForAmount1WhereRoundUpIsTrue\": \"264\",\n  \"getNextSqrtPriceFromInput_zeroForOneEqualsFalseGas\": \"316\",\n  \"getNextSqrtPriceFromInput_zeroForOneEqualsTrueGas\": \"539\",\n  \"getNextSqrtPriceFromOutput_zeroForOneEqualsFalseGas\": \"544\",\n  \"getNextSqrtPriceFromOutput_zeroForOneEqualsTrueGas\": \"214\"\n}"
  },
  {
    "path": "snapshots/StateLibraryTest.json",
    "content": "{\n  \"extsload getFeeGrowthGlobals\": \"4774\",\n  \"extsload getFeeGrowthInside\": \"2375\",\n  \"extsload getLiquidity\": \"2375\",\n  \"extsload getPositionInfo\": \"6949\",\n  \"extsload getPositionLiquidity\": \"2375\",\n  \"extsload getSlot0\": \"2375\",\n  \"extsload getTickBitmap\": \"2375\",\n  \"extsload getTickFeeGrowthOutside\": \"4774\",\n  \"extsload getTickInfo\": \"6949\",\n  \"extsload getTickLiquidity\": \"2375\"\n}"
  },
  {
    "path": "snapshots/SwapMathTest.json",
    "content": "{\n  \"SwapMath_oneForZero_exactInCapped\": \"1188\",\n  \"SwapMath_oneForZero_exactInPartial\": \"1274\",\n  \"SwapMath_oneForZero_exactOutCapped\": \"1001\",\n  \"SwapMath_oneForZero_exactOutPartial\": \"1565\",\n  \"SwapMath_zeroForOne_exactInCapped\": \"1126\",\n  \"SwapMath_zeroForOne_exactInPartial\": \"1439\",\n  \"SwapMath_zeroForOne_exactOutCapped\": \"919\",\n  \"SwapMath_zeroForOne_exactOutPartial\": \"1133\"\n}"
  },
  {
    "path": "snapshots/SyncTest.json",
    "content": "{\n  \"getReserves\": \"5973\"\n}"
  },
  {
    "path": "snapshots/TestBitMath.json",
    "content": "{\n  \"BitMathLeastSignificantBitMaxUint128\": \"648\",\n  \"BitMathLeastSignificantBitMaxUint256\": \"648\",\n  \"BitMathLeastSignificantBitSmallNumber\": \"25\",\n  \"BitMathMostSignificantBitMaxUint128\": \"648\",\n  \"BitMathMostSignificantBitMaxUint256\": \"648\",\n  \"BitMathMostSignificantBitSmallNumber\": \"14\"\n}"
  },
  {
    "path": "snapshots/TestDelegateCall.json",
    "content": "{\n  \"NoDelegateCall\": \"51\"\n}"
  },
  {
    "path": "snapshots/TestDynamicFees.json",
    "content": "{\n  \"swap with dynamic fee\": \"139153\",\n  \"update dynamic fee in before swap\": \"147743\"\n}"
  },
  {
    "path": "snapshots/TestDynamicReturnFees.json",
    "content": "{\n  \"swap with return dynamic fee\": \"145475\"\n}"
  },
  {
    "path": "snapshots/TickBitmapTest.json",
    "content": "{\n  \"flipTick_flippingATickThatResultsInDeletingAWord\": \"5109\",\n  \"flipTick_flippingFirstTickInWordToInitialized\": \"22209\",\n  \"flipTick_flippingSecondTickInWordToInitialized\": \"5178\",\n  \"nextInitializedTickWithinOneWord_lteFalse_forEntireWord\": \"2263\",\n  \"nextInitializedTickWithinOneWord_lteFalse_justBelowBoundary\": \"2252\",\n  \"nextInitializedTickWithinOneWord_lteFalse_onBoundary\": \"2281\",\n  \"nextInitializedTickWithinOneWord_lteTrue_forEntireWord\": \"2258\",\n  \"nextInitializedTickWithinOneWord_lteTrue_justBelowBoundary\": \"2242\",\n  \"nextInitializedTickWithinOneWord_lteTrue_onBoundary_gas\": \"2287\"\n}"
  },
  {
    "path": "snapshots/TickMathTestTest.json",
    "content": "{\n  \"TickMathGetSqrtPriceAtTick\": \"72349\",\n  \"TickMathGetTickAtSqrtPrice\": \"195022\"\n}"
  },
  {
    "path": "snapshots/TickTest.json",
    "content": "{\n  \"tickSpacingToMaxLiquidityPerTick_gasCost60TickSpacing\": \"25\",\n  \"tickSpacingToMaxLiquidityPerTick_gasCostMaxTickSpacing\": \"25\",\n  \"tickSpacingToMaxLiquidityPerTick_gasCostMinTickSpacing\": \"25\"\n}"
  },
  {
    "path": "src/ERC6909.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC6909Claims} from \"./interfaces/external/IERC6909Claims.sol\";\n\n/// @notice Minimalist and gas efficient standard ERC6909 implementation.\n/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC6909.sol)\n/// @dev Copied from the commit at 4b47a19038b798b4a33d9749d25e570443520647\n/// @dev This contract has been modified from the implementation at the above link.\nabstract contract ERC6909 is IERC6909Claims {\n    /*//////////////////////////////////////////////////////////////\n                             ERC6909 STORAGE\n    //////////////////////////////////////////////////////////////*/\n\n    mapping(address owner => mapping(address operator => bool isOperator)) public isOperator;\n\n    mapping(address owner => mapping(uint256 id => uint256 balance)) public balanceOf;\n\n    mapping(address owner => mapping(address spender => mapping(uint256 id => uint256 amount))) public allowance;\n\n    /*//////////////////////////////////////////////////////////////\n                              ERC6909 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function transfer(address receiver, uint256 id, uint256 amount) public virtual returns (bool) {\n        balanceOf[msg.sender][id] -= amount;\n\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, msg.sender, receiver, id, amount);\n\n        return true;\n    }\n\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount) public virtual returns (bool) {\n        if (msg.sender != sender && !isOperator[sender][msg.sender]) {\n            uint256 allowed = allowance[sender][msg.sender][id];\n            if (allowed != type(uint256).max) allowance[sender][msg.sender][id] = allowed - amount;\n        }\n\n        balanceOf[sender][id] -= amount;\n\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, sender, receiver, id, amount);\n\n        return true;\n    }\n\n    function approve(address spender, uint256 id, uint256 amount) public virtual returns (bool) {\n        allowance[msg.sender][spender][id] = amount;\n\n        emit Approval(msg.sender, spender, id, amount);\n\n        return true;\n    }\n\n    function setOperator(address operator, bool approved) public virtual returns (bool) {\n        isOperator[msg.sender][operator] = approved;\n\n        emit OperatorSet(msg.sender, operator, approved);\n\n        return true;\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                              ERC165 LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165\n            || interfaceId == 0x0f632fb3; // ERC165 Interface ID for ERC6909\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                        INTERNAL MINT/BURN LOGIC\n    //////////////////////////////////////////////////////////////*/\n\n    function _mint(address receiver, uint256 id, uint256 amount) internal virtual {\n        balanceOf[receiver][id] += amount;\n\n        emit Transfer(msg.sender, address(0), receiver, id, amount);\n    }\n\n    function _burn(address sender, uint256 id, uint256 amount) internal virtual {\n        balanceOf[sender][id] -= amount;\n\n        emit Transfer(msg.sender, sender, address(0), id, amount);\n    }\n}\n"
  },
  {
    "path": "src/ERC6909Claims.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {ERC6909} from \"./ERC6909.sol\";\n\n/// @notice ERC6909Claims inherits ERC6909 and implements an internal burnFrom function\nabstract contract ERC6909Claims is ERC6909 {\n    /// @notice Burn `amount` tokens of token type `id` from `from`.\n    /// @dev if sender is not `from` they must be an operator or have sufficient allowance.\n    /// @param from The address to burn tokens from.\n    /// @param id The currency to burn.\n    /// @param amount The amount to burn.\n    function _burnFrom(address from, uint256 id, uint256 amount) internal {\n        address sender = msg.sender;\n        if (from != sender && !isOperator[from][sender]) {\n            uint256 senderAllowance = allowance[from][sender][id];\n            if (senderAllowance != type(uint256).max) {\n                allowance[from][sender][id] = senderAllowance - amount;\n            }\n        }\n        _burn(from, id, amount);\n    }\n}\n"
  },
  {
    "path": "src/Extsload.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IExtsload} from \"./interfaces/IExtsload.sol\";\n\n/// @notice Enables public storage access for efficient state retrieval by external contracts.\n/// https://eips.ethereum.org/EIPS/eip-2330#rationale\nabstract contract Extsload is IExtsload {\n    /// @inheritdoc IExtsload\n    function extsload(bytes32 slot) external view returns (bytes32) {\n        assembly (\"memory-safe\") {\n            mstore(0, sload(slot))\n            return(0, 0x20)\n        }\n    }\n\n    /// @inheritdoc IExtsload\n    function extsload(bytes32 startSlot, uint256 nSlots) external view returns (bytes32[] memory) {\n        assembly (\"memory-safe\") {\n            let memptr := mload(0x40)\n            let start := memptr\n            // A left bit-shift of 5 is equivalent to multiplying by 32 but costs less gas.\n            let length := shl(5, nSlots)\n            // The abi offset of dynamic array in the returndata is 32.\n            mstore(memptr, 0x20)\n            // Store the length of the array returned\n            mstore(add(memptr, 0x20), nSlots)\n            // update memptr to the first location to hold a result\n            memptr := add(memptr, 0x40)\n            let end := add(memptr, length)\n            for {} 1 {} {\n                mstore(memptr, sload(startSlot))\n                memptr := add(memptr, 0x20)\n                startSlot := add(startSlot, 1)\n                if iszero(lt(memptr, end)) { break }\n            }\n            return(start, sub(end, start))\n        }\n    }\n\n    /// @inheritdoc IExtsload\n    function extsload(bytes32[] calldata slots) external view returns (bytes32[] memory) {\n        assembly (\"memory-safe\") {\n            let memptr := mload(0x40)\n            let start := memptr\n            // for abi encoding the response - the array will be found at 0x20\n            mstore(memptr, 0x20)\n            // next we store the length of the return array\n            mstore(add(memptr, 0x20), slots.length)\n            // update memptr to the first location to hold an array entry\n            memptr := add(memptr, 0x40)\n            // A left bit-shift of 5 is equivalent to multiplying by 32 but costs less gas.\n            let end := add(memptr, shl(5, slots.length))\n            let calldataptr := slots.offset\n            for {} 1 {} {\n                mstore(memptr, sload(calldataload(calldataptr)))\n                memptr := add(memptr, 0x20)\n                calldataptr := add(calldataptr, 0x20)\n                if iszero(lt(memptr, end)) { break }\n            }\n            return(start, sub(end, start))\n        }\n    }\n}\n"
  },
  {
    "path": "src/Exttload.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IExttload} from \"./interfaces/IExttload.sol\";\n\n/// @notice Enables public transient storage access for efficient state retrieval by external contracts.\n/// https://eips.ethereum.org/EIPS/eip-2330#rationale\nabstract contract Exttload is IExttload {\n    /// @inheritdoc IExttload\n    function exttload(bytes32 slot) external view returns (bytes32) {\n        assembly (\"memory-safe\") {\n            mstore(0, tload(slot))\n            return(0, 0x20)\n        }\n    }\n\n    /// @inheritdoc IExttload\n    function exttload(bytes32[] calldata slots) external view returns (bytes32[] memory) {\n        assembly (\"memory-safe\") {\n            let memptr := mload(0x40)\n            let start := memptr\n            // for abi encoding the response - the array will be found at 0x20\n            mstore(memptr, 0x20)\n            // next we store the length of the return array\n            mstore(add(memptr, 0x20), slots.length)\n            // update memptr to the first location to hold an array entry\n            memptr := add(memptr, 0x40)\n            // A left bit-shift of 5 is equivalent to multiplying by 32 but costs less gas.\n            let end := add(memptr, shl(5, slots.length))\n            let calldataptr := slots.offset\n            for {} 1 {} {\n                mstore(memptr, tload(calldataload(calldataptr)))\n                memptr := add(memptr, 0x20)\n                calldataptr := add(calldataptr, 0x20)\n                if iszero(lt(memptr, end)) { break }\n            }\n            return(start, sub(end, start))\n        }\n    }\n}\n"
  },
  {
    "path": "src/NoDelegateCall.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./libraries/CustomRevert.sol\";\n\n/// @title Prevents delegatecall to a contract\n/// @notice Base contract that provides a modifier for preventing delegatecall to methods in a child contract\nabstract contract NoDelegateCall {\n    using CustomRevert for bytes4;\n\n    error DelegateCallNotAllowed();\n\n    /// @dev The original address of this contract\n    address private immutable original;\n\n    constructor() {\n        // Immutables are computed in the init code of the contract, and then inlined into the deployed bytecode.\n        // In other words, this variable won't change when it's checked at runtime.\n        original = address(this);\n    }\n\n    /// @dev Private method is used instead of inlining into modifier because modifiers are copied into each method,\n    ///     and the use of immutable means the address bytes are copied in every place the modifier is used.\n    function checkNotDelegateCall() private view {\n        if (address(this) != original) DelegateCallNotAllowed.selector.revertWith();\n    }\n\n    /// @notice Prevents delegatecall into the modified method\n    modifier noDelegateCall() {\n        checkNotDelegateCall();\n        _;\n    }\n}\n"
  },
  {
    "path": "src/PoolManager.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity 0.8.26;\n\nimport {Hooks} from \"./libraries/Hooks.sol\";\nimport {Pool} from \"./libraries/Pool.sol\";\nimport {SafeCast} from \"./libraries/SafeCast.sol\";\nimport {Position} from \"./libraries/Position.sol\";\nimport {LPFeeLibrary} from \"./libraries/LPFeeLibrary.sol\";\nimport {Currency, CurrencyLibrary} from \"./types/Currency.sol\";\nimport {PoolKey} from \"./types/PoolKey.sol\";\nimport {TickMath} from \"./libraries/TickMath.sol\";\nimport {NoDelegateCall} from \"./NoDelegateCall.sol\";\nimport {IHooks} from \"./interfaces/IHooks.sol\";\nimport {IPoolManager} from \"./interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"./interfaces/callback/IUnlockCallback.sol\";\nimport {ProtocolFees} from \"./ProtocolFees.sol\";\nimport {ERC6909Claims} from \"./ERC6909Claims.sol\";\nimport {PoolId} from \"./types/PoolId.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"./types/PoolOperation.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"./types/BalanceDelta.sol\";\nimport {BeforeSwapDelta} from \"./types/BeforeSwapDelta.sol\";\nimport {Lock} from \"./libraries/Lock.sol\";\nimport {CurrencyDelta} from \"./libraries/CurrencyDelta.sol\";\nimport {NonzeroDeltaCount} from \"./libraries/NonzeroDeltaCount.sol\";\nimport {CurrencyReserves} from \"./libraries/CurrencyReserves.sol\";\nimport {Extsload} from \"./Extsload.sol\";\nimport {Exttload} from \"./Exttload.sol\";\nimport {CustomRevert} from \"./libraries/CustomRevert.sol\";\n\n//  4\n//   44\n//     444\n//       444                   4444\n//        4444            4444     4444\n//          4444          4444444    4444                           4\n//            4444        44444444     4444                         4\n//             44444       4444444       4444444444444444       444444\n//           4   44444     44444444       444444444444444444444    4444\n//            4    44444    4444444         4444444444444444444444  44444\n//             4     444444  4444444         44444444444444444444444 44  4\n//              44     44444   444444          444444444444444444444 4     4\n//               44      44444   44444           4444444444444444444 4 44\n//                44       4444     44             444444444444444     444\n//                444     4444                        4444444\n//               4444444444444                     44                      4\n//              44444444444                        444444     444444444    44\n//             444444           4444               4444     4444444444      44\n//             4444           44    44              4      44444444444\n//            44444          444444444                   444444444444    4444\n//            44444          44444444                  4444  44444444    444444\n//            44444                                  4444   444444444    44444444\n//           44444                                 4444     44444444    4444444444\n//          44444                                4444      444444444   444444444444\n//         44444                               4444        44444444    444444444444\n//       4444444                             4444          44444444         4444444\n//      4444444                            44444          44444444          4444444\n//     44444444                           44444444444444444444444444444        4444\n//   4444444444                           44444444444444444444444444444         444\n//  444444444444                         444444444444444444444444444444   444   444\n//  44444444444444                                      444444444         44444\n// 44444  44444444444         444                       44444444         444444\n// 44444  4444444444      4444444444      444444        44444444    444444444444\n//  444444444444444      4444  444444    4444444       44444444     444444444444\n//  444444444444444     444    444444     444444       44444444      44444444444\n//   4444444444444     4444   444444        4444                      4444444444\n//    444444444444      4     44444         4444                       444444444\n//     44444444444           444444         444                        44444444\n//      44444444            444444         4444                         4444444\n//                          44444          444                          44444\n//                          44444         444      4                    4444\n//                          44444        444      44                   444\n//                          44444       444      4444\n//                           444444  44444        444\n//                             444444444           444\n//                                                  44444   444\n//                                                      444\n\n/// @title PoolManager\n/// @notice Holds the state for all pools\ncontract PoolManager is IPoolManager, ProtocolFees, NoDelegateCall, ERC6909Claims, Extsload, Exttload {\n    using SafeCast for *;\n    using Pool for *;\n    using Hooks for IHooks;\n    using CurrencyDelta for Currency;\n    using LPFeeLibrary for uint24;\n    using CurrencyReserves for Currency;\n    using CustomRevert for bytes4;\n\n    int24 private constant MAX_TICK_SPACING = TickMath.MAX_TICK_SPACING;\n\n    int24 private constant MIN_TICK_SPACING = TickMath.MIN_TICK_SPACING;\n\n    mapping(PoolId id => Pool.State) internal _pools;\n\n    /// @notice This will revert if the contract is locked\n    modifier onlyWhenUnlocked() {\n        if (!Lock.isUnlocked()) ManagerLocked.selector.revertWith();\n        _;\n    }\n\n    constructor(address initialOwner) ProtocolFees(initialOwner) {}\n\n    /// @inheritdoc IPoolManager\n    function unlock(bytes calldata data) external override returns (bytes memory result) {\n        if (Lock.isUnlocked()) AlreadyUnlocked.selector.revertWith();\n\n        Lock.unlock();\n\n        // the caller does everything in this callback, including paying what they owe via calls to settle\n        result = IUnlockCallback(msg.sender).unlockCallback(data);\n\n        if (NonzeroDeltaCount.read() != 0) CurrencyNotSettled.selector.revertWith();\n        Lock.lock();\n    }\n\n    /// @inheritdoc IPoolManager\n    function initialize(PoolKey memory key, uint160 sqrtPriceX96) external noDelegateCall returns (int24 tick) {\n        // see TickBitmap.sol for overflow conditions that can arise from tick spacing being too large\n        if (key.tickSpacing > MAX_TICK_SPACING) TickSpacingTooLarge.selector.revertWith(key.tickSpacing);\n        if (key.tickSpacing < MIN_TICK_SPACING) TickSpacingTooSmall.selector.revertWith(key.tickSpacing);\n        if (key.currency0 >= key.currency1) {\n            CurrenciesOutOfOrderOrEqual.selector.revertWith(\n                Currency.unwrap(key.currency0), Currency.unwrap(key.currency1)\n            );\n        }\n        if (!key.hooks.isValidHookAddress(key.fee)) Hooks.HookAddressNotValid.selector.revertWith(address(key.hooks));\n\n        uint24 lpFee = key.fee.getInitialLPFee();\n\n        key.hooks.beforeInitialize(key, sqrtPriceX96);\n\n        PoolId id = key.toId();\n\n        tick = _pools[id].initialize(sqrtPriceX96, lpFee);\n\n        // event is emitted before the afterInitialize call to ensure events are always emitted in order\n        // emit all details of a pool key. poolkeys are not saved in storage and must always be provided by the caller\n        // the key's fee may be a static fee or a sentinel to denote a dynamic fee.\n        emit Initialize(id, key.currency0, key.currency1, key.fee, key.tickSpacing, key.hooks, sqrtPriceX96, tick);\n\n        key.hooks.afterInitialize(key, sqrtPriceX96, tick);\n    }\n\n    /// @inheritdoc IPoolManager\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes calldata hookData)\n        external\n        onlyWhenUnlocked\n        noDelegateCall\n        returns (BalanceDelta callerDelta, BalanceDelta feesAccrued)\n    {\n        PoolId id = key.toId();\n        {\n            Pool.State storage pool = _getPool(id);\n            pool.checkPoolInitialized();\n\n            key.hooks.beforeModifyLiquidity(key, params, hookData);\n\n            BalanceDelta principalDelta;\n            (principalDelta, feesAccrued) = pool.modifyLiquidity(\n                Pool.ModifyLiquidityParams({\n                    owner: msg.sender,\n                    tickLower: params.tickLower,\n                    tickUpper: params.tickUpper,\n                    liquidityDelta: params.liquidityDelta.toInt128(),\n                    tickSpacing: key.tickSpacing,\n                    salt: params.salt\n                })\n            );\n\n            // fee delta and principal delta are both accrued to the caller\n            callerDelta = principalDelta + feesAccrued;\n        }\n\n        // event is emitted before the afterModifyLiquidity call to ensure events are always emitted in order\n        emit ModifyLiquidity(id, msg.sender, params.tickLower, params.tickUpper, params.liquidityDelta, params.salt);\n\n        BalanceDelta hookDelta;\n        (callerDelta, hookDelta) = key.hooks.afterModifyLiquidity(key, params, callerDelta, feesAccrued, hookData);\n\n        // if the hook doesn't have the flag to be able to return deltas, hookDelta will always be 0\n        if (hookDelta != BalanceDeltaLibrary.ZERO_DELTA) _accountPoolBalanceDelta(key, hookDelta, address(key.hooks));\n\n        _accountPoolBalanceDelta(key, callerDelta, msg.sender);\n    }\n\n    /// @inheritdoc IPoolManager\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata hookData)\n        external\n        onlyWhenUnlocked\n        noDelegateCall\n        returns (BalanceDelta swapDelta)\n    {\n        if (params.amountSpecified == 0) SwapAmountCannotBeZero.selector.revertWith();\n        PoolId id = key.toId();\n        Pool.State storage pool = _getPool(id);\n        pool.checkPoolInitialized();\n\n        BeforeSwapDelta beforeSwapDelta;\n        {\n            int256 amountToSwap;\n            uint24 lpFeeOverride;\n            (amountToSwap, beforeSwapDelta, lpFeeOverride) = key.hooks.beforeSwap(key, params, hookData);\n\n            // execute swap, account protocol fees, and emit swap event\n            // _swap is needed to avoid stack too deep error\n            swapDelta = _swap(\n                pool,\n                id,\n                Pool.SwapParams({\n                    tickSpacing: key.tickSpacing,\n                    zeroForOne: params.zeroForOne,\n                    amountSpecified: amountToSwap,\n                    sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n                    lpFeeOverride: lpFeeOverride\n                }),\n                params.zeroForOne ? key.currency0 : key.currency1 // input token\n            );\n        }\n\n        BalanceDelta hookDelta;\n        (swapDelta, hookDelta) = key.hooks.afterSwap(key, params, swapDelta, hookData, beforeSwapDelta);\n\n        // if the hook doesn't have the flag to be able to return deltas, hookDelta will always be 0\n        if (hookDelta != BalanceDeltaLibrary.ZERO_DELTA) _accountPoolBalanceDelta(key, hookDelta, address(key.hooks));\n\n        _accountPoolBalanceDelta(key, swapDelta, msg.sender);\n    }\n\n    /// @notice Internal swap function to execute a swap, take protocol fees on input token, and emit the swap event\n    function _swap(Pool.State storage pool, PoolId id, Pool.SwapParams memory params, Currency inputCurrency)\n        internal\n        returns (BalanceDelta)\n    {\n        (BalanceDelta delta, uint256 amountToProtocol, uint24 swapFee, Pool.SwapResult memory result) =\n            pool.swap(params);\n\n        // the fee is on the input currency\n        if (amountToProtocol > 0) _updateProtocolFees(inputCurrency, amountToProtocol);\n\n        // event is emitted before the afterSwap call to ensure events are always emitted in order\n        emit Swap(\n            id,\n            msg.sender,\n            delta.amount0(),\n            delta.amount1(),\n            result.sqrtPriceX96,\n            result.liquidity,\n            result.tick,\n            swapFee\n        );\n\n        return delta;\n    }\n\n    /// @inheritdoc IPoolManager\n    function donate(PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        external\n        onlyWhenUnlocked\n        noDelegateCall\n        returns (BalanceDelta delta)\n    {\n        PoolId poolId = key.toId();\n        Pool.State storage pool = _getPool(poolId);\n        pool.checkPoolInitialized();\n\n        key.hooks.beforeDonate(key, amount0, amount1, hookData);\n\n        delta = pool.donate(amount0, amount1);\n\n        _accountPoolBalanceDelta(key, delta, msg.sender);\n\n        // event is emitted before the afterDonate call to ensure events are always emitted in order\n        emit Donate(poolId, msg.sender, amount0, amount1);\n\n        key.hooks.afterDonate(key, amount0, amount1, hookData);\n    }\n\n    /// @inheritdoc IPoolManager\n    function sync(Currency currency) external {\n        // address(0) is used for the native currency\n        if (currency.isAddressZero()) {\n            // The reserves balance is not used for native settling, so we only need to reset the currency.\n            CurrencyReserves.resetCurrency();\n        } else {\n            uint256 balance = currency.balanceOfSelf();\n            CurrencyReserves.syncCurrencyAndReserves(currency, balance);\n        }\n    }\n\n    /// @inheritdoc IPoolManager\n    function take(Currency currency, address to, uint256 amount) external onlyWhenUnlocked {\n        unchecked {\n            // negation must be safe as amount is not negative\n            _accountDelta(currency, -(amount.toInt128()), msg.sender);\n            currency.transfer(to, amount);\n        }\n    }\n\n    /// @inheritdoc IPoolManager\n    function settle() external payable onlyWhenUnlocked returns (uint256) {\n        return _settle(msg.sender);\n    }\n\n    /// @inheritdoc IPoolManager\n    function settleFor(address recipient) external payable onlyWhenUnlocked returns (uint256) {\n        return _settle(recipient);\n    }\n\n    /// @inheritdoc IPoolManager\n    function clear(Currency currency, uint256 amount) external onlyWhenUnlocked {\n        int256 current = currency.getDelta(msg.sender);\n        // Because input is `uint256`, only positive amounts can be cleared.\n        int128 amountDelta = amount.toInt128();\n        if (amountDelta != current) MustClearExactPositiveDelta.selector.revertWith();\n        // negation must be safe as amountDelta is positive\n        unchecked {\n            _accountDelta(currency, -(amountDelta), msg.sender);\n        }\n    }\n\n    /// @inheritdoc IPoolManager\n    function mint(address to, uint256 id, uint256 amount) external onlyWhenUnlocked {\n        unchecked {\n            Currency currency = CurrencyLibrary.fromId(id);\n            // negation must be safe as amount is not negative\n            _accountDelta(currency, -(amount.toInt128()), msg.sender);\n            _mint(to, currency.toId(), amount);\n        }\n    }\n\n    /// @inheritdoc IPoolManager\n    function burn(address from, uint256 id, uint256 amount) external onlyWhenUnlocked {\n        Currency currency = CurrencyLibrary.fromId(id);\n        _accountDelta(currency, amount.toInt128(), msg.sender);\n        _burnFrom(from, currency.toId(), amount);\n    }\n\n    /// @inheritdoc IPoolManager\n    function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external {\n        if (!key.fee.isDynamicFee() || msg.sender != address(key.hooks)) {\n            UnauthorizedDynamicLPFeeUpdate.selector.revertWith();\n        }\n        newDynamicLPFee.validate();\n        PoolId id = key.toId();\n        _pools[id].setLPFee(newDynamicLPFee);\n    }\n\n    // if settling native, integrators should still call `sync` first to avoid DoS attack vectors\n    function _settle(address recipient) internal returns (uint256 paid) {\n        Currency currency = CurrencyReserves.getSyncedCurrency();\n\n        // if not previously synced, or the syncedCurrency slot has been reset, expects native currency to be settled\n        if (currency.isAddressZero()) {\n            paid = msg.value;\n        } else {\n            if (msg.value > 0) NonzeroNativeValue.selector.revertWith();\n            // Reserves are guaranteed to be set because currency and reserves are always set together\n            uint256 reservesBefore = CurrencyReserves.getSyncedReserves();\n            uint256 reservesNow = currency.balanceOfSelf();\n            paid = reservesNow - reservesBefore;\n            CurrencyReserves.resetCurrency();\n        }\n\n        _accountDelta(currency, paid.toInt128(), recipient);\n    }\n\n    /// @notice Adds a balance delta in a currency for a target address\n    function _accountDelta(Currency currency, int128 delta, address target) internal {\n        if (delta == 0) return;\n\n        (int256 previous, int256 next) = currency.applyDelta(target, delta);\n\n        if (next == 0) {\n            NonzeroDeltaCount.decrement();\n        } else if (previous == 0) {\n            NonzeroDeltaCount.increment();\n        }\n    }\n\n    /// @notice Accounts the deltas of 2 currencies to a target address\n    function _accountPoolBalanceDelta(PoolKey memory key, BalanceDelta delta, address target) internal {\n        _accountDelta(key.currency0, delta.amount0(), target);\n        _accountDelta(key.currency1, delta.amount1(), target);\n    }\n\n    /// @notice Implementation of the _getPool function defined in ProtocolFees\n    function _getPool(PoolId id) internal view override returns (Pool.State storage) {\n        return _pools[id];\n    }\n\n    /// @notice Implementation of the _isUnlocked function defined in ProtocolFees\n    function _isUnlocked() internal view override returns (bool) {\n        return Lock.isUnlocked();\n    }\n}\n"
  },
  {
    "path": "src/ProtocolFees.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"./types/Currency.sol\";\nimport {CurrencyReserves} from \"./libraries/CurrencyReserves.sol\";\nimport {IProtocolFees} from \"./interfaces/IProtocolFees.sol\";\nimport {PoolKey} from \"./types/PoolKey.sol\";\nimport {ProtocolFeeLibrary} from \"./libraries/ProtocolFeeLibrary.sol\";\nimport {Owned} from \"solmate/src/auth/Owned.sol\";\nimport {PoolId} from \"./types/PoolId.sol\";\nimport {Pool} from \"./libraries/Pool.sol\";\nimport {CustomRevert} from \"./libraries/CustomRevert.sol\";\n\n/// @notice Contract handling the setting and accrual of protocol fees\nabstract contract ProtocolFees is IProtocolFees, Owned {\n    using ProtocolFeeLibrary for uint24;\n    using Pool for Pool.State;\n    using CustomRevert for bytes4;\n\n    /// @inheritdoc IProtocolFees\n    mapping(Currency currency => uint256 amount) public protocolFeesAccrued;\n\n    /// @inheritdoc IProtocolFees\n    address public protocolFeeController;\n\n    constructor(address initialOwner) Owned(initialOwner) {}\n\n    /// @inheritdoc IProtocolFees\n    function setProtocolFeeController(address controller) external onlyOwner {\n        protocolFeeController = controller;\n        emit ProtocolFeeControllerUpdated(controller);\n    }\n\n    /// @inheritdoc IProtocolFees\n    function setProtocolFee(PoolKey memory key, uint24 newProtocolFee) external {\n        if (msg.sender != protocolFeeController) InvalidCaller.selector.revertWith();\n        if (!newProtocolFee.isValidProtocolFee()) ProtocolFeeTooLarge.selector.revertWith(newProtocolFee);\n        PoolId id = key.toId();\n        _getPool(id).setProtocolFee(newProtocolFee);\n        emit ProtocolFeeUpdated(id, newProtocolFee);\n    }\n\n    /// @inheritdoc IProtocolFees\n    function collectProtocolFees(address recipient, Currency currency, uint256 amount)\n        external\n        returns (uint256 amountCollected)\n    {\n        if (msg.sender != protocolFeeController) InvalidCaller.selector.revertWith();\n        if (!currency.isAddressZero() && CurrencyReserves.getSyncedCurrency() == currency) {\n            // prevent transfer between the sync and settle balanceOfs (native settle uses msg.value)\n            ProtocolFeeCurrencySynced.selector.revertWith();\n        }\n\n        amountCollected = (amount == 0) ? protocolFeesAccrued[currency] : amount;\n        protocolFeesAccrued[currency] -= amountCollected;\n        currency.transfer(recipient, amountCollected);\n    }\n\n    /// @dev abstract internal function to allow the ProtocolFees contract to access the lock\n    function _isUnlocked() internal virtual returns (bool);\n\n    /// @dev abstract internal function to allow the ProtocolFees contract to access pool state\n    /// @dev this is overridden in PoolManager.sol to give access to the _pools mapping\n    function _getPool(PoolId id) internal virtual returns (Pool.State storage);\n\n    function _updateProtocolFees(Currency currency, uint256 amount) internal {\n        unchecked {\n            protocolFeesAccrued[currency] += amount;\n        }\n    }\n}\n"
  },
  {
    "path": "src/interfaces/IExtsload.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for functions to access any storage slot in a contract\ninterface IExtsload {\n    /// @notice Called by external contracts to access granular pool state\n    /// @param slot Key of slot to sload\n    /// @return value The value of the slot as bytes32\n    function extsload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access granular pool state\n    /// @param startSlot Key of slot to start sloading from\n    /// @param nSlots Number of slots to load into return value\n    /// @return values List of loaded values.\n    function extsload(bytes32 startSlot, uint256 nSlots) external view returns (bytes32[] memory values);\n\n    /// @notice Called by external contracts to access sparse pool state\n    /// @param slots List of slots to SLOAD from.\n    /// @return values List of loaded values.\n    function extsload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"
  },
  {
    "path": "src/interfaces/IExttload.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n/// @notice Interface for functions to access any transient storage slot in a contract\ninterface IExttload {\n    /// @notice Called by external contracts to access transient storage of the contract\n    /// @param slot Key of slot to tload\n    /// @return value The value of the slot as bytes32\n    function exttload(bytes32 slot) external view returns (bytes32 value);\n\n    /// @notice Called by external contracts to access sparse transient pool state\n    /// @param slots List of slots to tload\n    /// @return values List of loaded values\n    function exttload(bytes32[] calldata slots) external view returns (bytes32[] memory values);\n}\n"
  },
  {
    "path": "src/interfaces/IHooks.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {BeforeSwapDelta} from \"../types/BeforeSwapDelta.sol\";\n\n/// @notice V4 decides whether to invoke specific hooks by inspecting the least significant bits\n/// of the address that the hooks contract is deployed to.\n/// For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400\n/// has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.\n/// See the Hooks library for the full spec.\n/// @dev Should only be callable by the v4 PoolManager.\ninterface IHooks {\n    /// @notice The hook called before the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @return bytes4 The function selector for the hook\n    function beforeInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96) external returns (bytes4);\n\n    /// @notice The hook called after the state of a pool is initialized\n    /// @param sender The initial msg.sender for the initialize call\n    /// @param key The key for the pool being initialized\n    /// @param sqrtPriceX96 The sqrt(price) of the pool as a Q64.96\n    /// @param tick The current tick after the state of a pool is initialized\n    /// @return bytes4 The function selector for the hook\n    function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96, int24 tick)\n        external\n        returns (bytes4);\n\n    /// @notice The hook called before liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is added\n    /// @param sender The initial msg.sender for the add liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for adding liquidity\n    /// @param delta The caller's balance delta after adding liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterAddLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after liquidity is removed\n    /// @param sender The initial msg.sender for the remove liquidity call\n    /// @param key The key for the pool\n    /// @param params The parameters for removing liquidity\n    /// @param delta The caller's balance delta after removing liquidity; the sum of principal delta, fees accrued, and hook delta\n    /// @param feesAccrued The fees accrued since the last time fees were collected from this position\n    /// @param hookData Arbitrary data handed into the PoolManager by the liquidity provider to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BalanceDelta The hook's delta in token0 and token1. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterRemoveLiquidity(\n        address sender,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) external returns (bytes4, BalanceDelta);\n\n    /// @notice The hook called before a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return BeforeSwapDelta The hook's delta in specified and unspecified currencies. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    /// @return uint24 Optionally override the lp fee, only used if three conditions are met: 1. the Pool has a dynamic fee, 2. the value's 2nd highest bit is set (23rd bit, 0x400000), and 3. the value is less than or equal to the maximum fee (1 million)\n    function beforeSwap(address sender, PoolKey calldata key, SwapParams calldata params, bytes calldata hookData)\n        external\n        returns (bytes4, BeforeSwapDelta, uint24);\n\n    /// @notice The hook called after a swap\n    /// @param sender The initial msg.sender for the swap call\n    /// @param key The key for the pool\n    /// @param params The parameters for the swap\n    /// @param delta The amount owed to the caller (positive) or owed to the pool (negative)\n    /// @param hookData Arbitrary data handed into the PoolManager by the swapper to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    /// @return int128 The hook's delta in unspecified currency. Positive: the hook is owed/took currency, negative: the hook owes/sent currency\n    function afterSwap(\n        address sender,\n        PoolKey calldata key,\n        SwapParams calldata params,\n        BalanceDelta delta,\n        bytes calldata hookData\n    ) external returns (bytes4, int128);\n\n    /// @notice The hook called before donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function beforeDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n\n    /// @notice The hook called after donate\n    /// @param sender The initial msg.sender for the donate call\n    /// @param key The key for the pool\n    /// @param amount0 The amount of token0 being donated\n    /// @param amount1 The amount of token1 being donated\n    /// @param hookData Arbitrary data handed into the PoolManager by the donor to be be passed on to the hook\n    /// @return bytes4 The function selector for the hook\n    function afterDonate(\n        address sender,\n        PoolKey calldata key,\n        uint256 amount0,\n        uint256 amount1,\n        bytes calldata hookData\n    ) external returns (bytes4);\n}\n"
  },
  {
    "path": "src/interfaces/IPoolManager.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {IHooks} from \"./IHooks.sol\";\nimport {IERC6909Claims} from \"./external/IERC6909Claims.sol\";\nimport {IProtocolFees} from \"./IProtocolFees.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IExtsload} from \"./IExtsload.sol\";\nimport {IExttload} from \"./IExttload.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\n\n/// @notice Interface for the PoolManager\ninterface IPoolManager is IProtocolFees, IERC6909Claims, IExtsload, IExttload {\n    /// @notice Thrown when a currency is not netted out after the contract is unlocked\n    error CurrencyNotSettled();\n\n    /// @notice Thrown when trying to interact with a non-initialized pool\n    error PoolNotInitialized();\n\n    /// @notice Thrown when unlock is called, but the contract is already unlocked\n    error AlreadyUnlocked();\n\n    /// @notice Thrown when a function is called that requires the contract to be unlocked, but it is not\n    error ManagerLocked();\n\n    /// @notice Pools are limited to type(int16).max tickSpacing in #initialize, to prevent overflow\n    error TickSpacingTooLarge(int24 tickSpacing);\n\n    /// @notice Pools must have a positive non-zero tickSpacing passed to #initialize\n    error TickSpacingTooSmall(int24 tickSpacing);\n\n    /// @notice PoolKey must have currencies where address(currency0) < address(currency1)\n    error CurrenciesOutOfOrderOrEqual(address currency0, address currency1);\n\n    /// @notice Thrown when a call to updateDynamicLPFee is made by an address that is not the hook,\n    /// or on a pool that does not have a dynamic swap fee.\n    error UnauthorizedDynamicLPFeeUpdate();\n\n    /// @notice Thrown when trying to swap amount of 0\n    error SwapAmountCannotBeZero();\n\n    ///@notice Thrown when native currency is passed to a non native settlement\n    error NonzeroNativeValue();\n\n    /// @notice Thrown when `clear` is called with an amount that is not exactly equal to the open currency delta.\n    error MustClearExactPositiveDelta();\n\n    /// @notice Emitted when a new pool is initialized\n    /// @param id The abi encoded hash of the pool key struct for the new pool\n    /// @param currency0 The first currency of the pool by address sort order\n    /// @param currency1 The second currency of the pool by address sort order\n    /// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip\n    /// @param tickSpacing The minimum number of ticks between initialized ticks\n    /// @param hooks The hooks contract address for the pool, or address(0) if none\n    /// @param sqrtPriceX96 The price of the pool on initialization\n    /// @param tick The initial tick of the pool corresponding to the initialized price\n    event Initialize(\n        PoolId indexed id,\n        Currency indexed currency0,\n        Currency indexed currency1,\n        uint24 fee,\n        int24 tickSpacing,\n        IHooks hooks,\n        uint160 sqrtPriceX96,\n        int24 tick\n    );\n\n    /// @notice Emitted when a liquidity position is modified\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that modified the pool\n    /// @param tickLower The lower tick of the position\n    /// @param tickUpper The upper tick of the position\n    /// @param liquidityDelta The amount of liquidity that was added or removed\n    /// @param salt The extra data to make positions unique\n    event ModifyLiquidity(\n        PoolId indexed id, address indexed sender, int24 tickLower, int24 tickUpper, int256 liquidityDelta, bytes32 salt\n    );\n\n    /// @notice Emitted for swaps between currency0 and currency1\n    /// @param id The abi encoded hash of the pool key struct for the pool that was modified\n    /// @param sender The address that initiated the swap call, and that received the callback\n    /// @param amount0 The delta of the currency0 balance of the pool\n    /// @param amount1 The delta of the currency1 balance of the pool\n    /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\n    /// @param liquidity The liquidity of the pool after the swap\n    /// @param tick The log base 1.0001 of the price of the pool after the swap\n    /// @param fee The swap fee in hundredths of a bip\n    event Swap(\n        PoolId indexed id,\n        address indexed sender,\n        int128 amount0,\n        int128 amount1,\n        uint160 sqrtPriceX96,\n        uint128 liquidity,\n        int24 tick,\n        uint24 fee\n    );\n\n    /// @notice Emitted for donations\n    /// @param id The abi encoded hash of the pool key struct for the pool that was donated to\n    /// @param sender The address that initiated the donate call\n    /// @param amount0 The amount donated in currency0\n    /// @param amount1 The amount donated in currency1\n    event Donate(PoolId indexed id, address indexed sender, uint256 amount0, uint256 amount1);\n\n    /// @notice All interactions on the contract that account deltas require unlocking. A caller that calls `unlock` must implement\n    /// `IUnlockCallback(msg.sender).unlockCallback(data)`, where they interact with the remaining functions on this contract.\n    /// @dev The only functions callable without an unlocking are `initialize` and `updateDynamicLPFee`\n    /// @param data Any data to pass to the callback, via `IUnlockCallback(msg.sender).unlockCallback(data)`\n    /// @return The data returned by the call to `IUnlockCallback(msg.sender).unlockCallback(data)`\n    function unlock(bytes calldata data) external returns (bytes memory);\n\n    /// @notice Initialize the state for a given pool ID\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The pool key for the pool to initialize\n    /// @param sqrtPriceX96 The initial square root price\n    /// @return tick The initial tick of the pool\n    function initialize(PoolKey memory key, uint160 sqrtPriceX96) external returns (int24 tick);\n\n    /// @notice Modify the liquidity for the given pool\n    /// @dev Poke by calling with a zero liquidityDelta\n    /// @param key The pool to modify liquidity in\n    /// @param params The parameters for modifying the liquidity\n    /// @param hookData The data to pass through to the add/removeLiquidity hooks\n    /// @return callerDelta The balance delta of the caller of modifyLiquidity. This is the total of both principal, fee deltas, and hook deltas if applicable\n    /// @return feesAccrued The balance delta of the fees generated in the liquidity range. Returned for informational purposes\n    /// @dev Note that feesAccrued can be artificially inflated by a malicious actor and integrators should be careful using the value\n    /// For pools with a single liquidity position, actors can donate to themselves to inflate feeGrowthGlobal (and consequently feesAccrued)\n    /// atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta callerDelta, BalanceDelta feesAccrued);\n\n    /// @notice Swap against the given pool\n    /// @param key The pool to swap in\n    /// @param params The parameters for swapping\n    /// @param hookData The data to pass through to the swap hooks\n    /// @return swapDelta The balance delta of the address swapping\n    /// @dev Swapping on low liquidity pools may cause unexpected swap amounts when liquidity available is less than amountSpecified.\n    /// Additionally note that if interacting with hooks that have the BEFORE_SWAP_RETURNS_DELTA_FLAG or AFTER_SWAP_RETURNS_DELTA_FLAG\n    /// the hook may alter the swap input/output. Integrators should perform checks on the returned swapDelta.\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata hookData)\n        external\n        returns (BalanceDelta swapDelta);\n\n    /// @notice Donate the given currency amounts to the in-range liquidity providers of a pool\n    /// @dev Calls to donate can be frontrun adding just-in-time liquidity, with the aim of receiving a portion donated funds.\n    /// Donors should keep this in mind when designing donation mechanisms.\n    /// @dev This function donates to in-range LPs at slot0.tick. In certain edge-cases of the swap algorithm, the `sqrtPrice` of\n    /// a pool can be at the lower boundary of tick `n`, but the `slot0.tick` of the pool is already `n - 1`. In this case a call to\n    /// `donate` would donate to tick `n - 1` (slot0.tick) not tick `n` (getTickAtSqrtPrice(slot0.sqrtPriceX96)).\n    /// Read the comments in `Pool.swap()` for more information about this.\n    /// @param key The key of the pool to donate to\n    /// @param amount0 The amount of currency0 to donate\n    /// @param amount1 The amount of currency1 to donate\n    /// @param hookData The data to pass through to the donate hooks\n    /// @return BalanceDelta The delta of the caller after the donate\n    function donate(PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        external\n        returns (BalanceDelta);\n\n    /// @notice Writes the current ERC20 balance of the specified currency to transient storage\n    /// This is used to checkpoint balances for the manager and derive deltas for the caller.\n    /// @dev This MUST be called before any ERC20 tokens are sent into the contract, but can be skipped\n    /// for native tokens because the amount to settle is determined by the sent value.\n    /// However, if an ERC20 token has been synced and not settled, and the caller instead wants to settle\n    /// native funds, this function can be called with the native currency to then be able to settle the native currency\n    function sync(Currency currency) external;\n\n    /// @notice Called by the user to net out some value owed to the user\n    /// @dev Will revert if the requested amount is not available, consider using `mint` instead\n    /// @dev Can also be used as a mechanism for free flash loans\n    /// @param currency The currency to withdraw from the pool manager\n    /// @param to The address to withdraw to\n    /// @param amount The amount of currency to withdraw\n    function take(Currency currency, address to, uint256 amount) external;\n\n    /// @notice Called by the user to pay what is owed\n    /// @return paid The amount of currency settled\n    function settle() external payable returns (uint256 paid);\n\n    /// @notice Called by the user to pay on behalf of another address\n    /// @param recipient The address to credit for the payment\n    /// @return paid The amount of currency settled\n    function settleFor(address recipient) external payable returns (uint256 paid);\n\n    /// @notice WARNING - Any currency that is cleared, will be non-retrievable, and locked in the contract permanently.\n    /// A call to clear will zero out a positive balance WITHOUT a corresponding transfer.\n    /// @dev This could be used to clear a balance that is considered dust.\n    /// Additionally, the amount must be the exact positive balance. This is to enforce that the caller is aware of the amount being cleared.\n    function clear(Currency currency, uint256 amount) external;\n\n    /// @notice Called by the user to move value into ERC6909 balance\n    /// @param to The address to mint the tokens to\n    /// @param id The currency address to mint to ERC6909s, as a uint256\n    /// @param amount The amount of currency to mint\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function mint(address to, uint256 id, uint256 amount) external;\n\n    /// @notice Called by the user to move value from ERC6909 balance\n    /// @param from The address to burn the tokens from\n    /// @param id The currency address to burn from ERC6909s, as a uint256\n    /// @param amount The amount of currency to burn\n    /// @dev The id is converted to a uint160 to correspond to a currency address\n    /// If the upper 12 bytes are not 0, they will be 0-ed out\n    function burn(address from, uint256 id, uint256 amount) external;\n\n    /// @notice Updates the pools lp fees for the a pool that has enabled dynamic lp fees.\n    /// @dev A swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n    /// @param key The key of the pool to update dynamic LP fees for\n    /// @param newDynamicLPFee The new dynamic pool LP fee\n    function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external;\n}\n"
  },
  {
    "path": "src/interfaces/IProtocolFees.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\n\n/// @notice Interface for all protocol-fee related functions in the pool manager\ninterface IProtocolFees {\n    /// @notice Thrown when protocol fee is set too high\n    error ProtocolFeeTooLarge(uint24 fee);\n\n    /// @notice Thrown when collectProtocolFees or setProtocolFee is not called by the controller.\n    error InvalidCaller();\n\n    /// @notice Thrown when collectProtocolFees is attempted on a token that is synced.\n    error ProtocolFeeCurrencySynced();\n\n    /// @notice Emitted when the protocol fee controller address is updated in setProtocolFeeController.\n    event ProtocolFeeControllerUpdated(address indexed protocolFeeController);\n\n    /// @notice Emitted when the protocol fee is updated for a pool.\n    event ProtocolFeeUpdated(PoolId indexed id, uint24 protocolFee);\n\n    /// @notice Given a currency address, returns the protocol fees accrued in that currency\n    /// @param currency The currency to check\n    /// @return amount The amount of protocol fees accrued in the currency\n    function protocolFeesAccrued(Currency currency) external view returns (uint256 amount);\n\n    /// @notice Sets the protocol fee for the given pool\n    /// @param key The key of the pool to set a protocol fee for\n    /// @param newProtocolFee The fee to set\n    function setProtocolFee(PoolKey memory key, uint24 newProtocolFee) external;\n\n    /// @notice Sets the protocol fee controller\n    /// @param controller The new protocol fee controller\n    function setProtocolFeeController(address controller) external;\n\n    /// @notice Collects the protocol fees for a given recipient and currency, returning the amount collected\n    /// @dev This will revert if the contract is unlocked\n    /// @param recipient The address to receive the protocol fees\n    /// @param currency The currency to withdraw\n    /// @param amount The amount of currency to withdraw\n    /// @return amountCollected The amount of currency successfully withdrawn\n    function collectProtocolFees(address recipient, Currency currency, uint256 amount)\n        external\n        returns (uint256 amountCollected);\n\n    /// @notice Returns the current protocol fee controller address\n    /// @return address The current protocol fee controller address\n    function protocolFeeController() external view returns (address);\n}\n"
  },
  {
    "path": "src/interfaces/callback/IUnlockCallback.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for the callback executed when an address unlocks the pool manager\ninterface IUnlockCallback {\n    /// @notice Called by the pool manager on `msg.sender` when the manager is unlocked\n    /// @param data The data that was passed to the call to unlock\n    /// @return Any data that you want to be returned from the unlock call\n    function unlockCallback(bytes calldata data) external returns (bytes memory);\n}\n"
  },
  {
    "path": "src/interfaces/external/IERC20Minimal.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Minimal ERC20 interface for Uniswap\n/// @notice Contains a subset of the full ERC20 interface that is used in Uniswap V3\ninterface IERC20Minimal {\n    /// @notice Returns an account's balance in the token\n    /// @param account The account for which to look up the number of tokens it has, i.e. its balance\n    /// @return The number of tokens held by the account\n    function balanceOf(address account) external view returns (uint256);\n\n    /// @notice Transfers the amount of token from the `msg.sender` to the recipient\n    /// @param recipient The account that will receive the amount transferred\n    /// @param amount The number of tokens to send from the sender to the recipient\n    /// @return Returns true for a successful transfer, false for an unsuccessful transfer\n    function transfer(address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Returns the current allowance given to a spender by an owner\n    /// @param owner The account of the token owner\n    /// @param spender The account of the token spender\n    /// @return The current allowance granted by `owner` to `spender`\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /// @notice Sets the allowance of a spender from the `msg.sender` to the value `amount`\n    /// @param spender The account which will be allowed to spend a given amount of the owners tokens\n    /// @param amount The amount of tokens allowed to be used by `spender`\n    /// @return Returns true for a successful approval, false for unsuccessful\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /// @notice Transfers `amount` tokens from `sender` to `recipient` up to the allowance given to the `msg.sender`\n    /// @param sender The account from which the transfer will be initiated\n    /// @param recipient The recipient of the transfer\n    /// @param amount The amount of the transfer\n    /// @return Returns true for a successful transfer, false for unsuccessful\n    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n    /// @notice Event emitted when tokens are transferred from one address to another, either via `#transfer` or `#transferFrom`.\n    /// @param from The account from which the tokens were sent, i.e. the balance decreased\n    /// @param to The account to which the tokens were sent, i.e. the balance increased\n    /// @param value The amount of tokens that were transferred\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /// @notice Event emitted when the approval amount for the spender of a given owner's tokens changes.\n    /// @param owner The account that approved spending of its tokens\n    /// @param spender The account for which the spending allowance was modified\n    /// @param value The new allowance from the owner to the spender\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"
  },
  {
    "path": "src/interfaces/external/IERC6909Claims.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Interface for claims over a contract balance, wrapped as a ERC6909\ninterface IERC6909Claims {\n    /*//////////////////////////////////////////////////////////////\n                                 EVENTS\n    //////////////////////////////////////////////////////////////*/\n\n    event OperatorSet(address indexed owner, address indexed operator, bool approved);\n\n    event Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount);\n\n    event Transfer(address caller, address indexed from, address indexed to, uint256 indexed id, uint256 amount);\n\n    /*//////////////////////////////////////////////////////////////\n                                 FUNCTIONS\n    //////////////////////////////////////////////////////////////*/\n\n    /// @notice Owner balance of an id.\n    /// @param owner The address of the owner.\n    /// @param id The id of the token.\n    /// @return amount The balance of the token.\n    function balanceOf(address owner, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Spender allowance of an id.\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @return amount The allowance of the token.\n    function allowance(address owner, address spender, uint256 id) external view returns (uint256 amount);\n\n    /// @notice Checks if a spender is approved by an owner as an operator\n    /// @param owner The address of the owner.\n    /// @param spender The address of the spender.\n    /// @return approved The approval status.\n    function isOperator(address owner, address spender) external view returns (bool approved);\n\n    /// @notice Transfers an amount of an id from the caller to a receiver.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transfer(address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Transfers an amount of an id from a sender to a receiver.\n    /// @param sender The address of the sender.\n    /// @param receiver The address of the receiver.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always, unless the function reverts\n    function transferFrom(address sender, address receiver, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Approves an amount of an id to a spender.\n    /// @param spender The address of the spender.\n    /// @param id The id of the token.\n    /// @param amount The amount of the token.\n    /// @return bool True, always\n    function approve(address spender, uint256 id, uint256 amount) external returns (bool);\n\n    /// @notice Sets or removes an operator for the caller.\n    /// @param operator The address of the operator.\n    /// @param approved The approval status.\n    /// @return bool True, always\n    function setOperator(address operator, bool approved) external returns (bool);\n}\n"
  },
  {
    "path": "src/libraries/BitMath.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title BitMath\n/// @dev This library provides functionality for computing bit properties of an unsigned integer\n/// @author Solady (https://github.com/Vectorized/solady/blob/8200a70e8dc2a77ecb074fc2e99a2a0d36547522/src/utils/LibBit.sol)\nlibrary BitMath {\n    /// @notice Returns the index of the most significant bit of the number,\n    ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n    /// @param x the value for which to compute the most significant bit, must be greater than 0\n    /// @return r the index of the most significant bit\n    function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n        require(x > 0);\n\n        assembly (\"memory-safe\") {\n            r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))\n            r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))\n            r := or(r, shl(5, lt(0xffffffff, shr(r, x))))\n            r := or(r, shl(4, lt(0xffff, shr(r, x))))\n            r := or(r, shl(3, lt(0xff, shr(r, x))))\n            // forgefmt: disable-next-item\n            r := or(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)),\n                0x0706060506020500060203020504000106050205030304010505030400000000))\n        }\n    }\n\n    /// @notice Returns the index of the least significant bit of the number,\n    ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n    /// @param x the value for which to compute the least significant bit, must be greater than 0\n    /// @return r the index of the least significant bit\n    function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n        require(x > 0);\n\n        assembly (\"memory-safe\") {\n            // Isolate the least significant bit.\n            x := and(x, sub(0, x))\n            // For the upper 3 bits of the result, use a De Bruijn-like lookup.\n            // Credit to adhusson: https://blog.adhusson.com/cheap-find-first-set-evm/\n            // forgefmt: disable-next-item\n            r := shl(5, shr(252, shl(shl(2, shr(250, mul(x,\n                0xb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff))),\n                0x8040405543005266443200005020610674053026020000107506200176117077)))\n            // For the lower 5 bits of the result, use a De Bruijn lookup.\n            // forgefmt: disable-next-item\n            r := or(r, byte(and(div(0xd76453e0, shr(r, x)), 0x1f),\n                0x001f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405))\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/CurrencyDelta.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\n\n/// @title a library to store callers' currency deltas in transient storage\n/// @dev this library implements the equivalent of a mapping, as transient storage can only be accessed in assembly\nlibrary CurrencyDelta {\n    /// @notice calculates which storage slot a delta should be stored in for a given account and currency\n    function _computeSlot(address target, Currency currency) internal pure returns (bytes32 hashSlot) {\n        assembly (\"memory-safe\") {\n            mstore(0, and(target, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(32, and(currency, 0xffffffffffffffffffffffffffffffffffffffff))\n            hashSlot := keccak256(0, 64)\n        }\n    }\n\n    function getDelta(Currency currency, address target) internal view returns (int256 delta) {\n        bytes32 hashSlot = _computeSlot(target, currency);\n        assembly (\"memory-safe\") {\n            delta := tload(hashSlot)\n        }\n    }\n\n    /// @notice applies a new currency delta for a given account and currency\n    /// @return previous The prior value\n    /// @return next The modified result\n    function applyDelta(Currency currency, address target, int128 delta)\n        internal\n        returns (int256 previous, int256 next)\n    {\n        bytes32 hashSlot = _computeSlot(target, currency);\n\n        assembly (\"memory-safe\") {\n            previous := tload(hashSlot)\n        }\n        next = previous + delta;\n        assembly (\"memory-safe\") {\n            tstore(hashSlot, next)\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/CurrencyReserves.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\nlibrary CurrencyReserves {\n    using CustomRevert for bytes4;\n\n    /// bytes32(uint256(keccak256(\"ReservesOf\")) - 1)\n    bytes32 constant RESERVES_OF_SLOT = 0x1e0745a7db1623981f0b2a5d4232364c00787266eb75ad546f190e6cebe9bd95;\n    /// bytes32(uint256(keccak256(\"Currency\")) - 1)\n    bytes32 constant CURRENCY_SLOT = 0x27e098c505d44ec3574004bca052aabf76bd35004c182099d8c575fb238593b9;\n\n    function getSyncedCurrency() internal view returns (Currency currency) {\n        assembly (\"memory-safe\") {\n            currency := tload(CURRENCY_SLOT)\n        }\n    }\n\n    function resetCurrency() internal {\n        assembly (\"memory-safe\") {\n            tstore(CURRENCY_SLOT, 0)\n        }\n    }\n\n    function syncCurrencyAndReserves(Currency currency, uint256 value) internal {\n        assembly (\"memory-safe\") {\n            tstore(CURRENCY_SLOT, and(currency, 0xffffffffffffffffffffffffffffffffffffffff))\n            tstore(RESERVES_OF_SLOT, value)\n        }\n    }\n\n    function getSyncedReserves() internal view returns (uint256 value) {\n        assembly (\"memory-safe\") {\n            value := tload(RESERVES_OF_SLOT)\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/CustomRevert.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Library for reverting with custom errors efficiently\n/// @notice Contains functions for reverting with custom errors with different argument types efficiently\n/// @dev To use this library, declare `using CustomRevert for bytes4;` and replace `revert CustomError()` with\n/// `CustomError.selector.revertWith()`\n/// @dev The functions may tamper with the free memory pointer but it is fine since the call context is exited immediately\nlibrary CustomRevert {\n    /// @dev ERC-7751 error for wrapping bubbled up reverts\n    error WrappedError(address target, bytes4 selector, bytes reason, bytes details);\n\n    /// @dev Reverts with the selector of a custom error in the scratch space\n    function revertWith(bytes4 selector) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            revert(0, 0x04)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an address argument in the scratch space\n    function revertWith(bytes4 selector, address addr) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(addr, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with an int24 argument in the scratch space\n    function revertWith(bytes4 selector, int24 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, signextend(2, value))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with a uint160 argument in the scratch space\n    function revertWith(bytes4 selector, uint160 value) internal pure {\n        assembly (\"memory-safe\") {\n            mstore(0, selector)\n            mstore(0x04, and(value, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(0, 0x24)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two int24 arguments\n    function revertWith(bytes4 selector, int24 value1, int24 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), signextend(2, value1))\n            mstore(add(fmp, 0x24), signextend(2, value2))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two uint160 arguments\n    function revertWith(bytes4 selector, uint160 value1, uint160 value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @dev Reverts with a custom error with two address arguments\n    function revertWith(bytes4 selector, address value1, address value2) internal pure {\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(fmp, selector)\n            mstore(add(fmp, 0x04), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(add(fmp, 0x24), and(value2, 0xffffffffffffffffffffffffffffffffffffffff))\n            revert(fmp, 0x44)\n        }\n    }\n\n    /// @notice bubble up the revert message returned by a call and revert with a wrapped ERC-7751 error\n    /// @dev this method can be vulnerable to revert data bombs\n    function bubbleUpAndRevertWith(\n        address revertingContract,\n        bytes4 revertingFunctionSelector,\n        bytes4 additionalContext\n    ) internal pure {\n        bytes4 wrappedErrorSelector = WrappedError.selector;\n        assembly (\"memory-safe\") {\n            // Ensure the size of the revert data is a multiple of 32 bytes\n            let encodedDataSize := mul(div(add(returndatasize(), 31), 32), 32)\n\n            let fmp := mload(0x40)\n\n            // Encode wrapped error selector, address, function selector, offset, additional context, size, revert reason\n            mstore(fmp, wrappedErrorSelector)\n            mstore(add(fmp, 0x04), and(revertingContract, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(\n                add(fmp, 0x24),\n                and(revertingFunctionSelector, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            // offset revert reason\n            mstore(add(fmp, 0x44), 0x80)\n            // offset additional context\n            mstore(add(fmp, 0x64), add(0xa0, encodedDataSize))\n            // size revert reason\n            mstore(add(fmp, 0x84), returndatasize())\n            // revert reason\n            returndatacopy(add(fmp, 0xa4), 0, returndatasize())\n            // size additional context\n            mstore(add(fmp, add(0xa4, encodedDataSize)), 0x04)\n            // additional context\n            mstore(\n                add(fmp, add(0xc4, encodedDataSize)),\n                and(additionalContext, 0xffffffff00000000000000000000000000000000000000000000000000000000)\n            )\n            revert(fmp, add(0xe4, encodedDataSize))\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/FixedPoint128.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title FixedPoint128\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\nlibrary FixedPoint128 {\n    uint256 internal constant Q128 = 0x100000000000000000000000000000000;\n}\n"
  },
  {
    "path": "src/libraries/FixedPoint96.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title FixedPoint96\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\n/// @dev Used in SqrtPriceMath.sol\nlibrary FixedPoint96 {\n    uint8 internal constant RESOLUTION = 96;\n    uint256 internal constant Q96 = 0x1000000000000000000000000;\n}\n"
  },
  {
    "path": "src/libraries/FullMath.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\nlibrary FullMath {\n    /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n    function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = a * b\n            // Compute the product mod 2**256 and mod 2**256 - 1\n            // then use the Chinese Remainder Theorem to reconstruct\n            // the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2**256 + prod0\n            uint256 prod0 = a * b; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly (\"memory-safe\") {\n                let mm := mulmod(a, b, not(0))\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Make sure the result is less than 2**256.\n            // Also prevents denominator == 0\n            require(denominator > prod1);\n\n            // Handle non-overflow cases, 256 by 256 division\n            if (prod1 == 0) {\n                assembly (\"memory-safe\") {\n                    result := div(prod0, denominator)\n                }\n                return result;\n            }\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0]\n            // Compute remainder using mulmod\n            uint256 remainder;\n            assembly (\"memory-safe\") {\n                remainder := mulmod(a, b, denominator)\n            }\n            // Subtract 256 bit number from 512 bit number\n            assembly (\"memory-safe\") {\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator\n            // Compute largest power of two divisor of denominator.\n            // Always >= 1.\n            uint256 twos = (0 - denominator) & denominator;\n            // Divide denominator by power of two\n            assembly (\"memory-safe\") {\n                denominator := div(denominator, twos)\n            }\n\n            // Divide [prod1 prod0] by the factors of two\n            assembly (\"memory-safe\") {\n                prod0 := div(prod0, twos)\n            }\n            // Shift in bits from prod1 into prod0. For this we need\n            // to flip `twos` such that it is 2**256 / twos.\n            // If twos is zero, then it becomes one\n            assembly (\"memory-safe\") {\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2**256\n            // Now that denominator is an odd number, it has an inverse\n            // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n            // Compute the inverse by starting with a seed that is correct\n            // correct for four bits. That is, denominator * inv = 1 mod 2**4\n            uint256 inv = (3 * denominator) ^ 2;\n            // Now use Newton-Raphson iteration to improve the precision.\n            // Thanks to Hensel's lifting lemma, this also works in modular\n            // arithmetic, doubling the correct bits in each step.\n            inv *= 2 - denominator * inv; // inverse mod 2**8\n            inv *= 2 - denominator * inv; // inverse mod 2**16\n            inv *= 2 - denominator * inv; // inverse mod 2**32\n            inv *= 2 - denominator * inv; // inverse mod 2**64\n            inv *= 2 - denominator * inv; // inverse mod 2**128\n            inv *= 2 - denominator * inv; // inverse mod 2**256\n\n            // Because the division is now exact we can divide by multiplying\n            // with the modular inverse of denominator. This will give us the\n            // correct result modulo 2**256. Since the preconditions guarantee\n            // that the outcome is less than 2**256, this is the final result.\n            // We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inv;\n            return result;\n        }\n    }\n\n    /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result\n    function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            result = mulDiv(a, b, denominator);\n            if (mulmod(a, b, denominator) != 0) {\n                require(++result > 0);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/Hooks.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {SafeCast} from \"./SafeCast.sol\";\nimport {LPFeeLibrary} from \"./LPFeeLibrary.sol\";\nimport {BalanceDelta, toBalanceDelta, BalanceDeltaLibrary} from \"../types/BalanceDelta.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"../types/BeforeSwapDelta.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {ParseBytes} from \"./ParseBytes.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice V4 decides whether to invoke specific hooks by inspecting the least significant bits\n/// of the address that the hooks contract is deployed to.\n/// For example, a hooks contract deployed to address: 0x0000000000000000000000000000000000002400\n/// has the lowest bits '10 0100 0000 0000' which would cause the 'before initialize' and 'after add liquidity' hooks to be used.\nlibrary Hooks {\n    using LPFeeLibrary for uint24;\n    using Hooks for IHooks;\n    using SafeCast for int256;\n    using BeforeSwapDeltaLibrary for BeforeSwapDelta;\n    using ParseBytes for bytes;\n    using CustomRevert for bytes4;\n\n    uint160 internal constant ALL_HOOK_MASK = uint160((1 << 14) - 1);\n\n    uint160 internal constant BEFORE_INITIALIZE_FLAG = 1 << 13;\n    uint160 internal constant AFTER_INITIALIZE_FLAG = 1 << 12;\n\n    uint160 internal constant BEFORE_ADD_LIQUIDITY_FLAG = 1 << 11;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_FLAG = 1 << 10;\n\n    uint160 internal constant BEFORE_REMOVE_LIQUIDITY_FLAG = 1 << 9;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_FLAG = 1 << 8;\n\n    uint160 internal constant BEFORE_SWAP_FLAG = 1 << 7;\n    uint160 internal constant AFTER_SWAP_FLAG = 1 << 6;\n\n    uint160 internal constant BEFORE_DONATE_FLAG = 1 << 5;\n    uint160 internal constant AFTER_DONATE_FLAG = 1 << 4;\n\n    uint160 internal constant BEFORE_SWAP_RETURNS_DELTA_FLAG = 1 << 3;\n    uint160 internal constant AFTER_SWAP_RETURNS_DELTA_FLAG = 1 << 2;\n    uint160 internal constant AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 1;\n    uint160 internal constant AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG = 1 << 0;\n\n    struct Permissions {\n        bool beforeInitialize;\n        bool afterInitialize;\n        bool beforeAddLiquidity;\n        bool afterAddLiquidity;\n        bool beforeRemoveLiquidity;\n        bool afterRemoveLiquidity;\n        bool beforeSwap;\n        bool afterSwap;\n        bool beforeDonate;\n        bool afterDonate;\n        bool beforeSwapReturnDelta;\n        bool afterSwapReturnDelta;\n        bool afterAddLiquidityReturnDelta;\n        bool afterRemoveLiquidityReturnDelta;\n    }\n\n    /// @notice Thrown if the address will not lead to the specified hook calls being called\n    /// @param hooks The address of the hooks contract\n    error HookAddressNotValid(address hooks);\n\n    /// @notice Hook did not return its selector\n    error InvalidHookResponse();\n\n    /// @notice Additional context for ERC-7751 wrapped error when a hook call fails\n    error HookCallFailed();\n\n    /// @notice The hook's delta changed the swap from exactIn to exactOut or vice versa\n    error HookDeltaExceedsSwapAmount();\n\n    /// @notice Utility function intended to be used in hook constructors to ensure\n    /// the deployed hooks address causes the intended hooks to be called\n    /// @param permissions The hooks that are intended to be called\n    /// @dev permissions param is memory as the function will be called from constructors\n    function validateHookPermissions(IHooks self, Permissions memory permissions) internal pure {\n        if (\n            permissions.beforeInitialize != self.hasPermission(BEFORE_INITIALIZE_FLAG)\n                || permissions.afterInitialize != self.hasPermission(AFTER_INITIALIZE_FLAG)\n                || permissions.beforeAddLiquidity != self.hasPermission(BEFORE_ADD_LIQUIDITY_FLAG)\n                || permissions.afterAddLiquidity != self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG)\n                || permissions.beforeRemoveLiquidity != self.hasPermission(BEFORE_REMOVE_LIQUIDITY_FLAG)\n                || permissions.afterRemoveLiquidity != self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)\n                || permissions.beforeSwap != self.hasPermission(BEFORE_SWAP_FLAG)\n                || permissions.afterSwap != self.hasPermission(AFTER_SWAP_FLAG)\n                || permissions.beforeDonate != self.hasPermission(BEFORE_DONATE_FLAG)\n                || permissions.afterDonate != self.hasPermission(AFTER_DONATE_FLAG)\n                || permissions.beforeSwapReturnDelta != self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)\n                || permissions.afterSwapReturnDelta != self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)\n                || permissions.afterAddLiquidityReturnDelta != self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG)\n                || permissions.afterRemoveLiquidityReturnDelta\n                    != self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n        ) {\n            HookAddressNotValid.selector.revertWith(address(self));\n        }\n    }\n\n    /// @notice Ensures that the hook address includes at least one hook flag or dynamic fees, or is the 0 address\n    /// @param self The hook to verify\n    /// @param fee The fee of the pool the hook is used with\n    /// @return bool True if the hook address is valid\n    function isValidHookAddress(IHooks self, uint24 fee) internal pure returns (bool) {\n        // The hook can only have a flag to return a hook delta on an action if it also has the corresponding action flag\n        if (!self.hasPermission(BEFORE_SWAP_FLAG) && self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)) return false;\n        if (!self.hasPermission(AFTER_SWAP_FLAG) && self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)) return false;\n        if (!self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG) && self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG))\n        {\n            return false;\n        }\n        if (\n            !self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)\n                && self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n        ) return false;\n\n        // If there is no hook contract set, then fee cannot be dynamic\n        // If a hook contract is set, it must have at least 1 flag set, or have a dynamic fee\n        return address(self) == address(0)\n            ? !fee.isDynamicFee()\n            : (uint160(address(self)) & ALL_HOOK_MASK > 0 || fee.isDynamicFee());\n    }\n\n    /// @notice performs a hook call using the given calldata on the given hook that doesn't return a delta\n    /// @return result The complete data returned by the hook\n    function callHook(IHooks self, bytes memory data) internal returns (bytes memory result) {\n        bool success;\n        assembly (\"memory-safe\") {\n            success := call(gas(), self, 0, add(data, 0x20), mload(data), 0, 0)\n        }\n        // Revert with FailedHookCall, containing any error message to bubble up\n        if (!success) CustomRevert.bubbleUpAndRevertWith(address(self), bytes4(data), HookCallFailed.selector);\n\n        // The call was successful, fetch the returned data\n        assembly (\"memory-safe\") {\n            // allocate result byte array from the free memory pointer\n            result := mload(0x40)\n            // store new free memory pointer at the end of the array padded to 32 bytes\n            mstore(0x40, add(result, and(add(returndatasize(), 0x3f), not(0x1f))))\n            // store length in memory\n            mstore(result, returndatasize())\n            // copy return data to result\n            returndatacopy(add(result, 0x20), 0, returndatasize())\n        }\n\n        // Length must be at least 32 to contain the selector. Check expected selector and returned selector match.\n        if (result.length < 32 || result.parseSelector() != data.parseSelector()) {\n            InvalidHookResponse.selector.revertWith();\n        }\n    }\n\n    /// @notice performs a hook call using the given calldata on the given hook\n    /// @return int256 The delta returned by the hook\n    function callHookWithReturnDelta(IHooks self, bytes memory data, bool parseReturn) internal returns (int256) {\n        bytes memory result = callHook(self, data);\n\n        // If this hook wasn't meant to return something, default to 0 delta\n        if (!parseReturn) return 0;\n\n        // A length of 64 bytes is required to return a bytes4, and a 32 byte delta\n        if (result.length != 64) InvalidHookResponse.selector.revertWith();\n        return result.parseReturnDelta();\n    }\n\n    /// @notice modifier to prevent calling a hook if they initiated the action\n    modifier noSelfCall(IHooks self) {\n        if (msg.sender != address(self)) {\n            _;\n        }\n    }\n\n    /// @notice calls beforeInitialize hook if permissioned and validates return value\n    function beforeInitialize(IHooks self, PoolKey memory key, uint160 sqrtPriceX96) internal noSelfCall(self) {\n        if (self.hasPermission(BEFORE_INITIALIZE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeInitialize, (msg.sender, key, sqrtPriceX96)));\n        }\n    }\n\n    /// @notice calls afterInitialize hook if permissioned and validates return value\n    function afterInitialize(IHooks self, PoolKey memory key, uint160 sqrtPriceX96, int24 tick)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(AFTER_INITIALIZE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.afterInitialize, (msg.sender, key, sqrtPriceX96, tick)));\n        }\n    }\n\n    /// @notice calls beforeModifyLiquidity hook if permissioned and validates return value\n    function beforeModifyLiquidity(\n        IHooks self,\n        PoolKey memory key,\n        ModifyLiquidityParams memory params,\n        bytes calldata hookData\n    ) internal noSelfCall(self) {\n        if (params.liquidityDelta > 0 && self.hasPermission(BEFORE_ADD_LIQUIDITY_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeAddLiquidity, (msg.sender, key, params, hookData)));\n        } else if (params.liquidityDelta <= 0 && self.hasPermission(BEFORE_REMOVE_LIQUIDITY_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeRemoveLiquidity, (msg.sender, key, params, hookData)));\n        }\n    }\n\n    /// @notice calls afterModifyLiquidity hook if permissioned and validates return value\n    function afterModifyLiquidity(\n        IHooks self,\n        PoolKey memory key,\n        ModifyLiquidityParams memory params,\n        BalanceDelta delta,\n        BalanceDelta feesAccrued,\n        bytes calldata hookData\n    ) internal returns (BalanceDelta callerDelta, BalanceDelta hookDelta) {\n        if (msg.sender == address(self)) return (delta, BalanceDeltaLibrary.ZERO_DELTA);\n\n        callerDelta = delta;\n        if (params.liquidityDelta > 0) {\n            if (self.hasPermission(AFTER_ADD_LIQUIDITY_FLAG)) {\n                hookDelta = BalanceDelta.wrap(\n                    self.callHookWithReturnDelta(\n                        abi.encodeCall(\n                            IHooks.afterAddLiquidity, (msg.sender, key, params, delta, feesAccrued, hookData)\n                        ),\n                        self.hasPermission(AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG)\n                    )\n                );\n                callerDelta = callerDelta - hookDelta;\n            }\n        } else {\n            if (self.hasPermission(AFTER_REMOVE_LIQUIDITY_FLAG)) {\n                hookDelta = BalanceDelta.wrap(\n                    self.callHookWithReturnDelta(\n                        abi.encodeCall(\n                            IHooks.afterRemoveLiquidity, (msg.sender, key, params, delta, feesAccrued, hookData)\n                        ),\n                        self.hasPermission(AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)\n                    )\n                );\n                callerDelta = callerDelta - hookDelta;\n            }\n        }\n    }\n\n    /// @notice calls beforeSwap hook if permissioned and validates return value\n    function beforeSwap(IHooks self, PoolKey memory key, SwapParams memory params, bytes calldata hookData)\n        internal\n        returns (int256 amountToSwap, BeforeSwapDelta hookReturn, uint24 lpFeeOverride)\n    {\n        amountToSwap = params.amountSpecified;\n        if (msg.sender == address(self)) return (amountToSwap, BeforeSwapDeltaLibrary.ZERO_DELTA, lpFeeOverride);\n\n        if (self.hasPermission(BEFORE_SWAP_FLAG)) {\n            bytes memory result = callHook(self, abi.encodeCall(IHooks.beforeSwap, (msg.sender, key, params, hookData)));\n\n            // A length of 96 bytes is required to return a bytes4, a 32 byte delta, and an LP fee\n            if (result.length != 96) InvalidHookResponse.selector.revertWith();\n\n            // dynamic fee pools that want to override the cache fee, return a valid fee with the override flag. If override flag\n            // is set but an invalid fee is returned, the transaction will revert. Otherwise the current LP fee will be used\n            if (key.fee.isDynamicFee()) lpFeeOverride = result.parseFee();\n\n            // skip this logic for the case where the hook return is 0\n            if (self.hasPermission(BEFORE_SWAP_RETURNS_DELTA_FLAG)) {\n                hookReturn = BeforeSwapDelta.wrap(result.parseReturnDelta());\n\n                // any return in unspecified is passed to the afterSwap hook for handling\n                int128 hookDeltaSpecified = hookReturn.getSpecifiedDelta();\n\n                // Update the swap amount according to the hook's return, and check that the swap type doesn't change (exact input/output)\n                if (hookDeltaSpecified != 0) {\n                    bool exactInput = amountToSwap < 0;\n                    amountToSwap += hookDeltaSpecified;\n                    if (exactInput ? amountToSwap > 0 : amountToSwap < 0) {\n                        HookDeltaExceedsSwapAmount.selector.revertWith();\n                    }\n                }\n            }\n        }\n    }\n\n    /// @notice calls afterSwap hook if permissioned and validates return value\n    function afterSwap(\n        IHooks self,\n        PoolKey memory key,\n        SwapParams memory params,\n        BalanceDelta swapDelta,\n        bytes calldata hookData,\n        BeforeSwapDelta beforeSwapHookReturn\n    ) internal returns (BalanceDelta, BalanceDelta) {\n        if (msg.sender == address(self)) return (swapDelta, BalanceDeltaLibrary.ZERO_DELTA);\n\n        int128 hookDeltaSpecified = beforeSwapHookReturn.getSpecifiedDelta();\n        int128 hookDeltaUnspecified = beforeSwapHookReturn.getUnspecifiedDelta();\n\n        if (self.hasPermission(AFTER_SWAP_FLAG)) {\n            hookDeltaUnspecified += self.callHookWithReturnDelta(\n                abi.encodeCall(IHooks.afterSwap, (msg.sender, key, params, swapDelta, hookData)),\n                self.hasPermission(AFTER_SWAP_RETURNS_DELTA_FLAG)\n            ).toInt128();\n        }\n\n        BalanceDelta hookDelta;\n        if (hookDeltaUnspecified != 0 || hookDeltaSpecified != 0) {\n            hookDelta = (params.amountSpecified < 0 == params.zeroForOne)\n                ? toBalanceDelta(hookDeltaSpecified, hookDeltaUnspecified)\n                : toBalanceDelta(hookDeltaUnspecified, hookDeltaSpecified);\n\n            // the caller has to pay for (or receive) the hook's delta\n            swapDelta = swapDelta - hookDelta;\n        }\n        return (swapDelta, hookDelta);\n    }\n\n    /// @notice calls beforeDonate hook if permissioned and validates return value\n    function beforeDonate(IHooks self, PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(BEFORE_DONATE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.beforeDonate, (msg.sender, key, amount0, amount1, hookData)));\n        }\n    }\n\n    /// @notice calls afterDonate hook if permissioned and validates return value\n    function afterDonate(IHooks self, PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        internal\n        noSelfCall(self)\n    {\n        if (self.hasPermission(AFTER_DONATE_FLAG)) {\n            self.callHook(abi.encodeCall(IHooks.afterDonate, (msg.sender, key, amount0, amount1, hookData)));\n        }\n    }\n\n    function hasPermission(IHooks self, uint160 flag) internal pure returns (bool) {\n        return uint160(address(self)) & flag != 0;\n    }\n}\n"
  },
  {
    "path": "src/libraries/LPFeeLibrary.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice Library of helper functions for a pools LP fee\nlibrary LPFeeLibrary {\n    using LPFeeLibrary for uint24;\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when the static or dynamic fee on a pool exceeds 100%.\n    error LPFeeTooLarge(uint24 fee);\n\n    /// @notice An lp fee of exactly 0b1000000... signals a dynamic fee pool. This isn't a valid static fee as it is > MAX_LP_FEE\n    uint24 public constant DYNAMIC_FEE_FLAG = 0x800000;\n\n    /// @notice the second bit of the fee returned by beforeSwap is used to signal if the stored LP fee should be overridden in this swap\n    // only dynamic-fee pools can return a fee via the beforeSwap hook\n    uint24 public constant OVERRIDE_FEE_FLAG = 0x400000;\n\n    /// @notice mask to remove the override fee flag from a fee returned by the beforeSwaphook\n    uint24 public constant REMOVE_OVERRIDE_MASK = 0xBFFFFF;\n\n    /// @notice the lp fee is represented in hundredths of a bip, so the max is 100%\n    uint24 public constant MAX_LP_FEE = 1000000;\n\n    /// @notice returns true if a pool's LP fee signals that the pool has a dynamic fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is dynamic\n    function isDynamicFee(uint24 self) internal pure returns (bool) {\n        return self == DYNAMIC_FEE_FLAG;\n    }\n\n    /// @notice returns true if an LP fee is valid, aka not above the maximum permitted fee\n    /// @param self The fee to check\n    /// @return bool True of the fee is valid\n    function isValid(uint24 self) internal pure returns (bool) {\n        return self <= MAX_LP_FEE;\n    }\n\n    /// @notice validates whether an LP fee is larger than the maximum, and reverts if invalid\n    /// @param self The fee to validate\n    function validate(uint24 self) internal pure {\n        if (!self.isValid()) LPFeeTooLarge.selector.revertWith(self);\n    }\n\n    /// @notice gets and validates the initial LP fee for a pool. Dynamic fee pools have an initial fee of 0.\n    /// @dev if a dynamic fee pool wants a non-0 initial fee, it should call `updateDynamicLPFee` in the afterInitialize hook\n    /// @param self The fee to get the initial LP from\n    /// @return initialFee 0 if the fee is dynamic, otherwise the fee (if valid)\n    function getInitialLPFee(uint24 self) internal pure returns (uint24) {\n        // the initial fee for a dynamic fee pool is 0\n        if (self.isDynamicFee()) return 0;\n        self.validate();\n        return self;\n    }\n\n    /// @notice returns true if the fee has the override flag set (2nd highest bit of the uint24)\n    /// @param self The fee to check\n    /// @return bool True of the fee has the override flag set\n    function isOverride(uint24 self) internal pure returns (bool) {\n        return self & OVERRIDE_FEE_FLAG != 0;\n    }\n\n    /// @notice returns a fee with the override flag removed\n    /// @param self The fee to remove the override flag from\n    /// @return fee The fee without the override flag set\n    function removeOverrideFlag(uint24 self) internal pure returns (uint24) {\n        return self & REMOVE_OVERRIDE_MASK;\n    }\n\n    /// @notice Removes the override flag and validates the fee (reverts if the fee is too large)\n    /// @param self The fee to remove the override flag from, and then validate\n    /// @return fee The fee without the override flag set (if valid)\n    function removeOverrideFlagAndValidate(uint24 self) internal pure returns (uint24 fee) {\n        fee = self.removeOverrideFlag();\n        fee.validate();\n    }\n}\n"
  },
  {
    "path": "src/libraries/LiquidityMath.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Math library for liquidity\nlibrary LiquidityMath {\n    /// @notice Add a signed liquidity delta to liquidity and revert if it overflows or underflows\n    /// @param x The liquidity before change\n    /// @param y The delta by which liquidity should be changed\n    /// @return z The liquidity delta\n    function addDelta(uint128 x, int128 y) internal pure returns (uint128 z) {\n        assembly (\"memory-safe\") {\n            z := add(and(x, 0xffffffffffffffffffffffffffffffff), signextend(15, y))\n            if shr(128, z) {\n                // revert SafeCastOverflow()\n                mstore(0, 0x93dafdf1)\n                revert(0x1c, 0x04)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/Lock.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\n/// @notice This is a temporary library that allows us to use transient storage (tstore/tload)\n/// TODO: This library can be deleted when we have the transient keyword support in solidity.\nlibrary Lock {\n    // The slot holding the unlocked state, transiently. bytes32(uint256(keccak256(\"Unlocked\")) - 1)\n    bytes32 internal constant IS_UNLOCKED_SLOT = 0xc090fc4683624cfc3884e9d8de5eca132f2d0ec062aff75d43c0465d5ceeab23;\n\n    function unlock() internal {\n        assembly (\"memory-safe\") {\n            // unlock\n            tstore(IS_UNLOCKED_SLOT, true)\n        }\n    }\n\n    function lock() internal {\n        assembly (\"memory-safe\") {\n            tstore(IS_UNLOCKED_SLOT, false)\n        }\n    }\n\n    function isUnlocked() internal view returns (bool unlocked) {\n        assembly (\"memory-safe\") {\n            unlocked := tload(IS_UNLOCKED_SLOT)\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/NonzeroDeltaCount.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\n/// @notice This is a temporary library that allows us to use transient storage (tstore/tload)\n/// for the nonzero delta count.\n/// TODO: This library can be deleted when we have the transient keyword support in solidity.\nlibrary NonzeroDeltaCount {\n    // The slot holding the number of nonzero deltas. bytes32(uint256(keccak256(\"NonzeroDeltaCount\")) - 1)\n    bytes32 internal constant NONZERO_DELTA_COUNT_SLOT =\n        0x7d4b3164c6e45b97e7d87b7125a44c5828d005af88f9d751cfd78729c5d99a0b;\n\n    function read() internal view returns (uint256 count) {\n        assembly (\"memory-safe\") {\n            count := tload(NONZERO_DELTA_COUNT_SLOT)\n        }\n    }\n\n    function increment() internal {\n        assembly (\"memory-safe\") {\n            let count := tload(NONZERO_DELTA_COUNT_SLOT)\n            count := add(count, 1)\n            tstore(NONZERO_DELTA_COUNT_SLOT, count)\n        }\n    }\n\n    /// @notice Potential to underflow. Ensure checks are performed by integrating contracts to ensure this does not happen.\n    /// Current usage ensures this will not happen because we call decrement with known boundaries (only up to the number of times we call increment).\n    function decrement() internal {\n        assembly (\"memory-safe\") {\n            let count := tload(NONZERO_DELTA_COUNT_SLOT)\n            count := sub(count, 1)\n            tstore(NONZERO_DELTA_COUNT_SLOT, count)\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/ParseBytes.sol",
    "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/// @notice Parses bytes returned from hooks and the byte selector used to check return selectors from hooks.\n/// @dev parseSelector also is used to parse the expected selector\n/// For parsing hook returns, note that all hooks return either bytes4 or (bytes4, 32-byte-delta) or (bytes4, 32-byte-delta, uint24).\nlibrary ParseBytes {\n    function parseSelector(bytes memory result) internal pure returns (bytes4 selector) {\n        // equivalent: (selector,) = abi.decode(result, (bytes4, int256));\n        assembly (\"memory-safe\") {\n            selector := mload(add(result, 0x20))\n        }\n    }\n\n    function parseFee(bytes memory result) internal pure returns (uint24 lpFee) {\n        // equivalent: (,, lpFee) = abi.decode(result, (bytes4, int256, uint24));\n        assembly (\"memory-safe\") {\n            lpFee := mload(add(result, 0x60))\n        }\n    }\n\n    function parseReturnDelta(bytes memory result) internal pure returns (int256 hookReturn) {\n        // equivalent: (, hookReturnDelta) = abi.decode(result, (bytes4, int256));\n        assembly (\"memory-safe\") {\n            hookReturn := mload(add(result, 0x40))\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/Pool.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"./SafeCast.sol\";\nimport {TickBitmap} from \"./TickBitmap.sol\";\nimport {Position} from \"./Position.sol\";\nimport {UnsafeMath} from \"./UnsafeMath.sol\";\nimport {FixedPoint128} from \"./FixedPoint128.sol\";\nimport {TickMath} from \"./TickMath.sol\";\nimport {SqrtPriceMath} from \"./SqrtPriceMath.sol\";\nimport {SwapMath} from \"./SwapMath.sol\";\nimport {BalanceDelta, toBalanceDelta, BalanceDeltaLibrary} from \"../types/BalanceDelta.sol\";\nimport {Slot0} from \"../types/Slot0.sol\";\nimport {ProtocolFeeLibrary} from \"./ProtocolFeeLibrary.sol\";\nimport {LiquidityMath} from \"./LiquidityMath.sol\";\nimport {LPFeeLibrary} from \"./LPFeeLibrary.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @notice a library with all actions that can be performed on a pool\nlibrary Pool {\n    using SafeCast for *;\n    using TickBitmap for mapping(int16 => uint256);\n    using Position for mapping(bytes32 => Position.State);\n    using Position for Position.State;\n    using Pool for State;\n    using ProtocolFeeLibrary for *;\n    using LPFeeLibrary for uint24;\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when tickLower is not below tickUpper\n    /// @param tickLower The invalid tickLower\n    /// @param tickUpper The invalid tickUpper\n    error TicksMisordered(int24 tickLower, int24 tickUpper);\n\n    /// @notice Thrown when tickLower is less than min tick\n    /// @param tickLower The invalid tickLower\n    error TickLowerOutOfBounds(int24 tickLower);\n\n    /// @notice Thrown when tickUpper exceeds max tick\n    /// @param tickUpper The invalid tickUpper\n    error TickUpperOutOfBounds(int24 tickUpper);\n\n    /// @notice For the tick spacing, the tick has too much liquidity\n    error TickLiquidityOverflow(int24 tick);\n\n    /// @notice Thrown when trying to initialize an already initialized pool\n    error PoolAlreadyInitialized();\n\n    /// @notice Thrown when trying to interact with a non-initialized pool\n    error PoolNotInitialized();\n\n    /// @notice Thrown when sqrtPriceLimitX96 on a swap has already exceeded its limit\n    /// @param sqrtPriceCurrentX96 The invalid, already surpassed sqrtPriceLimitX96\n    /// @param sqrtPriceLimitX96 The surpassed price limit\n    error PriceLimitAlreadyExceeded(uint160 sqrtPriceCurrentX96, uint160 sqrtPriceLimitX96);\n\n    /// @notice Thrown when sqrtPriceLimitX96 lies outside of valid tick/price range\n    /// @param sqrtPriceLimitX96 The invalid, out-of-bounds sqrtPriceLimitX96\n    error PriceLimitOutOfBounds(uint160 sqrtPriceLimitX96);\n\n    /// @notice Thrown by donate if there is currently 0 liquidity, since the fees will not go to any liquidity providers\n    error NoLiquidityToReceiveFees();\n\n    /// @notice Thrown when trying to swap with max lp fee and specifying an output amount\n    error InvalidFeeForExactOut();\n\n    // info stored for each initialized individual tick\n    struct TickInfo {\n        // the total position liquidity that references this tick\n        uint128 liquidityGross;\n        // amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left),\n        int128 liquidityNet;\n        // fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n        // only has relative meaning, not absolute — the value depends on when the tick is initialized\n        uint256 feeGrowthOutside0X128;\n        uint256 feeGrowthOutside1X128;\n    }\n\n    /// @notice The state of a pool\n    /// @dev Note that feeGrowthGlobal can be artificially inflated\n    /// For pools with a single liquidity position, actors can donate to themselves to freely inflate feeGrowthGlobal\n    /// atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n    struct State {\n        Slot0 slot0;\n        uint256 feeGrowthGlobal0X128;\n        uint256 feeGrowthGlobal1X128;\n        uint128 liquidity;\n        mapping(int24 tick => TickInfo) ticks;\n        mapping(int16 wordPos => uint256) tickBitmap;\n        mapping(bytes32 positionKey => Position.State) positions;\n    }\n\n    /// @dev Common checks for valid tick inputs.\n    function checkTicks(int24 tickLower, int24 tickUpper) private pure {\n        if (tickLower >= tickUpper) TicksMisordered.selector.revertWith(tickLower, tickUpper);\n        if (tickLower < TickMath.MIN_TICK) TickLowerOutOfBounds.selector.revertWith(tickLower);\n        if (tickUpper > TickMath.MAX_TICK) TickUpperOutOfBounds.selector.revertWith(tickUpper);\n    }\n\n    function initialize(State storage self, uint160 sqrtPriceX96, uint24 lpFee) internal returns (int24 tick) {\n        if (self.slot0.sqrtPriceX96() != 0) PoolAlreadyInitialized.selector.revertWith();\n\n        tick = TickMath.getTickAtSqrtPrice(sqrtPriceX96);\n\n        // the initial protocolFee is 0 so doesn't need to be set\n        self.slot0 = Slot0.wrap(bytes32(0)).setSqrtPriceX96(sqrtPriceX96).setTick(tick).setLpFee(lpFee);\n    }\n\n    function setProtocolFee(State storage self, uint24 protocolFee) internal {\n        self.checkPoolInitialized();\n        self.slot0 = self.slot0.setProtocolFee(protocolFee);\n    }\n\n    /// @notice Only dynamic fee pools may update the lp fee.\n    function setLPFee(State storage self, uint24 lpFee) internal {\n        self.checkPoolInitialized();\n        self.slot0 = self.slot0.setLpFee(lpFee);\n    }\n\n    struct ModifyLiquidityParams {\n        // the address that owns the position\n        address owner;\n        // the lower and upper tick of the position\n        int24 tickLower;\n        int24 tickUpper;\n        // any change in liquidity\n        int128 liquidityDelta;\n        // the spacing between ticks\n        int24 tickSpacing;\n        // used to distinguish positions of the same owner, at the same tick range\n        bytes32 salt;\n    }\n\n    struct ModifyLiquidityState {\n        bool flippedLower;\n        uint128 liquidityGrossAfterLower;\n        bool flippedUpper;\n        uint128 liquidityGrossAfterUpper;\n    }\n\n    /// @notice Effect changes to a position in a pool\n    /// @dev PoolManager checks that the pool is initialized before calling\n    /// @param params the position details and the change to the position's liquidity to effect\n    /// @return delta the deltas of the token balances of the pool, from the liquidity change\n    /// @return feeDelta the fees generated by the liquidity range\n    function modifyLiquidity(State storage self, ModifyLiquidityParams memory params)\n        internal\n        returns (BalanceDelta delta, BalanceDelta feeDelta)\n    {\n        int128 liquidityDelta = params.liquidityDelta;\n        int24 tickLower = params.tickLower;\n        int24 tickUpper = params.tickUpper;\n        checkTicks(tickLower, tickUpper);\n\n        {\n            ModifyLiquidityState memory state;\n\n            // if we need to update the ticks, do it\n            if (liquidityDelta != 0) {\n                (state.flippedLower, state.liquidityGrossAfterLower) =\n                    updateTick(self, tickLower, liquidityDelta, false);\n                (state.flippedUpper, state.liquidityGrossAfterUpper) = updateTick(self, tickUpper, liquidityDelta, true);\n\n                // `>` and `>=` are logically equivalent here but `>=` is cheaper\n                if (liquidityDelta >= 0) {\n                    uint128 maxLiquidityPerTick = tickSpacingToMaxLiquidityPerTick(params.tickSpacing);\n                    if (state.liquidityGrossAfterLower > maxLiquidityPerTick) {\n                        TickLiquidityOverflow.selector.revertWith(tickLower);\n                    }\n                    if (state.liquidityGrossAfterUpper > maxLiquidityPerTick) {\n                        TickLiquidityOverflow.selector.revertWith(tickUpper);\n                    }\n                }\n\n                if (state.flippedLower) {\n                    self.tickBitmap.flipTick(tickLower, params.tickSpacing);\n                }\n                if (state.flippedUpper) {\n                    self.tickBitmap.flipTick(tickUpper, params.tickSpacing);\n                }\n            }\n\n            {\n                (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) =\n                    getFeeGrowthInside(self, tickLower, tickUpper);\n\n                Position.State storage position = self.positions.get(params.owner, tickLower, tickUpper, params.salt);\n                (uint256 feesOwed0, uint256 feesOwed1) =\n                    position.update(liquidityDelta, feeGrowthInside0X128, feeGrowthInside1X128);\n\n                // Fees earned from LPing are calculated, and returned\n                feeDelta = toBalanceDelta(feesOwed0.toInt128(), feesOwed1.toInt128());\n            }\n\n            // clear any tick data that is no longer needed\n            if (liquidityDelta < 0) {\n                if (state.flippedLower) {\n                    clearTick(self, tickLower);\n                }\n                if (state.flippedUpper) {\n                    clearTick(self, tickUpper);\n                }\n            }\n        }\n\n        if (liquidityDelta != 0) {\n            Slot0 _slot0 = self.slot0;\n            (int24 tick, uint160 sqrtPriceX96) = (_slot0.tick(), _slot0.sqrtPriceX96());\n            if (tick < tickLower) {\n                // current tick is below the passed range; liquidity can only become in range by crossing from left to\n                // right, when we'll need _more_ currency0 (it's becoming more valuable) so user must provide it\n                delta = toBalanceDelta(\n                    SqrtPriceMath.getAmount0Delta(\n                        TickMath.getSqrtPriceAtTick(tickLower), TickMath.getSqrtPriceAtTick(tickUpper), liquidityDelta\n                    ).toInt128(),\n                    0\n                );\n            } else if (tick < tickUpper) {\n                delta = toBalanceDelta(\n                    SqrtPriceMath.getAmount0Delta(sqrtPriceX96, TickMath.getSqrtPriceAtTick(tickUpper), liquidityDelta)\n                        .toInt128(),\n                    SqrtPriceMath.getAmount1Delta(TickMath.getSqrtPriceAtTick(tickLower), sqrtPriceX96, liquidityDelta)\n                        .toInt128()\n                );\n\n                self.liquidity = LiquidityMath.addDelta(self.liquidity, liquidityDelta);\n            } else {\n                // current tick is above the passed range; liquidity can only become in range by crossing from right to\n                // left, when we'll need _more_ currency1 (it's becoming more valuable) so user must provide it\n                delta = toBalanceDelta(\n                    0,\n                    SqrtPriceMath.getAmount1Delta(\n                        TickMath.getSqrtPriceAtTick(tickLower), TickMath.getSqrtPriceAtTick(tickUpper), liquidityDelta\n                    ).toInt128()\n                );\n            }\n        }\n    }\n\n    // Tracks the state of a pool throughout a swap, and returns these values at the end of the swap\n    struct SwapResult {\n        // the current sqrt(price)\n        uint160 sqrtPriceX96;\n        // the tick associated with the current price\n        int24 tick;\n        // the current liquidity in range\n        uint128 liquidity;\n    }\n\n    struct StepComputations {\n        // the price at the beginning of the step\n        uint160 sqrtPriceStartX96;\n        // the next tick to swap to from the current tick in the swap direction\n        int24 tickNext;\n        // whether tickNext is initialized or not\n        bool initialized;\n        // sqrt(price) for the next tick (1/0)\n        uint160 sqrtPriceNextX96;\n        // how much is being swapped in in this step\n        uint256 amountIn;\n        // how much is being swapped out\n        uint256 amountOut;\n        // how much fee is being paid in\n        uint256 feeAmount;\n        // the global fee growth of the input token. updated in storage at the end of swap\n        uint256 feeGrowthGlobalX128;\n    }\n\n    struct SwapParams {\n        int256 amountSpecified;\n        int24 tickSpacing;\n        bool zeroForOne;\n        uint160 sqrtPriceLimitX96;\n        uint24 lpFeeOverride;\n    }\n\n    /// @notice Executes a swap against the state, and returns the amount deltas of the pool\n    /// @dev PoolManager checks that the pool is initialized before calling\n    function swap(State storage self, SwapParams memory params)\n        internal\n        returns (BalanceDelta swapDelta, uint256 amountToProtocol, uint24 swapFee, SwapResult memory result)\n    {\n        Slot0 slot0Start = self.slot0;\n        bool zeroForOne = params.zeroForOne;\n\n        uint256 protocolFee =\n            zeroForOne ? slot0Start.protocolFee().getZeroForOneFee() : slot0Start.protocolFee().getOneForZeroFee();\n\n        // the amount remaining to be swapped in/out of the input/output asset. initially set to the amountSpecified\n        int256 amountSpecifiedRemaining = params.amountSpecified;\n        // the amount swapped out/in of the output/input asset. initially set to 0\n        int256 amountCalculated = 0;\n        // initialize to the current sqrt(price)\n        result.sqrtPriceX96 = slot0Start.sqrtPriceX96();\n        // initialize to the current tick\n        result.tick = slot0Start.tick();\n        // initialize to the current liquidity\n        result.liquidity = self.liquidity;\n\n        // if the beforeSwap hook returned a valid fee override, use that as the LP fee, otherwise load from storage\n        // lpFee, swapFee, and protocolFee are all in pips\n        {\n            uint24 lpFee = params.lpFeeOverride.isOverride()\n                ? params.lpFeeOverride.removeOverrideFlagAndValidate()\n                : slot0Start.lpFee();\n\n            swapFee = protocolFee == 0 ? lpFee : uint16(protocolFee).calculateSwapFee(lpFee);\n        }\n\n        // a swap fee totaling MAX_SWAP_FEE (100%) makes exact output swaps impossible since the input is entirely consumed by the fee\n        if (swapFee >= SwapMath.MAX_SWAP_FEE) {\n            // if exactOutput\n            if (params.amountSpecified > 0) {\n                InvalidFeeForExactOut.selector.revertWith();\n            }\n        }\n\n        // swapFee is the pool's fee in pips (LP fee + protocol fee)\n        // when the amount swapped is 0, there is no protocolFee applied and the fee amount paid to the protocol is set to 0\n        if (params.amountSpecified == 0) return (BalanceDeltaLibrary.ZERO_DELTA, 0, swapFee, result);\n\n        if (zeroForOne) {\n            if (params.sqrtPriceLimitX96 >= slot0Start.sqrtPriceX96()) {\n                PriceLimitAlreadyExceeded.selector.revertWith(slot0Start.sqrtPriceX96(), params.sqrtPriceLimitX96);\n            }\n            // Swaps can never occur at MIN_TICK, only at MIN_TICK + 1, except at initialization of a pool\n            // Under certain circumstances outlined below, the tick will preemptively reach MIN_TICK without swapping there\n            if (params.sqrtPriceLimitX96 <= TickMath.MIN_SQRT_PRICE) {\n                PriceLimitOutOfBounds.selector.revertWith(params.sqrtPriceLimitX96);\n            }\n        } else {\n            if (params.sqrtPriceLimitX96 <= slot0Start.sqrtPriceX96()) {\n                PriceLimitAlreadyExceeded.selector.revertWith(slot0Start.sqrtPriceX96(), params.sqrtPriceLimitX96);\n            }\n            if (params.sqrtPriceLimitX96 >= TickMath.MAX_SQRT_PRICE) {\n                PriceLimitOutOfBounds.selector.revertWith(params.sqrtPriceLimitX96);\n            }\n        }\n\n        StepComputations memory step;\n        step.feeGrowthGlobalX128 = zeroForOne ? self.feeGrowthGlobal0X128 : self.feeGrowthGlobal1X128;\n\n        // continue swapping as long as we haven't used the entire input/output and haven't reached the price limit\n        while (!(amountSpecifiedRemaining == 0 || result.sqrtPriceX96 == params.sqrtPriceLimitX96)) {\n            step.sqrtPriceStartX96 = result.sqrtPriceX96;\n\n            (step.tickNext, step.initialized) =\n                self.tickBitmap.nextInitializedTickWithinOneWord(result.tick, params.tickSpacing, zeroForOne);\n\n            // ensure that we do not overshoot the min/max tick, as the tick bitmap is not aware of these bounds\n            if (step.tickNext <= TickMath.MIN_TICK) {\n                step.tickNext = TickMath.MIN_TICK;\n            }\n            if (step.tickNext >= TickMath.MAX_TICK) {\n                step.tickNext = TickMath.MAX_TICK;\n            }\n\n            // get the price for the next tick\n            step.sqrtPriceNextX96 = TickMath.getSqrtPriceAtTick(step.tickNext);\n\n            // compute values to swap to the target tick, price limit, or point where input/output amount is exhausted\n            (result.sqrtPriceX96, step.amountIn, step.amountOut, step.feeAmount) = SwapMath.computeSwapStep(\n                result.sqrtPriceX96,\n                SwapMath.getSqrtPriceTarget(zeroForOne, step.sqrtPriceNextX96, params.sqrtPriceLimitX96),\n                result.liquidity,\n                amountSpecifiedRemaining,\n                swapFee\n            );\n\n            // if exactOutput\n            if (params.amountSpecified > 0) {\n                unchecked {\n                    amountSpecifiedRemaining -= step.amountOut.toInt256();\n                }\n                amountCalculated -= (step.amountIn + step.feeAmount).toInt256();\n            } else {\n                // safe because we test that amountSpecified > amountIn + feeAmount in SwapMath\n                unchecked {\n                    amountSpecifiedRemaining += (step.amountIn + step.feeAmount).toInt256();\n                }\n                amountCalculated += step.amountOut.toInt256();\n            }\n\n            // if the protocol fee is on, calculate how much is owed, decrement feeAmount, and increment protocolFee\n            if (protocolFee > 0) {\n                unchecked {\n                    // step.amountIn does not include the swap fee, as it's already been taken from it,\n                    // so add it back to get the total amountIn and use that to calculate the amount of fees owed to the protocol\n                    // cannot overflow due to limits on the size of protocolFee and params.amountSpecified\n                    // this rounds down to favor LPs over the protocol\n                    uint256 delta = (swapFee == protocolFee)\n                        ? step.feeAmount // lp fee is 0, so the entire fee is owed to the protocol instead\n                        : (step.amountIn + step.feeAmount) * protocolFee / ProtocolFeeLibrary.PIPS_DENOMINATOR;\n                    // subtract it from the total fee and add it to the protocol fee\n                    step.feeAmount -= delta;\n                    amountToProtocol += delta;\n                }\n            }\n\n            // update global fee tracker\n            if (result.liquidity > 0) {\n                unchecked {\n                    // FullMath.mulDiv isn't needed as the numerator can't overflow uint256 since tokens have a max supply of type(uint128).max\n                    step.feeGrowthGlobalX128 +=\n                        UnsafeMath.simpleMulDiv(step.feeAmount, FixedPoint128.Q128, result.liquidity);\n                }\n            }\n\n            // Shift tick if we reached the next price, and preemptively decrement for zeroForOne swaps to tickNext - 1.\n            // If the swap doesn't continue (if amountRemaining == 0 or sqrtPriceLimit is met), slot0.tick will be 1 less\n            // than getTickAtSqrtPrice(slot0.sqrtPrice). This doesn't affect swaps, but donation calls should verify both\n            // price and tick to reward the correct LPs.\n            if (result.sqrtPriceX96 == step.sqrtPriceNextX96) {\n                // if the tick is initialized, run the tick transition\n                if (step.initialized) {\n                    (uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128) = zeroForOne\n                        ? (step.feeGrowthGlobalX128, self.feeGrowthGlobal1X128)\n                        : (self.feeGrowthGlobal0X128, step.feeGrowthGlobalX128);\n                    int128 liquidityNet =\n                        Pool.crossTick(self, step.tickNext, feeGrowthGlobal0X128, feeGrowthGlobal1X128);\n                    // if we're moving leftward, we interpret liquidityNet as the opposite sign\n                    // safe because liquidityNet cannot be type(int128).min\n                    unchecked {\n                        if (zeroForOne) liquidityNet = -liquidityNet;\n                    }\n\n                    result.liquidity = LiquidityMath.addDelta(result.liquidity, liquidityNet);\n                }\n\n                unchecked {\n                    result.tick = zeroForOne ? step.tickNext - 1 : step.tickNext;\n                }\n            } else if (result.sqrtPriceX96 != step.sqrtPriceStartX96) {\n                // recompute unless we're on a lower tick boundary (i.e. already transitioned ticks), and haven't moved\n                result.tick = TickMath.getTickAtSqrtPrice(result.sqrtPriceX96);\n            }\n        }\n\n        self.slot0 = slot0Start.setTick(result.tick).setSqrtPriceX96(result.sqrtPriceX96);\n\n        // update liquidity if it changed\n        if (self.liquidity != result.liquidity) self.liquidity = result.liquidity;\n\n        // update fee growth global\n        if (!zeroForOne) {\n            self.feeGrowthGlobal1X128 = step.feeGrowthGlobalX128;\n        } else {\n            self.feeGrowthGlobal0X128 = step.feeGrowthGlobalX128;\n        }\n\n        unchecked {\n            // \"if currency1 is specified\"\n            if (zeroForOne != (params.amountSpecified < 0)) {\n                swapDelta = toBalanceDelta(\n                    amountCalculated.toInt128(), (params.amountSpecified - amountSpecifiedRemaining).toInt128()\n                );\n            } else {\n                swapDelta = toBalanceDelta(\n                    (params.amountSpecified - amountSpecifiedRemaining).toInt128(), amountCalculated.toInt128()\n                );\n            }\n        }\n    }\n\n    /// @notice Donates the given amount of currency0 and currency1 to the pool\n    function donate(State storage state, uint256 amount0, uint256 amount1) internal returns (BalanceDelta delta) {\n        uint128 liquidity = state.liquidity;\n        if (liquidity == 0) NoLiquidityToReceiveFees.selector.revertWith();\n        unchecked {\n            // negation safe as amount0 and amount1 are always positive\n            delta = toBalanceDelta(-(amount0.toInt128()), -(amount1.toInt128()));\n            // FullMath.mulDiv is unnecessary because the numerator is bounded by type(int128).max * Q128, which is less than type(uint256).max\n            if (amount0 > 0) {\n                state.feeGrowthGlobal0X128 += UnsafeMath.simpleMulDiv(amount0, FixedPoint128.Q128, liquidity);\n            }\n            if (amount1 > 0) {\n                state.feeGrowthGlobal1X128 += UnsafeMath.simpleMulDiv(amount1, FixedPoint128.Q128, liquidity);\n            }\n        }\n    }\n\n    /// @notice Retrieves fee growth data\n    /// @param self The Pool state struct\n    /// @param tickLower The lower tick boundary of the position\n    /// @param tickUpper The upper tick boundary of the position\n    /// @return feeGrowthInside0X128 The all-time fee growth in token0, per unit of liquidity, inside the position's tick boundaries\n    /// @return feeGrowthInside1X128 The all-time fee growth in token1, per unit of liquidity, inside the position's tick boundaries\n    function getFeeGrowthInside(State storage self, int24 tickLower, int24 tickUpper)\n        internal\n        view\n        returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128)\n    {\n        TickInfo storage lower = self.ticks[tickLower];\n        TickInfo storage upper = self.ticks[tickUpper];\n        int24 tickCurrent = self.slot0.tick();\n\n        unchecked {\n            if (tickCurrent < tickLower) {\n                feeGrowthInside0X128 = lower.feeGrowthOutside0X128 - upper.feeGrowthOutside0X128;\n                feeGrowthInside1X128 = lower.feeGrowthOutside1X128 - upper.feeGrowthOutside1X128;\n            } else if (tickCurrent >= tickUpper) {\n                feeGrowthInside0X128 = upper.feeGrowthOutside0X128 - lower.feeGrowthOutside0X128;\n                feeGrowthInside1X128 = upper.feeGrowthOutside1X128 - lower.feeGrowthOutside1X128;\n            } else {\n                feeGrowthInside0X128 =\n                    self.feeGrowthGlobal0X128 - lower.feeGrowthOutside0X128 - upper.feeGrowthOutside0X128;\n                feeGrowthInside1X128 =\n                    self.feeGrowthGlobal1X128 - lower.feeGrowthOutside1X128 - upper.feeGrowthOutside1X128;\n            }\n        }\n    }\n\n    /// @notice Updates a tick and returns true if the tick was flipped from initialized to uninitialized, or vice versa\n    /// @param self The mapping containing all tick information for initialized ticks\n    /// @param tick The tick that will be updated\n    /// @param liquidityDelta A new amount of liquidity to be added (subtracted) when tick is crossed from left to right (right to left)\n    /// @param upper true for updating a position's upper tick, or false for updating a position's lower tick\n    /// @return flipped Whether the tick was flipped from initialized to uninitialized, or vice versa\n    /// @return liquidityGrossAfter The total amount of liquidity for all positions that references the tick after the update\n    function updateTick(State storage self, int24 tick, int128 liquidityDelta, bool upper)\n        internal\n        returns (bool flipped, uint128 liquidityGrossAfter)\n    {\n        TickInfo storage info = self.ticks[tick];\n\n        uint128 liquidityGrossBefore = info.liquidityGross;\n        int128 liquidityNetBefore = info.liquidityNet;\n\n        liquidityGrossAfter = LiquidityMath.addDelta(liquidityGrossBefore, liquidityDelta);\n\n        flipped = (liquidityGrossAfter == 0) != (liquidityGrossBefore == 0);\n\n        if (liquidityGrossBefore == 0) {\n            // by convention, we assume that all growth before a tick was initialized happened _below_ the tick\n            if (tick <= self.slot0.tick()) {\n                info.feeGrowthOutside0X128 = self.feeGrowthGlobal0X128;\n                info.feeGrowthOutside1X128 = self.feeGrowthGlobal1X128;\n            }\n        }\n\n        // when the lower (upper) tick is crossed left to right, liquidity must be added (removed)\n        // when the lower (upper) tick is crossed right to left, liquidity must be removed (added)\n        int128 liquidityNet = upper ? liquidityNetBefore - liquidityDelta : liquidityNetBefore + liquidityDelta;\n        assembly (\"memory-safe\") {\n            // liquidityGrossAfter and liquidityNet are packed in the first slot of `info`\n            // So we can store them with a single sstore by packing them ourselves first\n            sstore(\n                info.slot,\n                // bitwise OR to pack liquidityGrossAfter and liquidityNet\n                or(\n                    // Put liquidityGrossAfter in the lower bits, clearing out the upper bits\n                    and(liquidityGrossAfter, 0xffffffffffffffffffffffffffffffff),\n                    // Shift liquidityNet to put it in the upper bits (no need for signextend since we're shifting left)\n                    shl(128, liquidityNet)\n                )\n            )\n        }\n    }\n\n    /// @notice Derives max liquidity per tick from given tick spacing\n    /// @dev Executed when adding liquidity\n    /// @param tickSpacing The amount of required tick separation, realized in multiples of `tickSpacing`\n    ///     e.g., a tickSpacing of 3 requires ticks to be initialized every 3rd tick i.e., ..., -6, -3, 0, 3, 6, ...\n    /// @return result The max liquidity per tick\n    function tickSpacingToMaxLiquidityPerTick(int24 tickSpacing) internal pure returns (uint128 result) {\n        // Equivalent to:\n        // int24 minTick = (TickMath.MIN_TICK / tickSpacing);\n        // if (TickMath.MIN_TICK  % tickSpacing != 0) minTick--;\n        // int24 maxTick = (TickMath.MAX_TICK / tickSpacing);\n        // uint24 numTicks = maxTick - minTick + 1;\n        // return type(uint128).max / numTicks;\n        int24 MAX_TICK = TickMath.MAX_TICK;\n        int24 MIN_TICK = TickMath.MIN_TICK;\n        // tick spacing will never be 0 since TickMath.MIN_TICK_SPACING is 1\n        assembly (\"memory-safe\") {\n            tickSpacing := signextend(2, tickSpacing)\n            let minTick := sub(sdiv(MIN_TICK, tickSpacing), slt(smod(MIN_TICK, tickSpacing), 0))\n            let maxTick := sdiv(MAX_TICK, tickSpacing)\n            let numTicks := add(sub(maxTick, minTick), 1)\n            result := div(sub(shl(128, 1), 1), numTicks)\n        }\n    }\n\n    /// @notice Reverts if the given pool has not been initialized\n    function checkPoolInitialized(State storage self) internal view {\n        if (self.slot0.sqrtPriceX96() == 0) PoolNotInitialized.selector.revertWith();\n    }\n\n    /// @notice Clears tick data\n    /// @param self The mapping containing all initialized tick information for initialized ticks\n    /// @param tick The tick that will be cleared\n    function clearTick(State storage self, int24 tick) internal {\n        delete self.ticks[tick];\n    }\n\n    /// @notice Transitions to next tick as needed by price movement\n    /// @param self The Pool state struct\n    /// @param tick The destination tick of the transition\n    /// @param feeGrowthGlobal0X128 The all-time global fee growth, per unit of liquidity, in token0\n    /// @param feeGrowthGlobal1X128 The all-time global fee growth, per unit of liquidity, in token1\n    /// @return liquidityNet The amount of liquidity added (subtracted) when tick is crossed from left to right (right to left)\n    function crossTick(State storage self, int24 tick, uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128)\n        internal\n        returns (int128 liquidityNet)\n    {\n        unchecked {\n            TickInfo storage info = self.ticks[tick];\n            info.feeGrowthOutside0X128 = feeGrowthGlobal0X128 - info.feeGrowthOutside0X128;\n            info.feeGrowthOutside1X128 = feeGrowthGlobal1X128 - info.feeGrowthOutside1X128;\n            liquidityNet = info.liquidityNet;\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/Position.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.0;\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {FixedPoint128} from \"./FixedPoint128.sol\";\nimport {LiquidityMath} from \"./LiquidityMath.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Position\n/// @notice Positions represent an owner address' liquidity between a lower and upper tick boundary\n/// @dev Positions store additional state for tracking fees owed to the position\nlibrary Position {\n    using CustomRevert for bytes4;\n\n    /// @notice Cannot update a position with no liquidity\n    error CannotUpdateEmptyPosition();\n\n    // info stored for each user's position\n    struct State {\n        // the amount of liquidity owned by this position\n        uint128 liquidity;\n        // fee growth per unit of liquidity as of the last update to liquidity or fees owed\n        uint256 feeGrowthInside0LastX128;\n        uint256 feeGrowthInside1LastX128;\n    }\n\n    /// @notice Returns the State struct of a position, given an owner and position boundaries\n    /// @param self The mapping containing all user positions\n    /// @param owner The address of the position owner\n    /// @param tickLower The lower tick boundary of the position\n    /// @param tickUpper The upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range\n    /// @return position The position info struct of the given owners' position\n    function get(mapping(bytes32 => State) storage self, address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        view\n        returns (State storage position)\n    {\n        bytes32 positionKey = calculatePositionKey(owner, tickLower, tickUpper, salt);\n        position = self[positionKey];\n    }\n\n    /// @notice A helper function to calculate the position key\n    /// @param owner The address of the position owner\n    /// @param tickLower the lower tick boundary of the position\n    /// @param tickUpper the upper tick boundary of the position\n    /// @param salt A unique value to differentiate between multiple positions in the same range, by the same owner. Passed in by the caller.\n    function calculatePositionKey(address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        internal\n        pure\n        returns (bytes32 positionKey)\n    {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        assembly (\"memory-safe\") {\n            let fmp := mload(0x40)\n            mstore(add(fmp, 0x26), salt) // [0x26, 0x46)\n            mstore(add(fmp, 0x06), tickUpper) // [0x23, 0x26)\n            mstore(add(fmp, 0x03), tickLower) // [0x20, 0x23)\n            mstore(fmp, owner) // [0x0c, 0x20)\n            positionKey := keccak256(add(fmp, 0x0c), 0x3a) // len is 58 bytes\n\n            // now clean the memory we used\n            mstore(add(fmp, 0x40), 0) // fmp+0x40 held salt\n            mstore(add(fmp, 0x20), 0) // fmp+0x20 held tickLower, tickUpper, salt\n            mstore(fmp, 0) // fmp held owner\n        }\n    }\n\n    /// @notice Credits accumulated fees to a user's position\n    /// @param self The individual position to update\n    /// @param liquidityDelta The change in pool liquidity as a result of the position update\n    /// @param feeGrowthInside0X128 The all-time fee growth in currency0, per unit of liquidity, inside the position's tick boundaries\n    /// @param feeGrowthInside1X128 The all-time fee growth in currency1, per unit of liquidity, inside the position's tick boundaries\n    /// @return feesOwed0 The amount of currency0 owed to the position owner\n    /// @return feesOwed1 The amount of currency1 owed to the position owner\n    function update(\n        State storage self,\n        int128 liquidityDelta,\n        uint256 feeGrowthInside0X128,\n        uint256 feeGrowthInside1X128\n    ) internal returns (uint256 feesOwed0, uint256 feesOwed1) {\n        uint128 liquidity = self.liquidity;\n\n        if (liquidityDelta == 0) {\n            // disallow pokes for 0 liquidity positions\n            if (liquidity == 0) CannotUpdateEmptyPosition.selector.revertWith();\n        } else {\n            self.liquidity = LiquidityMath.addDelta(liquidity, liquidityDelta);\n        }\n\n        // calculate accumulated fees. overflow in the subtraction of fee growth is expected\n        unchecked {\n            feesOwed0 =\n                FullMath.mulDiv(feeGrowthInside0X128 - self.feeGrowthInside0LastX128, liquidity, FixedPoint128.Q128);\n            feesOwed1 =\n                FullMath.mulDiv(feeGrowthInside1X128 - self.feeGrowthInside1LastX128, liquidity, FixedPoint128.Q128);\n        }\n\n        // update the position\n        self.feeGrowthInside0LastX128 = feeGrowthInside0X128;\n        self.feeGrowthInside1LastX128 = feeGrowthInside1X128;\n    }\n}\n"
  },
  {
    "path": "src/libraries/ProtocolFeeLibrary.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice library of functions related to protocol fees\nlibrary ProtocolFeeLibrary {\n    /// @notice Max protocol fee is 0.1% (1000 pips)\n    /// @dev Increasing these values could lead to overflow in Pool.swap\n    uint16 public constant MAX_PROTOCOL_FEE = 1000;\n\n    /// @notice Thresholds used for optimized bounds checks on protocol fees\n    uint24 internal constant FEE_0_THRESHOLD = 1001;\n    uint24 internal constant FEE_1_THRESHOLD = 1001 << 12;\n\n    /// @notice the protocol fee is represented in hundredths of a bip\n    uint256 internal constant PIPS_DENOMINATOR = 1_000_000;\n\n    function getZeroForOneFee(uint24 self) internal pure returns (uint16) {\n        return uint16(self & 0xfff);\n    }\n\n    function getOneForZeroFee(uint24 self) internal pure returns (uint16) {\n        return uint16(self >> 12);\n    }\n\n    function isValidProtocolFee(uint24 self) internal pure returns (bool valid) {\n        // Equivalent to: getZeroForOneFee(self) <= MAX_PROTOCOL_FEE && getOneForZeroFee(self) <= MAX_PROTOCOL_FEE\n        assembly (\"memory-safe\") {\n            let isZeroForOneFeeOk := lt(and(self, 0xfff), FEE_0_THRESHOLD)\n            let isOneForZeroFeeOk := lt(and(self, 0xfff000), FEE_1_THRESHOLD)\n            valid := and(isZeroForOneFeeOk, isOneForZeroFeeOk)\n        }\n    }\n\n    // The protocol fee is taken from the input amount first and then the LP fee is taken from the remaining\n    // The swap fee is capped at 100%\n    // Equivalent to protocolFee + lpFee(1_000_000 - protocolFee) / 1_000_000 (rounded up)\n    /// @dev here `self` is just a single direction's protocol fee, not a packed type of 2 protocol fees\n    function calculateSwapFee(uint16 self, uint24 lpFee) internal pure returns (uint24 swapFee) {\n        // protocolFee + lpFee - (protocolFee * lpFee / 1_000_000)\n        assembly (\"memory-safe\") {\n            self := and(self, 0xfff)\n            lpFee := and(lpFee, 0xffffff)\n            let numerator := mul(self, lpFee)\n            swapFee := sub(add(self, lpFee), div(numerator, PIPS_DENOMINATOR))\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/SafeCast.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Safe casting methods\n/// @notice Contains methods for safely casting between types\nlibrary SafeCast {\n    using CustomRevert for bytes4;\n\n    error SafeCastOverflow();\n\n    /// @notice Cast a uint256 to a uint160, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint160\n    function toUint160(uint256 x) internal pure returns (uint160 y) {\n        y = uint160(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a uint128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return y The downcasted integer, now type uint128\n    function toUint128(uint256 x) internal pure returns (uint128 y) {\n        y = uint128(x);\n        if (x != y) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a int128 to a uint128, revert on overflow or underflow\n    /// @param x The int128 to be casted\n    /// @return y The casted integer, now type uint128\n    function toUint128(int128 x) internal pure returns (uint128 y) {\n        if (x < 0) SafeCastOverflow.selector.revertWith();\n        y = uint128(x);\n    }\n\n    /// @notice Cast a int256 to a int128, revert on overflow or underflow\n    /// @param x The int256 to be downcasted\n    /// @return y The downcasted integer, now type int128\n    function toInt128(int256 x) internal pure returns (int128 y) {\n        y = int128(x);\n        if (y != x) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int256, revert on overflow\n    /// @param x The uint256 to be casted\n    /// @return y The casted integer, now type int256\n    function toInt256(uint256 x) internal pure returns (int256 y) {\n        y = int256(x);\n        if (y < 0) SafeCastOverflow.selector.revertWith();\n    }\n\n    /// @notice Cast a uint256 to a int128, revert on overflow\n    /// @param x The uint256 to be downcasted\n    /// @return The downcasted integer, now type int128\n    function toInt128(uint256 x) internal pure returns (int128) {\n        if (x >= 1 << 127) SafeCastOverflow.selector.revertWith();\n        return int128(int256(x));\n    }\n}\n"
  },
  {
    "path": "src/libraries/SqrtPriceMath.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"./SafeCast.sol\";\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {UnsafeMath} from \"./UnsafeMath.sol\";\nimport {FixedPoint96} from \"./FixedPoint96.sol\";\n\n/// @title Functions based on Q64.96 sqrt price and liquidity\n/// @notice Contains the math that uses square root of price as a Q64.96 and liquidity to compute deltas\nlibrary SqrtPriceMath {\n    using SafeCast for uint256;\n\n    error InvalidPriceOrLiquidity();\n    error InvalidPrice();\n    error NotEnoughLiquidity();\n    error PriceOverflow();\n\n    /// @notice Gets the next sqrt price given a delta of currency0\n    /// @dev Always rounds up, because in the exact output case (increasing price) we need to move the price at least\n    /// far enough to get the desired output amount, and in the exact input case (decreasing price) we need to move the\n    /// price less in order to not send too much output.\n    /// The most precise formula for this is liquidity * sqrtPX96 / (liquidity +- amount * sqrtPX96),\n    /// if this is impossible because of overflow, we calculate liquidity / (liquidity / sqrtPX96 +- amount).\n    /// @param sqrtPX96 The starting price, i.e. before accounting for the currency0 delta\n    /// @param liquidity The amount of usable liquidity\n    /// @param amount How much of currency0 to add or remove from virtual reserves\n    /// @param add Whether to add or remove the amount of currency0\n    /// @return The price after adding or removing amount, depending on add\n    function getNextSqrtPriceFromAmount0RoundingUp(uint160 sqrtPX96, uint128 liquidity, uint256 amount, bool add)\n        internal\n        pure\n        returns (uint160)\n    {\n        // we short circuit amount == 0 because the result is otherwise not guaranteed to equal the input price\n        if (amount == 0) return sqrtPX96;\n        uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n\n        if (add) {\n            unchecked {\n                uint256 product = amount * sqrtPX96;\n                if (product / amount == sqrtPX96) {\n                    uint256 denominator = numerator1 + product;\n                    if (denominator >= numerator1) {\n                        // always fits in 160 bits\n                        return uint160(FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator));\n                    }\n                }\n            }\n            // denominator is checked for overflow\n            return uint160(UnsafeMath.divRoundingUp(numerator1, (numerator1 / sqrtPX96) + amount));\n        } else {\n            unchecked {\n                uint256 product = amount * sqrtPX96;\n                // if the product overflows, we know the denominator underflows\n                // in addition, we must check that the denominator does not underflow\n                // equivalent: if (product / amount != sqrtPX96 || numerator1 <= product) revert PriceOverflow();\n                assembly (\"memory-safe\") {\n                    if iszero(\n                        and(\n                            eq(div(product, amount), and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                            gt(numerator1, product)\n                        )\n                    ) {\n                        mstore(0, 0xf5c787f1) // selector for PriceOverflow()\n                        revert(0x1c, 0x04)\n                    }\n                }\n                uint256 denominator = numerator1 - product;\n                return FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator).toUint160();\n            }\n        }\n    }\n\n    /// @notice Gets the next sqrt price given a delta of currency1\n    /// @dev Always rounds down, because in the exact output case (decreasing price) we need to move the price at least\n    /// far enough to get the desired output amount, and in the exact input case (increasing price) we need to move the\n    /// price less in order to not send too much output.\n    /// The formula we compute is within <1 wei of the lossless version: sqrtPX96 +- amount / liquidity\n    /// @param sqrtPX96 The starting price, i.e., before accounting for the currency1 delta\n    /// @param liquidity The amount of usable liquidity\n    /// @param amount How much of currency1 to add, or remove, from virtual reserves\n    /// @param add Whether to add, or remove, the amount of currency1\n    /// @return The price after adding or removing `amount`\n    function getNextSqrtPriceFromAmount1RoundingDown(uint160 sqrtPX96, uint128 liquidity, uint256 amount, bool add)\n        internal\n        pure\n        returns (uint160)\n    {\n        // if we're adding (subtracting), rounding down requires rounding the quotient down (up)\n        // in both cases, avoid a mulDiv for most inputs\n        if (add) {\n            uint256 quotient = (\n                amount <= type(uint160).max\n                    ? (amount << FixedPoint96.RESOLUTION) / liquidity\n                    : FullMath.mulDiv(amount, FixedPoint96.Q96, liquidity)\n            );\n\n            return (uint256(sqrtPX96) + quotient).toUint160();\n        } else {\n            uint256 quotient = (\n                amount <= type(uint160).max\n                    ? UnsafeMath.divRoundingUp(amount << FixedPoint96.RESOLUTION, liquidity)\n                    : FullMath.mulDivRoundingUp(amount, FixedPoint96.Q96, liquidity)\n            );\n\n            // equivalent: if (sqrtPX96 <= quotient) revert NotEnoughLiquidity();\n            assembly (\"memory-safe\") {\n                if iszero(gt(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff), quotient)) {\n                    mstore(0, 0x4323a555) // selector for NotEnoughLiquidity()\n                    revert(0x1c, 0x04)\n                }\n            }\n            // always fits 160 bits\n            unchecked {\n                return uint160(sqrtPX96 - quotient);\n            }\n        }\n    }\n\n    /// @notice Gets the next sqrt price given an input amount of currency0 or currency1\n    /// @dev Throws if price or liquidity are 0, or if the next price is out of bounds\n    /// @param sqrtPX96 The starting price, i.e., before accounting for the input amount\n    /// @param liquidity The amount of usable liquidity\n    /// @param amountIn How much of currency0, or currency1, is being swapped in\n    /// @param zeroForOne Whether the amount in is currency0 or currency1\n    /// @return uint160 The price after adding the input amount to currency0 or currency1\n    function getNextSqrtPriceFromInput(uint160 sqrtPX96, uint128 liquidity, uint256 amountIn, bool zeroForOne)\n        internal\n        pure\n        returns (uint160)\n    {\n        // equivalent: if (sqrtPX96 == 0 || liquidity == 0) revert InvalidPriceOrLiquidity();\n        assembly (\"memory-safe\") {\n            if or(\n                iszero(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                iszero(and(liquidity, 0xffffffffffffffffffffffffffffffff))\n            ) {\n                mstore(0, 0x4f2461b8) // selector for InvalidPriceOrLiquidity()\n                revert(0x1c, 0x04)\n            }\n        }\n\n        // round to make sure that we don't pass the target price\n        return zeroForOne\n            ? getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountIn, true)\n            : getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountIn, true);\n    }\n\n    /// @notice Gets the next sqrt price given an output amount of currency0 or currency1\n    /// @dev Throws if price or liquidity are 0 or the next price is out of bounds\n    /// @param sqrtPX96 The starting price before accounting for the output amount\n    /// @param liquidity The amount of usable liquidity\n    /// @param amountOut How much of currency0, or currency1, is being swapped out\n    /// @param zeroForOne Whether the amount out is currency1 or currency0\n    /// @return uint160 The price after removing the output amount of currency0 or currency1\n    function getNextSqrtPriceFromOutput(uint160 sqrtPX96, uint128 liquidity, uint256 amountOut, bool zeroForOne)\n        internal\n        pure\n        returns (uint160)\n    {\n        // equivalent: if (sqrtPX96 == 0 || liquidity == 0) revert InvalidPriceOrLiquidity();\n        assembly (\"memory-safe\") {\n            if or(\n                iszero(and(sqrtPX96, 0xffffffffffffffffffffffffffffffffffffffff)),\n                iszero(and(liquidity, 0xffffffffffffffffffffffffffffffff))\n            ) {\n                mstore(0, 0x4f2461b8) // selector for InvalidPriceOrLiquidity()\n                revert(0x1c, 0x04)\n            }\n        }\n\n        // round to make sure that we pass the target price\n        return zeroForOne\n            ? getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountOut, false)\n            : getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountOut, false);\n    }\n\n    /// @notice Gets the amount0 delta between two prices\n    /// @dev Calculates liquidity / sqrt(lower) - liquidity / sqrt(upper),\n    /// i.e. liquidity * (sqrt(upper) - sqrt(lower)) / (sqrt(upper) * sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The amount of usable liquidity\n    /// @param roundUp Whether to round the amount up or down\n    /// @return uint256 Amount of currency0 required to cover a position of size liquidity between the two passed prices\n    function getAmount0Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity, bool roundUp)\n        internal\n        pure\n        returns (uint256)\n    {\n        unchecked {\n            if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n\n            // equivalent: if (sqrtPriceAX96 == 0) revert InvalidPrice();\n            assembly (\"memory-safe\") {\n                if iszero(and(sqrtPriceAX96, 0xffffffffffffffffffffffffffffffffffffffff)) {\n                    mstore(0, 0x00bfc921) // selector for InvalidPrice()\n                    revert(0x1c, 0x04)\n                }\n            }\n\n            uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n            uint256 numerator2 = sqrtPriceBX96 - sqrtPriceAX96;\n\n            return roundUp\n                ? UnsafeMath.divRoundingUp(FullMath.mulDivRoundingUp(numerator1, numerator2, sqrtPriceBX96), sqrtPriceAX96)\n                : FullMath.mulDiv(numerator1, numerator2, sqrtPriceBX96) / sqrtPriceAX96;\n        }\n    }\n\n    /// @notice Equivalent to: `a >= b ? a - b : b - a`\n    function absDiff(uint160 a, uint160 b) internal pure returns (uint256 res) {\n        assembly (\"memory-safe\") {\n            let diff :=\n                sub(and(a, 0xffffffffffffffffffffffffffffffffffffffff), and(b, 0xffffffffffffffffffffffffffffffffffffffff))\n            // mask = 0 if a >= b else -1 (all 1s)\n            let mask := sar(255, diff)\n            // if a >= b, res = a - b = 0 ^ (a - b)\n            // if a < b, res = b - a = ~~(b - a) = ~(-(b - a) - 1) = ~(a - b - 1) = (-1) ^ (a - b - 1)\n            // either way, res = mask ^ (a - b + mask)\n            res := xor(mask, add(mask, diff))\n        }\n    }\n\n    /// @notice Gets the amount1 delta between two prices\n    /// @dev Calculates liquidity * (sqrt(upper) - sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The amount of usable liquidity\n    /// @param roundUp Whether to round the amount up, or down\n    /// @return amount1 Amount of currency1 required to cover a position of size liquidity between the two passed prices\n    function getAmount1Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity, bool roundUp)\n        internal\n        pure\n        returns (uint256 amount1)\n    {\n        uint256 numerator = absDiff(sqrtPriceAX96, sqrtPriceBX96);\n        uint256 denominator = FixedPoint96.Q96;\n        uint256 _liquidity = uint256(liquidity);\n\n        /**\n         * Equivalent to:\n         *   amount1 = roundUp\n         *       ? FullMath.mulDivRoundingUp(liquidity, sqrtPriceBX96 - sqrtPriceAX96, FixedPoint96.Q96)\n         *       : FullMath.mulDiv(liquidity, sqrtPriceBX96 - sqrtPriceAX96, FixedPoint96.Q96);\n         * Cannot overflow because `type(uint128).max * type(uint160).max >> 96 < (1 << 192)`.\n         */\n        amount1 = FullMath.mulDiv(_liquidity, numerator, denominator);\n        assembly (\"memory-safe\") {\n            amount1 := add(amount1, and(gt(mulmod(_liquidity, numerator, denominator), 0), roundUp))\n        }\n    }\n\n    /// @notice Helper that gets signed currency0 delta\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The change in liquidity for which to compute the amount0 delta\n    /// @return int256 Amount of currency0 corresponding to the passed liquidityDelta between the two prices\n    function getAmount0Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, int128 liquidity)\n        internal\n        pure\n        returns (int256)\n    {\n        unchecked {\n            return liquidity < 0\n                ? getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(-liquidity), false).toInt256()\n                : -getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(liquidity), true).toInt256();\n        }\n    }\n\n    /// @notice Helper that gets signed currency1 delta\n    /// @param sqrtPriceAX96 A sqrt price\n    /// @param sqrtPriceBX96 Another sqrt price\n    /// @param liquidity The change in liquidity for which to compute the amount1 delta\n    /// @return int256 Amount of currency1 corresponding to the passed liquidityDelta between the two prices\n    function getAmount1Delta(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, int128 liquidity)\n        internal\n        pure\n        returns (int256)\n    {\n        unchecked {\n            return liquidity < 0\n                ? getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(-liquidity), false).toInt256()\n                : -getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, uint128(liquidity), true).toInt256();\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/StateLibrary.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {Position} from \"./Position.sol\";\n\n/// @notice A helper library to provide state getters that use extsload\nlibrary StateLibrary {\n    /// @notice index of pools mapping in the PoolManager\n    bytes32 public constant POOLS_SLOT = bytes32(uint256(6));\n\n    /// @notice index of feeGrowthGlobal0X128 in Pool.State\n    uint256 public constant FEE_GROWTH_GLOBAL0_OFFSET = 1;\n\n    // feeGrowthGlobal1X128 offset in Pool.State = 2\n\n    /// @notice index of liquidity in Pool.State\n    uint256 public constant LIQUIDITY_OFFSET = 3;\n\n    /// @notice index of TicksInfo mapping in Pool.State: mapping(int24 => TickInfo) ticks;\n    uint256 public constant TICKS_OFFSET = 4;\n\n    /// @notice index of tickBitmap mapping in Pool.State\n    uint256 public constant TICK_BITMAP_OFFSET = 5;\n\n    /// @notice index of Position.State mapping in Pool.State: mapping(bytes32 => Position.State) positions;\n    uint256 public constant POSITIONS_OFFSET = 6;\n\n    /**\n     * @notice Get Slot0 of the pool: sqrtPriceX96, tick, protocolFee, lpFee\n     * @dev Corresponds to pools[poolId].slot0\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return sqrtPriceX96 The square root of the price of the pool, in Q96 precision.\n     * @return tick The current tick of the pool.\n     * @return protocolFee The protocol fee of the pool.\n     * @return lpFee The swap fee of the pool.\n     */\n    function getSlot0(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        bytes32 data = manager.extsload(stateSlot);\n\n        //   24 bits  |24bits|24bits      |24 bits|160 bits\n        // 0x000000   |000bb8|000000      |ffff75 |0000000000000000fe3aa841ba359daa0ea9eff7\n        // ---------- | fee  |protocolfee | tick  | sqrtPriceX96\n        assembly (\"memory-safe\") {\n            // bottom 160 bits of data\n            sqrtPriceX96 := and(data, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            // next 24 bits of data\n            tick := signextend(2, shr(160, data))\n            // next 24 bits of data\n            protocolFee := and(shr(184, data), 0xFFFFFF)\n            // last 24 bits of data\n            lpFee := and(shr(208, data), 0xFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the tick information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve information for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickInfo(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (\n            uint128 liquidityGross,\n            int128 liquidityNet,\n            uint256 feeGrowthOutside0X128,\n            uint256 feeGrowthOutside1X128\n        )\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // read all 3 words of the TickInfo struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n        assembly (\"memory-safe\") {\n            let firstWord := mload(add(data, 32))\n            liquidityNet := sar(128, firstWord)\n            liquidityGross := and(firstWord, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n            feeGrowthOutside0X128 := mload(add(data, 64))\n            feeGrowthOutside1X128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity information of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].ticks[tick].liquidityGross and pools[poolId].ticks[tick].liquidityNet. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve liquidity for.\n     * @return liquidityGross The total position liquidity that references this tick\n     * @return liquidityNet The amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n     */\n    function getTickLiquidity(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint128 liquidityGross, int128 liquidityNet)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        bytes32 value = manager.extsload(slot);\n        assembly (\"memory-safe\") {\n            liquidityNet := sar(128, value)\n            liquidityGross := and(value, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)\n        }\n    }\n\n    /**\n     * @notice Retrieves the fee growth outside a tick range of a pool\n     * @dev Corresponds to pools[poolId].ticks[tick].feeGrowthOutside0X128 and pools[poolId].ticks[tick].feeGrowthOutside1X128. A more gas efficient version of getTickInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve fee growth for.\n     * @return feeGrowthOutside0X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     * @return feeGrowthOutside1X128 fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n     */\n    function getTickFeeGrowthOutside(IPoolManager manager, PoolId poolId, int24 tick)\n        internal\n        view\n        returns (uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128)\n    {\n        bytes32 slot = _getTickInfoSlot(poolId, tick);\n\n        // offset by 1 word, since the first word is liquidityGross + liquidityNet\n        bytes32[] memory data = manager.extsload(bytes32(uint256(slot) + 1), 2);\n        assembly (\"memory-safe\") {\n            feeGrowthOutside0X128 := mload(add(data, 32))\n            feeGrowthOutside1X128 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves the global fee growth of a pool.\n     * @dev Corresponds to pools[poolId].feeGrowthGlobal0X128 and pools[poolId].feeGrowthGlobal1X128\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return feeGrowthGlobal0 The global fee growth for token0.\n     * @return feeGrowthGlobal1 The global fee growth for token1.\n     * @dev Note that feeGrowthGlobal can be artificially inflated\n     * For pools with a single liquidity position, actors can donate to themselves to freely inflate feeGrowthGlobal\n     * atomically donating and collecting fees in the same unlockCallback may make the inflated value more extreme\n     */\n    function getFeeGrowthGlobals(IPoolManager manager, PoolId poolId)\n        internal\n        view\n        returns (uint256 feeGrowthGlobal0, uint256 feeGrowthGlobal1)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State, `uint256 feeGrowthGlobal0X128`\n        bytes32 slot_feeGrowthGlobal0X128 = bytes32(uint256(stateSlot) + FEE_GROWTH_GLOBAL0_OFFSET);\n\n        // read the 2 words of feeGrowthGlobal\n        bytes32[] memory data = manager.extsload(slot_feeGrowthGlobal0X128, 2);\n        assembly (\"memory-safe\") {\n            feeGrowthGlobal0 := mload(add(data, 32))\n            feeGrowthGlobal1 := mload(add(data, 64))\n        }\n    }\n\n    /**\n     * @notice Retrieves total the liquidity of a pool.\n     * @dev Corresponds to pools[poolId].liquidity\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @return liquidity The liquidity of the pool.\n     */\n    function getLiquidity(IPoolManager manager, PoolId poolId) internal view returns (uint128 liquidity) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `uint128 liquidity`\n        bytes32 slot = bytes32(uint256(stateSlot) + LIQUIDITY_OFFSET);\n\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Retrieves the tick bitmap of a pool at a specific tick.\n     * @dev Corresponds to pools[poolId].tickBitmap[tick]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tick The tick to retrieve the bitmap for.\n     * @return tickBitmap The bitmap of the tick.\n     */\n    function getTickBitmap(IPoolManager manager, PoolId poolId, int16 tick)\n        internal\n        view\n        returns (uint256 tickBitmap)\n    {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int16 => uint256) tickBitmap;`\n        bytes32 tickBitmapMapping = bytes32(uint256(stateSlot) + TICK_BITMAP_OFFSET);\n\n        // slot id of the mapping key: `pools[poolId].tickBitmap[tick]\n        bytes32 slot = keccak256(abi.encodePacked(int256(tick), tickBitmapMapping));\n\n        tickBitmap = uint256(manager.extsload(slot));\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool without needing to calculate the `positionId`.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param poolId The ID of the pool.\n     * @param owner The owner of the liquidity position.\n     * @param tickLower The lower tick of the liquidity range.\n     * @param tickUpper The upper tick of the liquidity range.\n     * @param salt The bytes32 randomness to further distinguish position state.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(\n        IPoolManager manager,\n        PoolId poolId,\n        address owner,\n        int24 tickLower,\n        int24 tickUpper,\n        bytes32 salt\n    ) internal view returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128) {\n        // positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt))\n        bytes32 positionKey = Position.calculatePositionKey(owner, tickLower, tickUpper, salt);\n\n        (liquidity, feeGrowthInside0LastX128, feeGrowthInside1LastX128) = getPositionInfo(manager, poolId, positionKey);\n    }\n\n    /**\n     * @notice Retrieves the position information of a pool at a specific position ID.\n     * @dev Corresponds to pools[poolId].positions[positionId]\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     * @return feeGrowthInside0LastX128 The fee growth inside the position for token0.\n     * @return feeGrowthInside1LastX128 The fee growth inside the position for token1.\n     */\n    function getPositionInfo(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n\n        // read all 3 words of the Position.State struct\n        bytes32[] memory data = manager.extsload(slot, 3);\n\n        assembly (\"memory-safe\") {\n            liquidity := mload(add(data, 32))\n            feeGrowthInside0LastX128 := mload(add(data, 64))\n            feeGrowthInside1LastX128 := mload(add(data, 96))\n        }\n    }\n\n    /**\n     * @notice Retrieves the liquidity of a position.\n     * @dev Corresponds to pools[poolId].positions[positionId].liquidity. More gas efficient for just retrieiving liquidity as compared to getPositionInfo\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param positionId The ID of the position.\n     * @return liquidity The liquidity of the position.\n     */\n    function getPositionLiquidity(IPoolManager manager, PoolId poolId, bytes32 positionId)\n        internal\n        view\n        returns (uint128 liquidity)\n    {\n        bytes32 slot = _getPositionInfoSlot(poolId, positionId);\n        liquidity = uint128(uint256(manager.extsload(slot)));\n    }\n\n    /**\n     * @notice Calculate the fee growth inside a tick range of a pool\n     * @dev pools[poolId].feeGrowthInside0LastX128 in Position.State is cached and can become stale. This function will calculate the up to date feeGrowthInside\n     * @param manager The pool manager contract.\n     * @param poolId The ID of the pool.\n     * @param tickLower The lower tick of the range.\n     * @param tickUpper The upper tick of the range.\n     * @return feeGrowthInside0X128 The fee growth inside the tick range for token0.\n     * @return feeGrowthInside1X128 The fee growth inside the tick range for token1.\n     */\n    function getFeeGrowthInside(IPoolManager manager, PoolId poolId, int24 tickLower, int24 tickUpper)\n        internal\n        view\n        returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128)\n    {\n        (uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128) = getFeeGrowthGlobals(manager, poolId);\n\n        (uint256 lowerFeeGrowthOutside0X128, uint256 lowerFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickLower);\n        (uint256 upperFeeGrowthOutside0X128, uint256 upperFeeGrowthOutside1X128) =\n            getTickFeeGrowthOutside(manager, poolId, tickUpper);\n        (, int24 tickCurrent,,) = getSlot0(manager, poolId);\n        unchecked {\n            if (tickCurrent < tickLower) {\n                feeGrowthInside0X128 = lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            } else if (tickCurrent >= tickUpper) {\n                feeGrowthInside0X128 = upperFeeGrowthOutside0X128 - lowerFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = upperFeeGrowthOutside1X128 - lowerFeeGrowthOutside1X128;\n            } else {\n                feeGrowthInside0X128 = feeGrowthGlobal0X128 - lowerFeeGrowthOutside0X128 - upperFeeGrowthOutside0X128;\n                feeGrowthInside1X128 = feeGrowthGlobal1X128 - lowerFeeGrowthOutside1X128 - upperFeeGrowthOutside1X128;\n            }\n        }\n    }\n\n    function _getPoolStateSlot(PoolId poolId) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(PoolId.unwrap(poolId), POOLS_SLOT));\n    }\n\n    function _getTickInfoSlot(PoolId poolId, int24 tick) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(int24 => TickInfo) ticks`\n        bytes32 ticksMappingSlot = bytes32(uint256(stateSlot) + TICKS_OFFSET);\n\n        // slot key of the tick key: `pools[poolId].ticks[tick]\n        return keccak256(abi.encodePacked(int256(tick), ticksMappingSlot));\n    }\n\n    function _getPositionInfoSlot(PoolId poolId, bytes32 positionId) internal pure returns (bytes32) {\n        // slot key of Pool.State value: `pools[poolId]`\n        bytes32 stateSlot = _getPoolStateSlot(poolId);\n\n        // Pool.State: `mapping(bytes32 => Position.State) positions;`\n        bytes32 positionMapping = bytes32(uint256(stateSlot) + POSITIONS_OFFSET);\n\n        // slot of the mapping key: `pools[poolId].positions[positionId]\n        return keccak256(abi.encodePacked(positionId, positionMapping));\n    }\n}\n"
  },
  {
    "path": "src/libraries/SwapMath.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {FullMath} from \"./FullMath.sol\";\nimport {SqrtPriceMath} from \"./SqrtPriceMath.sol\";\n\n/// @title Computes the result of a swap within ticks\n/// @notice Contains methods for computing the result of a swap within a single tick price range, i.e., a single tick.\nlibrary SwapMath {\n    /// @notice the swap fee is represented in hundredths of a bip, so the max is 100%\n    /// @dev the swap fee is the total fee on a swap, including both LP and Protocol fee\n    uint256 internal constant MAX_SWAP_FEE = 1e6;\n\n    /// @notice Computes the sqrt price target for the next swap step\n    /// @param zeroForOne The direction of the swap, true for currency0 to currency1, false for currency1 to currency0\n    /// @param sqrtPriceNextX96 The Q64.96 sqrt price for the next initialized tick\n    /// @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this value\n    /// after the swap. If one for zero, the price cannot be greater than this value after the swap\n    /// @return sqrtPriceTargetX96 The price target for the next swap step\n    function getSqrtPriceTarget(bool zeroForOne, uint160 sqrtPriceNextX96, uint160 sqrtPriceLimitX96)\n        internal\n        pure\n        returns (uint160 sqrtPriceTargetX96)\n    {\n        assembly (\"memory-safe\") {\n            // a flag to toggle between sqrtPriceNextX96 and sqrtPriceLimitX96\n            // when zeroForOne == true, nextOrLimit reduces to sqrtPriceNextX96 >= sqrtPriceLimitX96\n            // sqrtPriceTargetX96 = max(sqrtPriceNextX96, sqrtPriceLimitX96)\n            // when zeroForOne == false, nextOrLimit reduces to sqrtPriceNextX96 < sqrtPriceLimitX96\n            // sqrtPriceTargetX96 = min(sqrtPriceNextX96, sqrtPriceLimitX96)\n            sqrtPriceNextX96 := and(sqrtPriceNextX96, 0xffffffffffffffffffffffffffffffffffffffff)\n            sqrtPriceLimitX96 := and(sqrtPriceLimitX96, 0xffffffffffffffffffffffffffffffffffffffff)\n            let nextOrLimit := xor(lt(sqrtPriceNextX96, sqrtPriceLimitX96), and(zeroForOne, 0x1))\n            let symDiff := xor(sqrtPriceNextX96, sqrtPriceLimitX96)\n            sqrtPriceTargetX96 := xor(sqrtPriceLimitX96, mul(symDiff, nextOrLimit))\n        }\n    }\n\n    /// @notice Computes the result of swapping some amount in, or amount out, given the parameters of the swap\n    /// @dev If the swap's amountSpecified is negative, the combined fee and input amount will never exceed the absolute value of the remaining amount.\n    /// @param sqrtPriceCurrentX96 The current sqrt price of the pool\n    /// @param sqrtPriceTargetX96 The price that cannot be exceeded, from which the direction of the swap is inferred\n    /// @param liquidity The usable liquidity\n    /// @param amountRemaining How much input or output amount is remaining to be swapped in/out\n    /// @param feePips The fee taken from the input amount, expressed in hundredths of a bip\n    /// @return sqrtPriceNextX96 The price after swapping the amount in/out, not to exceed the price target\n    /// @return amountIn The amount to be swapped in, of either currency0 or currency1, based on the direction of the swap\n    /// @return amountOut The amount to be received, of either currency0 or currency1, based on the direction of the swap\n    /// @return feeAmount The amount of input that will be taken as a fee\n    /// @dev feePips must be no larger than MAX_SWAP_FEE for this function. We ensure that before setting a fee using LPFeeLibrary.isValid.\n    function computeSwapStep(\n        uint160 sqrtPriceCurrentX96,\n        uint160 sqrtPriceTargetX96,\n        uint128 liquidity,\n        int256 amountRemaining,\n        uint24 feePips\n    ) internal pure returns (uint160 sqrtPriceNextX96, uint256 amountIn, uint256 amountOut, uint256 feeAmount) {\n        unchecked {\n            uint256 _feePips = feePips; // upcast once and cache\n            bool zeroForOne = sqrtPriceCurrentX96 >= sqrtPriceTargetX96;\n            bool exactIn = amountRemaining < 0;\n\n            if (exactIn) {\n                uint256 amountRemainingLessFee =\n                    FullMath.mulDiv(uint256(-amountRemaining), MAX_SWAP_FEE - _feePips, MAX_SWAP_FEE);\n                amountIn = zeroForOne\n                    ? SqrtPriceMath.getAmount0Delta(sqrtPriceTargetX96, sqrtPriceCurrentX96, liquidity, true)\n                    : SqrtPriceMath.getAmount1Delta(sqrtPriceCurrentX96, sqrtPriceTargetX96, liquidity, true);\n                if (amountRemainingLessFee >= amountIn) {\n                    // `amountIn` is capped by the target price\n                    sqrtPriceNextX96 = sqrtPriceTargetX96;\n                    feeAmount = _feePips == MAX_SWAP_FEE\n                        ? amountIn // amountIn is always 0 here, as amountRemainingLessFee == 0 and amountRemainingLessFee >= amountIn\n                        : FullMath.mulDivRoundingUp(amountIn, _feePips, MAX_SWAP_FEE - _feePips);\n                } else {\n                    // exhaust the remaining amount\n                    amountIn = amountRemainingLessFee;\n                    sqrtPriceNextX96 = SqrtPriceMath.getNextSqrtPriceFromInput(\n                        sqrtPriceCurrentX96, liquidity, amountRemainingLessFee, zeroForOne\n                    );\n                    // we didn't reach the target, so take the remainder of the maximum input as fee\n                    feeAmount = uint256(-amountRemaining) - amountIn;\n                }\n                amountOut = zeroForOne\n                    ? SqrtPriceMath.getAmount1Delta(sqrtPriceNextX96, sqrtPriceCurrentX96, liquidity, false)\n                    : SqrtPriceMath.getAmount0Delta(sqrtPriceCurrentX96, sqrtPriceNextX96, liquidity, false);\n            } else {\n                amountOut = zeroForOne\n                    ? SqrtPriceMath.getAmount1Delta(sqrtPriceTargetX96, sqrtPriceCurrentX96, liquidity, false)\n                    : SqrtPriceMath.getAmount0Delta(sqrtPriceCurrentX96, sqrtPriceTargetX96, liquidity, false);\n                if (uint256(amountRemaining) >= amountOut) {\n                    // `amountOut` is capped by the target price\n                    sqrtPriceNextX96 = sqrtPriceTargetX96;\n                } else {\n                    // cap the output amount to not exceed the remaining output amount\n                    amountOut = uint256(amountRemaining);\n                    sqrtPriceNextX96 =\n                        SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtPriceCurrentX96, liquidity, amountOut, zeroForOne);\n                }\n                amountIn = zeroForOne\n                    ? SqrtPriceMath.getAmount0Delta(sqrtPriceNextX96, sqrtPriceCurrentX96, liquidity, true)\n                    : SqrtPriceMath.getAmount1Delta(sqrtPriceCurrentX96, sqrtPriceNextX96, liquidity, true);\n                // `feePips` cannot be `MAX_SWAP_FEE` for exact out\n                feeAmount = FullMath.mulDivRoundingUp(amountIn, _feePips, MAX_SWAP_FEE - _feePips);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/TickBitmap.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {BitMath} from \"./BitMath.sol\";\n\n/// @title Packed tick initialized state library\n/// @notice Stores a packed mapping of tick index to its initialized state\n/// @dev The mapping uses int16 for keys since ticks are represented as int24 and there are 256 (2^8) values per word.\nlibrary TickBitmap {\n    /// @notice Thrown when the tick is not enumerated by the tick spacing\n    /// @param tick the invalid tick\n    /// @param tickSpacing The tick spacing of the pool\n    error TickMisaligned(int24 tick, int24 tickSpacing);\n\n    /// @dev round towards negative infinity\n    function compress(int24 tick, int24 tickSpacing) internal pure returns (int24 compressed) {\n        // compressed = tick / tickSpacing;\n        // if (tick < 0 && tick % tickSpacing != 0) compressed--;\n        assembly (\"memory-safe\") {\n            tick := signextend(2, tick)\n            tickSpacing := signextend(2, tickSpacing)\n            compressed :=\n                sub(\n                    sdiv(tick, tickSpacing),\n                    // if (tick < 0 && tick % tickSpacing != 0) then tick % tickSpacing < 0, vice versa\n                    slt(smod(tick, tickSpacing), 0)\n                )\n        }\n    }\n\n    /// @notice Computes the position in the mapping where the initialized bit for a tick lives\n    /// @param tick The tick for which to compute the position\n    /// @return wordPos The key in the mapping containing the word in which the bit is stored\n    /// @return bitPos The bit position in the word where the flag is stored\n    function position(int24 tick) internal pure returns (int16 wordPos, uint8 bitPos) {\n        assembly (\"memory-safe\") {\n            // signed arithmetic shift right\n            wordPos := sar(8, signextend(2, tick))\n            bitPos := and(tick, 0xff)\n        }\n    }\n\n    /// @notice Flips the initialized state for a given tick from false to true, or vice versa\n    /// @param self The mapping in which to flip the tick\n    /// @param tick The tick to flip\n    /// @param tickSpacing The spacing between usable ticks\n    function flipTick(mapping(int16 => uint256) storage self, int24 tick, int24 tickSpacing) internal {\n        // Equivalent to the following Solidity:\n        //     if (tick % tickSpacing != 0) revert TickMisaligned(tick, tickSpacing);\n        //     (int16 wordPos, uint8 bitPos) = position(tick / tickSpacing);\n        //     uint256 mask = 1 << bitPos;\n        //     self[wordPos] ^= mask;\n        assembly (\"memory-safe\") {\n            tick := signextend(2, tick)\n            tickSpacing := signextend(2, tickSpacing)\n            // ensure that the tick is spaced\n            if smod(tick, tickSpacing) {\n                let fmp := mload(0x40)\n                mstore(fmp, 0xd4d8f3e6) // selector for TickMisaligned(int24,int24)\n                mstore(add(fmp, 0x20), tick)\n                mstore(add(fmp, 0x40), tickSpacing)\n                revert(add(fmp, 0x1c), 0x44)\n            }\n            tick := sdiv(tick, tickSpacing)\n            // calculate the storage slot corresponding to the tick\n            // wordPos = tick >> 8\n            mstore(0, sar(8, tick))\n            mstore(0x20, self.slot)\n            // the slot of self[wordPos] is keccak256(abi.encode(wordPos, self.slot))\n            let slot := keccak256(0, 0x40)\n            // mask = 1 << bitPos = 1 << (tick % 256)\n            // self[wordPos] ^= mask\n            sstore(slot, xor(sload(slot), shl(and(tick, 0xff), 1)))\n        }\n    }\n\n    /// @notice Returns the next initialized tick contained in the same word (or adjacent word) as the tick that is either\n    /// to the left (less than or equal to) or right (greater than) of the given tick\n    /// @param self The mapping in which to compute the next initialized tick\n    /// @param tick The starting tick\n    /// @param tickSpacing The spacing between usable ticks\n    /// @param lte Whether to search for the next initialized tick to the left (less than or equal to the starting tick)\n    /// @return next The next initialized or uninitialized tick up to 256 ticks away from the current tick\n    /// @return initialized Whether the next tick is initialized, as the function only searches within up to 256 ticks\n    function nextInitializedTickWithinOneWord(\n        mapping(int16 => uint256) storage self,\n        int24 tick,\n        int24 tickSpacing,\n        bool lte\n    ) internal view returns (int24 next, bool initialized) {\n        unchecked {\n            int24 compressed = compress(tick, tickSpacing);\n\n            if (lte) {\n                (int16 wordPos, uint8 bitPos) = position(compressed);\n                // all the 1s at or to the right of the current bitPos\n                uint256 mask = type(uint256).max >> (uint256(type(uint8).max) - bitPos);\n                uint256 masked = self[wordPos] & mask;\n\n                // if there are no initialized ticks to the right of or at the current tick, return rightmost in the word\n                initialized = masked != 0;\n                // overflow/underflow is possible, but prevented externally by limiting both tickSpacing and tick\n                next = initialized\n                    ? (compressed - int24(uint24(bitPos - BitMath.mostSignificantBit(masked)))) * tickSpacing\n                    : (compressed - int24(uint24(bitPos))) * tickSpacing;\n            } else {\n                // start from the word of the next tick, since the current tick state doesn't matter\n                (int16 wordPos, uint8 bitPos) = position(++compressed);\n                // all the 1s at or to the left of the bitPos\n                uint256 mask = ~((1 << bitPos) - 1);\n                uint256 masked = self[wordPos] & mask;\n\n                // if there are no initialized ticks to the left of the current tick, return leftmost in the word\n                initialized = masked != 0;\n                // overflow/underflow is possible, but prevented externally by limiting both tickSpacing and tick\n                next = initialized\n                    ? (compressed + int24(uint24(BitMath.leastSignificantBit(masked) - bitPos))) * tickSpacing\n                    : (compressed + int24(uint24(type(uint8).max - bitPos))) * tickSpacing;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/TickMath.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {BitMath} from \"./BitMath.sol\";\nimport {CustomRevert} from \"./CustomRevert.sol\";\n\n/// @title Math library for computing sqrt prices from ticks and vice versa\n/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports\n/// prices between 2**-128 and 2**128\nlibrary TickMath {\n    using CustomRevert for bytes4;\n\n    /// @notice Thrown when the tick passed to #getSqrtPriceAtTick is not between MIN_TICK and MAX_TICK\n    error InvalidTick(int24 tick);\n    /// @notice Thrown when the price passed to #getTickAtSqrtPrice does not correspond to a price between MIN_TICK and MAX_TICK\n    error InvalidSqrtPrice(uint160 sqrtPriceX96);\n\n    /// @dev The minimum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**-128\n    /// @dev If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\n    int24 internal constant MIN_TICK = -887272;\n    /// @dev The maximum tick that may be passed to #getSqrtPriceAtTick computed from log base 1.0001 of 2**128\n    /// @dev If ever MIN_TICK and MAX_TICK are not centered around 0, the absTick logic in getSqrtPriceAtTick cannot be used\n    int24 internal constant MAX_TICK = 887272;\n\n    /// @dev The minimum tick spacing value drawn from the range of type int16 that is greater than 0, i.e. min from the range [1, 32767]\n    int24 internal constant MIN_TICK_SPACING = 1;\n    /// @dev The maximum tick spacing value drawn from the range of type int16, i.e. max from the range [1, 32767]\n    int24 internal constant MAX_TICK_SPACING = type(int16).max;\n\n    /// @dev The minimum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MIN_TICK)\n    uint160 internal constant MIN_SQRT_PRICE = 4295128739;\n    /// @dev The maximum value that can be returned from #getSqrtPriceAtTick. Equivalent to getSqrtPriceAtTick(MAX_TICK)\n    uint160 internal constant MAX_SQRT_PRICE = 1461446703485210103287273052203988822378723970342;\n    /// @dev A threshold used for optimized bounds check, equals `MAX_SQRT_PRICE - MIN_SQRT_PRICE - 1`\n    uint160 internal constant MAX_SQRT_PRICE_MINUS_MIN_SQRT_PRICE_MINUS_ONE =\n        1461446703485210103287273052203988822378723970342 - 4295128739 - 1;\n\n    /// @notice Given a tickSpacing, compute the maximum usable tick\n    function maxUsableTick(int24 tickSpacing) internal pure returns (int24) {\n        unchecked {\n            return (MAX_TICK / tickSpacing) * tickSpacing;\n        }\n    }\n\n    /// @notice Given a tickSpacing, compute the minimum usable tick\n    function minUsableTick(int24 tickSpacing) internal pure returns (int24) {\n        unchecked {\n            return (MIN_TICK / tickSpacing) * tickSpacing;\n        }\n    }\n\n    /// @notice Calculates sqrt(1.0001^tick) * 2^96\n    /// @dev Throws if |tick| > max tick\n    /// @param tick The input tick for the above formula\n    /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the price of the two assets (currency1/currency0)\n    /// at the given tick\n    function getSqrtPriceAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {\n        unchecked {\n            uint256 absTick;\n            assembly (\"memory-safe\") {\n                tick := signextend(2, tick)\n                // mask = 0 if tick >= 0 else -1 (all 1s)\n                let mask := sar(255, tick)\n                // if tick >= 0, |tick| = tick = 0 ^ tick\n                // if tick < 0, |tick| = ~~|tick| = ~(-|tick| - 1) = ~(tick - 1) = (-1) ^ (tick - 1)\n                // either way, |tick| = mask ^ (tick + mask)\n                absTick := xor(mask, add(mask, tick))\n            }\n\n            if (absTick > uint256(int256(MAX_TICK))) InvalidTick.selector.revertWith(tick);\n\n            // The tick is decomposed into bits, and for each bit with index i that is set, the product of 1/sqrt(1.0001^(2^i))\n            // is calculated (using Q128.128). The constants used for this calculation are rounded to the nearest integer\n\n            // Equivalent to:\n            //     price = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;\n            //     or price = int(2**128 / sqrt(1.0001)) if (absTick & 0x1) else 1 << 128\n            uint256 price;\n            assembly (\"memory-safe\") {\n                price := xor(shl(128, 1), mul(xor(shl(128, 1), 0xfffcb933bd6fad37aa2d162d1a594001), and(absTick, 0x1)))\n            }\n            if (absTick & 0x2 != 0) price = (price * 0xfff97272373d413259a46990580e213a) >> 128;\n            if (absTick & 0x4 != 0) price = (price * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;\n            if (absTick & 0x8 != 0) price = (price * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;\n            if (absTick & 0x10 != 0) price = (price * 0xffcb9843d60f6159c9db58835c926644) >> 128;\n            if (absTick & 0x20 != 0) price = (price * 0xff973b41fa98c081472e6896dfb254c0) >> 128;\n            if (absTick & 0x40 != 0) price = (price * 0xff2ea16466c96a3843ec78b326b52861) >> 128;\n            if (absTick & 0x80 != 0) price = (price * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;\n            if (absTick & 0x100 != 0) price = (price * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;\n            if (absTick & 0x200 != 0) price = (price * 0xf987a7253ac413176f2b074cf7815e54) >> 128;\n            if (absTick & 0x400 != 0) price = (price * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;\n            if (absTick & 0x800 != 0) price = (price * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;\n            if (absTick & 0x1000 != 0) price = (price * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;\n            if (absTick & 0x2000 != 0) price = (price * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;\n            if (absTick & 0x4000 != 0) price = (price * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;\n            if (absTick & 0x8000 != 0) price = (price * 0x31be135f97d08fd981231505542fcfa6) >> 128;\n            if (absTick & 0x10000 != 0) price = (price * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;\n            if (absTick & 0x20000 != 0) price = (price * 0x5d6af8dedb81196699c329225ee604) >> 128;\n            if (absTick & 0x40000 != 0) price = (price * 0x2216e584f5fa1ea926041bedfe98) >> 128;\n            if (absTick & 0x80000 != 0) price = (price * 0x48a170391f7dc42444e8fa2) >> 128;\n\n            assembly (\"memory-safe\") {\n                // if (tick > 0) price = type(uint256).max / price;\n                if sgt(tick, 0) { price := div(not(0), price) }\n\n                // this divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96.\n                // we then downcast because we know the result always fits within 160 bits due to our tick input constraint\n                // we round up in the division so getTickAtSqrtPrice of the output price is always consistent\n                // `sub(shl(32, 1), 1)` is `type(uint32).max`\n                // `price + type(uint32).max` will not overflow because `price` fits in 192 bits\n                sqrtPriceX96 := shr(32, add(price, sub(shl(32, 1), 1)))\n            }\n        }\n    }\n\n    /// @notice Calculates the greatest tick value such that getSqrtPriceAtTick(tick) <= sqrtPriceX96\n    /// @dev Throws in case sqrtPriceX96 < MIN_SQRT_PRICE, as MIN_SQRT_PRICE is the lowest value getSqrtPriceAtTick may\n    /// ever return.\n    /// @param sqrtPriceX96 The sqrt price for which to compute the tick as a Q64.96\n    /// @return tick The greatest tick for which the getSqrtPriceAtTick(tick) is less than or equal to the input sqrtPriceX96\n    function getTickAtSqrtPrice(uint160 sqrtPriceX96) internal pure returns (int24 tick) {\n        unchecked {\n            // Equivalent: if (sqrtPriceX96 < MIN_SQRT_PRICE || sqrtPriceX96 >= MAX_SQRT_PRICE) revert InvalidSqrtPrice();\n            // second inequality must be >= because the price can never reach the price at the max tick\n            // if sqrtPriceX96 < MIN_SQRT_PRICE, the `sub` underflows and `gt` is true\n            // if sqrtPriceX96 >= MAX_SQRT_PRICE, sqrtPriceX96 - MIN_SQRT_PRICE > MAX_SQRT_PRICE - MIN_SQRT_PRICE - 1\n            if ((sqrtPriceX96 - MIN_SQRT_PRICE) > MAX_SQRT_PRICE_MINUS_MIN_SQRT_PRICE_MINUS_ONE) {\n                InvalidSqrtPrice.selector.revertWith(sqrtPriceX96);\n            }\n\n            uint256 price = uint256(sqrtPriceX96) << 32;\n\n            uint256 r = price;\n            uint256 msb = BitMath.mostSignificantBit(r);\n\n            if (msb >= 128) r = price >> (msb - 127);\n            else r = price << (127 - msb);\n\n            int256 log_2 = (int256(msb) - 128) << 64;\n\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(63, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(62, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(61, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(60, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(59, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(58, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(57, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(56, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(55, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(54, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(53, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(52, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(51, f))\n                r := shr(f, r)\n            }\n            assembly (\"memory-safe\") {\n                r := shr(127, mul(r, r))\n                let f := shr(128, r)\n                log_2 := or(log_2, shl(50, f))\n            }\n\n            int256 log_sqrt10001 = log_2 * 255738958999603826347141; // Q22.128 number\n\n            // Magic number represents the ceiling of the maximum value of the error when approximating log_sqrt10001(x)\n            int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);\n\n            // Magic number represents the minimum value of the error when approximating log_sqrt10001(x), when\n            // sqrtPrice is from the range (2^-64, 2^64). This is safe as MIN_SQRT_PRICE is more than 2^-64. If MIN_SQRT_PRICE\n            // is changed, this may need to be changed too\n            int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);\n\n            tick = tickLow == tickHi ? tickLow : getSqrtPriceAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;\n        }\n    }\n}\n"
  },
  {
    "path": "src/libraries/TransientStateLibrary.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {CurrencyReserves} from \"./CurrencyReserves.sol\";\nimport {NonzeroDeltaCount} from \"./NonzeroDeltaCount.sol\";\nimport {Lock} from \"./Lock.sol\";\n\n/// @notice A helper library to provide state getters that use exttload\nlibrary TransientStateLibrary {\n    /// @notice returns the reserves for the synced currency\n    /// @param manager The pool manager contract.\n\n    /// @return uint256 The reserves of the currency.\n    /// @dev returns 0 if the reserves are not synced or value is 0.\n    /// Checks the synced currency to only return valid reserve values (after a sync and before a settle).\n    function getSyncedReserves(IPoolManager manager) internal view returns (uint256) {\n        if (getSyncedCurrency(manager).isAddressZero()) return 0;\n        return uint256(manager.exttload(CurrencyReserves.RESERVES_OF_SLOT));\n    }\n\n    function getSyncedCurrency(IPoolManager manager) internal view returns (Currency) {\n        return Currency.wrap(address(uint160(uint256(manager.exttload(CurrencyReserves.CURRENCY_SLOT)))));\n    }\n\n    /// @notice Returns the number of nonzero deltas open on the PoolManager that must be zeroed out before the contract is locked\n    function getNonzeroDeltaCount(IPoolManager manager) internal view returns (uint256) {\n        return uint256(manager.exttload(NonzeroDeltaCount.NONZERO_DELTA_COUNT_SLOT));\n    }\n\n    /// @notice Get the current delta for a caller in the given currency\n    /// @param target The credited account address\n    /// @param currency The currency for which to lookup the delta\n    function currencyDelta(IPoolManager manager, address target, Currency currency) internal view returns (int256) {\n        bytes32 key;\n        assembly (\"memory-safe\") {\n            mstore(0, and(target, 0xffffffffffffffffffffffffffffffffffffffff))\n            mstore(32, and(currency, 0xffffffffffffffffffffffffffffffffffffffff))\n            key := keccak256(0, 64)\n        }\n        return int256(uint256(manager.exttload(key)));\n    }\n\n    /// @notice Returns whether the contract is unlocked or not\n    function isUnlocked(IPoolManager manager) internal view returns (bool) {\n        return manager.exttload(Lock.IS_UNLOCKED_SLOT) != 0x0;\n    }\n}\n"
  },
  {
    "path": "src/libraries/UnsafeMath.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Math functions that do not check inputs or outputs\n/// @notice Contains methods that perform common math functions but do not do any overflow or underflow checks\nlibrary UnsafeMath {\n    /// @notice Returns ceil(x / y)\n    /// @dev division by 0 will return 0, and should be checked externally\n    /// @param x The dividend\n    /// @param y The divisor\n    /// @return z The quotient, ceil(x / y)\n    function divRoundingUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        assembly (\"memory-safe\") {\n            z := add(div(x, y), gt(mod(x, y), 0))\n        }\n    }\n\n    /// @notice Calculates floor(a×b÷denominator)\n    /// @dev division by 0 will return 0, and should be checked externally\n    /// @param a The multiplicand\n    /// @param b The multiplier\n    /// @param denominator The divisor\n    /// @return result The 256-bit result, floor(a×b÷denominator)\n    function simpleMulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n        assembly (\"memory-safe\") {\n            result := div(mul(a, b), denominator)\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/ActionsRouter.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport \"forge-std/Test.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"../interfaces/callback/IUnlockCallback.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {StateLibrary} from \"../libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"../libraries/TransientStateLibrary.sol\";\n\n// Supported Actions.\nenum Actions {\n    SETTLE,\n    SETTLE_NATIVE,\n    SETTLE_FOR,\n    TAKE,\n    PRANK_TAKE_FROM,\n    SYNC,\n    MINT,\n    CLEAR,\n    ASSERT_BALANCE_EQUALS,\n    ASSERT_RESERVES_EQUALS,\n    ASSERT_DELTA_EQUALS,\n    ASSERT_NONZERO_DELTA_COUNT_EQUALS,\n    TRANSFER_FROM,\n    COLLECT_PROTOCOL_FEES\n}\n// TODO: Add other actions as needed.\n// BURN,\n// MODIFY_POSITION,\n// INITIALIZE,\n// DONATE\n\n/// @notice A router that handles an arbitrary input of actions.\n/// TODO: Can continue to add functions per action.\ncontract ActionsRouter is IUnlockCallback, Test {\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n\n    error ActionNotSupported();\n\n    // error thrown so that incorrectly formatted tests don't pass silently\n    error CheckParameters();\n\n    IPoolManager manager;\n\n    constructor(IPoolManager _manager) {\n        manager = _manager;\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        (Actions[] memory actions, bytes[] memory params) = abi.decode(data, (Actions[], bytes[]));\n        if (actions.length != params.length || actions.length == 0) revert CheckParameters();\n        for (uint256 i = 0; i < actions.length; i++) {\n            Actions action = actions[i];\n            bytes memory param = params[i];\n            if (action == Actions.SETTLE) {\n                _settle();\n            } else if (action == Actions.SETTLE_NATIVE) {\n                _settleNative(param);\n            } else if (action == Actions.SETTLE_FOR) {\n                _settleFor(param);\n            } else if (action == Actions.TAKE) {\n                _take(param);\n            } else if (action == Actions.PRANK_TAKE_FROM) {\n                _prankTakeFrom(param);\n            } else if (action == Actions.SYNC) {\n                _sync(param);\n            } else if (action == Actions.MINT) {\n                _mint(param);\n            } else if (action == Actions.CLEAR) {\n                _clear(param);\n            } else if (action == Actions.ASSERT_BALANCE_EQUALS) {\n                _assertBalanceEquals(param);\n            } else if (action == Actions.ASSERT_RESERVES_EQUALS) {\n                _assertReservesEquals(param);\n            } else if (action == Actions.ASSERT_DELTA_EQUALS) {\n                _assertDeltaEquals(param);\n            } else if (action == Actions.ASSERT_NONZERO_DELTA_COUNT_EQUALS) {\n                _assertNonzeroDeltaCountEquals(param);\n            } else if (action == Actions.TRANSFER_FROM) {\n                _transferFrom(param);\n            } else if (action == Actions.COLLECT_PROTOCOL_FEES) {\n                _collectProtocolFees(param);\n            }\n        }\n        return \"\";\n    }\n\n    function executeActions(Actions[] memory actions, bytes[] memory params) external payable {\n        manager.unlock(abi.encode(actions, params));\n    }\n\n    function _settle() internal {\n        manager.settle();\n    }\n\n    function _settleNative(bytes memory params) internal {\n        uint256 amount = abi.decode(params, (uint256));\n        manager.settle{value: amount}();\n    }\n\n    function _settleFor(bytes memory params) internal {\n        address recipient = abi.decode(params, (address));\n        manager.settleFor(recipient);\n    }\n\n    function _take(bytes memory params) internal {\n        (Currency currency, address recipient, int128 amount) = abi.decode(params, (Currency, address, int128));\n        manager.take(currency, recipient, uint128(amount));\n    }\n\n    function _prankTakeFrom(bytes memory params) internal {\n        (Currency currency, address from, address recipient, uint256 amount) =\n            abi.decode(params, (Currency, address, address, uint256));\n        vm.prank(from);\n        manager.take(currency, recipient, amount);\n    }\n\n    function _sync(bytes memory params) internal {\n        Currency currency = Currency.wrap(abi.decode(params, (address)));\n        manager.sync(currency);\n    }\n\n    function _mint(bytes memory params) internal {\n        (address recipient, Currency currency, uint256 amount) = abi.decode(params, (address, Currency, uint256));\n        manager.mint(recipient, currency.toId(), amount);\n    }\n\n    function _clear(bytes memory params) internal {\n        (Currency currency, uint256 amount, bool measureGas, string memory gasSnapName) =\n            abi.decode(params, (Currency, uint256, bool, string));\n\n        manager.clear(currency, amount);\n        if (measureGas) vm.snapshotGasLastCall(gasSnapName);\n    }\n\n    function _assertBalanceEquals(bytes memory params) internal view {\n        (Currency currency, address user, uint256 expectedBalance) = abi.decode(params, (Currency, address, uint256));\n        assertEq(currency.balanceOf(user), expectedBalance, \"usertoken value incorrect\");\n    }\n\n    function _assertReservesEquals(bytes memory params) internal view {\n        uint256 expectedReserves = abi.decode(params, (uint256));\n        assertEq(manager.getSyncedReserves(), expectedReserves, \"reserves value incorrect\");\n    }\n\n    function _assertDeltaEquals(bytes memory params) internal view {\n        (Currency currency, address caller, int256 expectedDelta) = abi.decode(params, (Currency, address, int256));\n\n        assertEq(manager.currencyDelta(caller, currency), expectedDelta, \"delta value incorrect\");\n    }\n\n    function _assertNonzeroDeltaCountEquals(bytes memory params) internal view {\n        (uint256 expectedCount) = abi.decode(params, (uint256));\n        assertEq(manager.getNonzeroDeltaCount(), expectedCount, \"nonzero delta count incorrect\");\n    }\n\n    function _transferFrom(bytes memory params) internal {\n        (Currency currency, address from, address recipient, uint256 amount) =\n            abi.decode(params, (Currency, address, address, uint256));\n        MockERC20(Currency.unwrap(currency)).transferFrom(from, recipient, uint256(amount));\n    }\n\n    function _collectProtocolFees(bytes memory params) internal {\n        (address to, Currency currency, uint256 amount) = abi.decode(params, (address, Currency, uint256));\n        manager.collectProtocolFees(to, currency, amount);\n    }\n}\n"
  },
  {
    "path": "src/test/BaseTestHooks.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {BeforeSwapDelta} from \"../types/BeforeSwapDelta.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\n\ncontract BaseTestHooks is IHooks {\n    error HookNotImplemented();\n\n    function beforeInitialize(address, /* sender **/ PoolKey calldata, /* key **/ uint160 /* sqrtPriceX96 **/ )\n        external\n        virtual\n        returns (bytes4)\n    {\n        revert HookNotImplemented();\n    }\n\n    function afterInitialize(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        uint160, /* sqrtPriceX96 **/\n        int24 /* tick **/\n    ) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function beforeAddLiquidity(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        ModifyLiquidityParams calldata, /* params **/\n        bytes calldata /* hookData **/\n    ) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function afterAddLiquidity(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        ModifyLiquidityParams calldata, /* params **/\n        BalanceDelta, /* delta **/\n        BalanceDelta, /* feeDelta **/\n        bytes calldata /* hookData **/\n    ) external virtual returns (bytes4, BalanceDelta) {\n        revert HookNotImplemented();\n    }\n\n    function beforeRemoveLiquidity(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        ModifyLiquidityParams calldata, /* params **/\n        bytes calldata /* hookData **/\n    ) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function afterRemoveLiquidity(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        ModifyLiquidityParams calldata, /* params **/\n        BalanceDelta, /* delta **/\n        BalanceDelta, /* feeDelta **/\n        bytes calldata /* hookData **/\n    ) external virtual returns (bytes4, BalanceDelta) {\n        revert HookNotImplemented();\n    }\n\n    function beforeSwap(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        SwapParams calldata, /* params **/\n        bytes calldata /* hookData **/\n    ) external virtual returns (bytes4, BeforeSwapDelta, uint24) {\n        revert HookNotImplemented();\n    }\n\n    function afterSwap(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        SwapParams calldata, /* params **/\n        BalanceDelta, /* delta **/\n        bytes calldata /* hookData **/\n    ) external virtual returns (bytes4, int128) {\n        revert HookNotImplemented();\n    }\n\n    function beforeDonate(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        uint256, /* amount0 **/\n        uint256, /* amount1 **/\n        bytes calldata /* hookData **/\n    ) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n\n    function afterDonate(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        uint256, /* amount0 **/\n        uint256, /* amount1 **/\n        bytes calldata /* hookData **/\n    ) external virtual returns (bytes4) {\n        revert HookNotImplemented();\n    }\n}\n"
  },
  {
    "path": "src/test/CurrencyTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Currency, CurrencyLibrary} from \"../types/Currency.sol\";\n\ncontract CurrencyTest {\n    function transfer(Currency currency, address to, uint256 amount) external {\n        currency.transfer(to, amount);\n    }\n\n    function balanceOfSelf(Currency currency) external view returns (uint256) {\n        return currency.balanceOfSelf();\n    }\n\n    function balanceOf(Currency currency, address owner) external view returns (uint256) {\n        return currency.balanceOf(owner);\n    }\n\n    function isAddressZero(Currency currency) external pure returns (bool) {\n        return currency.isAddressZero();\n    }\n\n    function toId(Currency currency) external pure returns (uint256) {\n        return currency.toId();\n    }\n\n    function fromId(uint256 id) external pure returns (Currency) {\n        return CurrencyLibrary.fromId(id);\n    }\n}\n"
  },
  {
    "path": "src/test/CustomCurveHook.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {BeforeSwapDelta, toBeforeSwapDelta} from \"../types/BeforeSwapDelta.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\nimport {BaseTestHooks} from \"./BaseTestHooks.sol\";\nimport {Currency} from \"../types/Currency.sol\";\n\ncontract CustomCurveHook is BaseTestHooks {\n    using Hooks for IHooks;\n    using CurrencySettler for Currency;\n\n    error AddLiquidityDirectToHook();\n\n    IPoolManager immutable manager;\n\n    constructor(IPoolManager _manager) {\n        manager = _manager;\n    }\n\n    modifier onlyPoolManager() {\n        require(msg.sender == address(manager));\n        _;\n    }\n\n    function beforeSwap(\n        address, /* sender **/\n        PoolKey calldata key,\n        SwapParams calldata params,\n        bytes calldata /* hookData **/\n    ) external override onlyPoolManager returns (bytes4, BeforeSwapDelta, uint24) {\n        (Currency inputCurrency, Currency outputCurrency, uint256 amount) = _getInputOutputAndAmount(key, params);\n\n        // this \"custom curve\" is a line, 1-1\n        // take the full input amount, and give the full output amount\n        manager.take(inputCurrency, address(this), amount);\n        outputCurrency.settle(manager, address(this), amount, false);\n\n        // return -amountSpecified as specified to no-op the concentrated liquidity swap\n        BeforeSwapDelta hookDelta = toBeforeSwapDelta(int128(-params.amountSpecified), int128(params.amountSpecified));\n        return (IHooks.beforeSwap.selector, hookDelta, 0);\n    }\n\n    function afterAddLiquidity(\n        address, /* sender **/\n        PoolKey calldata, /* key **/\n        ModifyLiquidityParams calldata, /* params **/\n        BalanceDelta, /* delta **/\n        BalanceDelta, /* feeDelta **/\n        bytes calldata /* hookData **/\n    ) external view override onlyPoolManager returns (bytes4, BalanceDelta) {\n        revert AddLiquidityDirectToHook();\n    }\n\n    function _getInputOutputAndAmount(PoolKey calldata key, SwapParams calldata params)\n        internal\n        pure\n        returns (Currency input, Currency output, uint256 amount)\n    {\n        (input, output) = params.zeroForOne ? (key.currency0, key.currency1) : (key.currency1, key.currency0);\n\n        amount = params.amountSpecified < 0 ? uint256(-params.amountSpecified) : uint256(params.amountSpecified);\n    }\n}\n"
  },
  {
    "path": "src/test/DeltaReturningHook.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {SwapParams} from \"../types/PoolOperation.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {BaseTestHooks} from \"./BaseTestHooks.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {BeforeSwapDelta, toBeforeSwapDelta} from \"../types/BeforeSwapDelta.sol\";\n\ncontract DeltaReturningHook is BaseTestHooks {\n    using Hooks for IHooks;\n    using CurrencySettler for Currency;\n\n    IPoolManager immutable manager;\n\n    int128 deltaSpecified;\n    int128 deltaUnspecifiedBeforeSwap;\n    int128 deltaUnspecifiedAfterSwap;\n\n    constructor(IPoolManager _manager) {\n        manager = _manager;\n    }\n\n    modifier onlyPoolManager() {\n        require(msg.sender == address(manager));\n        _;\n    }\n\n    function setDeltaSpecified(int128 delta) external {\n        deltaSpecified = delta;\n    }\n\n    function setDeltaUnspecifiedBeforeSwap(int128 delta) external {\n        deltaUnspecifiedBeforeSwap = delta;\n    }\n\n    function setDeltaUnspecifiedAfterSwap(int128 delta) external {\n        deltaUnspecifiedAfterSwap = delta;\n    }\n\n    function beforeSwap(\n        address, /* sender **/\n        PoolKey calldata key,\n        SwapParams calldata params,\n        bytes calldata /* hookData **/\n    ) external override onlyPoolManager returns (bytes4, BeforeSwapDelta, uint24) {\n        (Currency specifiedCurrency, Currency unspecifiedCurrency) = _sortCurrencies(key, params);\n\n        if (deltaSpecified != 0) _settleOrTake(specifiedCurrency, deltaSpecified);\n        if (deltaUnspecifiedBeforeSwap != 0) _settleOrTake(unspecifiedCurrency, deltaUnspecifiedBeforeSwap);\n\n        BeforeSwapDelta beforeSwapDelta = toBeforeSwapDelta(deltaSpecified, deltaUnspecifiedBeforeSwap);\n\n        return (IHooks.beforeSwap.selector, beforeSwapDelta, 0);\n    }\n\n    function afterSwap(\n        address, /* sender **/\n        PoolKey calldata key,\n        SwapParams calldata params,\n        BalanceDelta, /* delta **/\n        bytes calldata /* hookData **/\n    ) external override onlyPoolManager returns (bytes4, int128) {\n        (, Currency unspecifiedCurrency) = _sortCurrencies(key, params);\n        _settleOrTake(unspecifiedCurrency, deltaUnspecifiedAfterSwap);\n\n        return (IHooks.afterSwap.selector, deltaUnspecifiedAfterSwap);\n    }\n\n    function _sortCurrencies(PoolKey calldata key, SwapParams calldata params)\n        internal\n        pure\n        returns (Currency specified, Currency unspecified)\n    {\n        (specified, unspecified) = (params.zeroForOne == (params.amountSpecified < 0))\n            ? (key.currency0, key.currency1)\n            : (key.currency1, key.currency0);\n    }\n\n    function _settleOrTake(Currency currency, int128 delta) internal {\n        // positive amount means positive delta for the hook, so it can take\n        // negative it should settle\n        if (delta > 0) {\n            currency.take(manager, address(this), uint128(delta), false);\n        } else {\n            uint256 amount = uint256(-int256(delta));\n            if (currency.isAddressZero()) {\n                manager.settle{value: amount}();\n            } else {\n                currency.settle(manager, address(this), amount, false);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/test/DynamicFeesTestHook.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {BaseTestHooks} from \"./BaseTestHooks.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {SwapParams} from \"../types/PoolOperation.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"../types/BeforeSwapDelta.sol\";\n\ncontract DynamicFeesTestHook is BaseTestHooks {\n    uint24 internal fee;\n    IPoolManager manager;\n\n    function setManager(IPoolManager _manager) external {\n        manager = _manager;\n    }\n\n    function setFee(uint24 _fee) external {\n        fee = _fee;\n    }\n\n    function afterInitialize(address, PoolKey calldata key, uint160, int24) external override returns (bytes4) {\n        manager.updateDynamicLPFee(key, fee);\n        return IHooks.afterInitialize.selector;\n    }\n\n    function beforeSwap(address, PoolKey calldata key, SwapParams calldata, bytes calldata)\n        external\n        override\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        manager.updateDynamicLPFee(key, fee);\n        return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);\n    }\n\n    function forcePoolFeeUpdate(PoolKey calldata _key, uint24 _fee) external {\n        manager.updateDynamicLPFee(_key, _fee);\n    }\n}\n"
  },
  {
    "path": "src/test/DynamicReturnFeeTestHook.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {BaseTestHooks} from \"./BaseTestHooks.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {SwapParams} from \"../types/PoolOperation.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"../types/BeforeSwapDelta.sol\";\nimport {LPFeeLibrary} from \"../libraries/LPFeeLibrary.sol\";\n\ncontract DynamicReturnFeeTestHook is BaseTestHooks {\n    using LPFeeLibrary for uint24;\n\n    uint24 internal fee;\n    IPoolManager manager;\n\n    function setManager(IPoolManager _manager) external {\n        manager = _manager;\n    }\n\n    function setFee(uint24 _fee) external {\n        fee = _fee;\n    }\n\n    function beforeSwap(address, PoolKey calldata, SwapParams calldata, bytes calldata)\n        external\n        view\n        override\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        // attach the fee flag to `fee` to enable overriding the pool's stored fee\n        return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, fee | LPFeeLibrary.OVERRIDE_FEE_FLAG);\n    }\n\n    function forcePoolFeeUpdate(PoolKey calldata _key, uint24 _fee) external {\n        manager.updateDynamicLPFee(_key, _fee);\n    }\n}\n"
  },
  {
    "path": "src/test/EmptyRevertContract.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\ncontract EmptyRevertContract {\n    // a contract to simulate reverting with no returndata, to test that our error catching works\n    fallback() external {\n        revert();\n    }\n}\n"
  },
  {
    "path": "src/test/EmptyTestHooks.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"../types/BalanceDelta.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"../types/BeforeSwapDelta.sol\";\n\ncontract EmptyTestHooks is IHooks {\n    using Hooks for IHooks;\n\n    constructor() {\n        IHooks(this).validateHookPermissions(\n            Hooks.Permissions({\n                beforeInitialize: true,\n                afterInitialize: true,\n                beforeAddLiquidity: true,\n                afterAddLiquidity: true,\n                beforeRemoveLiquidity: true,\n                afterRemoveLiquidity: true,\n                beforeSwap: true,\n                afterSwap: true,\n                beforeDonate: true,\n                afterDonate: true,\n                beforeSwapReturnDelta: true,\n                afterSwapReturnDelta: true,\n                afterAddLiquidityReturnDelta: true,\n                afterRemoveLiquidityReturnDelta: true\n            })\n        );\n    }\n\n    function beforeInitialize(address, PoolKey calldata, uint160) external pure override returns (bytes4) {\n        return IHooks.beforeInitialize.selector;\n    }\n\n    function afterInitialize(address, PoolKey calldata, uint160, int24) external pure override returns (bytes4) {\n        return IHooks.afterInitialize.selector;\n    }\n\n    function beforeAddLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata)\n        external\n        pure\n        override\n        returns (bytes4)\n    {\n        return IHooks.beforeAddLiquidity.selector;\n    }\n\n    function afterAddLiquidity(\n        address,\n        PoolKey calldata,\n        ModifyLiquidityParams calldata,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata\n    ) external pure override returns (bytes4, BalanceDelta) {\n        return (IHooks.afterAddLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeRemoveLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata)\n        external\n        pure\n        override\n        returns (bytes4)\n    {\n        return IHooks.beforeRemoveLiquidity.selector;\n    }\n\n    function afterRemoveLiquidity(\n        address,\n        PoolKey calldata,\n        ModifyLiquidityParams calldata,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata\n    ) external pure override returns (bytes4, BalanceDelta) {\n        return (IHooks.afterRemoveLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeSwap(address, PoolKey calldata, SwapParams calldata, bytes calldata)\n        external\n        pure\n        override\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);\n    }\n\n    function afterSwap(address, PoolKey calldata, SwapParams calldata, BalanceDelta, bytes calldata)\n        external\n        pure\n        override\n        returns (bytes4, int128)\n    {\n        return (IHooks.afterSwap.selector, 0);\n    }\n\n    function beforeDonate(address, PoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        pure\n        override\n        returns (bytes4)\n    {\n        return IHooks.beforeDonate.selector;\n    }\n\n    function afterDonate(address, PoolKey calldata, uint256, uint256, bytes calldata)\n        external\n        pure\n        override\n        returns (bytes4)\n    {\n        return IHooks.afterDonate.selector;\n    }\n}\n"
  },
  {
    "path": "src/test/FeeTakingHook.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta, toBalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {BaseTestHooks} from \"./BaseTestHooks.sol\";\n\ncontract FeeTakingHook is BaseTestHooks {\n    using Hooks for IHooks;\n    using SafeCast for uint256;\n    using SafeCast for int128;\n\n    IPoolManager immutable manager;\n\n    constructor(IPoolManager _manager) {\n        manager = _manager;\n    }\n\n    modifier onlyPoolManager() {\n        require(msg.sender == address(manager));\n        _;\n    }\n\n    uint128 public constant LIQUIDITY_FEE = 543; // 543/10000 = 5.43%\n    uint128 public constant SWAP_FEE_BIPS = 123; // 123/10000 = 1.23%\n    uint128 public constant TOTAL_BIPS = 10000;\n\n    function afterSwap(\n        address, /* sender **/\n        PoolKey calldata key,\n        SwapParams calldata params,\n        BalanceDelta delta,\n        bytes calldata /* hookData **/\n    ) external override onlyPoolManager returns (bytes4, int128) {\n        // fee will be in the unspecified token of the swap\n        bool specifiedTokenIs0 = (params.amountSpecified < 0 == params.zeroForOne);\n        (Currency feeCurrency, int128 swapAmount) =\n            (specifiedTokenIs0) ? (key.currency1, delta.amount1()) : (key.currency0, delta.amount0());\n        // if fee is on output, get the absolute output amount\n        if (swapAmount < 0) swapAmount = -swapAmount;\n\n        uint256 feeAmount = uint128(swapAmount) * SWAP_FEE_BIPS / TOTAL_BIPS;\n        manager.take(feeCurrency, address(this), feeAmount);\n\n        return (IHooks.afterSwap.selector, feeAmount.toInt128());\n    }\n\n    function afterRemoveLiquidity(\n        address, /* sender **/\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata, /* params **/\n        BalanceDelta delta,\n        BalanceDelta,\n        bytes calldata /* hookData **/\n    ) external override onlyPoolManager returns (bytes4, BalanceDelta) {\n        assert(delta.amount0() >= 0 && delta.amount1() >= 0);\n\n        uint128 feeAmount0 = uint128(delta.amount0()) * LIQUIDITY_FEE / TOTAL_BIPS;\n        uint128 feeAmount1 = uint128(delta.amount1()) * LIQUIDITY_FEE / TOTAL_BIPS;\n\n        manager.take(key.currency0, address(this), feeAmount0);\n        manager.take(key.currency1, address(this), feeAmount1);\n\n        return (IHooks.afterRemoveLiquidity.selector, toBalanceDelta(int128(feeAmount0), int128(feeAmount1)));\n    }\n\n    function afterAddLiquidity(\n        address, /* sender **/\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata, /* params **/\n        BalanceDelta delta,\n        BalanceDelta,\n        bytes calldata /* hookData **/\n    ) external override onlyPoolManager returns (bytes4, BalanceDelta) {\n        assert(delta.amount0() <= 0 && delta.amount1() <= 0);\n\n        uint128 feeAmount0 = uint128(-delta.amount0()) * LIQUIDITY_FEE / TOTAL_BIPS;\n        uint128 feeAmount1 = uint128(-delta.amount1()) * LIQUIDITY_FEE / TOTAL_BIPS;\n\n        manager.take(key.currency0, address(this), feeAmount0);\n        manager.take(key.currency1, address(this), feeAmount1);\n\n        return (IHooks.afterAddLiquidity.selector, toBalanceDelta(int128(feeAmount0), int128(feeAmount1)));\n    }\n}\n"
  },
  {
    "path": "src/test/Fuzzers.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {StdUtils} from \"forge-std/StdUtils.sol\";\n\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams} from \"../types/PoolOperation.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {TickMath} from \"../libraries/TickMath.sol\";\nimport {Pool} from \"../libraries/Pool.sol\";\nimport {PoolModifyLiquidityTest} from \"./PoolModifyLiquidityTest.sol\";\nimport {LiquidityAmounts} from \"../../test/utils/LiquidityAmounts.sol\";\nimport {SafeCast} from \"../../src/libraries/SafeCast.sol\";\n\ncontract Fuzzers is StdUtils {\n    using SafeCast for uint256;\n\n    Vm internal constant _vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n\n    function boundLiquidityDelta(PoolKey memory key, int256 liquidityDeltaUnbounded, int256 liquidityMaxByAmount)\n        internal\n        pure\n        returns (int256)\n    {\n        int256 liquidityMaxPerTick = int256(uint256(Pool.tickSpacingToMaxLiquidityPerTick(key.tickSpacing)));\n\n        // Finally bound the seeded liquidity by either the max per tick, or by the amount allowed in the position range.\n        int256 liquidityMax = liquidityMaxByAmount > liquidityMaxPerTick ? liquidityMaxPerTick : liquidityMaxByAmount;\n        _vm.assume(liquidityMax != 0);\n        return bound(liquidityDeltaUnbounded, 1, liquidityMax);\n    }\n\n    // Uses tickSpacingToMaxLiquidityPerTick/2 as one of the possible bounds.\n    // Potentially adjust this value to be more strict for positions that touch the same tick.\n    function boundLiquidityDeltaTightly(\n        PoolKey memory key,\n        int256 liquidityDeltaUnbounded,\n        int256 liquidityMaxByAmount,\n        uint256 maxPositions\n    ) internal pure returns (int256) {\n        // Divide by half to bound liquidity more. TODO: Probably a better way to do this.\n        int256 liquidityMaxTightBound =\n            int256(uint256(Pool.tickSpacingToMaxLiquidityPerTick(key.tickSpacing)) / maxPositions);\n\n        // Finally bound the seeded liquidity by either the max per tick, or by the amount allowed in the position range.\n        int256 liquidityMax =\n            liquidityMaxByAmount > liquidityMaxTightBound ? liquidityMaxTightBound : liquidityMaxByAmount;\n        _vm.assume(liquidityMax != 0);\n        return bound(liquidityDeltaUnbounded, 1, liquidityMax);\n    }\n\n    function getLiquidityDeltaFromAmounts(int24 tickLower, int24 tickUpper, uint160 sqrtPriceX96)\n        internal\n        pure\n        returns (int256)\n    {\n        // First get the maximum amount0 and maximum amount1 that can be deposited at this range.\n        (uint256 maxAmount0, uint256 maxAmount1) = LiquidityAmounts.getAmountsForLiquidity(\n            sqrtPriceX96,\n            TickMath.getSqrtPriceAtTick(tickLower),\n            TickMath.getSqrtPriceAtTick(tickUpper),\n            uint128(type(int128).max)\n        );\n\n        // Compare the max amounts (defined by the range of the position) to the max amount constrained by the type container.\n        // The true maximum should be the minimum of the two.\n        // (ie If the position range allows a deposit of more then int128.max in any token, then here we cap it at int128.max.)\n\n        uint256 amount0 = uint256(type(uint128).max / 2);\n        uint256 amount1 = uint256(type(uint128).max / 2);\n\n        maxAmount0 = maxAmount0 > amount0 ? amount0 : maxAmount0;\n        maxAmount1 = maxAmount1 > amount1 ? amount1 : maxAmount1;\n\n        int256 liquidityMaxByAmount = uint256(\n            LiquidityAmounts.getLiquidityForAmounts(\n                sqrtPriceX96,\n                TickMath.getSqrtPriceAtTick(tickLower),\n                TickMath.getSqrtPriceAtTick(tickUpper),\n                maxAmount0,\n                maxAmount1\n            )\n        ).toInt256();\n\n        return liquidityMaxByAmount;\n    }\n\n    function boundTicks(int24 tickLower, int24 tickUpper, int24 tickSpacing) internal pure returns (int24, int24) {\n        tickLower = int24(\n            bound(\n                int256(tickLower),\n                int256(TickMath.minUsableTick(tickSpacing)),\n                int256(TickMath.maxUsableTick(tickSpacing))\n            )\n        );\n        tickUpper = int24(\n            bound(\n                int256(tickUpper),\n                int256(TickMath.minUsableTick(tickSpacing)),\n                int256(TickMath.maxUsableTick(tickSpacing))\n            )\n        );\n\n        // round down ticks\n        tickLower = (tickLower / tickSpacing) * tickSpacing;\n        tickUpper = (tickUpper / tickSpacing) * tickSpacing;\n\n        (tickLower, tickUpper) = tickLower < tickUpper ? (tickLower, tickUpper) : (tickUpper, tickLower);\n\n        if (tickLower == tickUpper) {\n            if (tickLower != TickMath.minUsableTick(tickSpacing)) tickLower = tickLower - tickSpacing;\n            else tickUpper = tickUpper + tickSpacing;\n        }\n\n        return (tickLower, tickUpper);\n    }\n\n    function boundTicks(PoolKey memory key, int24 tickLower, int24 tickUpper) internal pure returns (int24, int24) {\n        return boundTicks(tickLower, tickUpper, key.tickSpacing);\n    }\n\n    function createRandomSqrtPriceX96(int24 tickSpacing, int256 seed) internal pure returns (uint160) {\n        int256 min = int256(TickMath.minUsableTick(tickSpacing));\n        int256 max = int256(TickMath.maxUsableTick(tickSpacing));\n        int256 randomTick = bound(seed, min + 1, max - 1);\n        return TickMath.getSqrtPriceAtTick(int24(randomTick));\n    }\n\n    /// @dev Obtain fuzzed and bounded parameters for creating liquidity\n    /// @param key The pool key\n    /// @param params IPoolManager.ModifyLiquidityParams Note that these parameters are unbounded\n    /// @param sqrtPriceX96 The current sqrt price\n    function createFuzzyLiquidityParams(PoolKey memory key, ModifyLiquidityParams memory params, uint160 sqrtPriceX96)\n        internal\n        pure\n        returns (ModifyLiquidityParams memory result)\n    {\n        (result.tickLower, result.tickUpper) = boundTicks(key, params.tickLower, params.tickUpper);\n        int256 liquidityDeltaFromAmounts =\n            getLiquidityDeltaFromAmounts(result.tickLower, result.tickUpper, sqrtPriceX96);\n        result.liquidityDelta = boundLiquidityDelta(key, params.liquidityDelta, liquidityDeltaFromAmounts);\n    }\n\n    // Creates liquidity parameters with a stricter bound. Should be used if multiple positions being initialized on the pool, with potential for tick overlap.\n    function createFuzzyLiquidityParamsWithTightBound(\n        PoolKey memory key,\n        ModifyLiquidityParams memory params,\n        uint160 sqrtPriceX96,\n        uint256 maxPositions\n    ) internal pure returns (ModifyLiquidityParams memory result) {\n        (result.tickLower, result.tickUpper) = boundTicks(key, params.tickLower, params.tickUpper);\n        int256 liquidityDeltaFromAmounts =\n            getLiquidityDeltaFromAmounts(result.tickLower, result.tickUpper, sqrtPriceX96);\n\n        result.liquidityDelta =\n            boundLiquidityDeltaTightly(key, params.liquidityDelta, liquidityDeltaFromAmounts, maxPositions);\n    }\n\n    function createFuzzyLiquidity(\n        PoolModifyLiquidityTest modifyLiquidityRouter,\n        PoolKey memory key,\n        ModifyLiquidityParams memory params,\n        uint160 sqrtPriceX96,\n        bytes memory hookData\n    ) internal returns (ModifyLiquidityParams memory result, BalanceDelta delta) {\n        result = createFuzzyLiquidityParams(key, params, sqrtPriceX96);\n        delta = modifyLiquidityRouter.modifyLiquidity(key, result, hookData);\n    }\n\n    // There exists possible positions in the pool, so we tighten the boundaries of liquidity.\n    function createFuzzyLiquidityWithTightBound(\n        PoolModifyLiquidityTest modifyLiquidityRouter,\n        PoolKey memory key,\n        ModifyLiquidityParams memory params,\n        uint160 sqrtPriceX96,\n        bytes memory hookData,\n        uint256 maxPositions\n    ) internal returns (ModifyLiquidityParams memory result, BalanceDelta delta) {\n        result = createFuzzyLiquidityParamsWithTightBound(key, params, sqrtPriceX96, maxPositions);\n        delta = modifyLiquidityRouter.modifyLiquidity(key, result, hookData);\n    }\n}\n"
  },
  {
    "path": "src/test/HooksTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\n\ncontract HooksTest {\n    using Hooks for IHooks;\n\n    function validateHookPermissions(address hookAddress, Hooks.Permissions calldata params) external pure {\n        IHooks(hookAddress).validateHookPermissions(params);\n    }\n\n    function isValidHookAddress(address hookAddress, uint24 fee) external pure returns (bool) {\n        return IHooks(hookAddress).isValidHookAddress(fee);\n    }\n\n    function shouldCallBeforeInitialize(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.BEFORE_INITIALIZE_FLAG);\n    }\n\n    function shouldCallAfterInitialize(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.AFTER_INITIALIZE_FLAG);\n    }\n\n    function shouldCallBeforeSwap(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.BEFORE_SWAP_FLAG);\n    }\n\n    function shouldCallAfterSwap(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.AFTER_SWAP_FLAG);\n    }\n\n    function shouldCallBeforeAddLiquidity(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG);\n    }\n\n    function shouldCallAfterAddLiquidity(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG);\n    }\n\n    function shouldCallBeforeRemoveLiquidity(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG);\n    }\n\n    function shouldCallAfterRemoveLiquidity(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG);\n    }\n\n    function shouldCallBeforeDonate(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.BEFORE_DONATE_FLAG);\n    }\n\n    function shouldCallAfterDonate(address hookAddress) external pure returns (bool) {\n        return IHooks(hookAddress).hasPermission(Hooks.AFTER_DONATE_FLAG);\n    }\n\n    function getGasCostOfShouldCall(address hookAddress) external view returns (uint256) {\n        uint256 gasBefore = gasleft();\n        IHooks(hookAddress).hasPermission(Hooks.BEFORE_SWAP_FLAG);\n        return gasBefore - gasleft();\n    }\n\n    function getGasCostOfValidateHookAddress(address hookAddress, Hooks.Permissions calldata params)\n        external\n        view\n        returns (uint256)\n    {\n        uint256 gasBefore = gasleft();\n        IHooks(hookAddress).validateHookPermissions(params);\n        return gasBefore - gasleft();\n    }\n}\n"
  },
  {
    "path": "src/test/LPFeeTakingHook.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams} from \"../types/PoolOperation.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta, toBalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {BaseTestHooks} from \"./BaseTestHooks.sol\";\n\n/// @notice a hook that takes all of the LP fee revenue\n/// @dev an example test hook to validate the data is provided correctly\ncontract LPFeeTakingHook is BaseTestHooks {\n    using Hooks for IHooks;\n    using SafeCast for uint256;\n    using SafeCast for int128;\n\n    IPoolManager immutable manager;\n\n    constructor(IPoolManager _manager) {\n        manager = _manager;\n    }\n\n    modifier onlyPoolManager() {\n        require(msg.sender == address(manager));\n        _;\n    }\n\n    function afterRemoveLiquidity(\n        address, /* sender **/\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata, /* params **/\n        BalanceDelta,\n        BalanceDelta feeDelta,\n        bytes calldata /* hookData **/\n    ) external override onlyPoolManager returns (bytes4, BalanceDelta) {\n        uint128 feeAmount0 = uint128(feeDelta.amount0());\n        uint128 feeAmount1 = uint128(feeDelta.amount1());\n\n        if (0 < feeAmount0) manager.take(key.currency0, address(this), feeAmount0);\n        if (0 < feeAmount1) manager.take(key.currency1, address(this), feeAmount1);\n\n        return (IHooks.afterRemoveLiquidity.selector, toBalanceDelta(int128(feeAmount0), int128(feeAmount1)));\n    }\n\n    function afterAddLiquidity(\n        address, /* sender **/\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata, /* params **/\n        BalanceDelta,\n        BalanceDelta feeDelta,\n        bytes calldata /* hookData **/\n    ) external override onlyPoolManager returns (bytes4, BalanceDelta) {\n        uint128 feeAmount0 = uint128(feeDelta.amount0());\n        uint128 feeAmount1 = uint128(feeDelta.amount1());\n\n        if (0 < feeAmount0) manager.take(key.currency0, address(this), feeAmount0);\n        if (0 < feeAmount1) manager.take(key.currency1, address(this), feeAmount1);\n\n        return (IHooks.afterAddLiquidity.selector, toBalanceDelta(int128(feeAmount0), int128(feeAmount1)));\n    }\n}\n"
  },
  {
    "path": "src/test/LiquidityMathTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {LiquidityMath} from \"../libraries/LiquidityMath.sol\";\n\ncontract LiquidityMathTest {\n    function addDelta(uint128 x, int128 y) external pure returns (uint128 z) {\n        return LiquidityMath.addDelta(x, y);\n    }\n}\n"
  },
  {
    "path": "src/test/MockContract.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Proxy} from \"@openzeppelin/contracts/proxy/Proxy.sol\";\n\n/// @notice Mock contract that tracks the number of calls to various functions by selector\n/// @dev allows for proxying to an implementation contract\n///  if real logic or return values are needed\ncontract MockContract is Proxy {\n    mapping(bytes32 => uint256) public calls;\n    mapping(bytes32 => mapping(bytes => uint256)) public callParams;\n\n    /// @notice If set, delegatecall to implementation after tracking call\n    address internal impl;\n\n    function timesCalledSelector(bytes32 selector) public view returns (uint256) {\n        return calls[selector];\n    }\n\n    function timesCalled(string calldata fnSig) public view returns (uint256) {\n        bytes32 selector = bytes32(uint256(keccak256(bytes(fnSig))) & (type(uint256).max << 224));\n        return calls[selector];\n    }\n\n    function calledWithSelector(bytes32 selector, bytes calldata params) public view returns (bool) {\n        return callParams[selector][params[1:]] > 0; // Drop 0x byte string prefix\n    }\n\n    function calledWith(string calldata fnSig, bytes calldata params) public view returns (bool) {\n        bytes32 selector = bytes32(uint256(keccak256(bytes(fnSig))) & (type(uint256).max << 224));\n        return callParams[selector][params[1:]] > 0; // Drop 0x byte string prefix\n    }\n\n    /// @notice exposes implementation contract address\n    function _implementation() internal view override returns (address) {\n        return impl;\n    }\n\n    function setImplementation(address _impl) external {\n        impl = _impl;\n    }\n\n    /// @notice Captures calls by selector\n    function _beforeFallback() internal {\n        bytes32 selector = bytes32(msg.data[:5]);\n        bytes memory params = msg.data[5:];\n        calls[selector]++;\n        callParams[selector][params]++;\n    }\n\n    function _fallback() internal override {\n        _beforeFallback();\n        super._fallback();\n    }\n\n    receive() external payable {}\n}\n"
  },
  {
    "path": "src/test/MockERC6909Claims.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {ERC6909Claims} from \"../ERC6909Claims.sol\";\n\n/// @notice Mock contract for testing ERC6909Claims\ncontract MockERC6909Claims is ERC6909Claims {\n    /// @notice mocked mint logic\n    function mint(address to, uint256 id, uint256 amount) public {\n        _mint(to, id, amount);\n    }\n\n    /// @notice mocked burn logic\n    function burn(uint256 id, uint256 amount) public {\n        _burn(msg.sender, id, amount);\n    }\n\n    /// @notice mocked burn logic without checking sender allowance\n    function burnFrom(address from, uint256 id, uint256 amount) public {\n        _burnFrom(from, id, amount);\n    }\n}\n"
  },
  {
    "path": "src/test/MockHooks.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"../types/BalanceDelta.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"../types/BeforeSwapDelta.sol\";\n\ncontract MockHooks is IHooks {\n    using Hooks for IHooks;\n\n    bytes public beforeInitializeData;\n    bytes public afterInitializeData;\n    bytes public beforeAddLiquidityData;\n    bytes public afterAddLiquidityData;\n    bytes public beforeRemoveLiquidityData;\n    bytes public afterRemoveLiquidityData;\n    bytes public beforeSwapData;\n    bytes public afterSwapData;\n    bytes public beforeDonateData;\n    bytes public afterDonateData;\n\n    mapping(bytes4 => bytes4) public returnValues;\n\n    mapping(PoolId => uint16) public lpFees;\n\n    function beforeInitialize(address, PoolKey calldata, uint160) external override returns (bytes4) {\n        beforeInitializeData = new bytes(123);\n        bytes4 selector = MockHooks.beforeInitialize.selector;\n        return returnValues[selector] == bytes4(0) ? selector : returnValues[selector];\n    }\n\n    function afterInitialize(address, PoolKey calldata, uint160, int24) external override returns (bytes4) {\n        afterInitializeData = new bytes(123);\n        bytes4 selector = MockHooks.afterInitialize.selector;\n        return returnValues[selector] == bytes4(0) ? selector : returnValues[selector];\n    }\n\n    function beforeAddLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata hookData)\n        external\n        override\n        returns (bytes4)\n    {\n        beforeAddLiquidityData = hookData;\n        bytes4 selector = MockHooks.beforeAddLiquidity.selector;\n        return returnValues[selector] == bytes4(0) ? selector : returnValues[selector];\n    }\n\n    function afterAddLiquidity(\n        address,\n        PoolKey calldata,\n        ModifyLiquidityParams calldata,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata hookData\n    ) external override returns (bytes4, BalanceDelta) {\n        afterAddLiquidityData = hookData;\n        bytes4 selector = MockHooks.afterAddLiquidity.selector;\n        return (returnValues[selector] == bytes4(0) ? selector : returnValues[selector], BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeRemoveLiquidity(address, PoolKey calldata, ModifyLiquidityParams calldata, bytes calldata hookData)\n        external\n        override\n        returns (bytes4)\n    {\n        beforeRemoveLiquidityData = hookData;\n        bytes4 selector = MockHooks.beforeRemoveLiquidity.selector;\n        return returnValues[selector] == bytes4(0) ? selector : returnValues[selector];\n    }\n\n    function afterRemoveLiquidity(\n        address,\n        PoolKey calldata,\n        ModifyLiquidityParams calldata,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata hookData\n    ) external override returns (bytes4, BalanceDelta) {\n        afterRemoveLiquidityData = hookData;\n        bytes4 selector = MockHooks.afterRemoveLiquidity.selector;\n        return (returnValues[selector] == bytes4(0) ? selector : returnValues[selector], BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeSwap(address, PoolKey calldata, SwapParams calldata, bytes calldata hookData)\n        external\n        override\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        beforeSwapData = hookData;\n        bytes4 selector = MockHooks.beforeSwap.selector;\n        return (\n            returnValues[selector] == bytes4(0) ? selector : returnValues[selector],\n            BeforeSwapDeltaLibrary.ZERO_DELTA,\n            0\n        );\n    }\n\n    function afterSwap(address, PoolKey calldata, SwapParams calldata, BalanceDelta, bytes calldata hookData)\n        external\n        override\n        returns (bytes4, int128)\n    {\n        afterSwapData = hookData;\n        bytes4 selector = MockHooks.afterSwap.selector;\n        return (returnValues[selector] == bytes4(0) ? selector : returnValues[selector], 0);\n    }\n\n    function beforeDonate(address, PoolKey calldata, uint256, uint256, bytes calldata hookData)\n        external\n        override\n        returns (bytes4)\n    {\n        beforeDonateData = hookData;\n        bytes4 selector = MockHooks.beforeDonate.selector;\n        return returnValues[selector] == bytes4(0) ? selector : returnValues[selector];\n    }\n\n    function afterDonate(address, PoolKey calldata, uint256, uint256, bytes calldata hookData)\n        external\n        override\n        returns (bytes4)\n    {\n        afterDonateData = hookData;\n        bytes4 selector = MockHooks.afterDonate.selector;\n        return returnValues[selector] == bytes4(0) ? selector : returnValues[selector];\n    }\n\n    function setReturnValue(bytes4 key, bytes4 value) external {\n        returnValues[key] = value;\n    }\n\n    function setlpFee(PoolKey calldata key, uint16 value) external {\n        lpFees[key.toId()] = value;\n    }\n}\n"
  },
  {
    "path": "src/test/NativeERC20.sol",
    "content": "// SPDX-License-Identifier: GPL-3.0-or-later\npragma solidity ^0.8.0;\n\nimport {Test} from \"forge-std/Test.sol\";\n\n/// @dev This token contract simulates the ERC20 representation of a native token where on `transfer` and `transferFrom` the native balances are modified using a precompile\ncontract NativeERC20 is Test {\n    string public name = \"NativeERC20\";\n    string public symbol = \"NERC20\";\n    uint8 public decimals = 18;\n\n    event Approval(address indexed src, address indexed guy, uint256 wad);\n    event Transfer(address indexed src, address indexed dst, uint256 wad);\n\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function totalSupply() public view returns (uint256) {\n        return address(this).balance;\n    }\n\n    function approve(address guy, uint256 wad) public returns (bool) {\n        allowance[msg.sender][guy] = wad;\n        emit Approval(msg.sender, guy, wad);\n        return true;\n    }\n\n    function transfer(address dst, uint256 wad) public returns (bool) {\n        return transferFrom(msg.sender, dst, wad);\n    }\n\n    function transferFrom(address src, address dst, uint256 wad) public returns (bool) {\n        require(src.balance >= wad);\n\n        if (src != msg.sender && allowance[src][msg.sender] != type(uint256).max) {\n            require(allowance[src][msg.sender] >= wad, \"\");\n            allowance[src][msg.sender] -= wad;\n        }\n\n        vm.deal(src, src.balance - wad);\n        vm.deal(dst, dst.balance + wad);\n\n        emit Transfer(src, dst, wad);\n\n        return true;\n    }\n\n    function balanceOf(address account) external view returns (uint256) {\n        return account.balance;\n    }\n}\n"
  },
  {
    "path": "src/test/NoDelegateCallTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {NoDelegateCall} from \"../NoDelegateCall.sol\";\n\ncontract NoDelegateCallTest is NoDelegateCall {\n    function canBeDelegateCalled() public view returns (uint256) {\n        return block.timestamp / 5;\n    }\n\n    function cannotBeDelegateCalled() public view noDelegateCall returns (uint256) {\n        return block.timestamp / 5;\n    }\n\n    function getGasCostOfCanBeDelegateCalled() external view returns (uint256) {\n        uint256 gasBefore = gasleft();\n        canBeDelegateCalled();\n        return gasBefore - gasleft();\n    }\n\n    function getGasCostOfCannotBeDelegateCalled() external view returns (uint256) {\n        uint256 gasBefore = gasleft();\n        cannotBeDelegateCalled();\n        return gasBefore - gasleft();\n    }\n\n    function callsIntoNoDelegateCallFunction() external view {\n        noDelegateCallPrivate();\n    }\n\n    function noDelegateCallPrivate() private view noDelegateCall {}\n}\n"
  },
  {
    "path": "src/test/PoolClaimsTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {PoolTestBase} from \"./PoolTestBase.sol\";\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\n\ncontract PoolClaimsTest is PoolTestBase {\n    using CurrencySettler for Currency;\n    using SafeCast for uint256;\n\n    constructor(IPoolManager _manager) PoolTestBase(_manager) {}\n\n    struct CallbackData {\n        address sender;\n        address user;\n        Currency currency;\n        uint256 amount;\n        bool deposit;\n    }\n\n    /// @notice Convert ERC20 into a claimable 6909\n    function deposit(Currency currency, address user, uint256 amount) external payable {\n        manager.unlock(abi.encode(CallbackData(msg.sender, user, currency, amount, true)));\n    }\n\n    /// @notice Redeem claimable 6909 for ERC20\n    function withdraw(Currency currency, address user, uint256 amount) external payable {\n        manager.unlock(abi.encode(CallbackData(msg.sender, user, currency, amount, false)));\n    }\n\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n\n        CallbackData memory data = abi.decode(rawData, (CallbackData));\n\n        if (data.deposit) {\n            data.currency.take(manager, data.user, data.amount, true); // mint 6909\n            data.currency.settle(manager, data.user, data.amount, false); // transfer ERC20\n        } else {\n            data.currency.settle(manager, data.user, data.amount, true); // burn 6909\n            data.currency.take(manager, data.user, data.amount, false); // claim ERC20\n        }\n\n        return abi.encode(0);\n    }\n}\n"
  },
  {
    "path": "src/test/PoolDonateTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Currency, CurrencyLibrary} from \"../types/Currency.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolTestBase} from \"./PoolTestBase.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\n\ncontract PoolDonateTest is PoolTestBase {\n    using CurrencySettler for Currency;\n    using Hooks for IHooks;\n\n    constructor(IPoolManager _manager) PoolTestBase(_manager) {}\n\n    struct CallbackData {\n        address sender;\n        PoolKey key;\n        uint256 amount0;\n        uint256 amount1;\n        bytes hookData;\n    }\n\n    function donate(PoolKey memory key, uint256 amount0, uint256 amount1, bytes memory hookData)\n        external\n        payable\n        returns (BalanceDelta delta)\n    {\n        delta = abi.decode(\n            manager.unlock(abi.encode(CallbackData(msg.sender, key, amount0, amount1, hookData))), (BalanceDelta)\n        );\n\n        uint256 ethBalance = address(this).balance;\n        if (ethBalance > 0) {\n            CurrencyLibrary.ADDRESS_ZERO.transfer(msg.sender, ethBalance);\n        }\n    }\n\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n\n        CallbackData memory data = abi.decode(rawData, (CallbackData));\n\n        (,, int256 deltaBefore0) = _fetchBalances(data.key.currency0, data.sender, address(this));\n        (,, int256 deltaBefore1) = _fetchBalances(data.key.currency1, data.sender, address(this));\n\n        require(deltaBefore0 == 0, \"deltaBefore0 is not 0\");\n        require(deltaBefore1 == 0, \"deltaBefore1 is not 0\");\n\n        BalanceDelta delta = manager.donate(data.key, data.amount0, data.amount1, data.hookData);\n\n        (,, int256 deltaAfter0) = _fetchBalances(data.key.currency0, data.sender, address(this));\n        (,, int256 deltaAfter1) = _fetchBalances(data.key.currency1, data.sender, address(this));\n\n        require(deltaAfter0 == -int256(data.amount0), \"deltaAfter0 is not equal to -int256(data.amount0)\");\n        require(deltaAfter1 == -int256(data.amount1), \"deltaAfter1 is not equal to -int256(data.amount1)\");\n\n        if (deltaAfter0 < 0) data.key.currency0.settle(manager, data.sender, uint256(-deltaAfter0), false);\n        if (deltaAfter1 < 0) data.key.currency1.settle(manager, data.sender, uint256(-deltaAfter1), false);\n        if (deltaAfter0 > 0) data.key.currency0.take(manager, data.sender, uint256(deltaAfter0), false);\n        if (deltaAfter1 > 0) data.key.currency1.take(manager, data.sender, uint256(deltaAfter1), false);\n\n        return abi.encode(delta);\n    }\n}\n"
  },
  {
    "path": "src/test/PoolEmptyUnlockTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"../interfaces/callback/IUnlockCallback.sol\";\n\ncontract PoolEmptyUnlockTest is IUnlockCallback {\n    event UnlockCallback();\n\n    IPoolManager manager;\n\n    constructor(IPoolManager _manager) {\n        manager = _manager;\n    }\n\n    function unlock() external {\n        manager.unlock(\"\");\n    }\n\n    /// @notice Called by the pool manager on `msg.sender` when the manager is unlocked\n    function unlockCallback(bytes calldata) external override returns (bytes memory) {\n        emit UnlockCallback();\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "src/test/PoolModifyLiquidityTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {CurrencyLibrary, Currency} from \"../types/Currency.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {ModifyLiquidityParams} from \"../types/PoolOperation.sol\";\nimport {PoolTestBase} from \"./PoolTestBase.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {LPFeeLibrary} from \"../libraries/LPFeeLibrary.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\nimport {StateLibrary} from \"../libraries/StateLibrary.sol\";\n\ncontract PoolModifyLiquidityTest is PoolTestBase {\n    using CurrencySettler for Currency;\n    using Hooks for IHooks;\n    using LPFeeLibrary for uint24;\n    using StateLibrary for IPoolManager;\n\n    constructor(IPoolManager _manager) PoolTestBase(_manager) {}\n\n    struct CallbackData {\n        address sender;\n        PoolKey key;\n        ModifyLiquidityParams params;\n        bytes hookData;\n        bool settleUsingBurn;\n        bool takeClaims;\n    }\n\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes memory hookData)\n        external\n        payable\n        returns (BalanceDelta delta)\n    {\n        delta = modifyLiquidity(key, params, hookData, false, false);\n    }\n\n    function modifyLiquidity(\n        PoolKey memory key,\n        ModifyLiquidityParams memory params,\n        bytes memory hookData,\n        bool settleUsingBurn,\n        bool takeClaims\n    ) public payable returns (BalanceDelta delta) {\n        delta = abi.decode(\n            manager.unlock(abi.encode(CallbackData(msg.sender, key, params, hookData, settleUsingBurn, takeClaims))),\n            (BalanceDelta)\n        );\n\n        uint256 ethBalance = address(this).balance;\n        if (ethBalance > 0) {\n            CurrencyLibrary.ADDRESS_ZERO.transfer(msg.sender, ethBalance);\n        }\n    }\n\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n\n        CallbackData memory data = abi.decode(rawData, (CallbackData));\n\n        (uint128 liquidityBefore,,) = manager.getPositionInfo(\n            data.key.toId(), address(this), data.params.tickLower, data.params.tickUpper, data.params.salt\n        );\n\n        (BalanceDelta delta,) = manager.modifyLiquidity(data.key, data.params, data.hookData);\n\n        (uint128 liquidityAfter,,) = manager.getPositionInfo(\n            data.key.toId(), address(this), data.params.tickLower, data.params.tickUpper, data.params.salt\n        );\n\n        (,, int256 delta0) = _fetchBalances(data.key.currency0, data.sender, address(this));\n        (,, int256 delta1) = _fetchBalances(data.key.currency1, data.sender, address(this));\n\n        require(\n            int128(liquidityBefore) + data.params.liquidityDelta == int128(liquidityAfter), \"liquidity change incorrect\"\n        );\n\n        if (data.params.liquidityDelta < 0) {\n            assert(delta0 > 0 || delta1 > 0);\n            assert(!(delta0 < 0 || delta1 < 0));\n        } else if (data.params.liquidityDelta > 0) {\n            assert(delta0 < 0 || delta1 < 0);\n            assert(!(delta0 > 0 || delta1 > 0));\n        }\n\n        if (delta0 < 0) data.key.currency0.settle(manager, data.sender, uint256(-delta0), data.settleUsingBurn);\n        if (delta1 < 0) data.key.currency1.settle(manager, data.sender, uint256(-delta1), data.settleUsingBurn);\n        if (delta0 > 0) data.key.currency0.take(manager, data.sender, uint256(delta0), data.takeClaims);\n        if (delta1 > 0) data.key.currency1.take(manager, data.sender, uint256(delta1), data.takeClaims);\n\n        return abi.encode(delta);\n    }\n}\n"
  },
  {
    "path": "src/test/PoolModifyLiquidityTestNoChecks.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {CurrencyLibrary, Currency} from \"../types/Currency.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {ModifyLiquidityParams} from \"../types/PoolOperation.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {PoolTestBase} from \"./PoolTestBase.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {LPFeeLibrary} from \"../libraries/LPFeeLibrary.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\n\ncontract PoolModifyLiquidityTestNoChecks is PoolTestBase {\n    using CurrencySettler for Currency;\n    using Hooks for IHooks;\n    using LPFeeLibrary for uint24;\n\n    constructor(IPoolManager _manager) PoolTestBase(_manager) {}\n\n    struct CallbackData {\n        address sender;\n        PoolKey key;\n        ModifyLiquidityParams params;\n        bytes hookData;\n        bool settleUsingBurn;\n        bool takeClaims;\n    }\n\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes memory hookData)\n        external\n        payable\n        returns (BalanceDelta delta)\n    {\n        delta = modifyLiquidity(key, params, hookData, false, false);\n    }\n\n    function modifyLiquidity(\n        PoolKey memory key,\n        ModifyLiquidityParams memory params,\n        bytes memory hookData,\n        bool settleUsingBurn,\n        bool takeClaims\n    ) public payable returns (BalanceDelta delta) {\n        delta = abi.decode(\n            manager.unlock(abi.encode(CallbackData(msg.sender, key, params, hookData, settleUsingBurn, takeClaims))),\n            (BalanceDelta)\n        );\n\n        uint256 ethBalance = address(this).balance;\n        if (ethBalance > 0) {\n            CurrencyLibrary.ADDRESS_ZERO.transfer(msg.sender, ethBalance);\n        }\n    }\n\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n\n        CallbackData memory data = abi.decode(rawData, (CallbackData));\n\n        (BalanceDelta delta,) = manager.modifyLiquidity(data.key, data.params, data.hookData);\n\n        int256 delta0 = delta.amount0();\n        int256 delta1 = delta.amount1();\n\n        if (delta0 < 0) data.key.currency0.settle(manager, data.sender, uint256(-delta0), data.settleUsingBurn);\n        if (delta1 < 0) data.key.currency1.settle(manager, data.sender, uint256(-delta1), data.settleUsingBurn);\n        if (delta0 > 0) data.key.currency0.take(manager, data.sender, uint256(delta0), data.takeClaims);\n        if (delta1 > 0) data.key.currency1.take(manager, data.sender, uint256(delta1), data.takeClaims);\n\n        return abi.encode(delta);\n    }\n}\n"
  },
  {
    "path": "src/test/PoolNestedActionsTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"../interfaces/callback/IUnlockCallback.sol\";\nimport {PoolTestBase} from \"./PoolTestBase.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {Constants} from \"../../test/utils/Constants.sol\";\nimport {Test} from \"forge-std/Test.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\nimport {StateLibrary} from \"../libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"../libraries/TransientStateLibrary.sol\";\n\nenum Action {\n    NESTED_SELF_UNLOCK,\n    NESTED_EXECUTOR_UNLOCK,\n    SWAP_AND_SETTLE,\n    DONATE_AND_SETTLE,\n    ADD_LIQUIDITY_AND_SETTLE,\n    REMOVE_LIQUIDITY_AND_SETTLE,\n    INITIALIZE\n}\n\ncontract PoolNestedActionsTest is Test, IUnlockCallback {\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n\n    IPoolManager manager;\n    NestedActionExecutor public executor;\n    address user;\n\n    constructor(IPoolManager _manager) {\n        manager = _manager;\n        user = msg.sender;\n        executor = new NestedActionExecutor(manager, user);\n    }\n\n    function unlock(bytes calldata data) external {\n        manager.unlock(data);\n    }\n\n    /// @notice Called by the pool manager on `msg.sender` when the manager is unlocked\n    function unlockCallback(bytes calldata data) external override returns (bytes memory) {\n        Action[] memory actions = abi.decode(data, (Action[]));\n        if (actions.length == 1 && actions[0] == Action.NESTED_SELF_UNLOCK) {\n            _nestedUnlock();\n        } else {\n            executor.execute(actions);\n        }\n        return \"\";\n    }\n\n    function _nestedUnlock() internal {\n        bool unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n        vm.expectRevert(abi.encodeWithSelector(IPoolManager.AlreadyUnlocked.selector));\n        manager.unlock(\"\");\n        unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n    }\n}\n\ncontract NestedActionExecutor is Test, PoolTestBase {\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n    using CurrencySettler for Currency;\n\n    PoolKey internal key;\n    address user;\n\n    error KeyNotSet();\n\n    ModifyLiquidityParams internal ADD_LIQUIDITY_PARAMS =\n        ModifyLiquidityParams({tickLower: -120, tickUpper: 120, liquidityDelta: 1e18, salt: 0});\n\n    ModifyLiquidityParams internal REMOVE_LIQUIDITY_PARAMS =\n        ModifyLiquidityParams({tickLower: -120, tickUpper: 120, liquidityDelta: -1e18, salt: 0});\n\n    SwapParams internal SWAP_PARAMS =\n        SwapParams({zeroForOne: true, amountSpecified: -100, sqrtPriceLimitX96: Constants.SQRT_PRICE_1_2});\n\n    uint256 internal DONATE_AMOUNT0 = 12345e6;\n    uint256 internal DONATE_AMOUNT1 = 98765e4;\n\n    constructor(IPoolManager _manager, address _user) PoolTestBase(_manager) {\n        user = _user;\n    }\n\n    function setKey(PoolKey memory _key) external {\n        key = _key;\n    }\n\n    function execute(Action[] memory actions) public {\n        if (Currency.unwrap(key.currency0) == address(0)) revert KeyNotSet();\n        for (uint256 i = 0; i < actions.length; i++) {\n            Action action = actions[i];\n            if (action == Action.NESTED_EXECUTOR_UNLOCK) _nestedUnlock();\n            else if (action == Action.SWAP_AND_SETTLE) _swap(msg.sender);\n            else if (action == Action.ADD_LIQUIDITY_AND_SETTLE) _addLiquidity(msg.sender);\n            else if (action == Action.REMOVE_LIQUIDITY_AND_SETTLE) _removeLiquidity(msg.sender);\n            else if (action == Action.DONATE_AND_SETTLE) _donate(msg.sender);\n            else if (action == Action.INITIALIZE) _initialize();\n        }\n    }\n\n    function _nestedUnlock() internal {\n        bool unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n        vm.expectRevert(abi.encodeWithSelector(IPoolManager.AlreadyUnlocked.selector));\n        manager.unlock(\"\");\n        unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n    }\n\n    function _swap(address caller) internal {\n        bool unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n        (,, int256 deltaCallerBefore0) = _fetchBalances(key.currency0, user, caller);\n        (,, int256 deltaCallerBefore1) = _fetchBalances(key.currency1, user, caller);\n        (,, int256 deltaThisBefore0) = _fetchBalances(key.currency0, user, address(this));\n        (,, int256 deltaThisBefore1) = _fetchBalances(key.currency1, user, address(this));\n\n        BalanceDelta delta = manager.swap(key, SWAP_PARAMS, \"\");\n\n        (,, int256 deltaCallerAfter0) = _fetchBalances(key.currency0, user, caller);\n        (,, int256 deltaCallerAfter1) = _fetchBalances(key.currency1, user, caller);\n        (,, int256 deltaThisAfter0) = _fetchBalances(key.currency0, user, address(this));\n        (,, int256 deltaThisAfter1) = _fetchBalances(key.currency1, user, address(this));\n\n        assertEq(deltaCallerBefore0, deltaCallerAfter0, \"Caller delta 0\");\n        assertEq(deltaCallerBefore1, deltaCallerAfter1, \"Caller delta 1\");\n        assertEq(deltaThisBefore0 + SWAP_PARAMS.amountSpecified, deltaThisAfter0, \"Executor delta 0\");\n        assertEq(deltaThisBefore1 + 98, deltaThisAfter1, \"Executor delta 1\");\n        assertEq(delta.amount0(), deltaThisAfter0, \"Swap delta 0\");\n        assertEq(delta.amount1(), deltaThisAfter1, \"Swap delta 1\");\n\n        key.currency0.settle(manager, user, uint256(-deltaThisAfter0), false);\n        key.currency1.take(manager, user, uint256(deltaThisAfter1), false);\n    }\n\n    function _addLiquidity(address caller) internal {\n        bool unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n        (,, int256 deltaCallerBefore0) = _fetchBalances(key.currency0, user, caller);\n        (,, int256 deltaCallerBefore1) = _fetchBalances(key.currency1, user, caller);\n        (,, int256 deltaThisBefore0) = _fetchBalances(key.currency0, user, address(this));\n        (,, int256 deltaThisBefore1) = _fetchBalances(key.currency1, user, address(this));\n\n        (BalanceDelta delta,) = manager.modifyLiquidity(key, ADD_LIQUIDITY_PARAMS, \"\");\n\n        (,, int256 deltaCallerAfter0) = _fetchBalances(key.currency0, user, caller);\n        (,, int256 deltaCallerAfter1) = _fetchBalances(key.currency1, user, caller);\n        (,, int256 deltaThisAfter0) = _fetchBalances(key.currency0, user, address(this));\n        (,, int256 deltaThisAfter1) = _fetchBalances(key.currency1, user, address(this));\n\n        assertEq(deltaCallerBefore0, deltaCallerAfter0, \"Caller delta 0\");\n        assertEq(deltaCallerBefore1, deltaCallerAfter1, \"Caller delta 1\");\n        assertEq(deltaThisBefore0 + delta.amount0(), deltaThisAfter0, \"Executor delta 0\");\n        assertEq(deltaThisBefore1 + delta.amount1(), deltaThisAfter1, \"Executor delta 1\");\n\n        key.currency0.settle(manager, user, uint256(-deltaThisAfter0), false);\n        key.currency1.settle(manager, user, uint256(-deltaThisAfter1), false);\n    }\n\n    // cannot remove non-existent liquidity - need to perform an add before this removal\n    function _removeLiquidity(address caller) internal {\n        bool unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n        (,, int256 deltaCallerBefore0) = _fetchBalances(key.currency0, user, caller);\n        (,, int256 deltaCallerBefore1) = _fetchBalances(key.currency1, user, caller);\n        (,, int256 deltaThisBefore0) = _fetchBalances(key.currency0, user, address(this));\n        (,, int256 deltaThisBefore1) = _fetchBalances(key.currency1, user, address(this));\n\n        (BalanceDelta delta,) = manager.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, \"\");\n\n        (,, int256 deltaCallerAfter0) = _fetchBalances(key.currency0, user, caller);\n        (,, int256 deltaCallerAfter1) = _fetchBalances(key.currency1, user, caller);\n        (,, int256 deltaThisAfter0) = _fetchBalances(key.currency0, user, address(this));\n        (,, int256 deltaThisAfter1) = _fetchBalances(key.currency1, user, address(this));\n\n        assertEq(deltaCallerBefore0, deltaCallerAfter0, \"Caller delta 0\");\n        assertEq(deltaCallerBefore1, deltaCallerAfter1, \"Caller delta 1\");\n        assertEq(deltaThisBefore0 + delta.amount0(), deltaThisAfter0, \"Executor delta 0\");\n        assertEq(deltaThisBefore1 + delta.amount1(), deltaThisAfter1, \"Executor delta 1\");\n\n        key.currency0.take(manager, user, uint256(deltaThisAfter0), false);\n        key.currency1.take(manager, user, uint256(deltaThisAfter1), false);\n    }\n\n    function _donate(address caller) internal {\n        bool unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n        (,, int256 deltaCallerBefore0) = _fetchBalances(key.currency0, user, caller);\n        (,, int256 deltaCallerBefore1) = _fetchBalances(key.currency1, user, caller);\n        (,, int256 deltaThisBefore0) = _fetchBalances(key.currency0, user, address(this));\n        (,, int256 deltaThisBefore1) = _fetchBalances(key.currency1, user, address(this));\n\n        BalanceDelta delta = manager.donate(key, DONATE_AMOUNT0, DONATE_AMOUNT1, \"\");\n\n        (,, int256 deltaCallerAfter0) = _fetchBalances(key.currency0, user, caller);\n        (,, int256 deltaCallerAfter1) = _fetchBalances(key.currency1, user, caller);\n        (,, int256 deltaThisAfter0) = _fetchBalances(key.currency0, user, address(this));\n        (,, int256 deltaThisAfter1) = _fetchBalances(key.currency1, user, address(this));\n\n        assertEq(deltaCallerBefore0, deltaCallerAfter0, \"Caller delta 0\");\n        assertEq(deltaCallerBefore1, deltaCallerAfter1, \"Caller delta 1\");\n        assertEq(deltaThisBefore0 - int256(DONATE_AMOUNT0), deltaThisAfter0, \"Executor delta 0\");\n        assertEq(deltaThisBefore1 - int256(DONATE_AMOUNT1), deltaThisAfter1, \"Executor delta 1\");\n        assertEq(-delta.amount0(), int256(DONATE_AMOUNT0), \"Donate delta 0\");\n        assertEq(-delta.amount1(), int256(DONATE_AMOUNT1), \"Donate delta 1\");\n\n        key.currency0.settle(manager, user, uint256(-deltaThisAfter0), false);\n        key.currency1.settle(manager, user, uint256(-deltaThisAfter1), false);\n    }\n\n    function _initialize() internal {\n        bool unlocked = manager.isUnlocked();\n        assertEq(unlocked, true);\n        key.tickSpacing = 50;\n        PoolId id = key.toId();\n        (uint256 price,,,) = manager.getSlot0(id);\n        assertEq(price, 0);\n        manager.initialize(key, Constants.SQRT_PRICE_1_2);\n        (price,,,) = manager.getSlot0(id);\n        assertEq(price, Constants.SQRT_PRICE_1_2);\n    }\n\n    // This will never actually be used - its just to allow us to use the PoolTestBase helper contact\n    function unlockCallback(bytes calldata) external pure override returns (bytes memory) {\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "src/test/PoolSwapTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {CurrencyLibrary, Currency} from \"../types/Currency.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {SwapParams} from \"../types/PoolOperation.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {PoolTestBase} from \"./PoolTestBase.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\n\ncontract PoolSwapTest is PoolTestBase {\n    using CurrencySettler for Currency;\n    using Hooks for IHooks;\n\n    constructor(IPoolManager _manager) PoolTestBase(_manager) {}\n\n    error NoSwapOccurred();\n\n    struct CallbackData {\n        address sender;\n        TestSettings testSettings;\n        PoolKey key;\n        SwapParams params;\n        bytes hookData;\n    }\n\n    struct TestSettings {\n        bool takeClaims;\n        bool settleUsingBurn;\n    }\n\n    function swap(PoolKey memory key, SwapParams memory params, TestSettings memory testSettings, bytes memory hookData)\n        external\n        payable\n        returns (BalanceDelta delta)\n    {\n        delta = abi.decode(\n            manager.unlock(abi.encode(CallbackData(msg.sender, testSettings, key, params, hookData))), (BalanceDelta)\n        );\n\n        uint256 ethBalance = address(this).balance;\n        if (ethBalance > 0) CurrencyLibrary.ADDRESS_ZERO.transfer(msg.sender, ethBalance);\n    }\n\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n\n        CallbackData memory data = abi.decode(rawData, (CallbackData));\n\n        (,, int256 deltaBefore0) = _fetchBalances(data.key.currency0, data.sender, address(this));\n        (,, int256 deltaBefore1) = _fetchBalances(data.key.currency1, data.sender, address(this));\n\n        require(deltaBefore0 == 0, \"deltaBefore0 is not equal to 0\");\n        require(deltaBefore1 == 0, \"deltaBefore1 is not equal to 0\");\n\n        BalanceDelta delta = manager.swap(data.key, data.params, data.hookData);\n\n        (,, int256 deltaAfter0) = _fetchBalances(data.key.currency0, data.sender, address(this));\n        (,, int256 deltaAfter1) = _fetchBalances(data.key.currency1, data.sender, address(this));\n\n        if (data.params.zeroForOne) {\n            if (data.params.amountSpecified < 0) {\n                // exact input, 0 for 1\n                require(\n                    deltaAfter0 >= data.params.amountSpecified,\n                    \"deltaAfter0 is not greater than or equal to data.params.amountSpecified\"\n                );\n                require(delta.amount0() == deltaAfter0, \"delta.amount0() is not equal to deltaAfter0\");\n                require(deltaAfter1 >= 0, \"deltaAfter1 is not greater than or equal to 0\");\n            } else {\n                // exact output, 0 for 1\n                require(deltaAfter0 <= 0, \"deltaAfter0 is not less than or equal to zero\");\n                require(delta.amount1() == deltaAfter1, \"delta.amount1() is not equal to deltaAfter1\");\n                require(\n                    deltaAfter1 <= data.params.amountSpecified,\n                    \"deltaAfter1 is not less than or equal to data.params.amountSpecified\"\n                );\n            }\n        } else {\n            if (data.params.amountSpecified < 0) {\n                // exact input, 1 for 0\n                require(\n                    deltaAfter1 >= data.params.amountSpecified,\n                    \"deltaAfter1 is not greater than or equal to data.params.amountSpecified\"\n                );\n                require(delta.amount1() == deltaAfter1, \"delta.amount1() is not equal to deltaAfter1\");\n                require(deltaAfter0 >= 0, \"deltaAfter0 is not greater than or equal to 0\");\n            } else {\n                // exact output, 1 for 0\n                require(deltaAfter1 <= 0, \"deltaAfter1 is not less than or equal to 0\");\n                require(delta.amount0() == deltaAfter0, \"delta.amount0() is not equal to deltaAfter0\");\n                require(\n                    deltaAfter0 <= data.params.amountSpecified,\n                    \"deltaAfter0 is not less than or equal to data.params.amountSpecified\"\n                );\n            }\n        }\n\n        if (deltaAfter0 < 0) {\n            data.key.currency0.settle(manager, data.sender, uint256(-deltaAfter0), data.testSettings.settleUsingBurn);\n        }\n        if (deltaAfter1 < 0) {\n            data.key.currency1.settle(manager, data.sender, uint256(-deltaAfter1), data.testSettings.settleUsingBurn);\n        }\n        if (deltaAfter0 > 0) {\n            data.key.currency0.take(manager, data.sender, uint256(deltaAfter0), data.testSettings.takeClaims);\n        }\n        if (deltaAfter1 > 0) {\n            data.key.currency1.take(manager, data.sender, uint256(deltaAfter1), data.testSettings.takeClaims);\n        }\n\n        return abi.encode(delta);\n    }\n}\n"
  },
  {
    "path": "src/test/PoolTakeTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {PoolTestBase} from \"./PoolTestBase.sol\";\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\n\ncontract PoolTakeTest is PoolTestBase {\n    using CurrencySettler for Currency;\n    using SafeCast for uint256;\n\n    constructor(IPoolManager _manager) PoolTestBase(_manager) {}\n\n    struct CallbackData {\n        address sender;\n        PoolKey key;\n        uint256 amount0;\n        uint256 amount1;\n    }\n\n    function take(PoolKey memory key, uint256 amount0, uint256 amount1) external payable {\n        manager.unlock(abi.encode(CallbackData(msg.sender, key, amount0, amount1)));\n    }\n\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n\n        CallbackData memory data = abi.decode(rawData, (CallbackData));\n\n        if (data.amount0 > 0) _testTake(data.key.currency0, data.sender, data.amount0);\n        if (data.amount1 > 0) _testTake(data.key.currency1, data.sender, data.amount1);\n\n        return abi.encode(0);\n    }\n\n    function _testTake(Currency currency, address sender, uint256 amount) internal {\n        (uint256 userBalBefore, uint256 pmBalBefore, int256 deltaBefore) =\n            _fetchBalances(currency, sender, address(this));\n        require(deltaBefore == 0, \"deltaBefore is not equal to 0\");\n\n        currency.take(manager, sender, amount, false);\n\n        (uint256 userBalAfter, uint256 pmBalAfter, int256 deltaAfter) = _fetchBalances(currency, sender, address(this));\n\n        require(deltaAfter == -amount.toInt128(), \"deltaAfter is not equal to -amount.toInt128()\");\n\n        require(\n            userBalAfter - userBalBefore == amount,\n            \"the difference between userBalAfter and userBalBefore is not equal to amount\"\n        );\n        require(\n            pmBalBefore - pmBalAfter == amount,\n            \"the difference between pmBalBefore and pmBalAfter is not equal to amount\"\n        );\n\n        currency.settle(manager, sender, amount, false);\n    }\n}\n"
  },
  {
    "path": "src/test/PoolTestBase.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\n\nimport {IUnlockCallback} from \"../interfaces/callback/IUnlockCallback.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\n\nimport {StateLibrary} from \"../libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"../libraries/TransientStateLibrary.sol\";\n\nabstract contract PoolTestBase is IUnlockCallback {\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n\n    IPoolManager public immutable manager;\n\n    constructor(IPoolManager _manager) {\n        manager = _manager;\n    }\n\n    function _fetchBalances(Currency currency, address user, address deltaHolder)\n        internal\n        view\n        returns (uint256 userBalance, uint256 poolBalance, int256 delta)\n    {\n        userBalance = currency.balanceOf(user);\n        poolBalance = currency.balanceOf(address(manager));\n        delta = manager.currencyDelta(deltaHolder, currency);\n    }\n}\n"
  },
  {
    "path": "src/test/ProtocolFeesImplementation.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {ProtocolFees} from \"../ProtocolFees.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {Pool} from \"../libraries/Pool.sol\";\nimport {Slot0} from \"../types/Slot0.sol\";\n\ncontract ProtocolFeesImplementation is ProtocolFees {\n    mapping(PoolId id => Pool.State) internal _pools;\n    bool internal isUnlocked;\n\n    constructor() ProtocolFees(msg.sender) {}\n\n    // Used to set the price of a pool to pretend that the pool has been initialized in order to successfully set a protocol fee\n    function setPrice(PoolKey memory key, uint160 sqrtPriceX96) public {\n        Pool.State storage pool = _getPool(key.toId());\n        pool.slot0 = pool.slot0.setSqrtPriceX96(sqrtPriceX96);\n    }\n\n    function _getPool(PoolId id) internal view override returns (Pool.State storage) {\n        return _pools[id];\n    }\n\n    function setIsUnlocked(bool newValue) public {\n        isUnlocked = newValue;\n    }\n\n    function _isUnlocked() internal view override returns (bool) {\n        return isUnlocked;\n    }\n\n    function updateProtocolFees(Currency currency, uint256 amount) public {\n        ProtocolFees._updateProtocolFees(currency, amount);\n    }\n}\n"
  },
  {
    "path": "src/test/ProxyPoolManager.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.24;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {Pool} from \"../libraries/Pool.sol\";\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\nimport {Position} from \"../libraries/Position.sol\";\nimport {LPFeeLibrary} from \"../libraries/LPFeeLibrary.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {TickMath} from \"../libraries/TickMath.sol\";\nimport {NoDelegateCall} from \"../NoDelegateCall.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"../interfaces/callback/IUnlockCallback.sol\";\nimport {ProtocolFees} from \"../ProtocolFees.sol\";\nimport {ERC6909Claims} from \"../ERC6909Claims.sol\";\nimport {PoolId} from \"../types/PoolId.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {Lock} from \"../libraries/Lock.sol\";\nimport {CurrencyDelta} from \"../libraries/CurrencyDelta.sol\";\nimport {NonzeroDeltaCount} from \"../libraries/NonzeroDeltaCount.sol\";\nimport {CurrencyReserves} from \"../libraries/CurrencyReserves.sol\";\nimport {Extsload} from \"../Extsload.sol\";\nimport {Exttload} from \"../Exttload.sol\";\nimport {CustomRevert} from \"../libraries/CustomRevert.sol\";\n\n/// @notice A proxy pool manager that delegates calls to the real/delegate pool manager\ncontract ProxyPoolManager is IPoolManager, ProtocolFees, NoDelegateCall, ERC6909Claims, Extsload, Exttload {\n    using SafeCast for *;\n    using Pool for *;\n    using Hooks for IHooks;\n    using CurrencyDelta for Currency;\n    using LPFeeLibrary for uint24;\n    using CurrencyReserves for Currency;\n    using CustomRevert for bytes4;\n\n    int24 private constant MAX_TICK_SPACING = TickMath.MAX_TICK_SPACING;\n\n    int24 private constant MIN_TICK_SPACING = TickMath.MIN_TICK_SPACING;\n\n    mapping(PoolId id => Pool.State) internal _pools;\n\n    address internal immutable _delegateManager;\n\n    constructor(address delegateManager) ProtocolFees(msg.sender) {\n        _delegateManager = delegateManager;\n    }\n\n    /// @notice This will revert if the contract is locked\n    modifier onlyWhenUnlocked() {\n        if (!Lock.isUnlocked()) ManagerLocked.selector.revertWith();\n        _;\n    }\n\n    /// @inheritdoc IPoolManager\n    function unlock(bytes calldata data) external noDelegateCall returns (bytes memory result) {\n        if (Lock.isUnlocked()) AlreadyUnlocked.selector.revertWith();\n\n        Lock.unlock();\n\n        // the caller does everything in this callback, including paying what they owe via calls to settle\n        result = IUnlockCallback(msg.sender).unlockCallback(data);\n\n        if (NonzeroDeltaCount.read() != 0) CurrencyNotSettled.selector.revertWith();\n        Lock.lock();\n    }\n\n    /// @inheritdoc IPoolManager\n    function initialize(PoolKey memory key, uint160 sqrtPriceX96) external noDelegateCall returns (int24 tick) {\n        // see TickBitmap.sol for overflow conditions that can arise from tick spacing being too large\n        if (key.tickSpacing > MAX_TICK_SPACING) TickSpacingTooLarge.selector.revertWith(key.tickSpacing);\n        if (key.tickSpacing < MIN_TICK_SPACING) TickSpacingTooSmall.selector.revertWith(key.tickSpacing);\n        if (key.currency0 >= key.currency1) {\n            CurrenciesOutOfOrderOrEqual.selector.revertWith(\n                Currency.unwrap(key.currency0), Currency.unwrap(key.currency1)\n            );\n        }\n        if (!key.hooks.isValidHookAddress(key.fee)) Hooks.HookAddressNotValid.selector.revertWith(address(key.hooks));\n\n        uint24 lpFee = key.fee.getInitialLPFee();\n\n        key.hooks.beforeInitialize(key, sqrtPriceX96);\n\n        PoolId id = key.toId();\n\n        tick = _pools[id].initialize(sqrtPriceX96, lpFee);\n\n        key.hooks.afterInitialize(key, sqrtPriceX96, tick);\n\n        // emit all details of a pool key. poolkeys are not saved in storage and must always be provided by the caller\n        // the key's fee may be a static fee or a sentinel to denote a dynamic fee.\n        emit Initialize(id, key.currency0, key.currency1, key.fee, key.tickSpacing, key.hooks, sqrtPriceX96, tick);\n    }\n\n    /// @inheritdoc IPoolManager\n    function modifyLiquidity(PoolKey memory key, ModifyLiquidityParams memory params, bytes calldata hookData)\n        external\n        onlyWhenUnlocked\n        noDelegateCall\n        returns (BalanceDelta callerDelta, BalanceDelta feesAccrued)\n    {\n        bytes memory result = _delegateCall(\n            _delegateManager, abi.encodeWithSelector(this.modifyLiquidity.selector, key, params, hookData)\n        );\n\n        return abi.decode(result, (BalanceDelta, BalanceDelta));\n    }\n\n    /// @inheritdoc IPoolManager\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata hookData)\n        external\n        onlyWhenUnlocked\n        noDelegateCall\n        returns (BalanceDelta swapDelta)\n    {\n        bytes memory result =\n            _delegateCall(_delegateManager, abi.encodeWithSelector(this.swap.selector, key, params, hookData));\n\n        return abi.decode(result, (BalanceDelta));\n    }\n\n    /// @inheritdoc IPoolManager\n    function donate(PoolKey memory key, uint256 amount0, uint256 amount1, bytes calldata hookData)\n        external\n        onlyWhenUnlocked\n        noDelegateCall\n        returns (BalanceDelta delta)\n    {\n        bytes memory result = _delegateCall(\n            _delegateManager, abi.encodeWithSelector(this.donate.selector, key, amount0, amount1, hookData)\n        );\n\n        return abi.decode(result, (BalanceDelta));\n    }\n\n    /// @inheritdoc IPoolManager\n    function sync(Currency currency) public {\n        // address(0) is used for the native currency\n        if (currency.isAddressZero()) {\n            // The reserves balance is not used for native settling, so we only need to reset the currency.\n            CurrencyReserves.resetCurrency();\n        } else {\n            uint256 balance = currency.balanceOfSelf();\n            CurrencyReserves.syncCurrencyAndReserves(currency, balance);\n        }\n    }\n\n    /// @inheritdoc IPoolManager\n    function take(Currency currency, address to, uint256 amount) external onlyWhenUnlocked noDelegateCall {\n        _delegateCall(_delegateManager, abi.encodeWithSelector(this.take.selector, currency, to, amount));\n    }\n\n    /// @inheritdoc IPoolManager\n    function settle() external payable onlyWhenUnlocked noDelegateCall returns (uint256 paid) {\n        bytes memory result = _delegateCall(_delegateManager, abi.encodeWithSelector(this.settle.selector));\n\n        return abi.decode(result, (uint256));\n    }\n\n    /// @inheritdoc IPoolManager\n    function settleFor(address recipient) external payable onlyWhenUnlocked noDelegateCall returns (uint256 paid) {\n        bytes memory result =\n            _delegateCall(_delegateManager, abi.encodeWithSelector(this.settleFor.selector, recipient));\n\n        return abi.decode(result, (uint256));\n    }\n\n    /// @inheritdoc IPoolManager\n    function clear(Currency currency, uint256 amount) external onlyWhenUnlocked {\n        _delegateCall(_delegateManager, abi.encodeWithSelector(this.clear.selector, currency, amount));\n    }\n\n    /// @inheritdoc IPoolManager\n    function mint(address to, uint256 id, uint256 amount) external onlyWhenUnlocked noDelegateCall {\n        _delegateCall(_delegateManager, abi.encodeWithSelector(this.mint.selector, to, id, amount));\n    }\n\n    /// @inheritdoc IPoolManager\n    function burn(address from, uint256 id, uint256 amount) external onlyWhenUnlocked noDelegateCall {\n        _delegateCall(_delegateManager, abi.encodeWithSelector(this.burn.selector, from, id, amount));\n    }\n\n    /// @inheritdoc IPoolManager\n    function updateDynamicLPFee(PoolKey memory key, uint24 newDynamicLPFee) external {\n        if (!key.fee.isDynamicFee() || msg.sender != address(key.hooks)) {\n            UnauthorizedDynamicLPFeeUpdate.selector.revertWith();\n        }\n        newDynamicLPFee.validate();\n        PoolId id = key.toId();\n        _pools[id].setLPFee(newDynamicLPFee);\n    }\n\n    /// @notice Make a delegate call, bubble up any error or return the result\n    function _delegateCall(address target, bytes memory data) internal returns (bytes memory result) {\n        (bool success, bytes memory returnData) = target.delegatecall(data);\n\n        if (!success) {\n            if (returnData.length == 0) {\n                revert();\n            } else {\n                assembly {\n                    let size := mload(returnData)\n                    revert(add(32, returnData), size)\n                }\n            }\n        }\n\n        return returnData;\n    }\n\n    /// @notice Implementation of the _getPool function defined in ProtocolFees\n    function _getPool(PoolId id) internal view override returns (Pool.State storage) {\n        return _pools[id];\n    }\n\n    /// @notice Implementation of the _isUnlocked function defined in ProtocolFees\n    function _isUnlocked() internal view override returns (bool) {\n        return Lock.isUnlocked();\n    }\n}\n"
  },
  {
    "path": "src/test/SkipCallsTestHook.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {BaseTestHooks} from \"./BaseTestHooks.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../types/PoolOperation.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"../types/BalanceDelta.sol\";\nimport {Currency} from \"../types/Currency.sol\";\nimport {Test} from \"forge-std/Test.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\nimport {StateLibrary} from \"../libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"../libraries/TransientStateLibrary.sol\";\nimport {BeforeSwapDelta, BeforeSwapDeltaLibrary} from \"../types/BeforeSwapDelta.sol\";\n\ncontract SkipCallsTestHook is BaseTestHooks, Test {\n    using CurrencySettler for Currency;\n    using Hooks for IHooks;\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n\n    uint256 public counter;\n    IPoolManager manager;\n\n    function setManager(IPoolManager _manager) external {\n        manager = _manager;\n    }\n\n    function beforeInitialize(address, PoolKey calldata key, uint160 sqrtPriceX96) external override returns (bytes4) {\n        counter++;\n        _initialize(key, sqrtPriceX96);\n        return IHooks.beforeInitialize.selector;\n    }\n\n    function afterInitialize(address, PoolKey calldata key, uint160 sqrtPriceX96, int24)\n        external\n        override\n        returns (bytes4)\n    {\n        counter++;\n        _initialize(key, sqrtPriceX96);\n        return IHooks.afterInitialize.selector;\n    }\n\n    function beforeAddLiquidity(\n        address,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external override returns (bytes4) {\n        counter++;\n        _addLiquidity(key, params, hookData);\n        return IHooks.beforeAddLiquidity.selector;\n    }\n\n    function afterAddLiquidity(\n        address,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata hookData\n    ) external override returns (bytes4, BalanceDelta) {\n        counter++;\n        _addLiquidity(key, params, hookData);\n        return (IHooks.afterAddLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeRemoveLiquidity(\n        address,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        bytes calldata hookData\n    ) external override returns (bytes4) {\n        counter++;\n        _removeLiquidity(key, params, hookData);\n        return IHooks.beforeRemoveLiquidity.selector;\n    }\n\n    function afterRemoveLiquidity(\n        address,\n        PoolKey calldata key,\n        ModifyLiquidityParams calldata params,\n        BalanceDelta,\n        BalanceDelta,\n        bytes calldata hookData\n    ) external override returns (bytes4, BalanceDelta) {\n        counter++;\n        _removeLiquidity(key, params, hookData);\n        return (IHooks.afterRemoveLiquidity.selector, BalanceDeltaLibrary.ZERO_DELTA);\n    }\n\n    function beforeSwap(address, PoolKey calldata key, SwapParams calldata params, bytes calldata hookData)\n        external\n        override\n        returns (bytes4, BeforeSwapDelta, uint24)\n    {\n        counter++;\n        _swap(key, params, hookData);\n        return (IHooks.beforeSwap.selector, BeforeSwapDeltaLibrary.ZERO_DELTA, 0);\n    }\n\n    function afterSwap(address, PoolKey calldata key, SwapParams calldata params, BalanceDelta, bytes calldata hookData)\n        external\n        override\n        returns (bytes4, int128)\n    {\n        counter++;\n        _swap(key, params, hookData);\n        return (IHooks.afterSwap.selector, 0);\n    }\n\n    function beforeDonate(address, PoolKey calldata key, uint256 amt0, uint256 amt1, bytes calldata hookData)\n        external\n        override\n        returns (bytes4)\n    {\n        counter++;\n        _donate(key, amt0, amt1, hookData);\n        return IHooks.beforeDonate.selector;\n    }\n\n    function afterDonate(address, PoolKey calldata key, uint256 amt0, uint256 amt1, bytes calldata hookData)\n        external\n        override\n        returns (bytes4)\n    {\n        counter++;\n        _donate(key, amt0, amt1, hookData);\n        return IHooks.afterDonate.selector;\n    }\n\n    function _initialize(PoolKey memory key, uint160 sqrtPriceX96) public {\n        // initialize a new pool with different fee\n        key.fee = 2000;\n        IPoolManager(manager).initialize(key, sqrtPriceX96);\n    }\n\n    function _swap(PoolKey calldata key, SwapParams memory params, bytes calldata hookData) public {\n        IPoolManager(manager).swap(key, params, hookData);\n        address payer = abi.decode(hookData, (address));\n        int256 delta0 = IPoolManager(manager).currencyDelta(address(this), key.currency0);\n        assertEq(delta0, params.amountSpecified);\n        int256 delta1 = IPoolManager(manager).currencyDelta(address(this), key.currency1);\n        assert(delta1 > 0);\n        key.currency0.settle(manager, payer, uint256(-delta0), false);\n        key.currency1.take(manager, payer, uint256(delta1), false);\n    }\n\n    function _addLiquidity(PoolKey calldata key, ModifyLiquidityParams memory params, bytes calldata hookData) public {\n        IPoolManager(manager).modifyLiquidity(key, params, hookData);\n        address payer = abi.decode(hookData, (address));\n        int256 delta0 = IPoolManager(manager).currencyDelta(address(this), key.currency0);\n        int256 delta1 = IPoolManager(manager).currencyDelta(address(this), key.currency1);\n\n        assert(delta0 < 0 || delta1 < 0);\n        assert(!(delta0 > 0 || delta1 > 0));\n\n        key.currency0.settle(manager, payer, uint256(-delta0), false);\n        key.currency1.settle(manager, payer, uint256(-delta1), false);\n    }\n\n    function _removeLiquidity(PoolKey calldata key, ModifyLiquidityParams memory params, bytes calldata hookData)\n        public\n    {\n        // first hook needs to add liquidity for itself\n        ModifyLiquidityParams memory newParams =\n            ModifyLiquidityParams({tickLower: -120, tickUpper: 120, liquidityDelta: 1e18, salt: 0});\n        IPoolManager(manager).modifyLiquidity(key, newParams, hookData);\n        // hook removes liquidity\n        IPoolManager(manager).modifyLiquidity(key, params, hookData);\n        address payer = abi.decode(hookData, (address));\n        int256 delta0 = IPoolManager(manager).currencyDelta(address(this), key.currency0);\n        int256 delta1 = IPoolManager(manager).currencyDelta(address(this), key.currency1);\n\n        assert(delta0 < 0 || delta1 < 0);\n        assert(!(delta0 > 0 || delta1 > 0));\n\n        key.currency0.settle(manager, payer, uint256(-delta0), false);\n        key.currency1.settle(manager, payer, uint256(-delta1), false);\n    }\n\n    function _donate(PoolKey calldata key, uint256 amt0, uint256 amt1, bytes calldata hookData) public {\n        IPoolManager(manager).donate(key, amt0, amt1, hookData);\n        address payer = abi.decode(hookData, (address));\n        int256 delta0 = IPoolManager(manager).currencyDelta(address(this), key.currency0);\n        int256 delta1 = IPoolManager(manager).currencyDelta(address(this), key.currency1);\n        key.currency0.settle(manager, payer, uint256(-delta0), false);\n        key.currency1.settle(manager, payer, uint256(-delta1), false);\n    }\n}\n"
  },
  {
    "path": "src/test/SqrtPriceMathEchidnaTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {FullMath} from \"../libraries/FullMath.sol\";\nimport {SqrtPriceMath} from \"../libraries/SqrtPriceMath.sol\";\nimport {FixedPoint96} from \"../libraries/FixedPoint96.sol\";\n\ncontract SqrtPriceMathEchidnaTest {\n    function mulDivRoundingUpInvariants(uint256 x, uint256 y, uint256 z) external pure {\n        unchecked {\n            require(z > 0);\n            uint256 notRoundedUp = FullMath.mulDiv(x, y, z);\n            uint256 roundedUp = FullMath.mulDivRoundingUp(x, y, z);\n            assert(roundedUp >= notRoundedUp);\n            assert(roundedUp - notRoundedUp < 2);\n            if (roundedUp - notRoundedUp == 1) {\n                assert(mulmod(x, y, z) > 0);\n            } else {\n                assert(mulmod(x, y, z) == 0);\n            }\n        }\n    }\n\n    function getNextSqrtPriceFromInputInvariants(uint160 sqrtP, uint128 liquidity, uint256 amountIn, bool zeroForOne)\n        external\n        pure\n    {\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, liquidity, amountIn, zeroForOne);\n\n        if (zeroForOne) {\n            assert(sqrtQ <= sqrtP);\n            assert(amountIn >= SqrtPriceMath.getAmount0Delta(sqrtQ, sqrtP, liquidity, true));\n        } else {\n            assert(sqrtQ >= sqrtP);\n            assert(amountIn >= SqrtPriceMath.getAmount1Delta(sqrtP, sqrtQ, liquidity, true));\n        }\n    }\n\n    function getNextSqrtPriceFromOutputInvariants(uint160 sqrtP, uint128 liquidity, uint256 amountOut, bool zeroForOne)\n        external\n        pure\n    {\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, liquidity, amountOut, zeroForOne);\n\n        if (zeroForOne) {\n            assert(sqrtQ <= sqrtP);\n            assert(amountOut <= SqrtPriceMath.getAmount1Delta(sqrtQ, sqrtP, liquidity, false));\n        } else {\n            assert(sqrtQ > 0); // this has to be true, otherwise we need another require\n            assert(sqrtQ >= sqrtP);\n            assert(amountOut <= SqrtPriceMath.getAmount0Delta(sqrtP, sqrtQ, liquidity, false));\n        }\n    }\n\n    function getNextSqrtPriceFromAmount0RoundingUpInvariants(\n        uint160 sqrtPX96,\n        uint128 liquidity,\n        uint256 amount,\n        bool add\n    ) external pure {\n        require(sqrtPX96 > 0);\n        require(liquidity > 0);\n        uint160 sqrtQX96 = SqrtPriceMath.getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amount, add);\n\n        if (add) {\n            assert(sqrtQX96 <= sqrtPX96);\n        } else {\n            assert(sqrtQX96 >= sqrtPX96);\n        }\n\n        if (amount == 0) {\n            assert(sqrtPX96 == sqrtQX96);\n        }\n    }\n\n    function getNextSqrtPriceFromAmount1RoundingDownInvariants(\n        uint160 sqrtPX96,\n        uint128 liquidity,\n        uint256 amount,\n        bool add\n    ) external pure {\n        require(sqrtPX96 > 0);\n        require(liquidity > 0);\n        uint160 sqrtQX96 = SqrtPriceMath.getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amount, add);\n\n        if (add) {\n            assert(sqrtQX96 >= sqrtPX96);\n        } else {\n            assert(sqrtQX96 <= sqrtPX96);\n        }\n\n        if (amount == 0) {\n            assert(sqrtPX96 == sqrtQX96);\n        }\n    }\n\n    function getAmount0DeltaInvariants(uint160 sqrtP, uint160 sqrtQ, uint128 liquidity) external pure {\n        require(sqrtP > 0 && sqrtQ > 0);\n\n        uint256 amount0Down = SqrtPriceMath.getAmount0Delta(sqrtQ, sqrtP, liquidity, false);\n        assert(amount0Down == SqrtPriceMath.getAmount0Delta(sqrtP, sqrtQ, liquidity, false));\n\n        uint256 amount0Up = SqrtPriceMath.getAmount0Delta(sqrtQ, sqrtP, liquidity, true);\n        assert(amount0Up == SqrtPriceMath.getAmount0Delta(sqrtP, sqrtQ, liquidity, true));\n\n        assert(amount0Down <= amount0Up);\n        // diff is 0 or 1\n        assert(amount0Up - amount0Down < 2);\n    }\n\n    // ensure that chained division is always equal to the full-precision case for\n    // liquidity * (sqrt(P) - sqrt(Q)) / (sqrt(P) * sqrt(Q))\n    function getAmount0DeltaEquivalency(uint160 sqrtP, uint160 sqrtQ, uint128 liquidity, bool roundUp) external pure {\n        require(sqrtP >= sqrtQ);\n        require(sqrtP > 0 && sqrtQ > 0);\n        require((sqrtP * sqrtQ) / sqrtP == sqrtQ);\n\n        uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n        uint256 numerator2 = sqrtP - sqrtQ;\n        uint256 denominator = uint256(sqrtP) * sqrtQ;\n\n        uint256 safeResult = roundUp\n            ? FullMath.mulDivRoundingUp(numerator1, numerator2, denominator)\n            : FullMath.mulDiv(numerator1, numerator2, denominator);\n        uint256 fullResult = SqrtPriceMath.getAmount0Delta(sqrtQ, sqrtP, liquidity, roundUp);\n\n        assert(safeResult == fullResult);\n    }\n\n    function getAmount1DeltaInvariants(uint160 sqrtP, uint160 sqrtQ, uint128 liquidity) external pure {\n        require(sqrtP > 0 && sqrtQ > 0);\n\n        uint256 amount1Down = SqrtPriceMath.getAmount1Delta(sqrtP, sqrtQ, liquidity, false);\n        assert(amount1Down == SqrtPriceMath.getAmount1Delta(sqrtQ, sqrtP, liquidity, false));\n\n        uint256 amount1Up = SqrtPriceMath.getAmount1Delta(sqrtP, sqrtQ, liquidity, true);\n        assert(amount1Up == SqrtPriceMath.getAmount1Delta(sqrtQ, sqrtP, liquidity, true));\n\n        assert(amount1Down <= amount1Up);\n        // diff is 0 or 1\n        assert(amount1Up - amount1Down < 2);\n    }\n\n    function getAmount0DeltaSignedInvariants(uint160 sqrtP, uint160 sqrtQ, int128 liquidity) external pure {\n        require(sqrtP > 0 && sqrtQ > 0);\n\n        int256 amount0 = SqrtPriceMath.getAmount0Delta(sqrtQ, sqrtP, liquidity);\n        if (liquidity < 0) assert(amount0 <= 0);\n        if (liquidity > 0) {\n            if (sqrtP == sqrtQ) assert(amount0 == 0);\n            else assert(amount0 > 0);\n        }\n        if (liquidity == 0) assert(amount0 == 0);\n    }\n\n    function getAmount1DeltaSignedInvariants(uint160 sqrtP, uint160 sqrtQ, int128 liquidity) external pure {\n        require(sqrtP > 0 && sqrtQ > 0);\n\n        int256 amount1 = SqrtPriceMath.getAmount1Delta(sqrtP, sqrtQ, liquidity);\n        if (liquidity < 0) assert(amount1 <= 0);\n        if (liquidity > 0) {\n            if (sqrtP == sqrtQ) assert(amount1 == 0);\n            else assert(amount1 > 0);\n        }\n        if (liquidity == 0) assert(amount1 == 0);\n    }\n\n    function getOutOfRangeMintInvariants(uint160 sqrtA, uint160 sqrtB, int128 liquidity) external pure {\n        require(sqrtA > 0 && sqrtB > 0);\n        require(liquidity > 0);\n\n        int256 amount0 = SqrtPriceMath.getAmount0Delta(sqrtA, sqrtB, liquidity);\n        int256 amount1 = SqrtPriceMath.getAmount1Delta(sqrtA, sqrtB, liquidity);\n\n        if (sqrtA == sqrtB) {\n            assert(amount0 == 0);\n            assert(amount1 == 0);\n        } else {\n            assert(amount0 > 0);\n            assert(amount1 > 0);\n        }\n    }\n\n    function getInRangeMintInvariants(uint160 sqrtLower, uint160 sqrtCurrent, uint160 sqrtUpper, int128 liquidity)\n        external\n        pure\n    {\n        require(sqrtLower > 0);\n        require(sqrtLower < sqrtUpper);\n        require(sqrtLower <= sqrtCurrent && sqrtCurrent <= sqrtUpper);\n        require(liquidity > 0);\n\n        int256 amount0 = SqrtPriceMath.getAmount0Delta(sqrtCurrent, sqrtUpper, liquidity);\n        int256 amount1 = SqrtPriceMath.getAmount1Delta(sqrtLower, sqrtCurrent, liquidity);\n\n        assert(amount0 > 0 || amount1 > 0);\n    }\n}\n"
  },
  {
    "path": "src/test/SwapRouterNoChecks.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport {Currency} from \"../types/Currency.sol\";\nimport {IPoolManager} from \"../interfaces/IPoolManager.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {SwapParams} from \"../types/PoolOperation.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {Hooks} from \"../libraries/Hooks.sol\";\nimport {PoolTestBase} from \"./PoolTestBase.sol\";\nimport {CurrencySettler} from \"../../test/utils/CurrencySettler.sol\";\n\ncontract SwapRouterNoChecks is PoolTestBase {\n    using CurrencySettler for Currency;\n    using Hooks for IHooks;\n\n    constructor(IPoolManager _manager) PoolTestBase(_manager) {}\n\n    error NoSwapOccurred();\n\n    struct CallbackData {\n        address sender;\n        PoolKey key;\n        SwapParams params;\n    }\n\n    function swap(PoolKey memory key, SwapParams memory params) external payable {\n        manager.unlock(abi.encode(CallbackData(msg.sender, key, params)));\n    }\n\n    function unlockCallback(bytes calldata rawData) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n\n        CallbackData memory data = abi.decode(rawData, (CallbackData));\n\n        BalanceDelta delta = manager.swap(data.key, data.params, new bytes(0));\n\n        if (data.params.zeroForOne) {\n            data.key.currency0.settle(manager, data.sender, uint256(int256(-delta.amount0())), false);\n            data.key.currency1.take(manager, data.sender, uint256(int256(delta.amount1())), false);\n        } else {\n            data.key.currency1.settle(manager, data.sender, uint256(int256(-delta.amount1())), false);\n            data.key.currency0.take(manager, data.sender, uint256(int256(delta.amount0())), false);\n        }\n\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "src/test/TestERC20.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {IERC20Minimal} from \"../interfaces/external/IERC20Minimal.sol\";\n\ncontract TestERC20 is IERC20Minimal {\n    mapping(address => uint256) public override balanceOf;\n    mapping(address => mapping(address => uint256)) public override allowance;\n\n    constructor(uint256 amountToMint) {\n        mint(msg.sender, amountToMint);\n    }\n\n    function mint(address to, uint256 amount) public {\n        uint256 balanceNext = balanceOf[to] + amount;\n        require(balanceNext >= amount, \"overflow balance\");\n        balanceOf[to] = balanceNext;\n    }\n\n    function transfer(address recipient, uint256 amount) external override returns (bool) {\n        uint256 balanceBefore = balanceOf[msg.sender];\n        require(balanceBefore >= amount, \"insufficient balance\");\n        balanceOf[msg.sender] = balanceBefore - amount;\n\n        uint256 balanceRecipient = balanceOf[recipient];\n        require(balanceRecipient + amount >= balanceRecipient, \"recipient balance overflow\");\n        balanceOf[recipient] = balanceRecipient + amount;\n\n        emit Transfer(msg.sender, recipient, amount);\n        return true;\n    }\n\n    function approve(address spender, uint256 amount) external override returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        emit Approval(msg.sender, spender, amount);\n        return true;\n    }\n\n    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {\n        uint256 allowanceBefore = allowance[sender][msg.sender];\n        require(allowanceBefore >= amount, \"allowance insufficient\");\n\n        allowance[sender][msg.sender] = allowanceBefore - amount;\n\n        uint256 balanceRecipient = balanceOf[recipient];\n        require(balanceRecipient + amount >= balanceRecipient, \"overflow balance recipient\");\n        balanceOf[recipient] = balanceRecipient + amount;\n        uint256 balanceSender = balanceOf[sender];\n        require(balanceSender >= amount, \"underflow balance sender\");\n        balanceOf[sender] = balanceSender - amount;\n\n        emit Transfer(sender, recipient, amount);\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/test/TestInvalidERC20.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {IERC20Minimal} from \"../interfaces/external/IERC20Minimal.sol\";\n\n// Regular ERC20 but it doesn't return true on transfer.\ncontract TestInvalidERC20 is IERC20Minimal {\n    mapping(address => uint256) public override balanceOf;\n    mapping(address => mapping(address => uint256)) public override allowance;\n\n    constructor(uint256 amountToMint) {\n        mint(msg.sender, amountToMint);\n    }\n\n    function mint(address to, uint256 amount) public {\n        uint256 balanceNext = balanceOf[to] + amount;\n        require(balanceNext >= amount, \"overflow balance\");\n        balanceOf[to] = balanceNext;\n    }\n\n    function transfer(address recipient, uint256 amount) external override returns (bool) {\n        uint256 balanceBefore = balanceOf[msg.sender];\n        require(balanceBefore >= amount, \"insufficient balance\");\n        balanceOf[msg.sender] = balanceBefore - amount;\n\n        uint256 balanceRecipient = balanceOf[recipient];\n        require(balanceRecipient + amount >= balanceRecipient, \"recipient balance overflow\");\n        balanceOf[recipient] = balanceRecipient + amount;\n\n        emit Transfer(msg.sender, recipient, amount);\n        return false; // returns false even though it succeeded\n    }\n\n    function approve(address spender, uint256 amount) external override returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        emit Approval(msg.sender, spender, amount);\n        return false;\n    }\n\n    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {\n        uint256 allowanceBefore = allowance[sender][msg.sender];\n        require(allowanceBefore >= amount, \"allowance insufficient\");\n\n        allowance[sender][msg.sender] = allowanceBefore - amount;\n\n        uint256 balanceRecipient = balanceOf[recipient];\n        require(balanceRecipient + amount >= balanceRecipient, \"overflow balance recipient\");\n        balanceOf[recipient] = balanceRecipient + amount;\n        uint256 balanceSender = balanceOf[sender];\n        require(balanceSender >= amount, \"underflow balance sender\");\n        balanceOf[sender] = balanceSender - amount;\n\n        emit Transfer(sender, recipient, amount);\n        return false; // returns false even though it succeeded\n    }\n}\n"
  },
  {
    "path": "src/test/TickMathEchidnaTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {TickMath} from \"../libraries/TickMath.sol\";\n\ncontract TickMathEchidnaTest {\n    // uniqueness and increasing order\n    function checkGetSqrtPriceAtTickInvariants(int24 tick) external pure {\n        uint160 price = TickMath.getSqrtPriceAtTick(tick);\n        assert(TickMath.getSqrtPriceAtTick(tick - 1) < price && price < TickMath.getSqrtPriceAtTick(tick + 1));\n        assert(price >= TickMath.MIN_SQRT_PRICE);\n        assert(price <= TickMath.MAX_SQRT_PRICE);\n    }\n\n    // the price is always between the returned tick and the returned tick+1\n    function checkGetTickAtSqrtPriceInvariants(uint160 price) external pure {\n        int24 tick = TickMath.getTickAtSqrtPrice(price);\n        assert(price >= TickMath.getSqrtPriceAtTick(tick) && price < TickMath.getSqrtPriceAtTick(tick + 1));\n        assert(tick >= TickMath.MIN_TICK);\n        assert(tick < TickMath.MAX_TICK);\n    }\n}\n"
  },
  {
    "path": "src/test/TickMathTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {TickMath} from \"../libraries/TickMath.sol\";\n\ncontract TickMathTest {\n    function getSqrtPriceAtTick(int24 tick) external pure returns (uint160) {\n        return TickMath.getSqrtPriceAtTick(tick);\n    }\n\n    function getGasCostOfGetSqrtPriceAtTick(int24 tick) external view returns (uint256) {\n        uint256 gasBefore = gasleft();\n        TickMath.getSqrtPriceAtTick(tick);\n        return gasBefore - gasleft();\n    }\n\n    function getTickAtSqrtPrice(uint160 sqrtPriceX96) external pure returns (int24) {\n        return TickMath.getTickAtSqrtPrice(sqrtPriceX96);\n    }\n\n    function getGasCostOfGetTickAtSqrtPrice(uint160 sqrtPriceX96) external view returns (uint256) {\n        uint256 gasBefore = gasleft();\n        TickMath.getTickAtSqrtPrice(sqrtPriceX96);\n        return gasBefore - gasleft();\n    }\n\n    function MIN_SQRT_PRICE() external pure returns (uint160) {\n        return TickMath.MIN_SQRT_PRICE;\n    }\n\n    function MAX_SQRT_PRICE() external pure returns (uint160) {\n        return TickMath.MAX_SQRT_PRICE;\n    }\n\n    function MIN_TICK() external pure returns (int24) {\n        return TickMath.MIN_TICK;\n    }\n\n    function MAX_TICK() external pure returns (int24) {\n        return TickMath.MAX_TICK;\n    }\n}\n"
  },
  {
    "path": "src/test/TickOverflowSafetyEchidnaTest.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Pool} from \"../libraries/Pool.sol\";\n\ncontract TickOverflowSafetyEchidnaTest {\n    using Pool for Pool.State;\n\n    int24 private constant MIN_TICK = -16;\n    int24 private constant MAX_TICK = 16;\n\n    Pool.State private pool;\n    int24 private tick = 0;\n\n    // half the cap of fee growth has happened, this can overflow\n    uint256 feeGrowthGlobal0X128 = type(uint256).max / 2;\n    uint256 feeGrowthGlobal1X128 = type(uint256).max / 2;\n\n    // used to track how much total liquidity has been added. should never be negative\n    int256 totalLiquidity = 0;\n    // how much total growth has happened, this cannot overflow\n    uint256 private totalGrowth0 = 0;\n    uint256 private totalGrowth1 = 0;\n\n    function increaseFeeGrowthGlobal0X128(uint256 amount) external {\n        require(totalGrowth0 + amount > totalGrowth0); // overflow check\n        feeGrowthGlobal0X128 += amount; // overflow desired\n        totalGrowth0 += amount;\n    }\n\n    function increaseFeeGrowthGlobal1X128(uint256 amount) external {\n        require(totalGrowth1 + amount > totalGrowth1); // overflow check\n        feeGrowthGlobal1X128 += amount; // overflow desired\n        totalGrowth1 += amount;\n    }\n\n    function setPosition(int24 tickLower, int24 tickUpper, int128 liquidityDelta) external {\n        require(tickLower > MIN_TICK);\n        require(tickUpper < MAX_TICK);\n        require(tickLower < tickUpper);\n        (bool flippedLower,) = pool.updateTick(tickLower, liquidityDelta, false);\n        (bool flippedUpper,) = pool.updateTick(tickUpper, liquidityDelta, true);\n\n        if (flippedLower) {\n            if (liquidityDelta < 0) {\n                assert(pool.ticks[tickLower].liquidityGross == 0);\n                pool.clearTick(tickLower);\n            } else {\n                assert(pool.ticks[tickLower].liquidityGross > 0);\n            }\n        }\n\n        if (flippedUpper) {\n            if (liquidityDelta < 0) {\n                assert(pool.ticks[tickUpper].liquidityGross == 0);\n                pool.clearTick(tickUpper);\n            } else {\n                assert(pool.ticks[tickUpper].liquidityGross > 0);\n            }\n        }\n\n        totalLiquidity += liquidityDelta;\n        // requires should have prevented this\n        assert(totalLiquidity >= 0);\n\n        if (totalLiquidity == 0) {\n            totalGrowth0 = 0;\n            totalGrowth1 = 0;\n        }\n    }\n\n    function moveToTick(int24 target) external {\n        require(target > MIN_TICK);\n        require(target < MAX_TICK);\n        while (tick != target) {\n            if (tick < target) {\n                if (pool.ticks[tick + 1].liquidityGross > 0) {\n                    pool.crossTick(tick + 1, feeGrowthGlobal0X128, feeGrowthGlobal1X128);\n                }\n                tick++;\n            } else {\n                if (pool.ticks[tick].liquidityGross > 0) {\n                    pool.crossTick(tick, feeGrowthGlobal0X128, feeGrowthGlobal1X128);\n                }\n                tick--;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/types/BalanceDelta.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {SafeCast} from \"../libraries/SafeCast.sol\";\n\n/// @dev Two `int128` values packed into a single `int256` where the upper 128 bits represent the amount0\n/// and the lower 128 bits represent the amount1.\ntype BalanceDelta is int256;\n\nusing {add as +, sub as -, eq as ==, neq as !=} for BalanceDelta global;\nusing BalanceDeltaLibrary for BalanceDelta global;\nusing SafeCast for int256;\n\nfunction toBalanceDelta(int128 _amount0, int128 _amount1) pure returns (BalanceDelta balanceDelta) {\n    assembly (\"memory-safe\") {\n        balanceDelta := or(shl(128, _amount0), and(sub(shl(128, 1), 1), _amount1))\n    }\n}\n\nfunction add(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := add(a0, b0)\n        res1 := add(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction sub(BalanceDelta a, BalanceDelta b) pure returns (BalanceDelta) {\n    int256 res0;\n    int256 res1;\n    assembly (\"memory-safe\") {\n        let a0 := sar(128, a)\n        let a1 := signextend(15, a)\n        let b0 := sar(128, b)\n        let b1 := signextend(15, b)\n        res0 := sub(a0, b0)\n        res1 := sub(a1, b1)\n    }\n    return toBalanceDelta(res0.toInt128(), res1.toInt128());\n}\n\nfunction eq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) == BalanceDelta.unwrap(b);\n}\n\nfunction neq(BalanceDelta a, BalanceDelta b) pure returns (bool) {\n    return BalanceDelta.unwrap(a) != BalanceDelta.unwrap(b);\n}\n\n/// @notice Library for getting the amount0 and amount1 deltas from the BalanceDelta type\nlibrary BalanceDeltaLibrary {\n    /// @notice A BalanceDelta of 0\n    BalanceDelta public constant ZERO_DELTA = BalanceDelta.wrap(0);\n\n    function amount0(BalanceDelta balanceDelta) internal pure returns (int128 _amount0) {\n        assembly (\"memory-safe\") {\n            _amount0 := sar(128, balanceDelta)\n        }\n    }\n\n    function amount1(BalanceDelta balanceDelta) internal pure returns (int128 _amount1) {\n        assembly (\"memory-safe\") {\n            _amount1 := signextend(15, balanceDelta)\n        }\n    }\n}\n"
  },
  {
    "path": "src/types/BeforeSwapDelta.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// Return type of the beforeSwap hook.\n// Upper 128 bits is the delta in specified tokens. Lower 128 bits is delta in unspecified tokens (to match the afterSwap hook)\ntype BeforeSwapDelta is int256;\n\n// Creates a BeforeSwapDelta from specified and unspecified\nfunction toBeforeSwapDelta(int128 deltaSpecified, int128 deltaUnspecified)\n    pure\n    returns (BeforeSwapDelta beforeSwapDelta)\n{\n    assembly (\"memory-safe\") {\n        beforeSwapDelta := or(shl(128, deltaSpecified), and(sub(shl(128, 1), 1), deltaUnspecified))\n    }\n}\n\n/// @notice Library for getting the specified and unspecified deltas from the BeforeSwapDelta type\nlibrary BeforeSwapDeltaLibrary {\n    /// @notice A BeforeSwapDelta of 0\n    BeforeSwapDelta public constant ZERO_DELTA = BeforeSwapDelta.wrap(0);\n\n    /// extracts int128 from the upper 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap\n    function getSpecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaSpecified) {\n        assembly (\"memory-safe\") {\n            deltaSpecified := sar(128, delta)\n        }\n    }\n\n    /// extracts int128 from the lower 128 bits of the BeforeSwapDelta\n    /// returned by beforeSwap and afterSwap\n    function getUnspecifiedDelta(BeforeSwapDelta delta) internal pure returns (int128 deltaUnspecified) {\n        assembly (\"memory-safe\") {\n            deltaUnspecified := signextend(15, delta)\n        }\n    }\n}\n"
  },
  {
    "path": "src/types/Currency.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC20Minimal} from \"../interfaces/external/IERC20Minimal.sol\";\nimport {CustomRevert} from \"../libraries/CustomRevert.sol\";\n\ntype Currency is address;\n\nusing {greaterThan as >, lessThan as <, greaterThanOrEqualTo as >=, equals as ==} for Currency global;\nusing CurrencyLibrary for Currency global;\n\nfunction equals(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) == Currency.unwrap(other);\n}\n\nfunction greaterThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) > Currency.unwrap(other);\n}\n\nfunction lessThan(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) < Currency.unwrap(other);\n}\n\nfunction greaterThanOrEqualTo(Currency currency, Currency other) pure returns (bool) {\n    return Currency.unwrap(currency) >= Currency.unwrap(other);\n}\n\n/// @title CurrencyLibrary\n/// @dev This library allows for transferring and holding native tokens and ERC20 tokens\nlibrary CurrencyLibrary {\n    /// @notice Additional context for ERC-7751 wrapped error when a native transfer fails\n    error NativeTransferFailed();\n\n    /// @notice Additional context for ERC-7751 wrapped error when an ERC20 transfer fails\n    error ERC20TransferFailed();\n\n    /// @notice A constant to represent the native currency\n    Currency public constant ADDRESS_ZERO = Currency.wrap(address(0));\n\n    function transfer(Currency currency, address to, uint256 amount) internal {\n        // altered from https://github.com/transmissions11/solmate/blob/44a9963d4c78111f77caa0e65d677b8b46d6f2e6/src/utils/SafeTransferLib.sol\n        // modified custom error selectors\n\n        bool success;\n        if (currency.isAddressZero()) {\n            assembly (\"memory-safe\") {\n                // Transfer the ETH and revert if it fails.\n                success := call(gas(), to, amount, 0, 0, 0, 0)\n            }\n            // revert with NativeTransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(to, bytes4(0), NativeTransferFailed.selector);\n            }\n        } else {\n            assembly (\"memory-safe\") {\n                // Get a pointer to some free memory.\n                let fmp := mload(0x40)\n\n                // Write the abi-encoded calldata into memory, beginning with the function selector.\n                mstore(fmp, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)\n                mstore(add(fmp, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the \"to\" argument.\n                mstore(add(fmp, 36), amount) // Append the \"amount\" argument. Masking not required as it's a full 32 byte type.\n\n                success :=\n                    and(\n                        // Set success to whether the call reverted, if not we check it either\n                        // returned exactly 1 (can't just be non-zero data), or had no return data.\n                        or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),\n                        // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.\n                        // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.\n                        // Counterintuitively, this call must be positioned second to the or() call in the\n                        // surrounding and() call or else returndatasize() will be zero during the computation.\n                        call(gas(), currency, 0, fmp, 68, 0, 32)\n                    )\n\n                // Now clean the memory we used\n                mstore(fmp, 0) // 4 byte `selector` and 28 bytes of `to` were stored here\n                mstore(add(fmp, 0x20), 0) // 4 bytes of `to` and 28 bytes of `amount` were stored here\n                mstore(add(fmp, 0x40), 0) // 4 bytes of `amount` were stored here\n            }\n            // revert with ERC20TransferFailed, containing the bubbled up error as an argument\n            if (!success) {\n                CustomRevert.bubbleUpAndRevertWith(\n                    Currency.unwrap(currency), IERC20Minimal.transfer.selector, ERC20TransferFailed.selector\n                );\n            }\n        }\n    }\n\n    function balanceOfSelf(Currency currency) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return address(this).balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(address(this));\n        }\n    }\n\n    function balanceOf(Currency currency, address owner) internal view returns (uint256) {\n        if (currency.isAddressZero()) {\n            return owner.balance;\n        } else {\n            return IERC20Minimal(Currency.unwrap(currency)).balanceOf(owner);\n        }\n    }\n\n    function isAddressZero(Currency currency) internal pure returns (bool) {\n        return Currency.unwrap(currency) == Currency.unwrap(ADDRESS_ZERO);\n    }\n\n    function toId(Currency currency) internal pure returns (uint256) {\n        return uint160(Currency.unwrap(currency));\n    }\n\n    // If the upper 12 bytes are non-zero, they will be zero-ed out\n    // Therefore, fromId() and toId() are not inverses of each other\n    function fromId(uint256 id) internal pure returns (Currency) {\n        return Currency.wrap(address(uint160(id)));\n    }\n}\n"
  },
  {
    "path": "src/types/PoolId.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {PoolKey} from \"./PoolKey.sol\";\n\ntype PoolId is bytes32;\n\n/// @notice Library for computing the ID of a pool\nlibrary PoolIdLibrary {\n    /// @notice Returns value equal to keccak256(abi.encode(poolKey))\n    function toId(PoolKey memory poolKey) internal pure returns (PoolId poolId) {\n        assembly (\"memory-safe\") {\n            // 0xa0 represents the total size of the poolKey struct (5 slots of 32 bytes)\n            poolId := keccak256(poolKey, 0xa0)\n        }\n    }\n}\n"
  },
  {
    "path": "src/types/PoolKey.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Currency} from \"./Currency.sol\";\nimport {IHooks} from \"../interfaces/IHooks.sol\";\nimport {PoolIdLibrary} from \"./PoolId.sol\";\n\nusing PoolIdLibrary for PoolKey global;\n\n/// @notice Returns the key for identifying a pool\nstruct PoolKey {\n    /// @notice The lower currency of the pool, sorted numerically\n    Currency currency0;\n    /// @notice The higher currency of the pool, sorted numerically\n    Currency currency1;\n    /// @notice The pool LP fee, capped at 1_000_000. If the highest bit is 1, the pool has a dynamic fee and must be exactly equal to 0x800000\n    uint24 fee;\n    /// @notice Ticks that involve positions must be a multiple of tick spacing\n    int24 tickSpacing;\n    /// @notice The hooks of the pool\n    IHooks hooks;\n}\n"
  },
  {
    "path": "src/types/PoolOperation.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {PoolKey} from \"../types/PoolKey.sol\";\nimport {BalanceDelta} from \"../types/BalanceDelta.sol\";\n\n/// @notice Parameter struct for `ModifyLiquidity` pool operations\nstruct ModifyLiquidityParams {\n    // the lower and upper tick of the position\n    int24 tickLower;\n    int24 tickUpper;\n    // how to modify the liquidity\n    int256 liquidityDelta;\n    // a value to set if you want unique liquidity positions at the same range\n    bytes32 salt;\n}\n\n/// @notice Parameter struct for `Swap` pool operations\nstruct SwapParams {\n    /// Whether to swap token0 for token1 or vice versa\n    bool zeroForOne;\n    /// The desired input amount if negative (exactIn), or the desired output amount if positive (exactOut)\n    int256 amountSpecified;\n    /// The sqrt price at which, if reached, the swap will stop executing\n    uint160 sqrtPriceLimitX96;\n}\n"
  },
  {
    "path": "src/types/Slot0.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/**\n * @dev Slot0 is a packed version of solidity structure.\n * Using the packaged version saves gas by not storing the structure fields in memory slots.\n *\n * Layout:\n * 24 bits empty | 24 bits lpFee | 12 bits protocolFee 1->0 | 12 bits protocolFee 0->1 | 24 bits tick | 160 bits sqrtPriceX96\n *\n * Fields in the direction from the least significant bit:\n *\n * The current price\n * uint160 sqrtPriceX96;\n *\n * The current tick\n * int24 tick;\n *\n * Protocol fee, expressed in hundredths of a bip, upper 12 bits are for 1->0, and the lower 12 are for 0->1\n * the maximum is 1000 - meaning the maximum protocol fee is 0.1%\n * the protocolFee is taken from the input first, then the lpFee is taken from the remaining input\n * uint24 protocolFee;\n *\n * The current LP fee of the pool. If the pool is dynamic, this does not include the dynamic fee flag.\n * uint24 lpFee;\n */\ntype Slot0 is bytes32;\n\nusing Slot0Library for Slot0 global;\n\n/// @notice Library for getting and setting values in the Slot0 type\nlibrary Slot0Library {\n    uint160 internal constant MASK_160_BITS = 0x00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\n    uint24 internal constant MASK_24_BITS = 0xFFFFFF;\n\n    uint8 internal constant TICK_OFFSET = 160;\n    uint8 internal constant PROTOCOL_FEE_OFFSET = 184;\n    uint8 internal constant LP_FEE_OFFSET = 208;\n\n    // #### GETTERS ####\n    function sqrtPriceX96(Slot0 _packed) internal pure returns (uint160 _sqrtPriceX96) {\n        assembly (\"memory-safe\") {\n            _sqrtPriceX96 := and(MASK_160_BITS, _packed)\n        }\n    }\n\n    function tick(Slot0 _packed) internal pure returns (int24 _tick) {\n        assembly (\"memory-safe\") {\n            _tick := signextend(2, shr(TICK_OFFSET, _packed))\n        }\n    }\n\n    function protocolFee(Slot0 _packed) internal pure returns (uint24 _protocolFee) {\n        assembly (\"memory-safe\") {\n            _protocolFee := and(MASK_24_BITS, shr(PROTOCOL_FEE_OFFSET, _packed))\n        }\n    }\n\n    function lpFee(Slot0 _packed) internal pure returns (uint24 _lpFee) {\n        assembly (\"memory-safe\") {\n            _lpFee := and(MASK_24_BITS, shr(LP_FEE_OFFSET, _packed))\n        }\n    }\n\n    // #### SETTERS ####\n    function setSqrtPriceX96(Slot0 _packed, uint160 _sqrtPriceX96) internal pure returns (Slot0 _result) {\n        assembly (\"memory-safe\") {\n            _result := or(and(not(MASK_160_BITS), _packed), and(MASK_160_BITS, _sqrtPriceX96))\n        }\n    }\n\n    function setTick(Slot0 _packed, int24 _tick) internal pure returns (Slot0 _result) {\n        assembly (\"memory-safe\") {\n            _result := or(and(not(shl(TICK_OFFSET, MASK_24_BITS)), _packed), shl(TICK_OFFSET, and(MASK_24_BITS, _tick)))\n        }\n    }\n\n    function setProtocolFee(Slot0 _packed, uint24 _protocolFee) internal pure returns (Slot0 _result) {\n        assembly (\"memory-safe\") {\n            _result :=\n                or(\n                    and(not(shl(PROTOCOL_FEE_OFFSET, MASK_24_BITS)), _packed),\n                    shl(PROTOCOL_FEE_OFFSET, and(MASK_24_BITS, _protocolFee))\n                )\n        }\n    }\n\n    function setLpFee(Slot0 _packed, uint24 _lpFee) internal pure returns (Slot0 _result) {\n        assembly (\"memory-safe\") {\n            _result :=\n                or(and(not(shl(LP_FEE_OFFSET, MASK_24_BITS)), _packed), shl(LP_FEE_OFFSET, and(MASK_24_BITS, _lpFee)))\n        }\n    }\n}\n"
  },
  {
    "path": "test/CurrencyReserves.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {CurrencyReserves} from \"../src/libraries/CurrencyReserves.sol\";\nimport {Test} from \"forge-std/Test.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\n\ncontract CurrencyReservesTest is Test {\n    using CurrencyReserves for Currency;\n\n    Currency currency0;\n\n    function setUp() public {\n        currency0 = Currency.wrap(address(0xbeef));\n    }\n\n    function test_getReserves_returns_set() public {\n        currency0.syncCurrencyAndReserves(100);\n        uint256 value = CurrencyReserves.getSyncedReserves();\n        assertEq(value, 100);\n        assertEq(Currency.unwrap(CurrencyReserves.getSyncedCurrency()), Currency.unwrap(currency0));\n    }\n\n    function test_set_twice_returns_correct_value() public {\n        currency0.syncCurrencyAndReserves(100);\n        currency0.syncCurrencyAndReserves(200);\n        uint256 value = CurrencyReserves.getSyncedReserves();\n        assertEq(value, 200);\n        assertEq(Currency.unwrap(CurrencyReserves.getSyncedCurrency()), Currency.unwrap(currency0));\n    }\n\n    function test_reset_currency() public {\n        currency0.syncCurrencyAndReserves(100);\n        uint256 value = CurrencyReserves.getSyncedReserves();\n        assertEq(value, 100);\n        assertEq(Currency.unwrap(CurrencyReserves.getSyncedCurrency()), Currency.unwrap(currency0));\n        CurrencyReserves.resetCurrency();\n        uint256 valueAfterReset = CurrencyReserves.getSyncedReserves();\n        assertEq(valueAfterReset, 100);\n        assertEq(Currency.unwrap(CurrencyReserves.getSyncedCurrency()), address(0));\n    }\n\n    function test_reservesOfSlot() public pure {\n        assertEq(bytes32(uint256(keccak256(\"ReservesOf\")) - 1), CurrencyReserves.RESERVES_OF_SLOT);\n    }\n\n    function test_syncSlot() public pure {\n        assertEq(bytes32(uint256(keccak256(\"Currency\")) - 1), CurrencyReserves.CURRENCY_SLOT);\n    }\n\n    function test_fuzz_get_set(Currency currency, uint256 value) public {\n        vm.assume(value != type(uint256).max);\n        currency.syncCurrencyAndReserves(value);\n\n        assertEq(Currency.unwrap(CurrencyReserves.getSyncedCurrency()), Currency.unwrap(currency));\n        assertEq(CurrencyReserves.getSyncedReserves(), value);\n    }\n}\n"
  },
  {
    "path": "test/CustomAccounting.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {FeeTakingHook} from \"../src/test/FeeTakingHook.sol\";\nimport {LPFeeTakingHook} from \"../src/test/LPFeeTakingHook.sol\";\nimport {CustomCurveHook} from \"../src/test/CustomCurveHook.sol\";\nimport {DeltaReturningHook} from \"../src/test/DeltaReturningHook.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {Hooks} from \"../src/libraries/Hooks.sol\";\nimport {PoolSwapTest} from \"../src/test/PoolSwapTest.sol\";\nimport {PoolId} from \"../src/types/PoolId.sol\";\nimport {SwapParams} from \"../src/types/PoolOperation.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {BalanceDelta} from \"../src/types/BalanceDelta.sol\";\nimport {SafeCast} from \"../src/libraries/SafeCast.sol\";\n\ncontract CustomAccountingTest is Test, Deployers {\n    using SafeCast for *;\n\n    address hook;\n\n    function setUp() public {\n        initializeManagerRoutersAndPoolsWithLiq(IHooks(address(0)));\n    }\n\n    function _setUpDeltaReturnFuzzPool() internal {\n        address hookAddr = address(uint160(Hooks.BEFORE_SWAP_FLAG | Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        address impl = address(new DeltaReturningHook(manager));\n        _etchHookAndInitPool(hookAddr, impl);\n    }\n\n    function _setUpCustomCurvePool() internal {\n        address hookAddr = address(uint160(Hooks.BEFORE_SWAP_FLAG | Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        address impl = address(new CustomCurveHook(manager));\n        _etchHookAndInitPool(hookAddr, impl);\n    }\n\n    function _setUpFeeTakingPool() internal {\n        address hookAddr = address(\n            uint160(\n                Hooks.AFTER_SWAP_FLAG | Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG | Hooks.AFTER_ADD_LIQUIDITY_FLAG\n                    | Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG | Hooks.AFTER_REMOVE_LIQUIDITY_FLAG\n                    | Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG\n            )\n        );\n        address impl = address(new FeeTakingHook(manager));\n        _etchHookAndInitPool(hookAddr, impl);\n    }\n\n    function _setUpLPFeeTakingPool() internal {\n        address hookAddr = address(\n            uint160(\n                Hooks.AFTER_ADD_LIQUIDITY_FLAG | Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG\n                    | Hooks.AFTER_REMOVE_LIQUIDITY_FLAG | Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG\n            )\n        );\n        address impl = address(new LPFeeTakingHook(manager));\n        _etchHookAndInitPool(hookAddr, impl);\n    }\n\n    function _etchHookAndInitPool(address hookAddr, address implAddr) internal {\n        vm.etch(hookAddr, implAddr.code);\n        hook = hookAddr;\n\n        (key,) = initPoolAndAddLiquidity(currency0, currency1, IHooks(hookAddr), 100, SQRT_PRICE_1_1);\n    }\n\n    // ------------------------ SWAP  ------------------------\n\n    function test_swap_afterSwapFeeOnUnspecified_exactInput() public {\n        _setUpFeeTakingPool();\n        uint256 balanceBefore0 = currency0.balanceOf(address(this));\n        uint256 balanceBefore1 = currency1.balanceOf(address(this));\n\n        uint256 amountToSwap = 1000;\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: -int256(amountToSwap), sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap CA fee on unspecified\");\n\n        // input is 1000 for output of 998 with this much liquidity available\n        // plus a fee of 1.23% on unspecified (output) => (998*123)/10000 = 12\n        assertEq(currency0.balanceOf(address(this)), balanceBefore0 - amountToSwap, \"amount 0\");\n        assertEq(currency1.balanceOf(address(this)), balanceBefore1 + (998 - 12), \"amount 1\");\n    }\n\n    function test_swap_afterSwapFeeOnUnspecified_exactOutput() public {\n        _setUpFeeTakingPool();\n\n        uint256 balanceBefore0 = currency0.balanceOf(address(this));\n        uint256 balanceBefore1 = currency1.balanceOf(address(this));\n\n        uint256 amountToSwap = 1000;\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: int256(amountToSwap), sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n\n        // input is 1002 for output of 1000 with this much liquidity available\n        // plus a fee of 1.23% on unspecified (input) => (1002*123)/10000 = 12\n        assertEq(currency0.balanceOf(address(this)), balanceBefore0 - 1002 - 12, \"amount 0\");\n        assertEq(currency1.balanceOf(address(this)), balanceBefore1 + amountToSwap, \"amount 1\");\n    }\n\n    function test_swap_beforeSwapNoOpsSwap_exactInput() public {\n        _setUpCustomCurvePool();\n\n        // add liquidity by sending tokens straight into the contract\n        key.currency0.transfer(hook, 10e18);\n        key.currency1.transfer(hook, 10e18);\n\n        uint256 balanceBefore0 = currency0.balanceOf(address(this));\n        uint256 balanceBefore1 = currency1.balanceOf(address(this));\n\n        uint256 amountToSwap = 123456;\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: -int256(amountToSwap), sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap CA custom curve + swap noop\");\n\n        // the custom curve hook is 1-1 linear\n        assertEq(currency0.balanceOf(address(this)), balanceBefore0 - amountToSwap, \"amount 0\");\n        assertEq(currency1.balanceOf(address(this)), balanceBefore1 + amountToSwap, \"amount 1\");\n    }\n\n    function test_swap_beforeSwapNoOpsSwap_exactOutput() public {\n        _setUpCustomCurvePool();\n\n        // add liquidity by sending tokens straight into the contract\n        key.currency0.transfer(hook, 10e18);\n        key.currency1.transfer(hook, 10e18);\n\n        uint256 balanceBefore0 = currency0.balanceOf(address(this));\n        uint256 balanceBefore1 = currency1.balanceOf(address(this));\n\n        uint256 amountToSwap = 123456;\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: int256(amountToSwap), sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n\n        // the custom curve hook is 1-1 linear\n        assertEq(currency0.balanceOf(address(this)), balanceBefore0 - amountToSwap, \"amount 0\");\n        assertEq(currency1.balanceOf(address(this)), balanceBefore1 + amountToSwap, \"amount 1\");\n    }\n\n    // maximum available liquidity in each direction for the pool in test_fuzz_swap_beforeSwap_returnsDeltaSpecified\n    int128 maxPossibleIn_fuzz_test = -6018336102428409;\n    int128 maxPossibleOut_fuzz_test = 5981737760509662;\n\n    function test_fuzz_swap_beforeSwap_returnsDeltaSpecified(\n        int128 hookDeltaSpecified,\n        int256 amountSpecified,\n        bool zeroForOne\n    ) public {\n        // ------------------------ SETUP ------------------------\n        Currency specifiedCurrency;\n        bool isExactIn;\n        _setUpDeltaReturnFuzzPool();\n\n        // initialize the pool and give the hook tokens to pay into swaps\n        key.currency0.transfer(hook, type(uint128).max);\n        key.currency1.transfer(hook, type(uint128).max);\n\n        // bound amount specified to be a fair amount less than the amount of liquidity we have\n        amountSpecified = int128(bound(amountSpecified, -3e11, 3e11));\n        isExactIn = amountSpecified < 0;\n        specifiedCurrency = (isExactIn == zeroForOne) ? key.currency0 : key.currency1;\n\n        // bound delta in specified to not take more than the reserves available, nor be the minimum int to\n        // stop the hook reverting on take/settle\n        uint128 reservesOfSpecified = uint128(specifiedCurrency.balanceOf(address(manager)));\n        hookDeltaSpecified = int128(bound(hookDeltaSpecified, type(int128).min + 1, int128(reservesOfSpecified)));\n        DeltaReturningHook(hook).setDeltaSpecified(hookDeltaSpecified);\n\n        // setup swap variables\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n        SwapParams memory params = SwapParams({\n            zeroForOne: zeroForOne,\n            amountSpecified: amountSpecified,\n            sqrtPriceLimitX96: (zeroForOne ? MIN_PRICE_LIMIT : MAX_PRICE_LIMIT)\n        });\n\n        // ------------------------ FUZZING CASES ------------------------\n        // with an amount specified of 0: the trade reverts\n        if (amountSpecified == 0) {\n            vm.expectRevert(IPoolManager.SwapAmountCannotBeZero.selector);\n            swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n\n            // trade is exact input of n:, the hook cannot TAKE (+ve hookDeltaSpecified) more than n in input\n            // otherwise the user would have to send more than n in input\n        } else if (isExactIn && (hookDeltaSpecified > -amountSpecified)) {\n            vm.expectRevert(Hooks.HookDeltaExceedsSwapAmount.selector);\n            swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n\n            // exact output of n: the hook cannot GIVE (-ve hookDeltaSpecified) more than n in output\n            // otherwise the user would receive more than n in output\n        } else if (!isExactIn && (amountSpecified < -hookDeltaSpecified)) {\n            vm.expectRevert(Hooks.HookDeltaExceedsSwapAmount.selector);\n            swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n\n            // successful swaps !\n        } else {\n            uint256 balanceThisBefore = specifiedCurrency.balanceOf(address(this));\n            uint256 balanceHookBefore = specifiedCurrency.balanceOf(hook);\n            uint256 balanceManagerBefore = specifiedCurrency.balanceOf(address(manager));\n\n            BalanceDelta delta = swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n            int128 deltaSpecified = (zeroForOne == isExactIn) ? delta.amount0() : delta.amount1();\n\n            // in all cases the hook gets what they took, and the user gets the swap's output delta (checked more below)\n            assertEq(\n                balanceHookBefore.toInt256() + hookDeltaSpecified,\n                specifiedCurrency.balanceOf(hook).toInt256(),\n                \"hook balance change incorrect\"\n            );\n            assertEq(\n                balanceThisBefore.toInt256() + deltaSpecified,\n                specifiedCurrency.balanceOf(address(this)).toInt256(),\n                \"swapper balance change incorrect\"\n            );\n\n            // exact input, where there arent enough input reserves available to pay swap and hook\n            // note: all 3 values are negative, so we use <\n            if (isExactIn && (hookDeltaSpecified + amountSpecified < maxPossibleIn_fuzz_test)) {\n                // the hook will have taken hookDeltaSpecified of the maxPossibleIn\n                assertEq(deltaSpecified, maxPossibleIn_fuzz_test - hookDeltaSpecified, \"deltaSpecified exact input\");\n                // the manager received all possible input tokens\n                assertEq(\n                    balanceManagerBefore.toInt256() - maxPossibleIn_fuzz_test,\n                    specifiedCurrency.balanceOf(address(manager)).toInt256(),\n                    \"manager balance change exact input\"\n                );\n\n                // exact output, where there isn't enough output reserves available to pay swap and hook\n            } else if (!isExactIn && (hookDeltaSpecified + amountSpecified > maxPossibleOut_fuzz_test)) {\n                // the hook will have taken hookDeltaSpecified of the maxPossibleOut\n                assertEq(deltaSpecified, maxPossibleOut_fuzz_test - hookDeltaSpecified, \"deltaSpecified exact output\");\n                // the manager sent out all possible output tokens\n                assertEq(\n                    balanceManagerBefore.toInt256() - maxPossibleOut_fuzz_test,\n                    specifiedCurrency.balanceOf(address(manager)).toInt256(),\n                    \"manager balance change exact output\"\n                );\n\n                // enough reserves were available, so the user got what they desired\n            } else {\n                assertEq(deltaSpecified, amountSpecified, \"deltaSpecified not amountSpecified\");\n                assertEq(\n                    balanceManagerBefore.toInt256() - amountSpecified - hookDeltaSpecified,\n                    specifiedCurrency.balanceOf(address(manager)).toInt256(),\n                    \"manager balance change not\"\n                );\n            }\n        }\n    }\n\n    // ------------------------ MODIFY LIQUIDITY ------------------------\n\n    function test_addLiquidity_withFeeTakingHook() public {\n        _setUpFeeTakingPool();\n\n        uint256 balanceBefore0 = currency0.balanceOf(address(this));\n        uint256 balanceBefore1 = currency1.balanceOf(address(this));\n        uint256 hookBalanceBefore0 = currency0.balanceOf(hook);\n        uint256 hookBalanceBefore1 = currency1.balanceOf(hook);\n        uint256 managerBalanceBefore0 = currency0.balanceOf(address(manager));\n        uint256 managerBalanceBefore1 = currency1.balanceOf(address(manager));\n        // console2.log(address(key.hooks));\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"addLiquidity CA fee\");\n\n        uint256 hookGain0 = currency0.balanceOf(hook) - hookBalanceBefore0;\n        uint256 hookGain1 = currency1.balanceOf(hook) - hookBalanceBefore1;\n        uint256 thisLoss0 = balanceBefore0 - currency0.balanceOf(address(this));\n        uint256 thisLoss1 = balanceBefore1 - currency1.balanceOf(address(this));\n        uint256 managerGain0 = currency0.balanceOf(address(manager)) - managerBalanceBefore0;\n        uint256 managerGain1 = currency1.balanceOf(address(manager)) - managerBalanceBefore1;\n\n        // Assert that the hook got 5.43% of the added liquidity\n        assertEq(hookGain0, managerGain0 * 543 / 10000, \"hook amount 0\");\n        assertEq(hookGain1, managerGain1 * 543 / 10000, \"hook amount 1\");\n        assertEq(thisLoss0 - hookGain0, managerGain0, \"manager amount 0\");\n        assertEq(thisLoss1 - hookGain1, managerGain1, \"manager amount 1\");\n    }\n\n    function test_removeLiquidity_withFeeTakingHook() public {\n        _setUpFeeTakingPool();\n\n        uint256 balanceBefore0 = currency0.balanceOf(address(this));\n        uint256 balanceBefore1 = currency1.balanceOf(address(this));\n        uint256 hookBalanceBefore0 = currency0.balanceOf(hook);\n        uint256 hookBalanceBefore1 = currency1.balanceOf(hook);\n        uint256 managerBalanceBefore0 = currency0.balanceOf(address(manager));\n        uint256 managerBalanceBefore1 = currency1.balanceOf(address(manager));\n\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"removeLiquidity CA fee\");\n\n        uint256 hookGain0 = currency0.balanceOf(hook) - hookBalanceBefore0;\n        uint256 hookGain1 = currency1.balanceOf(hook) - hookBalanceBefore1;\n        uint256 thisGain0 = currency0.balanceOf(address(this)) - balanceBefore0;\n        uint256 thisGain1 = currency1.balanceOf(address(this)) - balanceBefore1;\n        uint256 managerLoss0 = managerBalanceBefore0 - currency0.balanceOf(address(manager));\n        uint256 managerLoss1 = managerBalanceBefore1 - currency1.balanceOf(address(manager));\n\n        // Assert that the hook got 5.43% of the withdrawn liquidity\n        assertEq(hookGain0, managerLoss0 * 543 / 10000, \"hook amount 0\");\n        assertEq(hookGain1, managerLoss1 * 543 / 10000, \"hook amount 1\");\n        assertEq(thisGain0 + hookGain0, managerLoss0, \"manager amount 0\");\n        assertEq(thisGain1 + hookGain1, managerLoss1, \"manager amount 1\");\n    }\n\n    function test_fuzz_addLiquidity_withLPFeeTakingHook(uint128 feeRevenue0, uint128 feeRevenue1) public {\n        feeRevenue0 = uint128(bound(feeRevenue0, 0, type(uint128).max / 2));\n        feeRevenue1 = uint128(bound(feeRevenue1, 0, type(uint128).max / 2));\n        _setUpLPFeeTakingPool(); // creates liquidity as part of setup\n\n        // donate to generate fee revenue\n        donateRouter.donate(key, feeRevenue0, feeRevenue1, ZERO_BYTES);\n\n        uint256 hookBalanceBefore0 = currency0.balanceOf(hook);\n        uint256 hookBalanceBefore1 = currency1.balanceOf(hook);\n\n        // add liquidity again to trigger the hook, which should take the fee revenue\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        uint256 hookGain0 = currency0.balanceOf(hook) - hookBalanceBefore0;\n        uint256 hookGain1 = currency1.balanceOf(hook) - hookBalanceBefore1;\n\n        // Assert that the hook took ALL of the fee revenue, minus 1 wei of imprecision\n        assertApproxEqAbs(hookGain0, feeRevenue0, 1 wei);\n        assertApproxEqAbs(hookGain1, feeRevenue1, 1 wei);\n        assertTrue(hookGain0 <= feeRevenue0);\n        assertTrue(hookGain1 <= feeRevenue1);\n    }\n\n    function test_fuzz_removeLiquidity_withLPFeeTakingHook(uint128 feeRevenue0, uint128 feeRevenue1) public {\n        // test fails when fee revenue approaches int128.max because PoolManager is limited by (principal + fees)\n        feeRevenue0 = uint128(bound(feeRevenue0, 0, type(uint128).max / 3));\n        feeRevenue1 = uint128(bound(feeRevenue1, 0, type(uint128).max / 3));\n        _setUpLPFeeTakingPool(); // creates liquidity as part of setup\n\n        // donate to generate fee revenue\n        donateRouter.donate(key, feeRevenue0, feeRevenue1, ZERO_BYTES);\n\n        uint256 balanceBefore0 = currency0.balanceOf(address(this));\n        uint256 balanceBefore1 = currency1.balanceOf(address(this));\n        uint256 hookBalanceBefore0 = currency0.balanceOf(hook);\n        uint256 hookBalanceBefore1 = currency1.balanceOf(hook);\n        uint256 managerBalanceBefore0 = currency0.balanceOf(address(manager));\n        uint256 managerBalanceBefore1 = currency1.balanceOf(address(manager));\n\n        // remove liquidity to trigger the hook, which should take the fee revenue\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        uint256 hookGain0 = currency0.balanceOf(hook) - hookBalanceBefore0;\n        uint256 hookGain1 = currency1.balanceOf(hook) - hookBalanceBefore1;\n        uint256 thisGain0 = currency0.balanceOf(address(this)) - balanceBefore0;\n        uint256 thisGain1 = currency1.balanceOf(address(this)) - balanceBefore1;\n        uint256 managerLoss0 = managerBalanceBefore0 - currency0.balanceOf(address(manager));\n        uint256 managerLoss1 = managerBalanceBefore1 - currency1.balanceOf(address(manager));\n\n        // Assert that the hook took ALL of the fee revenue, minus 1 wei of imprecision\n        assertApproxEqAbs(hookGain0, feeRevenue0, 1 wei);\n        assertApproxEqAbs(hookGain1, feeRevenue1, 1 wei);\n        assertTrue(hookGain0 <= feeRevenue0);\n        assertTrue(hookGain1 <= feeRevenue1);\n        assertEq(thisGain0 + hookGain0, managerLoss0, \"manager amount 0\");\n        assertEq(thisGain1 + hookGain1, managerLoss1, \"manager amount 1\");\n    }\n}\n"
  },
  {
    "path": "test/DynamicFees.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {PoolId} from \"../src/types/PoolId.sol\";\nimport {Hooks} from \"../src/libraries/Hooks.sol\";\nimport {LPFeeLibrary} from \"../src/libraries/LPFeeLibrary.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {IProtocolFees} from \"../src/interfaces/IProtocolFees.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"../src/types/PoolKey.sol\";\nimport {SwapParams} from \"../src/types/PoolOperation.sol\";\nimport {PoolManager} from \"../src/PoolManager.sol\";\nimport {PoolSwapTest} from \"../src/test/PoolSwapTest.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {DynamicFeesTestHook} from \"../src/test/DynamicFeesTestHook.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {Pool} from \"../src/libraries/Pool.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"../src/types/BalanceDelta.sol\";\nimport {StateLibrary} from \"../src/libraries/StateLibrary.sol\";\nimport {CustomRevert} from \"../src/libraries/CustomRevert.sol\";\nimport {ProtocolFeeLibrary} from \"../src/libraries/ProtocolFeeLibrary.sol\";\n\ncontract TestDynamicFees is Test, Deployers {\n    using StateLibrary for IPoolManager;\n    using ProtocolFeeLibrary for uint16;\n\n    DynamicFeesTestHook dynamicFeesHooks = DynamicFeesTestHook(\n        address(\n            uint160(\n                uint256(type(uint160).max) & clearAllHookPermissionsMask | Hooks.BEFORE_SWAP_FLAG\n                    | Hooks.AFTER_INITIALIZE_FLAG\n            )\n        )\n    );\n\n    DynamicFeesTestHook dynamicFeesNoHooks =\n        DynamicFeesTestHook(address(uint160(uint256(type(uint160).max) & clearAllHookPermissionsMask)));\n\n    event Swap(\n        PoolId indexed poolId,\n        address indexed sender,\n        int128 amount0,\n        int128 amount1,\n        uint160 sqrtPriceX96,\n        uint128 liquidity,\n        int24 tick,\n        uint24 fee\n    );\n\n    function setUp() public {\n        DynamicFeesTestHook impl = new DynamicFeesTestHook();\n        vm.etch(address(dynamicFeesHooks), address(impl).code);\n        vm.etch(address(dynamicFeesNoHooks), address(impl).code);\n\n        deployFreshManagerAndRouters();\n        dynamicFeesHooks.setManager(IPoolManager(manager));\n        dynamicFeesNoHooks.setManager(IPoolManager(manager));\n\n        deployMintAndApprove2Currencies();\n        (key,) = initPoolAndAddLiquidity(\n            currency0, currency1, IHooks(address(dynamicFeesHooks)), LPFeeLibrary.DYNAMIC_FEE_FLAG, SQRT_PRICE_1_1\n        );\n    }\n\n    function test_updateDynamicLPFee_afterInitialize_failsWithTooLargeFee() public {\n        key.tickSpacing = 30;\n        uint24 fee = 1000001;\n        dynamicFeesHooks.setFee(fee);\n\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                CustomRevert.WrappedError.selector,\n                address(dynamicFeesHooks),\n                IHooks.afterInitialize.selector,\n                abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, fee),\n                abi.encodeWithSelector(Hooks.HookCallFailed.selector)\n            )\n        );\n        manager.initialize(key, SQRT_PRICE_1_1);\n    }\n\n    function test_initialize_initializesFeeTo0() public {\n        key.hooks = dynamicFeesNoHooks;\n\n        // this fee is not fetched as theres no afterInitialize hook\n        dynamicFeesNoHooks.setFee(1000000);\n\n        manager.initialize(key, SQRT_PRICE_1_1);\n        assertEq(_fetchPoolLPFee(key), 0);\n    }\n\n    function test_updateDynamicLPFee_afterInitialize_initializesFee() public {\n        key.tickSpacing = 30;\n        dynamicFeesHooks.setFee(123);\n\n        manager.initialize(key, SQRT_PRICE_1_1);\n        assertEq(_fetchPoolLPFee(key), 123);\n    }\n\n    function test_updateDynamicLPFee_revertsIfCallerIsntHook() public {\n        vm.expectRevert(IPoolManager.UnauthorizedDynamicLPFeeUpdate.selector);\n        manager.updateDynamicLPFee(key, 123);\n    }\n\n    function test_updateDynamicLPFee_revertsIfPoolHasStaticFee() public {\n        key.fee = 3000; // static fee\n        dynamicFeesHooks.setFee(123);\n\n        // afterInitialize will try to update the fee, and fail\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                CustomRevert.WrappedError.selector,\n                address(dynamicFeesHooks),\n                IHooks.afterInitialize.selector,\n                abi.encodeWithSelector(IPoolManager.UnauthorizedDynamicLPFeeUpdate.selector),\n                abi.encodeWithSelector(Hooks.HookCallFailed.selector)\n            )\n        );\n        manager.initialize(key, SQRT_PRICE_1_1);\n    }\n\n    function test_updateDynamicLPFee_beforeSwap_failsWithTooLargeFee() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        uint24 fee = 1000001;\n        dynamicFeesHooks.setFee(1000001);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                CustomRevert.WrappedError.selector,\n                address(dynamicFeesHooks),\n                IHooks.beforeSwap.selector,\n                abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, fee),\n                abi.encodeWithSelector(Hooks.HookCallFailed.selector)\n            )\n        );\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n    }\n\n    function test_updateDynamicLPFee_beforeSwap_succeeds_gas() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        dynamicFeesHooks.setFee(123);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true, address(manager));\n        emit Swap(key.toId(), address(swapRouter), -100, 98, 79228162514264329749955861424, 1e18, -1, 123);\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"update dynamic fee in before swap\");\n\n        assertEq(_fetchPoolLPFee(key), 123);\n    }\n\n    function test_swap_100PercentLPFee_AmountIn_NoProtocol() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        dynamicFeesHooks.setFee(1000000);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true, address(manager));\n        emit Swap(key.toId(), address(swapRouter), -100, 0, SQRT_PRICE_1_1, 1e18, -1, 1000000);\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n\n        assertEq(_fetchPoolLPFee(key), 1000000);\n    }\n\n    function test_swap_50PercentLPFee_AmountIn_NoProtocol() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        dynamicFeesHooks.setFee(500000);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true, address(manager));\n        emit Swap(key.toId(), address(swapRouter), -100, 49, 79228162514264333632135824623, 1e18, -1, 500000);\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n\n        assertEq(_fetchPoolLPFee(key), 500000);\n    }\n\n    function test_swap_50PercentLPFee_AmountOut_NoProtocol() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        dynamicFeesHooks.setFee(500000);\n\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: 100, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true, address(manager));\n        emit Swap(key.toId(), address(swapRouter), -202, 100, 79228162514264329670727698909, 1e18, -1, 500000);\n\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n\n        assertEq(_fetchPoolLPFee(key), 500000);\n    }\n\n    function test_swap_revertsWith_InvalidFeeForExactOut_whenFeeIsMax() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        dynamicFeesHooks.setFee(1000000);\n\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: 100, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectRevert(Pool.InvalidFeeForExactOut.selector);\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_99PercentFee_AmountOut_WithProtocol() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        dynamicFeesHooks.setFee(999999);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(key, 1000);\n\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: 100, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectRevert(Pool.InvalidFeeForExactOut.selector);\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_100PercentFee_AmountIn_WithProtocol() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        dynamicFeesHooks.setFee(1000000);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(key, 1000);\n\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: -1000, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true, address(manager));\n        emit Swap(key.toId(), address(swapRouter), -1000, 0, SQRT_PRICE_1_1, 1e18, -1, 1000000);\n\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n\n        uint256 expectedProtocolFee = uint256(-params.amountSpecified) * 1000 / 1e6;\n        assertEq(manager.protocolFeesAccrued(currency0), expectedProtocolFee);\n    }\n\n    function test_emitsSwapFee() public {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        dynamicFeesHooks.setFee(123);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(key, 1000);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true, address(manager));\n        emit Swap(key.toId(), address(swapRouter), -100, 98, 79228162514264329749955861424, 1e18, -1, 1123);\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n\n        assertEq(_fetchPoolLPFee(key), 123);\n    }\n\n    function test_fuzz_ProtocolAndLPFee(uint24 lpFee, uint16 protocolFee0, uint16 protocolFee1, int256 amountSpecified)\n        public\n    {\n        assertEq(_fetchPoolLPFee(key), 0);\n\n        lpFee = uint16(bound(lpFee, 0, 1000000));\n        protocolFee0 = uint16(bound(protocolFee0, 0, 1000));\n        protocolFee1 = uint16(bound(protocolFee1, 0, 1000));\n        vm.assume(amountSpecified != 0);\n\n        uint24 protocolFee = (uint24(protocolFee1) << 12) | uint24(protocolFee0);\n        dynamicFeesHooks.setFee(lpFee);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(key, protocolFee);\n\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: amountSpecified, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        BalanceDelta delta = swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n\n        uint24 swapFee = uint16(protocolFee).calculateSwapFee(lpFee);\n\n        uint256 expectedProtocolFee = uint256(uint128(-delta.amount0())) * protocolFee0 / 1e6;\n        if (lpFee == 0) {\n            assertEq(protocolFee0, swapFee);\n            if (((uint256(uint128(-delta.amount0())) * protocolFee0) % 1e6) != 0) expectedProtocolFee++;\n        }\n\n        assertEq(manager.protocolFeesAccrued(currency0), expectedProtocolFee);\n    }\n\n    function test_swap_withDynamicFee_gas() public {\n        (key,) = initPoolAndAddLiquidity(\n            currency0, currency1, dynamicFeesNoHooks, LPFeeLibrary.DYNAMIC_FEE_FLAG, SQRT_PRICE_1_1\n        );\n\n        assertEq(_fetchPoolLPFee(key), 0);\n        dynamicFeesNoHooks.forcePoolFeeUpdate(key, 123);\n        assertEq(_fetchPoolLPFee(key), 123);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true, address(manager));\n        emit Swap(key.toId(), address(swapRouter), -100, 98, 79228162514264329749955861424, 1e18, -1, 123);\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap with dynamic fee\");\n    }\n\n    function _fetchPoolLPFee(PoolKey memory _key) internal view returns (uint256 lpFee) {\n        PoolId id = _key.toId();\n        (,,, lpFee) = manager.getSlot0(id);\n    }\n}\n"
  },
  {
    "path": "test/DynamicReturnFees.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {PoolId} from \"../src/types/PoolId.sol\";\nimport {Hooks} from \"../src/libraries/Hooks.sol\";\nimport {LPFeeLibrary} from \"../src/libraries/LPFeeLibrary.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {IProtocolFees} from \"../src/interfaces/IProtocolFees.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"../src/types/PoolKey.sol\";\nimport {PoolManager} from \"../src/PoolManager.sol\";\nimport {PoolSwapTest} from \"../src/test/PoolSwapTest.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {DynamicReturnFeeTestHook} from \"../src/test/DynamicReturnFeeTestHook.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {FullMath} from \"../src/libraries/FullMath.sol\";\nimport {BalanceDelta} from \"../src/types/BalanceDelta.sol\";\nimport {StateLibrary} from \"../src/libraries/StateLibrary.sol\";\n\ncontract TestDynamicReturnFees is Test, Deployers {\n    using StateLibrary for IPoolManager;\n    using LPFeeLibrary for uint24;\n\n    DynamicReturnFeeTestHook dynamicReturnFeesHook = DynamicReturnFeeTestHook(\n        address(uint160(uint256(type(uint160).max) & clearAllHookPermissionsMask | Hooks.BEFORE_SWAP_FLAG))\n    );\n\n    event Swap(\n        PoolId indexed poolId,\n        address indexed sender,\n        int128 amount0,\n        int128 amount1,\n        uint160 sqrtPriceX96,\n        uint128 liquidity,\n        int24 tick,\n        uint24 fee\n    );\n\n    function setUp() public {\n        DynamicReturnFeeTestHook impl = new DynamicReturnFeeTestHook();\n        vm.etch(address(dynamicReturnFeesHook), address(impl).code);\n\n        deployFreshManagerAndRouters();\n        dynamicReturnFeesHook.setManager(IPoolManager(manager));\n\n        deployMintAndApprove2Currencies();\n        (key,) = initPoolAndAddLiquidity(\n            currency0, currency1, IHooks(address(dynamicReturnFeesHook)), LPFeeLibrary.DYNAMIC_FEE_FLAG, SQRT_PRICE_1_1\n        );\n    }\n\n    function test_fuzz_dynamicReturnSwapFee(uint24 fee) public {\n        // hook will handle adding the override flag\n        dynamicReturnFeesHook.setFee(fee);\n\n        uint24 actualFee = fee.removeOverrideFlag();\n\n        int256 amountSpecified = -10000;\n        BalanceDelta result;\n        if (actualFee > LPFeeLibrary.MAX_LP_FEE) {\n            vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, actualFee));\n            result = swap(key, true, amountSpecified, ZERO_BYTES);\n            return;\n        } else {\n            result = swap(key, true, amountSpecified, ZERO_BYTES);\n        }\n        // BalanceDelta result = swap(key, true, amountSpecified, ZERO_BYTES);\n        assertEq(result.amount0(), amountSpecified);\n\n        if (actualFee > LPFeeLibrary.MAX_LP_FEE) {\n            // if the fee is too large, the fee from beforeSwap is not used (and remains at 0 -- the default value)\n            assertApproxEqAbs(uint256(int256(result.amount1())), uint256(int256(-result.amount0())), 1 wei);\n        } else {\n            assertApproxEqAbs(\n                uint256(int256(result.amount1())),\n                FullMath.mulDiv(uint256(-amountSpecified), (1e6 - actualFee), 1e6),\n                1 wei\n            );\n        }\n    }\n\n    function test_returnDynamicSwapFee_beforeSwap_succeeds_gas() public {\n        assertEq(_fetchPoolSwapFee(key), 0);\n\n        dynamicReturnFeesHook.setFee(123);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true, address(manager));\n        emit Swap(key.toId(), address(swapRouter), -100, 98, 79228162514264329749955861424, 1e18, -1, 123);\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap with return dynamic fee\");\n\n        assertEq(_fetchPoolSwapFee(key), 0);\n    }\n\n    function test_dynamicReturnSwapFee_initializeZeroSwapFee() public {\n        key.tickSpacing = 30;\n        manager.initialize(key, SQRT_PRICE_1_1);\n        assertEq(_fetchPoolSwapFee(key), 0);\n    }\n\n    function test_dynamicReturnSwapFee_notUsedIfPoolIsStaticFee() public {\n        key.fee = 3000; // static fee\n        dynamicReturnFeesHook.setFee(1000); // 0.10% fee is NOT used because the pool has a static fee\n\n        initPoolAndAddLiquidity(currency0, currency1, IHooks(address(dynamicReturnFeesHook)), 3000, SQRT_PRICE_1_1);\n        assertEq(_fetchPoolSwapFee(key), 3000);\n\n        // despite returning a valid swap fee (1000), the static fee is used\n        int256 amountSpecified = -10000;\n        BalanceDelta result = swap(key, true, amountSpecified, ZERO_BYTES);\n\n        // after swapping ~1:1, the amount out (amount1) should be approximately 0.30% less than the amount specified\n        assertEq(result.amount0(), amountSpecified);\n        assertApproxEqAbs(\n            uint256(int256(result.amount1())), FullMath.mulDiv(uint256(-amountSpecified), (1e6 - 3000), 1e6), 1 wei\n        );\n    }\n\n    function test_dynamicReturnSwapFee_notStored() public {\n        // fees returned by beforeSwap are not written to storage\n\n        // create a new pool with an initial fee of 123\n        key.tickSpacing = 30;\n        manager.initialize(key, SQRT_PRICE_1_1);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n        uint24 initialFee = 123;\n        dynamicReturnFeesHook.forcePoolFeeUpdate(key, initialFee);\n        assertEq(_fetchPoolSwapFee(key), initialFee);\n\n        // swap with a different fee\n        uint24 newFee = 3000;\n        dynamicReturnFeesHook.setFee(newFee);\n\n        int256 amountSpecified = -10000;\n        BalanceDelta result = swap(key, true, amountSpecified, ZERO_BYTES);\n        assertApproxEqAbs(\n            uint256(int256(result.amount1())), FullMath.mulDiv(uint256(-amountSpecified), (1e6 - newFee), 1e6), 1 wei\n        );\n\n        // the fee from beforeSwap is not stored\n        assertEq(_fetchPoolSwapFee(key), initialFee);\n    }\n\n    function test_dynamicReturnSwapFee_revertIfLPFeeTooLarge() public {\n        assertEq(_fetchPoolSwapFee(key), 0);\n\n        // hook adds the override flag\n        uint24 fee = 1000001;\n        dynamicReturnFeesHook.setFee(fee);\n\n        // a large fee is not used\n        int256 amountSpecified = -10000;\n        vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, fee));\n        swap(key, true, amountSpecified, ZERO_BYTES);\n    }\n\n    function _fetchPoolSwapFee(PoolKey memory _key) internal view returns (uint256 swapFee) {\n        PoolId id = _key.toId();\n        (,,, swapFee) = manager.getSlot0(id);\n    }\n}\n"
  },
  {
    "path": "test/ERC6909Claims.t.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.15;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {MockERC6909Claims} from \"../src/test/MockERC6909Claims.sol\";\n\ncontract ERC6909ClaimsTest is Test {\n    MockERC6909Claims token;\n\n    function setUp() public {\n        token = new MockERC6909Claims();\n    }\n\n    function test_burnFrom_withApproval(address sender, uint256 id, uint256 mintAmount, uint256 transferAmount)\n        public\n    {\n        token.mint(sender, id, mintAmount);\n\n        vm.prank(sender);\n        token.approve(address(this), id, mintAmount);\n\n        if (transferAmount > mintAmount) {\n            vm.expectRevert();\n        }\n        token.burnFrom(sender, id, transferAmount);\n\n        if (transferAmount <= mintAmount) {\n            if (mintAmount == type(uint256).max) {\n                assertEq(token.allowance(sender, address(this), id), type(uint256).max);\n            } else {\n                if (sender != address(this)) {\n                    assertEq(token.allowance(sender, address(this), id), mintAmount - transferAmount);\n                } else {\n                    assertEq(token.allowance(sender, address(this), id), mintAmount);\n                }\n            }\n            assertEq(token.balanceOf(sender, id), mintAmount - transferAmount);\n        }\n    }\n\n    function test_burnFrom_revertsWithNoApproval() public {\n        token.mint(address(this), 1337, 100);\n\n        vm.prank(address(0xBEEF));\n        vm.expectRevert();\n        token.burnFrom(address(this), 1337, 100);\n    }\n\n    /// ---- Tests copied from solmate ---- ///\n\n    function testMint() public {\n        token.mint(address(0xBEEF), 1337, 100);\n        vm.snapshotGasLastCall(\"ERC6909Claims mint\");\n\n        assertEq(token.balanceOf(address(0xBEEF), 1337), 100);\n    }\n\n    function testBurn() public {\n        token.mint(address(0xBEEF), 1337, 100);\n        vm.prank(address(0xBEEF));\n        token.burn(1337, 70);\n        vm.snapshotGasLastCall(\"ERC6909Claims burn\");\n\n        assertEq(token.balanceOf(address(0xBEEF), 1337), 30);\n    }\n\n    function testSetOperator() public {\n        token.setOperator(address(0xBEEF), true);\n\n        assertTrue(token.isOperator(address(this), address(0xBEEF)));\n    }\n\n    function testApprove() public {\n        token.approve(address(0xBEEF), 1337, 100);\n        vm.snapshotGasLastCall(\"ERC6909Claims approve\");\n\n        assertEq(token.allowance(address(this), address(0xBEEF), 1337), 100);\n    }\n\n    function testTransfer() public {\n        address sender = address(0xABCD);\n\n        token.mint(sender, 1337, 100);\n\n        vm.prank(sender);\n\n        token.transfer(address(0xBEEF), 1337, 70);\n        vm.snapshotGasLastCall(\"ERC6909Claims transfer\");\n\n        assertEq(token.balanceOf(sender, 1337), 30);\n        assertEq(token.balanceOf(address(0xBEEF), 1337), 70);\n    }\n\n    function testTransferFromWithApproval() public {\n        address sender = address(0xABCD);\n        address receiver = address(0xBEEF);\n\n        token.mint(sender, 1337, 100);\n\n        vm.prank(sender);\n        token.approve(address(this), 1337, 100);\n\n        token.transferFrom(sender, receiver, 1337, 70);\n        vm.snapshotGasLastCall(\"ERC6909Claims transferFrom with approval\");\n\n        assertEq(token.allowance(sender, address(this), 1337), 30);\n        assertEq(token.balanceOf(sender, 1337), 30);\n        assertEq(token.balanceOf(receiver, 1337), 70);\n    }\n\n    function testTransferFromWithInfiniteApproval() public {\n        address sender = address(0xABCD);\n        address receiver = address(0xBEEF);\n\n        token.mint(sender, 1337, 100);\n\n        vm.prank(sender);\n        token.approve(address(this), 1337, type(uint256).max);\n\n        token.transferFrom(sender, receiver, 1337, 70);\n        vm.snapshotGasLastCall(\"ERC6909Claims transferFrom with infinite approval\");\n\n        assertEq(token.allowance(sender, address(this), 1337), type(uint256).max);\n        assertEq(token.balanceOf(sender, 1337), 30);\n        assertEq(token.balanceOf(receiver, 1337), 70);\n    }\n\n    function testTransferFromAsOperator() public {\n        address sender = address(0xABCD);\n        address receiver = address(0xBEEF);\n\n        token.mint(sender, 1337, 100);\n\n        vm.prank(sender);\n        token.setOperator(address(this), true);\n\n        token.transferFrom(sender, receiver, 1337, 70);\n        vm.snapshotGasLastCall(\"ERC6909Claims transferFrom as operator\");\n\n        assertEq(token.balanceOf(sender, 1337), 30);\n        assertEq(token.balanceOf(receiver, 1337), 70);\n    }\n\n    function test_revertMintBalanceOverflow() public {\n        token.mint(address(0xDEAD), 1337, type(uint256).max);\n        vm.expectRevert();\n        token.mint(address(0xDEAD), 1337, 1);\n    }\n\n    function test_revertTransferBalanceUnderflow() public {\n        address sender = address(0xABCD);\n        address receiver = address(0xBEEF);\n\n        vm.expectRevert();\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, 1337, 1);\n    }\n\n    function test_revertTransferBalanceOverflow() public {\n        address sender = address(0xABCD);\n        address receiver = address(0xBEEF);\n\n        token.mint(sender, 1337, type(uint256).max);\n\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, 1337, type(uint256).max);\n\n        token.mint(sender, 1337, 1);\n\n        vm.expectRevert();\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, 1337, 1);\n    }\n\n    function test_revertTransferFromBalanceUnderflow() public {\n        address sender = address(0xABCD);\n        address receiver = address(0xBEEF);\n\n        vm.expectRevert();\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, 1337, 1);\n    }\n\n    function test_revertTransferFromBalanceOverflow() public {\n        address sender = address(0xABCD);\n        address receiver = address(0xBEEF);\n\n        token.mint(sender, 1337, type(uint256).max);\n\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, 1337, type(uint256).max);\n\n        token.mint(sender, 1337, 1);\n\n        vm.expectRevert();\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, 1337, 1);\n    }\n\n    function test_revertTransferFromNotAuthorized() public {\n        address sender = address(0xABCD);\n        address receiver = address(0xBEEF);\n\n        token.mint(sender, 1337, 100);\n\n        vm.expectRevert();\n        token.transferFrom(sender, receiver, 1337, 100);\n    }\n\n    function testMint(address receiver, uint256 id, uint256 amount) public {\n        token.mint(receiver, id, amount);\n\n        assertEq(token.balanceOf(receiver, id), amount);\n    }\n\n    function testBurn(address sender, uint256 id, uint256 amount) public {\n        token.mint(sender, id, amount);\n        vm.prank(sender);\n        token.burn(id, amount);\n\n        assertEq(token.balanceOf(sender, id), 0);\n    }\n\n    function testSetOperator(address operator, bool approved) public {\n        token.setOperator(operator, approved);\n\n        assertEq(token.isOperator(address(this), operator), approved);\n    }\n\n    function testApprove(address spender, uint256 id, uint256 amount) public {\n        token.approve(spender, id, amount);\n\n        assertEq(token.allowance(address(this), spender, id), amount);\n    }\n\n    function testTransfer(address sender, address receiver, uint256 id, uint256 mintAmount, uint256 transferAmount)\n        public\n    {\n        transferAmount = bound(transferAmount, 0, mintAmount);\n\n        token.mint(sender, id, mintAmount);\n\n        vm.prank(sender);\n        token.transfer(receiver, id, transferAmount);\n\n        if (sender == receiver) {\n            assertEq(token.balanceOf(sender, id), mintAmount);\n        } else {\n            assertEq(token.balanceOf(sender, id), mintAmount - transferAmount);\n            assertEq(token.balanceOf(receiver, id), transferAmount);\n        }\n    }\n\n    function testTransferFromWithApproval(\n        address sender,\n        address receiver,\n        uint256 id,\n        uint256 mintAmount,\n        uint256 transferAmount\n    ) public {\n        transferAmount = bound(transferAmount, 0, mintAmount);\n\n        token.mint(sender, id, mintAmount);\n\n        vm.prank(sender);\n        token.approve(address(this), id, mintAmount);\n\n        token.transferFrom(sender, receiver, id, transferAmount);\n\n        if (mintAmount == type(uint256).max) {\n            assertEq(token.allowance(sender, address(this), id), type(uint256).max);\n        } else {\n            if (sender != address(this)) {\n                assertEq(token.allowance(sender, address(this), id), mintAmount - transferAmount);\n            } else {\n                assertEq(token.allowance(sender, address(this), id), mintAmount);\n            }\n        }\n\n        if (sender == receiver) {\n            assertEq(token.balanceOf(sender, id), mintAmount);\n        } else {\n            assertEq(token.balanceOf(sender, id), mintAmount - transferAmount);\n            assertEq(token.balanceOf(receiver, id), transferAmount);\n        }\n    }\n\n    function testTransferFromWithInfiniteApproval(\n        address sender,\n        address receiver,\n        uint256 id,\n        uint256 mintAmount,\n        uint256 transferAmount\n    ) public {\n        transferAmount = bound(transferAmount, 0, mintAmount);\n\n        token.mint(sender, id, mintAmount);\n\n        vm.prank(sender);\n        token.approve(address(this), id, type(uint256).max);\n\n        token.transferFrom(sender, receiver, id, transferAmount);\n\n        assertEq(token.allowance(sender, address(this), id), type(uint256).max);\n\n        if (sender == receiver) {\n            assertEq(token.balanceOf(sender, id), mintAmount);\n        } else {\n            assertEq(token.balanceOf(sender, id), mintAmount - transferAmount);\n            assertEq(token.balanceOf(receiver, id), transferAmount);\n        }\n    }\n\n    function testTransferFromAsOperator(\n        address sender,\n        address receiver,\n        uint256 id,\n        uint256 mintAmount,\n        uint256 transferAmount\n    ) public {\n        transferAmount = bound(transferAmount, 0, mintAmount);\n\n        token.mint(sender, id, mintAmount);\n\n        vm.prank(sender);\n        token.setOperator(address(this), true);\n\n        token.transferFrom(sender, receiver, id, transferAmount);\n\n        if (sender == receiver) {\n            assertEq(token.balanceOf(sender, id), mintAmount);\n        } else {\n            assertEq(token.balanceOf(sender, id), mintAmount - transferAmount);\n            assertEq(token.balanceOf(receiver, id), transferAmount);\n        }\n    }\n\n    function test_revertTransferBalanceUnderflow(address sender, address receiver, uint256 id, uint256 amount) public {\n        amount = bound(amount, 1, type(uint256).max);\n\n        vm.expectRevert();\n        vm.prank(sender);\n        token.transfer(receiver, id, amount);\n    }\n\n    function test_revertTransferBalanceOverflow(address sender, address receiver, uint256 id, uint256 amount) public {\n        if (sender == receiver) return;\n        amount = bound(amount, 1, type(uint256).max);\n        uint256 overflowAmount = type(uint256).max - amount + 1;\n\n        token.mint(sender, id, amount);\n\n        vm.prank(sender);\n        token.transfer(receiver, id, amount);\n\n        token.mint(sender, id, overflowAmount);\n\n        vm.expectRevert();\n        vm.prank(sender);\n        token.transfer(receiver, id, overflowAmount);\n    }\n\n    function test_revertTransferFromBalanceUnderflow(address sender, address receiver, uint256 id, uint256 amount)\n        public\n    {\n        amount = bound(amount, 1, type(uint256).max);\n\n        vm.expectRevert();\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, id, amount);\n    }\n\n    function test_revertTransferFromBalanceOverflow(address sender, address receiver, uint256 id, uint256 amount)\n        public\n    {\n        if (sender == receiver) return;\n        amount = bound(amount, 1, type(uint256).max);\n        uint256 overflowAmount = type(uint256).max - amount + 1;\n\n        token.mint(sender, id, amount);\n\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, id, amount);\n\n        token.mint(sender, id, overflowAmount);\n\n        vm.expectRevert();\n        vm.prank(sender);\n        token.transferFrom(sender, receiver, id, overflowAmount);\n    }\n\n    function test_revertTransferFromNotAuthorized(address sender, address receiver, uint256 id, uint256 amount)\n        public\n    {\n        amount = bound(amount, 1, type(uint256).max);\n\n        token.mint(sender, id, amount);\n\n        vm.assume(sender != address(this));\n        vm.expectRevert();\n        token.transferFrom(sender, receiver, id, amount);\n    }\n}\n"
  },
  {
    "path": "test/Extsload.t.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Extsload} from \"../src/Extsload.sol\";\n\ncontract Loadable is Extsload {}\n\n/// @author philogy <https://github.com/philogy>\ncontract ExtsloadTest is Test {\n    Loadable loadable = new Loadable();\n\n    function test_load10_sparse() public {\n        bytes32[] memory keys = new bytes32[](10);\n        for (uint256 i = 0; i < keys.length; i++) {\n            keys[i] = keccak256(abi.encode(i));\n            vm.store(address(loadable), keys[i], bytes32(i));\n        }\n\n        bytes32[] memory values = loadable.extsload(keys);\n        vm.snapshotGasLastCall(\"sparse external sload\");\n        assertEq(values.length, keys.length);\n        for (uint256 i = 0; i < values.length; i++) {\n            assertEq(values[i], bytes32(i));\n        }\n    }\n\n    function test_fuzz_consecutiveExtsload(uint256 startSlot, uint256 length, uint256 seed) public {\n        length = bound(length, 0, 1000);\n        startSlot = bound(startSlot, 0, type(uint256).max - length);\n        for (uint256 i; i < length; ++i) {\n            vm.store(address(loadable), bytes32(startSlot + i), keccak256(abi.encode(i, seed)));\n        }\n        bytes32[] memory values = loadable.extsload(bytes32(startSlot), length);\n        assertEq(values.length, length);\n        for (uint256 i; i < length; ++i) {\n            assertEq(values[i], keccak256(abi.encode(i, seed)));\n        }\n    }\n\n    function test_fuzz_extsload(uint256 length, uint256 seed, bytes memory dirtyBits) public {\n        length = bound(length, 0, 1000);\n        bytes32[] memory slots = new bytes32[](length);\n        bytes32[] memory expected = new bytes32[](length);\n        for (uint256 i; i < length; ++i) {\n            slots[i] = keccak256(abi.encode(i, seed));\n            expected[i] = keccak256(abi.encode(slots[i]));\n            vm.store(address(loadable), slots[i], expected[i]);\n        }\n        bytes32[] memory values = loadable.extsload(slots);\n        assertEq(values, expected);\n        // test with dirty bits\n        bytes memory data = abi.encodeWithSignature(\"extsload(bytes32[])\", (slots));\n        bytes memory malformedData = bytes.concat(data, dirtyBits);\n        (bool success, bytes memory returnData) = address(loadable).staticcall(malformedData);\n        assertTrue(success, \"extsload failed\");\n        assertEq(returnData.length % 0x20, 0, \"return data length is not a multiple of 32\");\n        assertEq(abi.decode(returnData, (bytes32[])), expected);\n    }\n}\n"
  },
  {
    "path": "test/ModifyLiquidity.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {PoolKey} from \"src/types/PoolKey.sol\";\nimport {ModifyLiquidityParams} from \"src/types/PoolOperation.sol\";\nimport {IPoolManager} from \"src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"src/interfaces/IHooks.sol\";\nimport {Position} from \"src/libraries/Position.sol\";\nimport {PoolId} from \"src/types/PoolId.sol\";\nimport {PoolModifyLiquidityTest} from \"../src/test/PoolModifyLiquidityTest.sol\";\nimport {Constants} from \"./utils/Constants.sol\";\nimport {Currency} from \"src/types/Currency.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {StateLibrary} from \"src/libraries/StateLibrary.sol\";\nimport {JavascriptFfi} from \"./utils/JavascriptFfi.sol\";\nimport {BalanceDelta} from \"../src/types/BalanceDelta.sol\";\nimport {Fuzzers} from \"../src/test/Fuzzers.sol\";\nimport {TickMath} from \"src/libraries/TickMath.sol\";\nimport {toBalanceDelta} from \"src/types/BalanceDelta.sol\";\nimport {Logger} from \"./utils/Logger.sol\";\n\ncontract ModifyLiquidityTest is Test, Logger, Deployers, JavascriptFfi, Fuzzers {\n    using StateLibrary for IPoolManager;\n\n    PoolKey simpleKey; // vanilla pool key\n    PoolId simplePoolId; // id for vanilla pool key\n\n    bytes32 SALT = hex\"CAFF\";\n\n    int128 constant ONE_PIP = 1e6;\n\n    ModifyLiquidityParams public LIQ_PARAM_NO_SALT =\n        ModifyLiquidityParams({tickLower: -120, tickUpper: 120, liquidityDelta: 1e18, salt: 0});\n\n    ModifyLiquidityParams public LIQ_PARAM_SALT =\n        ModifyLiquidityParams({tickLower: -120, tickUpper: 120, liquidityDelta: 1e18, salt: SALT});\n\n    function setUp() public {\n        deployFreshManagerAndRouters();\n        deployMintAndApprove2Currencies();\n        (simpleKey, simplePoolId) = initPool(currency0, currency1, IHooks(address(0)), 3000, SQRT_PRICE_1_1);\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                            Fuzz Add Liquidity\n    //////////////////////////////////////////////////////////////*/\n\n    /// forge-config: default.fuzz.runs = 10\n    /// forge-config: pr.fuzz.runs = 10\n    /// forge-config: ci.fuzz.runs = 500\n    /// forge-config: debug.fuzz.runs = 10\n    function test_ffi_fuzz_addLiquidity_defaultPool_ReturnsCorrectLiquidityDelta(ModifyLiquidityParams memory paramSeed)\n        public\n    {\n        // Sanitize the fuzzed params to get valid tickLower, tickUpper, and liquidityDelta.\n        // We use SQRT_PRICE_1_1 because the simpleKey pool has initial sqrtPrice of SQRT_PRICE_1_1.\n        ModifyLiquidityParams memory params = createFuzzyLiquidityParams(simpleKey, paramSeed, SQRT_PRICE_1_1);\n\n        logParams(params);\n\n        (BalanceDelta delta) = modifyLiquidityRouter.modifyLiquidity(simpleKey, params, ZERO_BYTES);\n\n        (int128 jsDelta0, int128 jsDelta1) = _modifyLiquidityJS(simplePoolId, params);\n\n        _checkError(delta.amount0(), jsDelta0, \"amount0 is off by more than one pip\");\n        _checkError(delta.amount1(), jsDelta1, \"amount1 is off by more than one pip\");\n    }\n\n    // Static edge case, no fuzz test, to make sure we test max tickspacing.\n    function test_ffi_addLiqudity_weirdPool_0_returnsCorrectLiquidityDelta() public {\n        // Use a pool with TickSpacing of MAX_TICK_SPACING\n        (PoolKey memory wp0, PoolId wpId0) =\n            initPool(currency0, currency1, IHooks(address(0)), 500, TickMath.MAX_TICK_SPACING, SQRT_PRICE_1_1);\n\n        // Set the params to add random amount of liquidity to random tick boundary.\n        int24 tickUpper = TickMath.MAX_TICK_SPACING * 4;\n        int24 tickLower = TickMath.MAX_TICK_SPACING * -9;\n        ModifyLiquidityParams memory params = ModifyLiquidityParams({\n            tickLower: tickLower,\n            tickUpper: tickUpper,\n            liquidityDelta: 16787899214600939458,\n            salt: 0\n        });\n\n        (BalanceDelta delta) = modifyLiquidityRouter.modifyLiquidity(wp0, params, ZERO_BYTES);\n\n        (int128 jsDelta0, int128 jsDelta1) = _modifyLiquidityJS(wpId0, params);\n\n        _checkError(delta.amount0(), jsDelta0, \"amount0 is off by more than one pip\");\n        _checkError(delta.amount1(), jsDelta1, \"amount1 is off by more than one pip\");\n    }\n\n    // Static edge case, no fuzz test, to make sure we test min tick spacing.\n    function test_ffi_addLiqudity_weirdPool_1_returnsCorrectLiquidityDelta() public {\n        // Use a pool with TickSpacing of MIN_TICK_SPACING\n        (PoolKey memory wp0, PoolId wpId0) =\n            initPool(currency0, currency1, IHooks(address(0)), 551, TickMath.MIN_TICK_SPACING, SQRT_PRICE_1_1);\n\n        // Set the params to add random amount of liquidity to random tick boundary.\n        int24 tickUpper = TickMath.MIN_TICK_SPACING * 17;\n        int24 tickLower = TickMath.MIN_TICK_SPACING * 9;\n        ModifyLiquidityParams memory params = ModifyLiquidityParams({\n            tickLower: tickLower,\n            tickUpper: tickUpper,\n            liquidityDelta: 922871614499955267459963,\n            salt: 0\n        });\n\n        params.tickLower = 10;\n\n        (BalanceDelta delta) = modifyLiquidityRouter.modifyLiquidity(wp0, params, ZERO_BYTES);\n\n        (int128 jsDelta0, int128 jsDelta1) = _modifyLiquidityJS(wpId0, params);\n\n        _checkError(delta.amount0(), jsDelta0, \"amount0 is off by more than one pip\");\n        _checkError(delta.amount1(), jsDelta1, \"amount1 is off by more than one pip\");\n    }\n\n    function _modifyLiquidityJS(PoolId poolId, ModifyLiquidityParams memory params) public returns (int128, int128) {\n        (uint256 price, int24 tick,,) = manager.getSlot0(poolId);\n\n        string memory jsParameters = string(\n            abi.encodePacked(\n                vm.toString(params.tickLower),\n                \",\",\n                vm.toString(params.tickUpper),\n                \",\",\n                vm.toString(params.liquidityDelta),\n                \",\",\n                vm.toString(tick),\n                \",\",\n                vm.toString(price)\n            )\n        );\n\n        string memory scriptName = \"forge-test-getModifyLiquidityResult\";\n        bytes memory jsResult = runScript(scriptName, jsParameters);\n\n        int128[] memory result = abi.decode(jsResult, (int128[]));\n        int128 jsDelta0 = result[0];\n        int128 jsDelta1 = result[1];\n        return (jsDelta0, jsDelta1);\n    }\n\n    // assert solc/js result is at most off by 1/100th of a bip (aka one pip)\n    function _checkError(int128 solc, int128 js, string memory errMsg) public pure {\n        if (solc != js) {\n            // Ensures no div by 0 in the case of one-sided liquidity adds.\n            (int128 gtResult, int128 ltResult) = js > solc ? (js, solc) : (solc, js);\n            int128 resultsDiff = gtResult - ltResult;\n            assertEq(resultsDiff * ONE_PIP / js, 0, errMsg);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                            Salt\n    //////////////////////////////////////////////////////////////*/\n\n    function test_modifyLiquidity_samePosition_zeroSalt_isUpdated() public {\n        (uint128 liquidity,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_NO_SALT.tickLower, LIQ_PARAM_NO_SALT.tickUpper, 0\n        );\n        assertEq(liquidity, 0);\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_NO_SALT, ZERO_BYTES);\n        (liquidity,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_NO_SALT.tickLower, LIQ_PARAM_NO_SALT.tickUpper, 0\n        );\n\n        assertEq(liquidity, uint128(uint256(LIQ_PARAM_NO_SALT.liquidityDelta)));\n\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_NO_SALT, ZERO_BYTES);\n        (uint128 liquidityUpdated,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_NO_SALT.tickLower, LIQ_PARAM_NO_SALT.tickUpper, 0\n        );\n        assertEq(liquidityUpdated, liquidity + uint128(uint256(LIQ_PARAM_NO_SALT.liquidityDelta)));\n    }\n\n    function test_modifyLiquidity_samePosition_withSalt_isUpdated() public {\n        (uint128 liquidity,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n        assertEq(liquidity, 0);\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_SALT, ZERO_BYTES);\n        (liquidity,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n        assertEq(liquidity, uint128(uint256(LIQ_PARAM_SALT.liquidityDelta)));\n\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_SALT, ZERO_BYTES);\n        (uint128 liquidityUpdated,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n        assertEq(liquidityUpdated, liquidity + uint128(uint256(LIQ_PARAM_SALT.liquidityDelta)));\n    }\n\n    function test_modifyLiquidity_sameTicks_withDifferentSalt_isNotUpdated() public {\n        (uint128 liquidityNoSalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_NO_SALT.tickLower, LIQ_PARAM_NO_SALT.tickUpper, 0\n        );\n\n        (uint128 liquiditySalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n        assertEq(liquidityNoSalt, 0);\n        assertEq(liquiditySalt, 0);\n\n        // Modify the liquidity with the salt.\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_SALT, ZERO_BYTES);\n\n        (liquidityNoSalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_NO_SALT.tickLower, LIQ_PARAM_NO_SALT.tickUpper, 0\n        );\n\n        (liquiditySalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n\n        assertEq(liquidityNoSalt, 0); // This position does not have liquidity.\n        assertEq(liquiditySalt, uint128(uint256(LIQ_PARAM_SALT.liquidityDelta))); // This position does.\n\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_NO_SALT, ZERO_BYTES); // Now the positions should have the same liquidity.\n\n        (liquidityNoSalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_NO_SALT.tickLower, LIQ_PARAM_NO_SALT.tickUpper, 0\n        );\n\n        (liquiditySalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n\n        // positionSalt should still only have the original liquidity deposited to it\n        assertEq(liquiditySalt, uint128(uint256(LIQ_PARAM_SALT.liquidityDelta)));\n        assertEq(liquidityNoSalt, liquiditySalt);\n\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_SALT, ZERO_BYTES);\n        (uint128 updatedLiquidityWithSalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n        (uint128 updatedLiquidityNoSalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_NO_SALT.tickLower, LIQ_PARAM_NO_SALT.tickUpper, 0\n        );\n\n        assertEq(updatedLiquidityWithSalt, liquiditySalt + uint128(uint256(LIQ_PARAM_SALT.liquidityDelta)));\n        assertGt(updatedLiquidityWithSalt, updatedLiquidityNoSalt);\n        assertEq(updatedLiquidityNoSalt, liquidityNoSalt);\n    }\n\n    function test_modifyLiquidity_sameSalt_differentLiquidityRouters_doNotEditSamePosition() public {\n        // Set up new router.\n        PoolModifyLiquidityTest modifyLiquidityRouter2 = new PoolModifyLiquidityTest(manager);\n\n        MockERC20(Currency.unwrap(currency0)).approve(address(modifyLiquidityRouter2), Constants.MAX_UINT256);\n        MockERC20(Currency.unwrap(currency1)).approve(address(modifyLiquidityRouter2), Constants.MAX_UINT256);\n\n        ModifyLiquidityParams memory LIQ_PARAM_SALT_2 =\n            ModifyLiquidityParams({tickLower: -120, tickUpper: 120, liquidityDelta: 2e18, salt: SALT});\n\n        // Get the uninitialized positions and assert they have no liquidity.\n        (uint128 liquiditySalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n\n        (uint128 liquiditySalt2,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter2), LIQ_PARAM_SALT_2.tickLower, LIQ_PARAM_SALT_2.tickUpper, SALT\n        );\n\n        assertEq(liquiditySalt, 0);\n        assertEq(liquiditySalt2, 0);\n\n        // Modify the liquidity with the salt with the first router.\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_SALT, ZERO_BYTES);\n\n        (uint128 updatedLiquiditySalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n\n        (uint128 updatedLiquiditySalt2,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter2), LIQ_PARAM_SALT_2.tickLower, LIQ_PARAM_SALT_2.tickUpper, SALT\n        );\n\n        // Assert only the liquidity from the first router is updated.\n        assertEq(updatedLiquiditySalt, uint128(uint256(LIQ_PARAM_SALT.liquidityDelta)));\n        assertEq(updatedLiquiditySalt2, 0);\n\n        // Modify the liquidity with the second router.\n        modifyLiquidityRouter2.modifyLiquidity(simpleKey, LIQ_PARAM_SALT_2, ZERO_BYTES);\n\n        (updatedLiquiditySalt2,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter2), LIQ_PARAM_SALT_2.tickLower, LIQ_PARAM_SALT_2.tickUpper, SALT\n        );\n        (updatedLiquiditySalt,,) = manager.getPositionInfo(\n            simplePoolId, address(modifyLiquidityRouter), LIQ_PARAM_SALT.tickLower, LIQ_PARAM_SALT.tickUpper, SALT\n        );\n\n        // Assert only the liquidity from the second router is updated.\n        assertEq(updatedLiquiditySalt2, uint128(uint256(LIQ_PARAM_SALT_2.liquidityDelta)));\n        assertEq(updatedLiquiditySalt, uint128(uint256(LIQ_PARAM_SALT.liquidityDelta)));\n    }\n\n    function test_gas_modifyLiquidity_newPosition() public {\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_SALT, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"create new liquidity to a position with salt\");\n    }\n\n    function test_gas_modifyLiquidity_updateSamePosition_withSalt() public {\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_SALT, ZERO_BYTES);\n        modifyLiquidityRouter.modifyLiquidity(simpleKey, LIQ_PARAM_SALT, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"add liquidity to already existing position with salt\");\n    }\n}\n"
  },
  {
    "path": "test/NoDelegateCall.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {PoolSwapTest} from \"../src/test/PoolSwapTest.sol\";\nimport {ProxyPoolManager} from \"../src/test/ProxyPoolManager.sol\";\nimport {NoDelegateCallTest} from \"../src/test/NoDelegateCallTest.sol\";\nimport {PoolManager} from \"../src/PoolManager.sol\";\nimport {NoDelegateCall} from \"../src/NoDelegateCall.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\n\ncontract TestDelegateCall is Test, Deployers {\n    // override to use ProxyPoolManager\n    function deployFreshManager() internal virtual override {\n        IPoolManager delegateManager = new PoolManager(address(this));\n        manager = new ProxyPoolManager(address(delegateManager));\n    }\n\n    NoDelegateCallTest noDelegateCallTest;\n\n    function setUp() public {\n        deployFreshManagerAndRouters();\n\n        noDelegateCallTest = new NoDelegateCallTest();\n    }\n\n    function test_gas_noDelegateCall() public {\n        vm.snapshotValue(\n            \"NoDelegateCall\",\n            noDelegateCallTest.getGasCostOfCannotBeDelegateCalled()\n                - noDelegateCallTest.getGasCostOfCanBeDelegateCalled()\n        );\n    }\n\n    function test_delegateCallNoModifier() public {\n        (bool success,) =\n            address(noDelegateCallTest).delegatecall(abi.encode(noDelegateCallTest.canBeDelegateCalled.selector));\n        assertTrue(success);\n    }\n\n    function test_delegateCallWithModifier_revertsWithDelegateCallNotAllowed() public {\n        vm.expectRevert(NoDelegateCall.DelegateCallNotAllowed.selector);\n        (bool success,) =\n            address(noDelegateCallTest).delegatecall(abi.encode(noDelegateCallTest.cannotBeDelegateCalled.selector));\n        // note vm.expectRevert inverts success, so a true result here means it reverted\n        assertTrue(success);\n    }\n\n    function test_externalCallToPrivateMethodWithModifier_succeeds() public view {\n        noDelegateCallTest.callsIntoNoDelegateCallFunction();\n    }\n\n    function test_delegateCallFromExternalToPrivateMethodWithModifier_revertsWithDelegateCallNotAllowed() public {\n        vm.expectRevert(NoDelegateCall.DelegateCallNotAllowed.selector);\n        (bool success,) = address(noDelegateCallTest).delegatecall(\n            abi.encode(noDelegateCallTest.callsIntoNoDelegateCallFunction.selector)\n        );\n        // note vm.expectRevert inverts success, so a true result here means it reverted\n        assertTrue(success);\n    }\n\n    function test_modifyLiquidity_noDelegateCall() public {\n        vm.expectRevert(NoDelegateCall.DelegateCallNotAllowed.selector);\n        modifyLiquidityRouter.modifyLiquidity(uninitializedKey, LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        vm.expectRevert(NoDelegateCall.DelegateCallNotAllowed.selector);\n        modifyLiquidityRouter.modifyLiquidity(uninitializedKey, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_swap_noDelegateCall() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectRevert(NoDelegateCall.DelegateCallNotAllowed.selector);\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n    }\n\n    function test_donate_noDelegateCall() public {\n        vm.expectRevert(NoDelegateCall.DelegateCallNotAllowed.selector);\n        donateRouter.donate(key, 100, 200, ZERO_BYTES);\n    }\n}\n"
  },
  {
    "path": "test/PoolManager.clear.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.0;\n\nimport \"forge-std/Test.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {Actions} from \"../src/test/ActionsRouter.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {MockERC20} from \"forge-std/mocks/MockERC20.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\n\ncontract ClearTest is Test, Deployers {\n    function setUp() public {\n        initializeManagerRoutersAndPoolsWithLiq(IHooks(address(0)));\n        seedMoreLiquidity(key, 10e18, 10e18);\n    }\n\n    function test_clear_reverts_negativeDelta() external {\n        uint256 amount = 1e18;\n\n        Actions[] memory actions = new Actions[](2);\n        bytes[] memory params = new bytes[](2);\n\n        // Apply a negative delta.\n        actions[0] = Actions.TAKE;\n        params[0] = abi.encode(currency0, address(this), amount);\n\n        actions[1] = Actions.CLEAR;\n        params[1] = abi.encode(currency0, amount, false, \"\");\n\n        vm.expectRevert(IPoolManager.MustClearExactPositiveDelta.selector);\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_clear_reverts_positiveDelta_inputGreaterThanDelta() external {\n        uint256 amount = 1e18;\n        Actions[] memory actions = new Actions[](5);\n        bytes[] memory params = new bytes[](5);\n\n        // Apply a positive delta.\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency0);\n\n        actions[1] = Actions.TRANSFER_FROM;\n        params[1] = abi.encode(currency0, address(this), address(manager), amount);\n\n        actions[2] = Actions.SETTLE;\n        params[2] = abi.encode(currency0);\n\n        // Delta should be equal to the positive amount.\n        actions[3] = Actions.ASSERT_DELTA_EQUALS;\n        params[3] = abi.encode(currency0, address(actionsRouter), amount);\n\n        // Clear for 1 greater than the delta.\n        actions[4] = Actions.CLEAR;\n        params[4] = abi.encode(currency0, amount + 1, false, \"\");\n\n        vm.expectRevert(IPoolManager.MustClearExactPositiveDelta.selector);\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_clear_reverts_positiveDelta_inputLessThanDelta() external {\n        uint256 amount = 1e18;\n        Actions[] memory actions = new Actions[](5);\n        bytes[] memory params = new bytes[](5);\n\n        // Apply a positive delta.\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency0);\n\n        actions[1] = Actions.TRANSFER_FROM;\n        params[1] = abi.encode(currency0, address(this), address(manager), amount);\n\n        actions[2] = Actions.SETTLE;\n        params[2] = abi.encode(currency0);\n\n        actions[3] = Actions.ASSERT_DELTA_EQUALS;\n        params[3] = abi.encode(currency0, address(actionsRouter), amount);\n\n        // Clear for 1 less than the delta.\n        actions[4] = Actions.CLEAR;\n        params[4] = abi.encode(currency0, amount - 1, false, \"\");\n\n        vm.expectRevert(IPoolManager.MustClearExactPositiveDelta.selector);\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_clear_reverts_positiveDelta_inputZero() external {\n        uint256 amount = 1e18;\n        Actions[] memory actions = new Actions[](5);\n        bytes[] memory params = new bytes[](5);\n\n        // Apply a positive delta.\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency0);\n\n        actions[1] = Actions.TRANSFER_FROM;\n        params[1] = abi.encode(currency0, address(this), address(manager), amount);\n\n        actions[2] = Actions.SETTLE;\n        params[2] = abi.encode(currency0);\n\n        actions[3] = Actions.ASSERT_DELTA_EQUALS;\n        params[3] = abi.encode(currency0, address(actionsRouter), amount);\n\n        // Clear with 0.\n        actions[4] = Actions.CLEAR;\n        params[4] = abi.encode(currency0, 0, false, \"\");\n\n        vm.expectRevert(IPoolManager.MustClearExactPositiveDelta.selector);\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_clear_zeroDelta_inputZero_isUnchanged() external {\n        Actions[] memory actions = new Actions[](5);\n        bytes[] memory params = new bytes[](5);\n\n        actions[0] = Actions.ASSERT_NONZERO_DELTA_COUNT_EQUALS;\n        params[0] = abi.encode(0);\n\n        actions[1] = Actions.ASSERT_DELTA_EQUALS;\n        params[1] = abi.encode(currency0, address(actionsRouter), 0);\n\n        // Clear with 0.\n        actions[2] = Actions.CLEAR;\n        params[2] = abi.encode(currency0, 0, false, \"\");\n\n        actions[3] = Actions.ASSERT_DELTA_EQUALS;\n        params[3] = abi.encode(currency0, address(actionsRouter), 0);\n\n        actions[4] = Actions.ASSERT_NONZERO_DELTA_COUNT_EQUALS;\n        params[4] = abi.encode(0);\n\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_clear_reverts_zeroDelta_inputNonzero() external {\n        uint256 amount = 1e18;\n        Actions[] memory actions = new Actions[](3);\n        bytes[] memory params = new bytes[](3);\n\n        actions[0] = Actions.ASSERT_NONZERO_DELTA_COUNT_EQUALS;\n        params[0] = abi.encode(0);\n\n        actions[1] = Actions.ASSERT_DELTA_EQUALS;\n        params[1] = abi.encode(currency0, address(actionsRouter), 0);\n\n        // Clear with nonzero.\n        actions[2] = Actions.CLEAR;\n        params[2] = abi.encode(currency0, amount, false, \"\");\n\n        vm.expectRevert(IPoolManager.MustClearExactPositiveDelta.selector);\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_clear_positiveDelta_inputExact_succeeds() external {\n        uint256 amount = 1e18;\n        Actions[] memory actions = new Actions[](8);\n        bytes[] memory params = new bytes[](8);\n\n        // Apply a positive delta.\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency0);\n\n        actions[1] = Actions.TRANSFER_FROM;\n        params[1] = abi.encode(currency0, address(this), address(manager), amount);\n\n        actions[2] = Actions.SETTLE;\n        params[2] = abi.encode(currency0);\n\n        // Delta should be equal to the positive amount.\n        actions[3] = Actions.ASSERT_DELTA_EQUALS;\n        params[3] = abi.encode(currency0, address(actionsRouter), amount);\n\n        // Assert nonzero delta count is 1.\n        actions[4] = Actions.ASSERT_NONZERO_DELTA_COUNT_EQUALS;\n        params[4] = abi.encode(1);\n\n        // Clear the exact delta amount.\n        actions[5] = Actions.CLEAR;\n        params[5] = abi.encode(currency0, amount, false, \"\");\n\n        actions[6] = Actions.ASSERT_DELTA_EQUALS;\n        params[6] = abi.encode(currency0, address(actionsRouter), 0);\n\n        actions[7] = Actions.ASSERT_NONZERO_DELTA_COUNT_EQUALS;\n        params[7] = abi.encode(0);\n\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_clear_gas() external {\n        uint256 amount = 1e18;\n        Actions[] memory actions = new Actions[](8);\n        bytes[] memory params = new bytes[](8);\n\n        // Apply a positive delta.\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency0);\n\n        actions[1] = Actions.TRANSFER_FROM;\n        params[1] = abi.encode(currency0, address(this), address(manager), amount);\n\n        actions[2] = Actions.SETTLE;\n        params[2] = abi.encode(currency0);\n\n        // Delta should be equal to the positive amount.\n        actions[3] = Actions.ASSERT_DELTA_EQUALS;\n        params[3] = abi.encode(currency0, address(actionsRouter), amount);\n\n        // Assert nonzero delta count is 1.\n        actions[4] = Actions.ASSERT_NONZERO_DELTA_COUNT_EQUALS;\n        params[4] = abi.encode(1);\n\n        // Clear the exact delta amount.\n        actions[5] = Actions.CLEAR;\n        params[5] = abi.encode(currency0, amount, true, \"clear\");\n\n        actions[6] = Actions.ASSERT_DELTA_EQUALS;\n        params[6] = abi.encode(currency0, address(actionsRouter), 0);\n\n        actions[7] = Actions.ASSERT_NONZERO_DELTA_COUNT_EQUALS;\n        params[7] = abi.encode(0);\n\n        actionsRouter.executeActions(actions, params);\n    }\n}\n"
  },
  {
    "path": "test/PoolManager.gas.spec.ts",
    "content": "// import { ethers, waffle } from 'hardhat'\n// import { Wallet } from 'ethers'\n// import { PoolManager, PoolSwapTest, PoolDonateTest, PoolModifyPositionTest } from '../typechain'\n// import { expect } from './shared/expect'\n// import { ADDRESS_ZERO } from './shared/constants'\n//\n// import { tokensFixture } from './shared/fixtures'\n// import snapshotGasCost from '@uniswap/snapshot-gas-cost'\n//\n// import {\n//   expandTo18Decimals,\n//   FeeAmount,\n//   getMinTick,\n//   encodeSqrtPriceX96,\n//   TICK_SPACINGS,\n//   SwapFunction,\n//   ModifyPositionFunction,\n//   DonateFunction,\n//   getMaxTick,\n//   MaxUint128,\n//   SwapToPriceFunction,\n//   MIN_SQRT_PRICE,\n//   getPoolId,\n// } from './shared/utilities'\n//\n// const { constants } = ethers\n//\n// const createFixtureLoader = waffle.createFixtureLoader\n//\n// type AsyncReturnType<T extends (...args: any) => any> = T extends (...args: any) => Promise<infer U>\n//   ? U\n//   : T extends (...args: any) => infer U\n//   ? U\n//   : any\n//\n// describe('PoolManager gas tests', () => {\n//   let wallet: Wallet, other: Wallet\n//\n//   let loadFixture: ReturnType<typeof createFixtureLoader>\n//\n//   before('create fixture loader', async () => {\n//     ;[wallet, other] = await (ethers as any).getSigners()\n//     loadFixture = createFixtureLoader([wallet, other])\n//   })\n//\n//   const startingPrice = encodeSqrtPriceX96(100001, 100000)\n//   const startingTick = 0\n//   const feeAmount = FeeAmount.MEDIUM\n//   const tickSpacing = TICK_SPACINGS[feeAmount]\n//   const minTick = getMinTick(tickSpacing)\n//   const maxTick = getMaxTick(tickSpacing)\n//\n//   describe('ERC20 tokens', () => {\n//     const gasTestFixture = async ([wallet]: Wallet[]) => {\n//       const { currency0, currency1 } = await tokensFixture()\n//\n//       const singletonPoolFactory = await ethers.getContractFactory('PoolManager')\n//       const swapTestFactory = await ethers.getContractFactory('PoolSwapTest')\n//       const donateTestFactory = await ethers.getContractFactory('PoolDonateTest')\n//       const mintTestFactory = await ethers.getContractFactory('PoolModifyPositionTest')\n//       const CONTROLLER_GAS_LIMIT = 50000\n//       const manager = (await singletonPoolFactory.deploy(CONTROLLER_GAS_LIMIT)) as PoolManager\n//\n//       const swapTest = (await swapTestFactory.deploy(manager.address)) as PoolSwapTest\n//       const donateTest = (await donateTestFactory.deploy(manager.address)) as PoolDonateTest\n//       const modifyPositionTest = (await mintTestFactory.deploy(manager.address)) as PoolModifyPositionTest\n//\n//       for (const token of [currency0, currency1]) {\n//         for (const spender of [swapTest, donateTest, modifyPositionTest]) {\n//           await token.connect(wallet).approve(spender.address, constants.MaxUint256)\n//         }\n//       }\n//\n//       const poolKey = {\n//         currency0: currency0.address,\n//         currency1: currency1.address,\n//         fee: FeeAmount.MEDIUM,\n//         tickSpacing: 60,\n//         hooks: ADDRESS_ZERO,\n//       }\n//\n//       const swapExact0For1: SwapFunction = (amount, to, sqrtPriceLimitX96) => {\n//         return swapTest.swap(\n//           poolKey,\n//           {\n//             zeroForOne: true,\n//             amountSpecified: amount,\n//             sqrtPriceLimitX96: sqrtPriceLimitX96 ?? MIN_SQRT_PRICE.add(1),\n//           },\n//           {\n//             withdrawTokens: true,\n//             settleUsingTransfer: true,\n//           },\n//           '0x00'\n//         )\n//       }\n//       const swapToHigherPrice: SwapToPriceFunction = (sqrtPriceX96, to) => {\n//         return swapTest.swap(\n//           poolKey,\n//           {\n//             zeroForOne: false,\n//             amountSpecified: MaxUint128,\n//             sqrtPriceLimitX96: sqrtPriceX96,\n//           },\n//           {\n//             withdrawTokens: true,\n//             settleUsingTransfer: true,\n//           },\n//           '0x00'\n//         )\n//       }\n//       const swapToLowerPrice: SwapToPriceFunction = (sqrtPriceX96, to) => {\n//         return swapTest.swap(\n//           poolKey,\n//           {\n//             zeroForOne: true,\n//             amountSpecified: MaxUint128,\n//             sqrtPriceLimitX96: sqrtPriceX96,\n//           },\n//           {\n//             withdrawTokens: true,\n//             settleUsingTransfer: true,\n//           },\n//           '0x00'\n//         )\n//       }\n//       const modifyPosition: ModifyPositionFunction = (tickLower, tickUpper, liquidityDelta) => {\n//         return modifyPositionTest.modifyPosition(\n//           poolKey,\n//           {\n//             tickLower,\n//             tickUpper,\n//             liquidityDelta,\n//           },\n//           '0x00'\n//         )\n//       }\n//       const donate: DonateFunction = (amount0, amount1) => {\n//         return donateTest.donate(poolKey, amount0, amount1, '0x00')\n//       }\n//       const getSlot0 = async () => {\n//         return await manager.getSlot0(getPoolId(poolKey))\n//       }\n//\n//       await manager.initialize(poolKey, encodeSqrtPriceX96(1, 1), '0x00')\n//\n//       await modifyPosition(minTick, maxTick, expandTo18Decimals(2))\n//\n//       await swapExact0For1(expandTo18Decimals(1), wallet.address)\n//       await swapToHigherPrice(startingPrice, wallet.address)\n//\n//       const { tick, sqrtPriceX96 } = await getSlot0()\n//\n//       expect(tick).to.eq(startingTick)\n//       expect(sqrtPriceX96).to.eq(startingPrice)\n//\n//       return { manager, getSlot0, poolKey, swapExact0For1, modifyPosition, donate, swapToHigherPrice, swapToLowerPrice }\n//     }\n//\n//     let swapExact0For1: SwapFunction\n//     let swapToHigherPrice: SwapToPriceFunction\n//     let swapToLowerPrice: SwapToPriceFunction\n//     let manager: PoolManager\n//     let modifyPosition: ModifyPositionFunction\n//     let donate: DonateFunction\n//     let getSlot0: AsyncReturnType<typeof gasTestFixture>['getSlot0']\n//     let poolKey: AsyncReturnType<typeof gasTestFixture>['poolKey']\n//\n//     beforeEach('load the fixture', async () => {\n//       ;({ swapExact0For1, manager, modifyPosition, donate, swapToHigherPrice, swapToLowerPrice, getSlot0, poolKey } =\n//         await loadFixture(gasTestFixture))\n//     })\n//\n//     describe('#initialize', () => {\n//       it('initialize pool with no hooks and no protocol fee', async () => {\n//         let currency0 = wallet.address\n//         let currency1 = other.address\n//\n//         ;[currency0, currency1] = currency0 < currency1 ? [currency0, currency1] : [currency1, currency0]\n//\n//         const altPoolKey = {\n//           currency0,\n//           currency1,\n//           fee: FeeAmount.MEDIUM,\n//           tickSpacing: 60,\n//           hooks: '0x0000000000000000000000000000000000000000',\n//         }\n//         await snapshotGasCost(manager.initialize(altPoolKey, encodeSqrtPriceX96(1, 1), '0x00'))\n//       })\n//     })\n//\n//     describe('#swapExact0For1', () => {\n//       it('first swap in block with no tick movement', async () => {\n//         await snapshotGasCost(swapExact0For1(2000, wallet.address))\n//         expect((await getSlot0()).sqrtPriceX96).to.not.eq(startingPrice)\n//         expect((await getSlot0()).tick).to.eq(startingTick)\n//       })\n//\n//       it('first swap in block moves tick, no initialized crossings', async () => {\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address))\n//         expect((await getSlot0()).tick).to.eq(startingTick - 1)\n//       })\n//\n//       it('second swap in block with no tick movement', async () => {\n//         await swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address)\n//         expect((await getSlot0()).tick).to.eq(startingTick - 1)\n//         await snapshotGasCost(swapExact0For1(2000, wallet.address))\n//         expect((await getSlot0()).tick).to.eq(startingTick - 1)\n//       })\n//\n//       it('second swap in block moves tick, no initialized crossings', async () => {\n//         await swapExact0For1(1000, wallet.address)\n//         expect((await getSlot0()).tick).to.eq(startingTick)\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address))\n//         expect((await getSlot0()).tick).to.eq(startingTick - 1)\n//       })\n//\n//       it('first swap in block, large swap, no initialized crossings', async () => {\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(10), wallet.address))\n//         expect((await getSlot0()).tick).to.eq(-35787)\n//       })\n//\n//       it('first swap in block, large swap crossing several initialized ticks', async () => {\n//         await modifyPosition(startingTick - 3 * tickSpacing, startingTick - tickSpacing, expandTo18Decimals(1))\n//         await modifyPosition(startingTick - 4 * tickSpacing, startingTick - 2 * tickSpacing, expandTo18Decimals(1))\n//         expect((await getSlot0()).tick).to.eq(startingTick)\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1), wallet.address))\n//         expect((await getSlot0()).tick).to.be.lt(startingTick - 4 * tickSpacing) // we crossed the last tick\n//       })\n//\n//       it('first swap in block, large swap crossing a single initialized tick', async () => {\n//         await modifyPosition(minTick, startingTick - 2 * tickSpacing, expandTo18Decimals(1))\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1), wallet.address))\n//         expect((await getSlot0()).tick).to.be.lt(startingTick - 2 * tickSpacing) // we crossed the last tick\n//       })\n//\n//       it('second swap in block, large swap crossing several initialized ticks', async () => {\n//         await modifyPosition(startingTick - 3 * tickSpacing, startingTick - tickSpacing, expandTo18Decimals(1))\n//         await modifyPosition(startingTick - 4 * tickSpacing, startingTick - 2 * tickSpacing, expandTo18Decimals(1))\n//         await swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address)\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1), wallet.address))\n//         expect((await getSlot0()).tick).to.be.lt(startingTick - 4 * tickSpacing)\n//       })\n//\n//       it('second swap in block, large swap crossing a single initialized tick', async () => {\n//         await modifyPosition(minTick, startingTick - 2 * tickSpacing, expandTo18Decimals(1))\n//         await swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address)\n//         expect((await getSlot0()).tick).to.be.gt(startingTick - 2 * tickSpacing) // we didn't cross the initialized tick\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1), wallet.address))\n//         expect((await getSlot0()).tick).to.be.lt(startingTick - 2 * tickSpacing) // we crossed the last tick\n//       })\n//     })\n//\n//     describe('#mint', () => {\n//       for (const { description, tickLower, tickUpper } of [\n//         {\n//           description: 'around current price',\n//           tickLower: startingTick - tickSpacing,\n//           tickUpper: startingTick + tickSpacing,\n//         },\n//         {\n//           description: 'below current price',\n//           tickLower: startingTick - 2 * tickSpacing,\n//           tickUpper: startingTick - tickSpacing,\n//         },\n//         {\n//           description: 'above current price',\n//           tickLower: startingTick + tickSpacing,\n//           tickUpper: startingTick + 2 * tickSpacing,\n//         },\n//       ]) {\n//         describe(description, () => {\n//           it('new position mint first in range', async () => {\n//             await snapshotGasCost(modifyPosition(tickLower, tickUpper, expandTo18Decimals(1)))\n//           })\n//           it('add to position existing', async () => {\n//             await modifyPosition(tickLower, tickUpper, expandTo18Decimals(1))\n//             await snapshotGasCost(modifyPosition(tickLower, tickUpper, expandTo18Decimals(1)))\n//           })\n//           it('second position in same range', async () => {\n//             await modifyPosition(tickLower, tickUpper, expandTo18Decimals(1))\n//             await snapshotGasCost(modifyPosition(tickLower, tickUpper, expandTo18Decimals(1)))\n//           })\n//         })\n//       }\n//     })\n//\n//     // describe('#burn', () => {\n//     //   for (const { description, tickLower, tickUpper } of [\n//     //     {\n//     //       description: 'around current price',\n//     //       tickLower: startingTick - tickSpacing,\n//     //       tickUpper: startingTick + tickSpacing,\n//     //     },\n//     //     {\n//     //       description: 'below current price',\n//     //       tickLower: startingTick - 2 * tickSpacing,\n//     //       tickUpper: startingTick - tickSpacing,\n//     //     },\n//     //     {\n//     //       description: 'above current price',\n//     //       tickLower: startingTick + tickSpacing,\n//     //       tickUpper: startingTick + 2 * tickSpacing,\n//     //     },\n//     //   ]) {\n//     //     describe(description, () => {\n//     //       const liquidityAmount = expandTo18Decimals(1)\n//     //       beforeEach('mint a position', async () => {\n//     //         await modifyPosition( tickLower, tickUpper, liquidityAmount)\n//     //       })\n//     //\n//     //       it('burn when only position using ticks', async () => {\n//     //         await snapshotGasCost(pool.burn(tickLower, tickUpper, expandTo18Decimals(1)))\n//     //       })\n//     //       it('partial position burn', async () => {\n//     //         await snapshotGasCost(pool.burn(tickLower, tickUpper, expandTo18Decimals(1).div(2)))\n//     //       })\n//     //       it('entire position burn but other positions are using the ticks', async () => {\n//     //         await mint(other.address, tickLower, tickUpper, expandTo18Decimals(1))\n//     //         await snapshotGasCost(pool.burn(tickLower, tickUpper, expandTo18Decimals(1)))\n//     //       })\n//     //       it('burn entire position after some time passes', async () => {\n//     //         await manager.advanceTime(1)\n//     //         await snapshotGasCost(pool.burn(tickLower, tickUpper, expandTo18Decimals(1)))\n//     //       })\n//     //     })\n//     //   }\n//     // })\n//\n//     // describe('#poke', () => {\n//     //   const tickLower = startingTick - tickSpacing\n//     //   const tickUpper = startingTick + tickSpacing\n//     //\n//     //   it('best case', async () => {\n//     //     await modifyPosition( tickLower, tickUpper, expandTo18Decimals(1))\n//     //     await swapExact0For1(expandTo18Decimals(1).div(100), wallet.address)\n//     //     await pool.burn(tickLower, tickUpper, 0)\n//     //     await swapExact0For1(expandTo18Decimals(1).div(100), wallet.address)\n//     //     await snapshotGasCost(pool.burn(tickLower, tickUpper, 0))\n//     //   })\n//     // })\n//   })\n//\n//   describe('Native Tokens', () => {\n//     const gasTestFixture = async ([wallet]: Wallet[]) => {\n//       const { currency1 } = await tokensFixture()\n//\n//       const singletonPoolFactory = await ethers.getContractFactory('PoolManager')\n//       const swapTestFactory = await ethers.getContractFactory('PoolSwapTest')\n//       const donateTestFactory = await ethers.getContractFactory('PoolDonateTest')\n//       const mintTestFactory = await ethers.getContractFactory('PoolModifyPositionTest')\n//       const CONTROLLER_GAS_LIMIT = 50000\n//       const manager = (await singletonPoolFactory.deploy(CONTROLLER_GAS_LIMIT)) as PoolManager\n//\n//       const swapTest = (await swapTestFactory.deploy(manager.address)) as PoolSwapTest\n//       const donateTest = (await donateTestFactory.deploy(manager.address)) as PoolDonateTest\n//       const modifyPositionTest = (await mintTestFactory.deploy(manager.address)) as PoolModifyPositionTest\n//\n//       for (const spender of [swapTest, donateTest, modifyPositionTest]) {\n//         await currency1.connect(wallet).approve(spender.address, constants.MaxUint256)\n//       }\n//\n//       const poolKey = {\n//         currency0: ADDRESS_ZERO,\n//         currency1: currency1.address,\n//         fee: FeeAmount.MEDIUM,\n//         tickSpacing: 60,\n//         hooks: ADDRESS_ZERO,\n//       }\n//\n//       const swapExact0For1: SwapFunction = (amount, to, sqrtPriceLimitX96) => {\n//         return swapTest.swap(\n//           poolKey,\n//           {\n//             zeroForOne: true,\n//             amountSpecified: amount,\n//             sqrtPriceLimitX96: sqrtPriceLimitX96 ?? MIN_SQRT_PRICE.add(1),\n//           },\n//           {\n//             withdrawTokens: true,\n//             settleUsingTransfer: true,\n//           },\n//           '0x00',\n//           {\n//             value: amount,\n//           }\n//         )\n//       }\n//       const swapToHigherPrice: SwapToPriceFunction = (sqrtPriceX96, to) => {\n//         return swapTest.swap(\n//           poolKey,\n//           {\n//             zeroForOne: false,\n//             amountSpecified: MaxUint128,\n//             sqrtPriceLimitX96: sqrtPriceX96,\n//           },\n//           {\n//             withdrawTokens: true,\n//             settleUsingTransfer: true,\n//           },\n//           '0x00'\n//         )\n//       }\n//       const swapToLowerPrice: SwapToPriceFunction = (sqrtPriceX96, to) => {\n//         return swapTest.swap(\n//           poolKey,\n//           {\n//             zeroForOne: true,\n//             amountSpecified: MaxUint128,\n//             sqrtPriceLimitX96: sqrtPriceX96,\n//           },\n//           {\n//             withdrawTokens: true,\n//             settleUsingTransfer: true,\n//           },\n//           '0x00',\n//           {\n//             value: MaxUint128,\n//           }\n//         )\n//       }\n//       const modifyPosition: ModifyPositionFunction = (tickLower, tickUpper, liquidityDelta) => {\n//         return modifyPositionTest.modifyPosition(\n//           poolKey,\n//           {\n//             tickLower,\n//             tickUpper,\n//             liquidityDelta,\n//           },\n//           '0x00',\n//           { value: liquidityDelta }\n//         )\n//       }\n//       const donate: DonateFunction = (amount0, amount1) => {\n//         return donateTest.donate(poolKey, amount0, amount1, '0x00', { value: amount0 })\n//       }\n//       const getSlot0 = async () => {\n//         return await manager.getSlot0(getPoolId(poolKey))\n//       }\n//\n//       await manager.initialize(poolKey, encodeSqrtPriceX96(1, 1), '0x00')\n//\n//       await modifyPosition(minTick, maxTick, expandTo18Decimals(2))\n//\n//       await swapExact0For1(expandTo18Decimals(1), wallet.address)\n//       await swapToHigherPrice(startingPrice, wallet.address)\n//\n//       const { tick, sqrtPriceX96 } = await getSlot0()\n//\n//       expect(tick).to.eq(startingTick)\n//       expect(sqrtPriceX96).to.eq(startingPrice)\n//\n//       return { manager, getSlot0, poolKey, swapExact0For1, modifyPosition, donate, swapToHigherPrice, swapToLowerPrice }\n//     }\n//\n//     let swapExact0For1: SwapFunction\n//     let swapToHigherPrice: SwapToPriceFunction\n//     let swapToLowerPrice: SwapToPriceFunction\n//     let manager: PoolManager\n//     let modifyPosition: ModifyPositionFunction\n//     let donate: DonateFunction\n//     let getSlot0: AsyncReturnType<typeof gasTestFixture>['getSlot0']\n//     let poolKey: AsyncReturnType<typeof gasTestFixture>['poolKey']\n//\n//     beforeEach('load the fixture', async () => {\n//       ;({ swapExact0For1, manager, modifyPosition, donate, swapToHigherPrice, swapToLowerPrice, getSlot0, poolKey } =\n//         await loadFixture(gasTestFixture))\n//     })\n//\n//     describe('#swapExact0For1', () => {\n//       it('first swap in block with no tick movement', async () => {\n//         await snapshotGasCost(swapExact0For1(2000, wallet.address))\n//         expect((await getSlot0()).sqrtPriceX96).to.not.eq(startingPrice)\n//         expect((await getSlot0()).tick).to.eq(startingTick)\n//       })\n//\n//       it('first swap in block moves tick, no initialized crossings', async () => {\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address))\n//         expect((await getSlot0()).tick).to.eq(startingTick - 1)\n//       })\n//\n//       it('second swap in block with no tick movement', async () => {\n//         await swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address)\n//         expect((await getSlot0()).tick).to.eq(startingTick - 1)\n//         await snapshotGasCost(swapExact0For1(2000, wallet.address))\n//         expect((await getSlot0()).tick).to.eq(startingTick - 1)\n//       })\n//\n//       it('second swap in block moves tick, no initialized crossings', async () => {\n//         await swapExact0For1(1000, wallet.address)\n//         expect((await getSlot0()).tick).to.eq(startingTick)\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address))\n//         expect((await getSlot0()).tick).to.eq(startingTick - 1)\n//       })\n//\n//       it('first swap in block, large swap, no initialized crossings', async () => {\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(10), wallet.address))\n//         expect((await getSlot0()).tick).to.eq(-35787)\n//       })\n//\n//       it('first swap in block, large swap crossing several initialized ticks', async () => {\n//         await modifyPosition(startingTick - 3 * tickSpacing, startingTick - tickSpacing, expandTo18Decimals(1))\n//         await modifyPosition(startingTick - 4 * tickSpacing, startingTick - 2 * tickSpacing, expandTo18Decimals(1))\n//         expect((await getSlot0()).tick).to.eq(startingTick)\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1), wallet.address))\n//         expect((await getSlot0()).tick).to.be.lt(startingTick - 4 * tickSpacing) // we crossed the last tick\n//       })\n//\n//       it('first swap in block, large swap crossing a single initialized tick', async () => {\n//         await modifyPosition(minTick, startingTick - 2 * tickSpacing, expandTo18Decimals(1))\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1), wallet.address))\n//         expect((await getSlot0()).tick).to.be.lt(startingTick - 2 * tickSpacing) // we crossed the last tick\n//       })\n//\n//       it('second swap in block, large swap crossing several initialized ticks', async () => {\n//         await modifyPosition(startingTick - 3 * tickSpacing, startingTick - tickSpacing, expandTo18Decimals(1))\n//         await modifyPosition(startingTick - 4 * tickSpacing, startingTick - 2 * tickSpacing, expandTo18Decimals(1))\n//         await swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address)\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1), wallet.address))\n//         expect((await getSlot0()).tick).to.be.lt(startingTick - 4 * tickSpacing)\n//       })\n//\n//       it('second swap in block, large swap crossing a single initialized tick', async () => {\n//         await modifyPosition(minTick, startingTick - 2 * tickSpacing, expandTo18Decimals(1))\n//         await swapExact0For1(expandTo18Decimals(1).div(10000), wallet.address)\n//         expect((await getSlot0()).tick).to.be.gt(startingTick - 2 * tickSpacing) // we didn't cross the initialized tick\n//         await snapshotGasCost(swapExact0For1(expandTo18Decimals(1), wallet.address))\n//         expect((await getSlot0()).tick).to.be.lt(startingTick - 2 * tickSpacing) // we crossed the last tick\n//       })\n//     })\n//\n//     describe('#mint', () => {\n//       for (const { description, tickLower, tickUpper } of [\n//         {\n//           description: 'around current price',\n//           tickLower: startingTick - tickSpacing,\n//           tickUpper: startingTick + tickSpacing,\n//         },\n//         {\n//           description: 'below current price',\n//           tickLower: startingTick - 2 * tickSpacing,\n//           tickUpper: startingTick - tickSpacing,\n//         },\n//         {\n//           description: 'above current price',\n//           tickLower: startingTick + tickSpacing,\n//           tickUpper: startingTick + 2 * tickSpacing,\n//         },\n//       ]) {\n//         describe(description, () => {\n//           it('new position mint first in range', async () => {\n//             await snapshotGasCost(modifyPosition(tickLower, tickUpper, expandTo18Decimals(1)))\n//           })\n//           it('add to position existing', async () => {\n//             await modifyPosition(tickLower, tickUpper, expandTo18Decimals(1))\n//             await snapshotGasCost(modifyPosition(tickLower, tickUpper, expandTo18Decimals(1)))\n//           })\n//           it('second position in same range', async () => {\n//             await modifyPosition(tickLower, tickUpper, expandTo18Decimals(1))\n//             await snapshotGasCost(modifyPosition(tickLower, tickUpper, expandTo18Decimals(1)))\n//           })\n//         })\n//       }\n//     })\n//   })\n// })\n"
  },
  {
    "path": "test/PoolManager.swap.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport \"forge-std/Test.sol\";\nimport {V3Helper, IUniswapV3Pool, IUniswapV3MintCallback, IUniswapV3SwapCallback} from \"./utils/V3Helper.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {Fuzzers} from \"../src/test/Fuzzers.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary, toBalanceDelta} from \"../src/types/BalanceDelta.sol\";\nimport {PoolSwapTest} from \"../src/test/PoolSwapTest.sol\";\nimport {PoolKey} from \"../src/types/PoolKey.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../src/types/PoolOperation.sol\";\nimport {SqrtPriceMath} from \"../src/libraries/SqrtPriceMath.sol\";\nimport {TickMath} from \"../src/libraries/TickMath.sol\";\nimport {SafeCast} from \"../src/libraries/SafeCast.sol\";\nimport {LiquidityAmounts} from \"./utils/LiquidityAmounts.sol\";\n\nabstract contract V3Fuzzer is V3Helper, Deployers, Fuzzers, IUniswapV3MintCallback, IUniswapV3SwapCallback {\n    function setUp() public virtual override {\n        super.setUp();\n        deployFreshManagerAndRouters();\n        deployMintAndApprove2Currencies();\n    }\n\n    function initPools(uint24 fee, int24 tickSpacing, int256 sqrtPriceX96seed)\n        internal\n        returns (IUniswapV3Pool v3Pool, PoolKey memory key_, uint160 sqrtPriceX96)\n    {\n        fee = uint24(bound(fee, 0, 999999));\n        tickSpacing = int24(bound(tickSpacing, 1, 16383));\n        // v3 pools don't allow overwriting existing fees, 500, 3000, 10000 are set by default in the constructor\n        if (fee == 500) tickSpacing = 10;\n        else if (fee == 3000) tickSpacing = 60;\n        else if (fee == 10000) tickSpacing = 200;\n        else v3Factory.enableFeeAmount(fee, tickSpacing);\n\n        sqrtPriceX96 = createRandomSqrtPriceX96(tickSpacing, sqrtPriceX96seed);\n\n        v3Pool = IUniswapV3Pool(v3Factory.createPool(Currency.unwrap(currency0), Currency.unwrap(currency1), fee));\n        v3Pool.initialize(sqrtPriceX96);\n\n        key_ = PoolKey(currency0, currency1, fee, tickSpacing, IHooks(address(0)));\n        manager.initialize(key_, sqrtPriceX96);\n    }\n\n    function addLiquidity(\n        IUniswapV3Pool v3Pool,\n        PoolKey memory key_,\n        uint160 sqrtPriceX96,\n        int24 lowerTickUnsanitized,\n        int24 upperTickUnsanitized,\n        int256 liquidityDeltaUnbound,\n        bool tight\n    ) internal {\n        ModifyLiquidityParams memory v4LiquidityParams = ModifyLiquidityParams({\n            tickLower: lowerTickUnsanitized,\n            tickUpper: upperTickUnsanitized,\n            liquidityDelta: liquidityDeltaUnbound,\n            salt: 0\n        });\n\n        v4LiquidityParams = tight\n            ? createFuzzyLiquidityParamsWithTightBound(key_, v4LiquidityParams, sqrtPriceX96, 20)\n            : createFuzzyLiquidityParams(key_, v4LiquidityParams, sqrtPriceX96);\n\n        v3Pool.mint(\n            address(this),\n            v4LiquidityParams.tickLower,\n            v4LiquidityParams.tickUpper,\n            uint128(int128(v4LiquidityParams.liquidityDelta)),\n            \"\"\n        );\n\n        modifyLiquidityRouter.modifyLiquidity(key_, v4LiquidityParams, \"\");\n    }\n\n    function swap(IUniswapV3Pool pool, PoolKey memory key_, bool zeroForOne, int128 amountSpecified)\n        internal\n        returns (int256 amount0Diff, int256 amount1Diff)\n    {\n        if (amountSpecified == 0) amountSpecified = 1;\n        if (amountSpecified == type(int128).min) amountSpecified = type(int128).min + 1;\n        // v3 swap\n        (int256 amount0Delta, int256 amount1Delta) = pool.swap(\n            // invert amountSpecified because v3 swaps use inverted signs\n            address(this),\n            zeroForOne,\n            amountSpecified * -1,\n            zeroForOne ? MIN_PRICE_LIMIT : MAX_PRICE_LIMIT,\n            \"\"\n        );\n        // v3 can handle bigger numbers than v4, so if we exceed int128, check that the next call reverts\n        bool overflows = false;\n        if (\n            amount0Delta > type(int128).max || amount1Delta > type(int128).max || amount0Delta < type(int128).min\n                || amount1Delta < type(int128).min\n        ) {\n            overflows = true;\n        }\n        // v4 swap\n        SwapParams memory swapParams = SwapParams({\n            zeroForOne: zeroForOne,\n            amountSpecified: amountSpecified,\n            sqrtPriceLimitX96: zeroForOne ? MIN_PRICE_LIMIT : MAX_PRICE_LIMIT\n        });\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        BalanceDelta delta;\n        try swapRouter.swap(key_, swapParams, testSettings, \"\") returns (BalanceDelta delta_) {\n            delta = delta_;\n        } catch (bytes memory reason) {\n            require(overflows, \"v4 should not overflow\");\n            assertEq(bytes4(reason), SafeCast.SafeCastOverflow.selector);\n            delta = toBalanceDelta(0, 0);\n            amount0Delta = 0;\n            amount1Delta = 0;\n        }\n\n        // because signs for v3 and v4 swaps are inverted, add values up to get the difference\n        amount0Diff = amount0Delta + delta.amount0();\n        amount1Diff = amount1Delta + delta.amount1();\n    }\n\n    function uniswapV3MintCallback(uint256 amount0Owed, uint256 amount1Owed, bytes calldata) external {\n        currency0.transfer(msg.sender, amount0Owed);\n        currency1.transfer(msg.sender, amount1Owed);\n    }\n\n    function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata) external {\n        if (amount0Delta > 0) currency0.transfer(msg.sender, uint256(amount0Delta));\n        if (amount1Delta > 0) currency1.transfer(msg.sender, uint256(amount1Delta));\n    }\n}\n\ncontract V3SwapTests is V3Fuzzer {\n    function test_shouldSwapEqual(\n        uint24 feeSeed,\n        int24 tickSpacingSeed,\n        int24 lowerTickUnsanitized,\n        int24 upperTickUnsanitized,\n        int256 liquidityDeltaUnbound,\n        int256 sqrtPriceX96seed,\n        int128 swapAmount,\n        bool zeroForOne\n    ) public {\n        (IUniswapV3Pool pool, PoolKey memory key_, uint160 sqrtPriceX96) =\n            initPools(feeSeed, tickSpacingSeed, sqrtPriceX96seed);\n        addLiquidity(pool, key_, sqrtPriceX96, lowerTickUnsanitized, upperTickUnsanitized, liquidityDeltaUnbound, false);\n        (int256 amount0Diff, int256 amount1Diff) = swap(pool, key_, zeroForOne, swapAmount);\n        assertEq(amount0Diff, 0);\n        assertEq(amount1Diff, 0);\n    }\n\n    struct TightLiquidityParams {\n        int24 lowerTickUnsanitized;\n        int24 upperTickUnsanitized;\n        int256 liquidityDeltaUnbound;\n    }\n\n    function test_shouldSwapEqualMultipleLP(\n        uint24 feeSeed,\n        int24 tickSpacingSeed,\n        TightLiquidityParams[] memory liquidityParams,\n        int256 sqrtPriceX96seed,\n        int128 swapAmount,\n        bool zeroForOne\n    ) public {\n        (IUniswapV3Pool pool, PoolKey memory key_, uint160 sqrtPriceX96) =\n            initPools(feeSeed, tickSpacingSeed, sqrtPriceX96seed);\n        for (uint256 i = 0; i < liquidityParams.length; ++i) {\n            if (i == 20) break;\n            addLiquidity(\n                pool,\n                key_,\n                sqrtPriceX96,\n                liquidityParams[i].lowerTickUnsanitized,\n                liquidityParams[i].upperTickUnsanitized,\n                liquidityParams[i].liquidityDeltaUnbound,\n                true\n            );\n        }\n\n        (int256 amount0Diff, int256 amount1Diff) = swap(pool, key_, zeroForOne, swapAmount);\n        assertEq(amount0Diff, 0);\n        assertEq(amount1Diff, 0);\n    }\n}\n"
  },
  {
    "path": "test/PoolManager.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {Hooks} from \"../src/libraries/Hooks.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {IProtocolFees} from \"../src/interfaces/IProtocolFees.sol\";\nimport {PoolManager} from \"../src/PoolManager.sol\";\nimport {TickMath} from \"../src/libraries/TickMath.sol\";\nimport {Pool} from \"../src/libraries/Pool.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {Currency, CurrencyLibrary} from \"../src/types/Currency.sol\";\nimport {MockHooks} from \"../src/test/MockHooks.sol\";\nimport {MockContract} from \"../src/test/MockContract.sol\";\nimport {EmptyTestHooks} from \"../src/test/EmptyTestHooks.sol\";\nimport {PoolKey} from \"../src/types/PoolKey.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../src/types/PoolOperation.sol\";\nimport {PoolModifyLiquidityTest} from \"../src/test/PoolModifyLiquidityTest.sol\";\nimport {BalanceDelta, BalanceDeltaLibrary} from \"../src/types/BalanceDelta.sol\";\nimport {PoolSwapTest} from \"../src/test/PoolSwapTest.sol\";\nimport {TestInvalidERC20} from \"../src/test/TestInvalidERC20.sol\";\nimport {PoolEmptyUnlockTest} from \"../src/test/PoolEmptyUnlockTest.sol\";\nimport {Action} from \"../src/test/PoolNestedActionsTest.sol\";\nimport {PoolId} from \"../src/types/PoolId.sol\";\nimport {LPFeeLibrary} from \"../src/libraries/LPFeeLibrary.sol\";\nimport {Position} from \"../src/libraries/Position.sol\";\nimport {Constants} from \"./utils/Constants.sol\";\nimport {SafeCast} from \"../src/libraries/SafeCast.sol\";\nimport {AmountHelpers} from \"./utils/AmountHelpers.sol\";\nimport {ProtocolFeeLibrary} from \"../src/libraries/ProtocolFeeLibrary.sol\";\nimport {IProtocolFees} from \"../src/interfaces/IProtocolFees.sol\";\nimport {StateLibrary} from \"../src/libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"../src/libraries/TransientStateLibrary.sol\";\nimport {Actions} from \"../src/test/ActionsRouter.sol\";\nimport {CustomRevert} from \"../src/libraries/CustomRevert.sol\";\n\ncontract PoolManagerTest is Test, Deployers {\n    using Hooks for IHooks;\n    using LPFeeLibrary for uint24;\n    using SafeCast for *;\n    using ProtocolFeeLibrary for uint24;\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n\n    event UnlockCallback();\n    event ProtocolFeeControllerUpdated(address feeController);\n    event ModifyLiquidity(\n        PoolId indexed poolId,\n        address indexed sender,\n        int24 tickLower,\n        int24 tickUpper,\n        int256 liquidityDelta,\n        bytes32 salt\n    );\n    event Swap(\n        PoolId indexed poolId,\n        address indexed sender,\n        int128 amount0,\n        int128 amount1,\n        uint160 sqrtPriceX96,\n        uint128 liquidity,\n        int24 tick,\n        uint24 fee\n    );\n\n    event Donate(PoolId indexed id, address indexed sender, uint256 amount0, uint256 amount1);\n\n    event Transfer(\n        address caller, address indexed sender, address indexed receiver, uint256 indexed id, uint256 amount\n    );\n\n    PoolEmptyUnlockTest emptyUnlockRouter;\n\n    uint24 constant MAX_PROTOCOL_FEE_BOTH_TOKENS = (1000 << 12) | 1000; // 1000 1000\n\n    address recipientAddress = makeAddr(\"recipientAddress\");\n\n    function setUp() public {\n        initializeManagerRoutersAndPoolsWithLiq(IHooks(address(0)));\n\n        emptyUnlockRouter = new PoolEmptyUnlockTest(manager);\n    }\n\n    function test_bytecodeSize() public {\n        vm.snapshotValue(\"poolManager bytecode size\", address(manager).code.length);\n    }\n\n    function test_initcodeHash() public {\n        vm.snapshotValue(\n            \"poolManager initcode hash (without constructor params, as uint256)\",\n            uint256(keccak256(type(PoolManager).creationCode))\n        );\n    }\n\n    function test_addLiquidity_failsIfNotInitialized() public {\n        vm.expectRevert(Pool.PoolNotInitialized.selector);\n        modifyLiquidityRouter.modifyLiquidity(uninitializedKey, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_addLiquidity_failsIfLocked() public {\n        vm.expectRevert(IPoolManager.ManagerLocked.selector);\n        manager.modifyLiquidity(uninitializedKey, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_removeLiquidity_failsIfNotInitialized() public {\n        vm.expectRevert(Pool.PoolNotInitialized.selector);\n        modifyLiquidityRouter.modifyLiquidity(uninitializedKey, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_removeLiquidity_failsIfLocked() public {\n        vm.expectRevert(IPoolManager.ManagerLocked.selector);\n        manager.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_addLiquidity_succeedsIfInitialized(uint160 sqrtPriceX96) public {\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        vm.expectEmit(true, true, false, true, address(manager));\n        emit ModifyLiquidity(\n            key.toId(),\n            address(modifyLiquidityRouter),\n            LIQUIDITY_PARAMS.tickLower,\n            LIQUIDITY_PARAMS.tickUpper,\n            LIQUIDITY_PARAMS.liquidityDelta,\n            LIQUIDITY_PARAMS.salt\n        );\n\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_removeLiquidity_succeedsIfInitialized(uint160 sqrtPriceX96) public {\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        vm.expectEmit(true, true, false, true, address(manager));\n        emit ModifyLiquidity(\n            key.toId(),\n            address(modifyLiquidityRouter),\n            REMOVE_LIQUIDITY_PARAMS.tickLower,\n            REMOVE_LIQUIDITY_PARAMS.tickUpper,\n            REMOVE_LIQUIDITY_PARAMS.liquidityDelta,\n            LIQUIDITY_PARAMS.salt\n        );\n\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_addLiquidity_succeedsForNativeTokensIfInitialized(uint160 sqrtPriceX96) public {\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        vm.expectEmit(true, true, false, true, address(manager));\n        emit ModifyLiquidity(\n            nativeKey.toId(),\n            address(modifyLiquidityRouter),\n            LIQUIDITY_PARAMS.tickLower,\n            LIQUIDITY_PARAMS.tickUpper,\n            LIQUIDITY_PARAMS.liquidityDelta,\n            LIQUIDITY_PARAMS.salt\n        );\n\n        modifyLiquidityRouter.modifyLiquidity{value: 1 ether}(nativeKey, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_removeLiquidity_succeedsForNativeTokensIfInitialized(uint160 sqrtPriceX96) public {\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        vm.expectEmit(true, true, false, true, address(manager));\n        emit ModifyLiquidity(\n            nativeKey.toId(),\n            address(modifyLiquidityRouter),\n            REMOVE_LIQUIDITY_PARAMS.tickLower,\n            REMOVE_LIQUIDITY_PARAMS.tickUpper,\n            REMOVE_LIQUIDITY_PARAMS.liquidityDelta,\n            LIQUIDITY_PARAMS.salt\n        );\n\n        modifyLiquidityRouter.modifyLiquidity{value: 1 ether}(nativeKey, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_addLiquidity_succeedsWithHooksIfInitialized(uint160 sqrtPriceX96) public {\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        address payable mockAddr =\n            payable(address(uint160(Hooks.BEFORE_ADD_LIQUIDITY_FLAG | Hooks.AFTER_ADD_LIQUIDITY_FLAG)));\n        address payable hookAddr = payable(Constants.ALL_HOOKS);\n\n        vm.etch(hookAddr, vm.getDeployedCode(\"EmptyTestHooks.sol:EmptyTestHooks\"));\n        MockContract mockContract = new MockContract();\n        vm.etch(mockAddr, address(mockContract).code);\n\n        MockContract(mockAddr).setImplementation(hookAddr);\n\n        (key,) = initPool(currency0, currency1, IHooks(mockAddr), 3000, sqrtPriceX96);\n\n        BalanceDelta balanceDelta = modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        bytes32 beforeSelector = MockHooks.beforeAddLiquidity.selector;\n        bytes memory beforeParams = abi.encode(address(modifyLiquidityRouter), key, LIQUIDITY_PARAMS, ZERO_BYTES);\n        bytes32 afterSelector = MockHooks.afterAddLiquidity.selector;\n        bytes memory afterParams = abi.encode(\n            address(modifyLiquidityRouter),\n            key,\n            LIQUIDITY_PARAMS,\n            balanceDelta,\n            BalanceDeltaLibrary.ZERO_DELTA,\n            ZERO_BYTES\n        );\n\n        assertEq(MockContract(mockAddr).timesCalledSelector(beforeSelector), 1);\n        assertTrue(MockContract(mockAddr).calledWithSelector(beforeSelector, beforeParams));\n        assertEq(MockContract(mockAddr).timesCalledSelector(afterSelector), 1);\n        assertTrue(MockContract(mockAddr).calledWithSelector(afterSelector, afterParams));\n    }\n\n    function test_removeLiquidity_succeedsWithHooksIfInitialized(uint160 sqrtPriceX96) public {\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        address payable mockAddr =\n            payable(address(uint160(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG | Hooks.AFTER_REMOVE_LIQUIDITY_FLAG)));\n        address payable hookAddr = payable(Constants.ALL_HOOKS);\n\n        vm.etch(hookAddr, vm.getDeployedCode(\"EmptyTestHooks.sol:EmptyTestHooks\"));\n        MockContract mockContract = new MockContract();\n        vm.etch(mockAddr, address(mockContract).code);\n\n        MockContract(mockAddr).setImplementation(hookAddr);\n\n        (key,) = initPool(currency0, currency1, IHooks(mockAddr), 3000, sqrtPriceX96);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n        BalanceDelta balanceDelta = modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        bytes32 beforeSelector = MockHooks.beforeRemoveLiquidity.selector;\n        bytes memory beforeParams = abi.encode(address(modifyLiquidityRouter), key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n        bytes32 afterSelector = MockHooks.afterRemoveLiquidity.selector;\n        bytes memory afterParams = abi.encode(\n            address(modifyLiquidityRouter),\n            key,\n            REMOVE_LIQUIDITY_PARAMS,\n            balanceDelta,\n            BalanceDeltaLibrary.ZERO_DELTA,\n            ZERO_BYTES\n        );\n\n        assertEq(MockContract(mockAddr).timesCalledSelector(beforeSelector), 1);\n        assertTrue(MockContract(mockAddr).calledWithSelector(beforeSelector, beforeParams));\n        assertEq(MockContract(mockAddr).timesCalledSelector(afterSelector), 1);\n        assertTrue(MockContract(mockAddr).calledWithSelector(afterSelector, afterParams));\n    }\n\n    function test_addLiquidity_failsWithIncorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_ADD_LIQUIDITY_FLAG | Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        (key,) = initPool(currency0, currency1, mockHooks, 100, SQRT_PRICE_1_1);\n\n        mockHooks.setReturnValue(mockHooks.beforeAddLiquidity.selector, bytes4(0xdeadbeef));\n        mockHooks.setReturnValue(mockHooks.afterAddLiquidity.selector, bytes4(0xdeadbeef));\n\n        // Fails at beforeAddLiquidity hook.\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        // Fail at afterAddLiquidity hook.\n        mockHooks.setReturnValue(mockHooks.beforeAddLiquidity.selector, mockHooks.beforeAddLiquidity.selector);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_removeLiquidity_failsWithIncorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG | Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        (key,) = initPool(currency0, currency1, mockHooks, 100, SQRT_PRICE_1_1);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        mockHooks.setReturnValue(mockHooks.beforeRemoveLiquidity.selector, bytes4(0xdeadbeef));\n        mockHooks.setReturnValue(mockHooks.afterRemoveLiquidity.selector, bytes4(0xdeadbeef));\n\n        // Fails at beforeRemoveLiquidity hook.\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        // Fail at afterRemoveLiquidity hook.\n        mockHooks.setReturnValue(mockHooks.beforeRemoveLiquidity.selector, mockHooks.beforeRemoveLiquidity.selector);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_addLiquidity_succeedsWithCorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_ADD_LIQUIDITY_FLAG | Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        (key,) = initPool(currency0, currency1, mockHooks, 100, SQRT_PRICE_1_1);\n\n        mockHooks.setReturnValue(mockHooks.beforeAddLiquidity.selector, mockHooks.beforeAddLiquidity.selector);\n        mockHooks.setReturnValue(mockHooks.afterAddLiquidity.selector, mockHooks.afterAddLiquidity.selector);\n\n        vm.expectEmit(true, true, false, true, address(manager));\n        emit ModifyLiquidity(\n            key.toId(),\n            address(modifyLiquidityRouter),\n            LIQUIDITY_PARAMS.tickLower,\n            LIQUIDITY_PARAMS.tickUpper,\n            LIQUIDITY_PARAMS.liquidityDelta,\n            LIQUIDITY_PARAMS.salt\n        );\n\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_removeLiquidity_succeedsWithCorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG | Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        (key,) = initPool(currency0, currency1, mockHooks, 100, SQRT_PRICE_1_1);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        mockHooks.setReturnValue(mockHooks.beforeRemoveLiquidity.selector, mockHooks.beforeRemoveLiquidity.selector);\n        mockHooks.setReturnValue(mockHooks.afterRemoveLiquidity.selector, mockHooks.afterRemoveLiquidity.selector);\n\n        vm.expectEmit(true, true, false, true, address(manager));\n        emit ModifyLiquidity(\n            key.toId(),\n            address(modifyLiquidityRouter),\n            REMOVE_LIQUIDITY_PARAMS.tickLower,\n            REMOVE_LIQUIDITY_PARAMS.tickUpper,\n            REMOVE_LIQUIDITY_PARAMS.liquidityDelta,\n            REMOVE_LIQUIDITY_PARAMS.salt\n        );\n\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_addLiquidity_6909() public {\n        // convert test tokens into ERC6909 claims\n        claimsRouter.deposit(currency0, address(this), 10_000e18);\n        claimsRouter.deposit(currency1, address(this), 10_000e18);\n        assertEq(manager.balanceOf(address(this), currency0.toId()), 10_000e18);\n        assertEq(manager.balanceOf(address(this), currency1.toId()), 10_000e18);\n\n        uint256 currency0BalanceBefore = currency0.balanceOfSelf();\n        uint256 currency1BalanceBefore = currency1.balanceOfSelf();\n        uint256 currency0PMBalanceBefore = currency0.balanceOf(address(manager));\n        uint256 currency1PMBalanceBefore = currency1.balanceOf(address(manager));\n\n        // allow liquidity router to burn our 6909 tokens\n        manager.setOperator(address(modifyLiquidityRouter), true);\n\n        // add liquidity with 6909: settleUsingBurn=true, takeClaims=true (unused)\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES, true, true);\n\n        assertLt(manager.balanceOf(address(this), currency0.toId()), 10_000e18);\n        assertLt(manager.balanceOf(address(this), currency1.toId()), 10_000e18);\n\n        // ERC20s are unspent\n        assertEq(currency0.balanceOfSelf(), currency0BalanceBefore);\n        assertEq(currency1.balanceOfSelf(), currency1BalanceBefore);\n\n        // PoolManager did not receive net-new ERC20s\n        assertEq(currency0.balanceOf(address(manager)), currency0PMBalanceBefore);\n        assertEq(currency1.balanceOf(address(manager)), currency1PMBalanceBefore);\n    }\n\n    function test_removeLiquidity_6909() public {\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        assertEq(manager.balanceOf(address(this), currency0.toId()), 0);\n        assertEq(manager.balanceOf(address(this), currency1.toId()), 0);\n\n        uint256 currency0BalanceBefore = currency0.balanceOfSelf();\n        uint256 currency1BalanceBefore = currency1.balanceOfSelf();\n        uint256 currency0PMBalanceBefore = currency0.balanceOf(address(manager));\n        uint256 currency1PMBalanceBefore = currency1.balanceOf(address(manager));\n\n        // remove liquidity as 6909: settleUsingBurn=true (unused), takeClaims=true\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES, true, true);\n\n        assertTrue(manager.balanceOf(address(this), currency0.toId()) > 0);\n        assertTrue(manager.balanceOf(address(this), currency1.toId()) > 0);\n\n        // ERC20s are unspent\n        assertEq(currency0.balanceOfSelf(), currency0BalanceBefore);\n        assertEq(currency1.balanceOfSelf(), currency1BalanceBefore);\n\n        // PoolManager did lose ERC-20s\n        assertEq(currency0.balanceOf(address(manager)), currency0PMBalanceBefore);\n        assertEq(currency1.balanceOf(address(manager)), currency1PMBalanceBefore);\n    }\n\n    function test_addLiquidity_gas() public {\n        ModifyLiquidityParams memory uniqueParams =\n            ModifyLiquidityParams({tickLower: -300, tickUpper: -180, liquidityDelta: 1e18, salt: 0});\n        modifyLiquidityNoChecks.modifyLiquidity(key, uniqueParams, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"simple addLiquidity\");\n    }\n\n    function test_addLiquidity_secondAdditionSameRange_gas() public {\n        ModifyLiquidityParams memory uniqueParams =\n            ModifyLiquidityParams({tickLower: -300, tickUpper: -180, liquidityDelta: 1e18, salt: 0});\n        modifyLiquidityNoChecks.modifyLiquidity(key, uniqueParams, ZERO_BYTES);\n        modifyLiquidityNoChecks.modifyLiquidity(key, uniqueParams, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"simple addLiquidity second addition same range\");\n    }\n\n    function test_removeLiquidity_gas() public {\n        ModifyLiquidityParams memory uniqueParams =\n            ModifyLiquidityParams({tickLower: -300, tickUpper: -180, liquidityDelta: 1e18, salt: 0});\n        // add some liquidity to remove\n        modifyLiquidityNoChecks.modifyLiquidity(key, uniqueParams, ZERO_BYTES);\n\n        uniqueParams.liquidityDelta *= -1;\n        modifyLiquidityNoChecks.modifyLiquidity(key, uniqueParams, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"simple removeLiquidity\");\n    }\n\n    function test_removeLiquidity_someLiquidityRemains_gas() public {\n        // add double the liquidity to remove\n        ModifyLiquidityParams memory uniqueParams =\n            ModifyLiquidityParams({tickLower: -300, tickUpper: -180, liquidityDelta: 1e18, salt: 0});\n        modifyLiquidityNoChecks.modifyLiquidity(key, uniqueParams, ZERO_BYTES);\n\n        uniqueParams.liquidityDelta /= -2;\n        modifyLiquidityNoChecks.modifyLiquidity(key, uniqueParams, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"simple removeLiquidity some liquidity remains\");\n    }\n\n    function test_addLiquidity_succeeds() public {\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_removeLiquidity_succeeds() public {\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_addLiquidity_withNative_gas() public {\n        modifyLiquidityRouter.modifyLiquidity{value: 1 ether}(nativeKey, LIQUIDITY_PARAMS, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"addLiquidity with native token\");\n    }\n\n    function test_removeLiquidity_withNative_gas() public {\n        modifyLiquidityRouter.modifyLiquidity{value: 1 ether}(nativeKey, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"removeLiquidity with native token\");\n    }\n\n    function test_addLiquidity_withHooks_gas() public {\n        address allHooksAddr = Constants.ALL_HOOKS;\n        MockHooks impl = new MockHooks();\n        vm.etch(allHooksAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(allHooksAddr);\n\n        (key,) = initPool(currency0, currency1, mockHooks, 3000, SQRT_PRICE_1_1);\n\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"addLiquidity with empty hook\");\n    }\n\n    function test_removeLiquidity_withHooks_gas() public {\n        address allHooksAddr = Constants.ALL_HOOKS;\n        MockHooks impl = new MockHooks();\n        vm.etch(allHooksAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(allHooksAddr);\n\n        (key,) = initPool(currency0, currency1, mockHooks, 3000, SQRT_PRICE_1_1);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"removeLiquidity with empty hook\");\n    }\n\n    function test_swap_failsIfNotInitialized(uint160 sqrtPriceX96) public {\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        key.fee = 100;\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: -100, sqrtPriceLimitX96: sqrtPriceX96});\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectRevert(Pool.PoolNotInitialized.selector);\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_succeedsIfInitialized() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true);\n        emit Swap(\n            key.toId(), address(swapRouter), int128(-100), int128(98), 79228162514264329749955861424, 1e18, -1, 3000\n        );\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_failsIfLocked() public {\n        vm.expectRevert(IPoolManager.ManagerLocked.selector);\n        manager.swap(key, SWAP_PARAMS, ZERO_BYTES);\n    }\n\n    function test_swap_succeedsWithNativeTokensIfInitialized() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        vm.expectEmit(true, true, true, true);\n        emit Swap(\n            nativeKey.toId(),\n            address(swapRouter),\n            int128(-100),\n            int128(98),\n            79228162514264329749955861424,\n            1e18,\n            -1,\n            3000\n        );\n\n        swapRouter.swap{value: 100}(nativeKey, SWAP_PARAMS, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_succeedsWithHooksIfInitialized() public {\n        address payable mockAddr = payable(address(uint160(Hooks.BEFORE_SWAP_FLAG | Hooks.AFTER_SWAP_FLAG)));\n        address payable hookAddr = payable(Constants.ALL_HOOKS);\n\n        vm.etch(hookAddr, vm.getDeployedCode(\"EmptyTestHooks.sol:EmptyTestHooks\"));\n        MockContract mockContract = new MockContract();\n        vm.etch(mockAddr, address(mockContract).code);\n\n        MockContract(mockAddr).setImplementation(hookAddr);\n\n        (key,) = initPoolAndAddLiquidity(currency0, currency1, IHooks(mockAddr), 3000, SQRT_PRICE_1_1);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        BalanceDelta balanceDelta = swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n\n        bytes32 beforeSelector = MockHooks.beforeSwap.selector;\n        bytes memory beforeParams = abi.encode(address(swapRouter), key, SWAP_PARAMS, ZERO_BYTES);\n\n        bytes32 afterSelector = MockHooks.afterSwap.selector;\n        bytes memory afterParams = abi.encode(address(swapRouter), key, SWAP_PARAMS, balanceDelta, ZERO_BYTES);\n\n        assertEq(MockContract(mockAddr).timesCalledSelector(beforeSelector), 1);\n        assertTrue(MockContract(mockAddr).calledWithSelector(beforeSelector, beforeParams));\n        assertEq(MockContract(mockAddr).timesCalledSelector(afterSelector), 1);\n        assertTrue(MockContract(mockAddr).calledWithSelector(afterSelector, afterParams));\n    }\n\n    function test_swap_failsWithIncorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_SWAP_FLAG | Hooks.AFTER_SWAP_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        (key,) = initPoolAndAddLiquidity(currency0, currency1, mockHooks, 100, SQRT_PRICE_1_1);\n\n        SwapParams memory swapParams =\n            SwapParams({zeroForOne: true, amountSpecified: 10, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        mockHooks.setReturnValue(mockHooks.beforeSwap.selector, bytes4(0xdeadbeef));\n        mockHooks.setReturnValue(mockHooks.afterSwap.selector, bytes4(0xdeadbeef));\n\n        // Fails at beforeSwap hook.\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        swapRouter.swap(key, swapParams, testSettings, ZERO_BYTES);\n\n        // Fail at afterSwap hook.\n        mockHooks.setReturnValue(mockHooks.beforeSwap.selector, mockHooks.beforeSwap.selector);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        swapRouter.swap(key, swapParams, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_succeedsWithCorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_SWAP_FLAG | Hooks.AFTER_SWAP_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        (key,) = initPoolAndAddLiquidity(currency0, currency1, mockHooks, 100, SQRT_PRICE_1_1);\n\n        SwapParams memory swapParams =\n            SwapParams({zeroForOne: true, amountSpecified: -10, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        mockHooks.setReturnValue(mockHooks.beforeSwap.selector, mockHooks.beforeSwap.selector);\n        mockHooks.setReturnValue(mockHooks.afterSwap.selector, mockHooks.afterSwap.selector);\n\n        vm.expectEmit(true, true, true, true);\n        emit Swap(key.toId(), address(swapRouter), -10, 8, 79228162514264336880490487708, 1e18, -1, 100);\n\n        swapRouter.swap(key, swapParams, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_succeeds() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_gas() public {\n        swapRouterNoChecks.swap(key, SWAP_PARAMS);\n        vm.snapshotGasLastCall(\"simple swap\");\n    }\n\n    function test_swap_withNative_succeeds() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        swapRouter.swap{value: 100}(nativeKey, SWAP_PARAMS, testSettings, ZERO_BYTES);\n    }\n\n    function test_swap_withNative_gas() public {\n        swapRouterNoChecks.swap{value: 100}(nativeKey, SWAP_PARAMS);\n        vm.snapshotGasLastCall(\"simple swap with native\");\n    }\n\n    function test_swap_withHooks_gas() public {\n        address allHooksAddr = Constants.ALL_HOOKS;\n\n        MockHooks impl = new MockHooks();\n        vm.etch(allHooksAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(allHooksAddr);\n\n        (key,) = initPoolAndAddLiquidity(currency0, currency1, mockHooks, 3000, SQRT_PRICE_1_1);\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n\n        SwapParams memory swapParams =\n            SwapParams({zeroForOne: true, amountSpecified: -100, sqrtPriceLimitX96: SQRT_PRICE_1_4});\n        testSettings = PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        swapRouter.swap(key, swapParams, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap with hooks\");\n    }\n\n    function test_swap_mint6909IfOutputNotTaken_gas() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        vm.expectEmit();\n        emit Transfer(address(swapRouter), address(0), address(this), CurrencyLibrary.toId(currency1), 98);\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap mint output as 6909\");\n\n        uint256 erc6909Balance = manager.balanceOf(address(this), CurrencyLibrary.toId(currency1));\n        assertEq(erc6909Balance, 98);\n    }\n\n    function test_swap_mint6909IfNativeOutputNotTaken_gas() public {\n        SwapParams memory params =\n            SwapParams({zeroForOne: false, amountSpecified: -100, sqrtPriceLimitX96: SQRT_PRICE_2_1});\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        vm.expectEmit();\n        emit Transfer(\n            address(swapRouter), address(0), address(this), CurrencyLibrary.toId(CurrencyLibrary.ADDRESS_ZERO), 98\n        );\n        swapRouter.swap(nativeKey, params, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap mint native output as 6909\");\n\n        uint256 erc6909Balance = manager.balanceOf(address(this), CurrencyLibrary.toId(CurrencyLibrary.ADDRESS_ZERO));\n        assertEq(erc6909Balance, 98);\n    }\n\n    function test_swap_burn6909AsInput_gas() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        vm.expectEmit();\n        emit Transfer(address(swapRouter), address(0), address(this), CurrencyLibrary.toId(currency1), 98);\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n\n        uint256 erc6909Balance = manager.balanceOf(address(this), uint256(uint160(Currency.unwrap(currency1))));\n        assertEq(erc6909Balance, 98);\n\n        // give permission for swapRouter to burn the 6909s\n        manager.setOperator(address(swapRouter), true);\n\n        // swap from currency1 to currency0 again, using 6909s as input tokens\n        SwapParams memory params =\n            SwapParams({zeroForOne: false, amountSpecified: 25, sqrtPriceLimitX96: SQRT_PRICE_4_1});\n        testSettings = PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: true});\n\n        vm.expectEmit();\n        emit Transfer(address(swapRouter), address(this), address(0), CurrencyLibrary.toId(currency1), 27);\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap burn 6909 for input\");\n\n        erc6909Balance = manager.balanceOf(address(this), CurrencyLibrary.toId(currency1));\n        assertEq(erc6909Balance, 71);\n    }\n\n    function test_swap_burnNative6909AsInput_gas() public {\n        SwapParams memory params =\n            SwapParams({zeroForOne: false, amountSpecified: -100, sqrtPriceLimitX96: SQRT_PRICE_2_1});\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: true, settleUsingBurn: false});\n\n        vm.expectEmit();\n        emit Transfer(\n            address(swapRouter), address(0), address(this), CurrencyLibrary.toId(CurrencyLibrary.ADDRESS_ZERO), 98\n        );\n        swapRouter.swap(nativeKey, params, testSettings, ZERO_BYTES);\n\n        uint256 erc6909Balance = manager.balanceOf(address(this), CurrencyLibrary.toId(CurrencyLibrary.ADDRESS_ZERO));\n        assertEq(erc6909Balance, 98);\n\n        // give permission for swapRouter to burn the 6909s\n        manager.setOperator(address(swapRouter), true);\n\n        // swap from currency0 to currency1, using 6909s as input tokens\n        params = SwapParams({zeroForOne: true, amountSpecified: 25, sqrtPriceLimitX96: SQRT_PRICE_1_4});\n        testSettings = PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: true});\n\n        vm.expectEmit();\n        emit Transfer(\n            address(swapRouter), address(this), address(0), CurrencyLibrary.toId(CurrencyLibrary.ADDRESS_ZERO), 27\n        );\n        // don't have to send in native currency since burning 6909 for input\n        swapRouter.swap(nativeKey, params, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap burn native 6909 for input\");\n\n        erc6909Balance = manager.balanceOf(address(this), CurrencyLibrary.toId(CurrencyLibrary.ADDRESS_ZERO));\n        assertEq(erc6909Balance, 71);\n    }\n\n    function test_swap_againstLiquidity_gas() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, ZERO_BYTES);\n\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: -100, sqrtPriceLimitX96: SQRT_PRICE_1_4});\n\n        swapRouter.swap(key, params, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap against liquidity\");\n    }\n\n    function test_swap_againstLiqWithNative_gas() public {\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        swapRouter.swap{value: 1 ether}(nativeKey, SWAP_PARAMS, testSettings, ZERO_BYTES);\n\n        SwapParams memory params =\n            SwapParams({zeroForOne: true, amountSpecified: -100, sqrtPriceLimitX96: SQRT_PRICE_1_4});\n\n        swapRouter.swap{value: 1 ether}(nativeKey, params, testSettings, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"swap against liquidity with native token\");\n    }\n\n    function test_swap_accruesProtocolFees(uint16 protocolFee0, uint16 protocolFee1, int256 amountSpecified) public {\n        protocolFee0 = uint16(bound(protocolFee0, 0, 1000));\n        protocolFee1 = uint16(bound(protocolFee1, 0, 1000));\n        vm.assume(amountSpecified != 0);\n\n        uint24 protocolFee = (uint24(protocolFee1) << 12) | uint24(protocolFee0);\n\n        (,, uint24 slot0ProtocolFee,) = manager.getSlot0(key.toId());\n        assertEq(slot0ProtocolFee, 0);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(key, protocolFee);\n\n        (,, slot0ProtocolFee,) = manager.getSlot0(key.toId());\n        assertEq(slot0ProtocolFee, protocolFee);\n\n        // Add liquidity - Fees dont accrue for positive liquidity delta.\n        ModifyLiquidityParams memory params = LIQUIDITY_PARAMS;\n        modifyLiquidityRouter.modifyLiquidity(key, params, ZERO_BYTES);\n\n        assertEq(manager.protocolFeesAccrued(currency0), 0);\n        assertEq(manager.protocolFeesAccrued(currency1), 0);\n\n        // Remove liquidity - Fees dont accrue for negative liquidity delta.\n        params.liquidityDelta = -LIQUIDITY_PARAMS.liquidityDelta;\n        modifyLiquidityRouter.modifyLiquidity(key, params, ZERO_BYTES);\n\n        assertEq(manager.protocolFeesAccrued(currency0), 0);\n        assertEq(manager.protocolFeesAccrued(currency1), 0);\n\n        // Now re-add the liquidity to test swap\n        params.liquidityDelta = LIQUIDITY_PARAMS.liquidityDelta;\n        modifyLiquidityRouter.modifyLiquidity(key, params, ZERO_BYTES);\n\n        SwapParams memory swapParams = SwapParams(false, amountSpecified, TickMath.MAX_SQRT_PRICE - 1);\n        BalanceDelta delta = swapRouter.swap(key, swapParams, PoolSwapTest.TestSettings(false, false), ZERO_BYTES);\n        uint256 expectedProtocolFee =\n            uint256(uint128(-delta.amount1())) * protocolFee1 / ProtocolFeeLibrary.PIPS_DENOMINATOR;\n        assertEq(manager.protocolFeesAccrued(currency0), 0);\n        assertEq(manager.protocolFeesAccrued(currency1), expectedProtocolFee);\n    }\n\n    function test_donate_failsIfNotInitialized() public {\n        vm.expectRevert(Pool.PoolNotInitialized.selector);\n        donateRouter.donate(uninitializedKey, 100, 100, ZERO_BYTES);\n    }\n\n    function test_donate_failsIfLocked() public {\n        vm.expectRevert(IPoolManager.ManagerLocked.selector);\n        manager.donate(key, 100, 100, ZERO_BYTES);\n    }\n\n    function test_donate_failsIfNoLiquidity(uint160 sqrtPriceX96) public {\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        (key,) = initPool(currency0, currency1, IHooks(address(0)), 100, sqrtPriceX96);\n\n        vm.expectRevert(Pool.NoLiquidityToReceiveFees.selector);\n        donateRouter.donate(key, 100, 100, ZERO_BYTES);\n    }\n\n    // test successful donation if pool has liquidity\n    function test_donate_succeedsWhenPoolHasLiquidity() public {\n        (uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128) = manager.getFeeGrowthGlobals(key.toId());\n        assertEq(feeGrowthGlobal0X128, 0);\n        assertEq(feeGrowthGlobal1X128, 0);\n\n        donateRouter.donate(key, 100, 200, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"donate gas with 2 tokens\");\n\n        (feeGrowthGlobal0X128, feeGrowthGlobal1X128) = manager.getFeeGrowthGlobals(key.toId());\n        assertEq(feeGrowthGlobal0X128, 34028236692093846346337);\n        assertEq(feeGrowthGlobal1X128, 68056473384187692692674);\n    }\n\n    function test_donate_succeedsForNativeTokensWhenPoolHasLiquidity() public {\n        (uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128) = manager.getFeeGrowthGlobals(nativeKey.toId());\n        assertEq(feeGrowthGlobal0X128, 0);\n        assertEq(feeGrowthGlobal1X128, 0);\n\n        donateRouter.donate{value: 100}(nativeKey, 100, 200, ZERO_BYTES);\n\n        (feeGrowthGlobal0X128, feeGrowthGlobal1X128) = manager.getFeeGrowthGlobals(nativeKey.toId());\n        assertEq(feeGrowthGlobal0X128, 34028236692093846346337);\n        assertEq(feeGrowthGlobal1X128, 68056473384187692692674);\n    }\n\n    function test_donate_failsWithIncorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_DONATE_FLAG | Hooks.AFTER_DONATE_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        (key,) = initPoolAndAddLiquidity(currency0, currency1, mockHooks, 100, SQRT_PRICE_1_1);\n\n        mockHooks.setReturnValue(mockHooks.beforeDonate.selector, bytes4(0xdeadbeef));\n        mockHooks.setReturnValue(mockHooks.afterDonate.selector, bytes4(0xdeadbeef));\n\n        // Fails at beforeDonate hook.\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        donateRouter.donate(key, 100, 200, ZERO_BYTES);\n\n        // Fail at afterDonate hook.\n        mockHooks.setReturnValue(mockHooks.beforeDonate.selector, mockHooks.beforeDonate.selector);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        donateRouter.donate(key, 100, 200, ZERO_BYTES);\n    }\n\n    function test_donate_succeedsWithCorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_DONATE_FLAG | Hooks.AFTER_DONATE_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        (key,) = initPoolAndAddLiquidity(currency0, currency1, mockHooks, 100, SQRT_PRICE_1_1);\n\n        mockHooks.setReturnValue(mockHooks.beforeDonate.selector, mockHooks.beforeDonate.selector);\n        mockHooks.setReturnValue(mockHooks.afterDonate.selector, mockHooks.afterDonate.selector);\n\n        donateRouter.donate(key, 100, 200, ZERO_BYTES);\n    }\n\n    function test_donate_OneToken_gas() public {\n        donateRouter.donate(key, 100, 0, ZERO_BYTES);\n        vm.snapshotGasLastCall(\"donate gas with 1 token\");\n    }\n\n    function test_fuzz_donate_emits_event(uint256 amount0, uint256 amount1) public {\n        amount0 = bound(amount0, 0, uint256(int256(type(int128).max)));\n        amount1 = bound(amount1, 0, uint256(int256(type(int128).max)));\n\n        vm.expectEmit(true, true, false, true, address(manager));\n        emit Donate(key.toId(), address(donateRouter), uint256(amount0), uint256(amount1));\n        donateRouter.donate(key, amount0, amount1, ZERO_BYTES);\n    }\n\n    function test_take_failsWithNoLiquidity() public {\n        deployFreshManagerAndRouters();\n\n        vm.expectRevert();\n        takeRouter.take(key, 100, 0);\n    }\n\n    function test_take_failsWithInvalidTokensThatDoNotReturnTrueOnTransfer() public {\n        TestInvalidERC20 invalidToken = new TestInvalidERC20(2 ** 255);\n        Currency invalidCurrency = Currency.wrap(address(invalidToken));\n        invalidToken.approve(address(modifyLiquidityRouter), type(uint256).max);\n        invalidToken.approve(address(takeRouter), type(uint256).max);\n\n        bool currency0Invalid = invalidCurrency < currency0;\n\n        (key,) = initPoolAndAddLiquidity(\n            (currency0Invalid ? invalidCurrency : currency0),\n            (currency0Invalid ? currency0 : invalidCurrency),\n            IHooks(address(0)),\n            3000,\n            SQRT_PRICE_1_1\n        );\n\n        (uint256 amount0, uint256 amount1) = currency0Invalid ? (1, 0) : (0, 1);\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                CustomRevert.WrappedError.selector,\n                address(invalidToken),\n                TestInvalidERC20.transfer.selector,\n                abi.encode(bytes32(0)),\n                abi.encodeWithSelector(CurrencyLibrary.ERC20TransferFailed.selector)\n            )\n        );\n        takeRouter.take(key, amount0, amount1);\n\n        // should not revert when non zero amount passed in for valid currency\n        // assertions inside takeRouter because it takes then settles\n        (amount0, amount1) = currency0Invalid ? (0, 1) : (1, 0);\n        takeRouter.take(key, amount0, amount1);\n    }\n\n    function test_take_succeedsWithPoolWithLiquidity() public {\n        takeRouter.take(key, 1, 1); // assertions inside takeRouter because it takes then settles\n    }\n\n    function test_take_failsIfLocked() public {\n        vm.expectRevert(IPoolManager.ManagerLocked.selector);\n        manager.take(key.currency0, address(this), 1);\n    }\n\n    function test_take_succeedsWithPoolWithLiquidityWithNativeToken() public {\n        takeRouter.take{value: 1}(nativeKey, 1, 1); // assertions inside takeRouter because it takes then settles\n    }\n\n    function test_settle_failsIfLocked() public {\n        vm.expectRevert(IPoolManager.ManagerLocked.selector);\n        manager.settle();\n    }\n\n    function test_settle_revertsSendingNative_withTokenSynced() public {\n        Actions[] memory actions = new Actions[](2);\n        bytes[] memory params = new bytes[](2);\n\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(key.currency0);\n\n        // Revert with NonzeroNativeValue\n        actions[1] = Actions.SETTLE_NATIVE;\n        params[1] = abi.encode(1);\n\n        vm.expectRevert(IPoolManager.NonzeroNativeValue.selector);\n        actionsRouter.executeActions{value: 1}(actions, params);\n    }\n\n    function test_mint_failsIfLocked() public {\n        vm.expectRevert(IPoolManager.ManagerLocked.selector);\n        manager.mint(address(this), key.currency0.toId(), 1);\n    }\n\n    function test_burn_failsIfLocked() public {\n        vm.expectRevert(IPoolManager.ManagerLocked.selector);\n        manager.burn(address(this), key.currency0.toId(), 1);\n    }\n\n    function test_collectProtocolFees_locked_revertsWithProtocolFeeCurrencySynced() public noIsolate {\n        manager.setProtocolFeeController(address(this));\n        // currency1 is never native\n        manager.sync(key.currency1);\n        assertEq(Currency.unwrap(key.currency1), Currency.unwrap(manager.getSyncedCurrency()));\n        vm.expectRevert(IProtocolFees.ProtocolFeeCurrencySynced.selector);\n        manager.collectProtocolFees(address(this), key.currency1, 1);\n    }\n\n    function test_sync_locked_collectProtocolFees_unlocked_revertsWithProtocolFeeCurrencySynced() public noIsolate {\n        manager.setProtocolFeeController(address(actionsRouter));\n        manager.sync(key.currency1);\n        assertEq(Currency.unwrap(key.currency1), Currency.unwrap(manager.getSyncedCurrency()));\n\n        Actions[] memory actions = new Actions[](1);\n        bytes[] memory params = new bytes[](1);\n\n        actions[0] = Actions.COLLECT_PROTOCOL_FEES;\n        params[0] = abi.encode(address(this), key.currency1, 1);\n\n        vm.expectRevert(IProtocolFees.ProtocolFeeCurrencySynced.selector);\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_collectProtocolFees_unlocked_revertsWithProtocolFeeCurrencySynced() public {\n        manager.setProtocolFeeController(address(actionsRouter));\n\n        Actions[] memory actions = new Actions[](2);\n        bytes[] memory params = new bytes[](2);\n\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(key.currency1);\n\n        actions[1] = Actions.COLLECT_PROTOCOL_FEES;\n        params[1] = abi.encode(address(this), key.currency1, 1);\n\n        vm.expectRevert(IProtocolFees.ProtocolFeeCurrencySynced.selector);\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_collectProtocolFees_ERC20_accumulateFees_gas() public {\n        uint256 expectedFees = 10;\n\n        (,, uint24 slot0ProtocolFee,) = manager.getSlot0(key.toId());\n        assertEq(slot0ProtocolFee, 0);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(key, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        (,, slot0ProtocolFee,) = manager.getSlot0(key.toId());\n        assertEq(slot0ProtocolFee, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        swapRouter.swap(\n            key, SwapParams(true, -10000, SQRT_PRICE_1_2), PoolSwapTest.TestSettings(false, false), ZERO_BYTES\n        );\n\n        assertEq(manager.protocolFeesAccrued(currency0), expectedFees);\n        assertEq(manager.protocolFeesAccrued(currency1), 0);\n        assertEq(currency0.balanceOf(recipientAddress), 0);\n        vm.prank(feeController);\n        manager.collectProtocolFees(recipientAddress, currency0, expectedFees);\n        vm.snapshotGasLastCall(\"erc20 collect protocol fees\");\n        assertEq(currency0.balanceOf(recipientAddress), expectedFees);\n        assertEq(manager.protocolFeesAccrued(currency0), 0);\n    }\n\n    function test_collectProtocolFees_ERC20_accumulateFees_exactOutput() public {\n        uint256 expectedFees = 10;\n\n        (,, uint24 slot0ProtocolFee,) = manager.getSlot0(key.toId());\n        assertEq(slot0ProtocolFee, 0);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(key, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        (,, slot0ProtocolFee,) = manager.getSlot0(key.toId());\n        assertEq(slot0ProtocolFee, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        swapRouter.swap(\n            key, SwapParams(true, 10000, SQRT_PRICE_1_2), PoolSwapTest.TestSettings(false, false), ZERO_BYTES\n        );\n\n        assertEq(manager.protocolFeesAccrued(currency0), expectedFees);\n        assertEq(manager.protocolFeesAccrued(currency1), 0);\n        assertEq(currency0.balanceOf(recipientAddress), 0);\n        vm.prank(feeController);\n        manager.collectProtocolFees(recipientAddress, currency0, expectedFees);\n        assertEq(currency0.balanceOf(recipientAddress), expectedFees);\n        assertEq(manager.protocolFeesAccrued(currency0), 0);\n    }\n\n    function test_collectProtocolFees_ERC20_returnsAllFeesIf0IsProvidedAsParameter() public {\n        uint256 expectedFees = 10;\n\n        (,, uint24 slot0ProtocolFee,) = manager.getSlot0(key.toId());\n        assertEq(slot0ProtocolFee, 0);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(key, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        (,, slot0ProtocolFee,) = manager.getSlot0(key.toId());\n        assertEq(slot0ProtocolFee, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        swapRouter.swap(\n            key,\n            SwapParams(false, -10000, TickMath.MAX_SQRT_PRICE - 1),\n            PoolSwapTest.TestSettings(false, false),\n            ZERO_BYTES\n        );\n\n        assertEq(manager.protocolFeesAccrued(currency0), 0);\n        assertEq(manager.protocolFeesAccrued(currency1), expectedFees);\n        assertEq(currency1.balanceOf(recipientAddress), 0);\n        vm.prank(feeController);\n        manager.collectProtocolFees(recipientAddress, currency1, 0);\n        assertEq(currency1.balanceOf(recipientAddress), expectedFees);\n        assertEq(manager.protocolFeesAccrued(currency1), 0);\n    }\n\n    function test_collectProtocolFees_nativeToken_accumulateFees_gas() public {\n        uint256 expectedFees = 10;\n        Currency nativeCurrency = CurrencyLibrary.ADDRESS_ZERO;\n\n        (,, uint24 slot0ProtocolFee,) = manager.getSlot0(nativeKey.toId());\n        assertEq(slot0ProtocolFee, 0);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(nativeKey, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        (,, slot0ProtocolFee,) = manager.getSlot0(nativeKey.toId());\n        assertEq(slot0ProtocolFee, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        swapRouter.swap{value: 10000}(\n            nativeKey, SwapParams(true, -10000, SQRT_PRICE_1_2), PoolSwapTest.TestSettings(false, false), ZERO_BYTES\n        );\n\n        assertEq(manager.protocolFeesAccrued(nativeCurrency), expectedFees);\n        assertEq(manager.protocolFeesAccrued(currency1), 0);\n        assertEq(nativeCurrency.balanceOf(recipientAddress), 0);\n        vm.prank(feeController);\n        manager.collectProtocolFees(recipientAddress, nativeCurrency, expectedFees);\n        vm.snapshotGasLastCall(\"native collect protocol fees\");\n        assertEq(nativeCurrency.balanceOf(recipientAddress), expectedFees);\n        assertEq(manager.protocolFeesAccrued(nativeCurrency), 0);\n    }\n\n    function test_collectProtocolFees_nativeToken_returnsAllFeesIf0IsProvidedAsParameter() public {\n        uint256 expectedFees = 10;\n        Currency nativeCurrency = CurrencyLibrary.ADDRESS_ZERO;\n\n        (,, uint24 slot0ProtocolFee,) = manager.getSlot0(nativeKey.toId());\n        assertEq(slot0ProtocolFee, 0);\n\n        vm.prank(feeController);\n        manager.setProtocolFee(nativeKey, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        (,, slot0ProtocolFee,) = manager.getSlot0(nativeKey.toId());\n        assertEq(slot0ProtocolFee, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n\n        swapRouter.swap{value: 10000}(\n            nativeKey, SwapParams(true, -10000, SQRT_PRICE_1_2), PoolSwapTest.TestSettings(false, false), ZERO_BYTES\n        );\n\n        assertEq(manager.protocolFeesAccrued(nativeCurrency), expectedFees);\n        assertEq(manager.protocolFeesAccrued(currency1), 0);\n        assertEq(nativeCurrency.balanceOf(recipientAddress), 0);\n        vm.prank(feeController);\n        manager.collectProtocolFees(recipientAddress, nativeCurrency, 0);\n        assertEq(nativeCurrency.balanceOf(recipientAddress), expectedFees);\n        assertEq(manager.protocolFeesAccrued(nativeCurrency), 0);\n    }\n\n    function test_unlock_EmitsCorrectId() public {\n        vm.expectEmit(false, false, false, true);\n        emit UnlockCallback();\n        emptyUnlockRouter.unlock();\n    }\n\n    Action[] _actions;\n\n    function test_unlock_cannotBeCalledTwiceByCaller() public {\n        _actions = [Action.NESTED_SELF_UNLOCK];\n        nestedActionRouter.unlock(abi.encode(_actions));\n    }\n\n    function test_unlock_cannotBeCalledTwiceByDifferentCallers() public {\n        _actions = [Action.NESTED_EXECUTOR_UNLOCK];\n        nestedActionRouter.unlock(abi.encode(_actions));\n    }\n\n    // function testExtsloadForPoolPrice() public {\n    //     IPoolManager.key = IPoolManager.PoolKey({\n    //         currency0: currency0,\n    //         currency1: currency1,\n    //         fee: 100,\n    //         hooks: IHooks(address(0)),\n    //         tickSpacing: 10\n    //     });\n    //     manager.initialize(key, SQRT_PRICE_1_1);\n\n    //     PoolId poolId = key.toId();\n    //     bytes32 slot0Bytes = manager.extsload(keccak256(abi.encode(poolId, POOL_SLOT)));\n    //     vm.snapshotGasLastCall(\"poolExtsloadSlot0\");\n\n    //     uint160 sqrtPriceX96Extsload;\n    //     assembly {\n    //         sqrtPriceX96Extsload := and(slot0Bytes, sub(shl(160, 1), 1))\n    //     }\n    //     (uint160 sqrtPriceX96Slot0,,,,,) = manager.getSlot0(poolId);\n\n    //     // assert that extsload loads the correct storage slot which matches the true slot0\n    //     assertEq(sqrtPriceX96Extsload, sqrtPriceX96Slot0);\n    // }\n\n    // function testExtsloadMultipleSlots() public {\n    //     IPoolManager.key = IPoolManager.PoolKey({\n    //         currency0: currency0,\n    //         currency1: currency1,\n    //         fee: 100,\n    //         hooks: IHooks(address(0)),\n    //         tickSpacing: 10\n    //     });\n    //     manager.initialize(key, SQRT_PRICE_1_1);\n\n    //     // populate feeGrowthGlobalX128 struct w/ modify + swap\n    //     modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-120, 120, 5 ether, 0));\n    //     swapRouter.swap(\n    //         key,\n    //         SwapParams(false, 1 ether, TickMath.MAX_SQRT_PRICE - 1),\n    //         PoolSwapTest.TestSettings(true, true)\n    //     );\n    //     swapRouter.swap(\n    //         key,\n    //         SwapParams(true, 5 ether, TickMath.MIN_SQRT_PRICE + 1),\n    //         PoolSwapTest.TestSettings(true, true)\n    //     );\n\n    //     PoolId poolId = key.toId();\n    //     bytes memory value = manager.extsload(bytes32(uint256(keccak256(abi.encode(poolId, POOL_SLOT))) + 1), 2);\n    //     vm.snapshotGasLastCall(\"poolExtsloadTickInfoStruct\");\n\n    //     uint256 feeGrowthGlobal0X128Extsload;\n    //     uint256 feeGrowthGlobal1X128Extsload;\n    //     assembly {\n    //         feeGrowthGlobal0X128Extsload := and(mload(add(value, 0x20)), sub(shl(256, 1), 1))\n    //         feeGrowthGlobal1X128Extsload := and(mload(add(value, 0x40)), sub(shl(256, 1), 1))\n    //     }\n\n    //     assertEq(feeGrowthGlobal0X128Extsload, 408361710565269213475534193967158);\n    //     assertEq(feeGrowthGlobal1X128Extsload, 204793365386061595215803889394593);\n    // }\n\n    function test_getPosition() public view {\n        (uint128 liquidity,,) = manager.getPositionInfo(key.toId(), address(modifyLiquidityRouter), -120, 120, 0);\n        assert(LIQUIDITY_PARAMS.liquidityDelta > 0);\n        assertEq(liquidity, uint128(uint256(LIQUIDITY_PARAMS.liquidityDelta)));\n    }\n\n    function supportsInterface(bytes4) external pure returns (bool) {\n        return true;\n    }\n}\n"
  },
  {
    "path": "test/PoolManagerInitialize.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {Hooks} from \"../src/libraries/Hooks.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {IProtocolFees} from \"../src/interfaces/IProtocolFees.sol\";\nimport {PoolManager} from \"../src/PoolManager.sol\";\nimport {TickMath} from \"../src/libraries/TickMath.sol\";\nimport {Pool} from \"../src/libraries/Pool.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {Constants} from \"./utils/Constants.sol\";\nimport {Currency, CurrencyLibrary} from \"../src/types/Currency.sol\";\nimport {MockHooks} from \"../src/test/MockHooks.sol\";\nimport {MockContract} from \"../src/test/MockContract.sol\";\nimport {EmptyTestHooks} from \"../src/test/EmptyTestHooks.sol\";\nimport {PoolKey} from \"../src/types/PoolKey.sol\";\nimport {PoolId} from \"../src/types/PoolId.sol\";\nimport {LPFeeLibrary} from \"../src/libraries/LPFeeLibrary.sol\";\nimport {ProtocolFeeLibrary} from \"../src/libraries/ProtocolFeeLibrary.sol\";\nimport {StateLibrary} from \"../src/libraries/StateLibrary.sol\";\n\ncontract PoolManagerInitializeTest is Test, Deployers {\n    using Hooks for IHooks;\n    using LPFeeLibrary for uint24;\n    using ProtocolFeeLibrary for uint24;\n    using StateLibrary for IPoolManager;\n\n    event Initialize(\n        PoolId indexed poolId,\n        Currency indexed currency0,\n        Currency indexed currency1,\n        uint24 fee,\n        int24 tickSpacing,\n        IHooks hooks,\n        uint160 sqrtPriceX96,\n        int24 tick\n    );\n\n    function setUp() public {\n        deployFreshManagerAndRouters();\n        deployMintAndApprove2Currencies();\n\n        uninitializedKey = PoolKey({\n            currency0: currency0,\n            currency1: currency1,\n            fee: 3000,\n            hooks: IHooks(Constants.ADDRESS_ZERO),\n            tickSpacing: 60\n        });\n    }\n\n    function test_fuzz_initialize(PoolKey memory key0, uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        // tested in Hooks.t.sol\n        key0.hooks = IHooks(Constants.ADDRESS_ZERO);\n\n        if (key0.tickSpacing > TickMath.MAX_TICK_SPACING) {\n            vm.expectRevert(abi.encodeWithSelector(IPoolManager.TickSpacingTooLarge.selector, key0.tickSpacing));\n            manager.initialize(key0, sqrtPriceX96);\n        } else if (key0.tickSpacing < TickMath.MIN_TICK_SPACING) {\n            vm.expectRevert(abi.encodeWithSelector(IPoolManager.TickSpacingTooSmall.selector, key0.tickSpacing));\n            manager.initialize(key0, sqrtPriceX96);\n        } else if (key0.currency0 >= key0.currency1) {\n            vm.expectRevert(\n                abi.encodeWithSelector(\n                    IPoolManager.CurrenciesOutOfOrderOrEqual.selector, key0.currency0, key0.currency1\n                )\n            );\n            manager.initialize(key0, sqrtPriceX96);\n        } else if (!key0.hooks.isValidHookAddress(key0.fee)) {\n            vm.expectRevert(abi.encodeWithSelector(Hooks.HookAddressNotValid.selector, address(key0.hooks)));\n            manager.initialize(key0, sqrtPriceX96);\n        } else if ((key0.fee != LPFeeLibrary.DYNAMIC_FEE_FLAG) && (key0.fee > 1000000)) {\n            vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, key0.fee));\n            manager.initialize(key0, sqrtPriceX96);\n        } else {\n            int24 tick = TickMath.getTickAtSqrtPrice(sqrtPriceX96);\n            vm.expectEmit(true, true, true, true);\n            emit Initialize(\n                key0.toId(), key0.currency0, key0.currency1, key0.fee, key0.tickSpacing, key0.hooks, sqrtPriceX96, tick\n            );\n            manager.initialize(key0, sqrtPriceX96);\n\n            (uint160 slot0SqrtPriceX96,, uint24 slot0ProtocolFee,) = manager.getSlot0(key0.toId());\n            assertEq(slot0SqrtPriceX96, sqrtPriceX96);\n            assertEq(slot0ProtocolFee, 0);\n        }\n    }\n\n    function test_initialize_forNativeTokens(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n        uninitializedKey.currency0 = CurrencyLibrary.ADDRESS_ZERO;\n\n        int24 tick = TickMath.getTickAtSqrtPrice(sqrtPriceX96);\n\n        vm.expectEmit(true, true, true, true);\n        emit Initialize(\n            uninitializedKey.toId(),\n            uninitializedKey.currency0,\n            uninitializedKey.currency1,\n            uninitializedKey.fee,\n            uninitializedKey.tickSpacing,\n            uninitializedKey.hooks,\n            sqrtPriceX96,\n            tick\n        );\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n\n        (uint160 slot0SqrtPriceX96, int24 slot0Tick, uint24 slot0ProtocolFee,) =\n            manager.getSlot0(uninitializedKey.toId());\n        assertEq(slot0SqrtPriceX96, sqrtPriceX96);\n        assertEq(slot0ProtocolFee, 0);\n        assertEq(slot0Tick, TickMath.getTickAtSqrtPrice(sqrtPriceX96));\n    }\n\n    function test_initialize_succeedsWithHooks(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        address payable mockAddr = payable(address(uint160(Hooks.BEFORE_INITIALIZE_FLAG | Hooks.AFTER_INITIALIZE_FLAG)));\n        address payable hookAddr = payable(Constants.ALL_HOOKS);\n\n        vm.etch(hookAddr, vm.getDeployedCode(\"EmptyTestHooks.sol:EmptyTestHooks\"));\n        MockContract mockContract = new MockContract();\n        vm.etch(mockAddr, address(mockContract).code);\n\n        MockContract(mockAddr).setImplementation(hookAddr);\n\n        uninitializedKey.hooks = IHooks(mockAddr);\n\n        int24 tick = manager.initialize(uninitializedKey, sqrtPriceX96);\n        (uint160 slot0SqrtPriceX96,,,) = manager.getSlot0(uninitializedKey.toId());\n        assertEq(slot0SqrtPriceX96, sqrtPriceX96, \"sqrtPrice\");\n\n        bytes32 beforeSelector = MockHooks.beforeInitialize.selector;\n        bytes memory beforeParams = abi.encode(address(this), uninitializedKey, sqrtPriceX96);\n\n        bytes32 afterSelector = MockHooks.afterInitialize.selector;\n        bytes memory afterParams = abi.encode(address(this), uninitializedKey, sqrtPriceX96, tick);\n\n        assertEq(MockContract(mockAddr).timesCalledSelector(beforeSelector), 1, \"beforeSelector count\");\n        assertTrue(MockContract(mockAddr).calledWithSelector(beforeSelector, beforeParams), \"beforeSelector params\");\n        assertEq(MockContract(mockAddr).timesCalledSelector(afterSelector), 1, \"afterSelector count\");\n        assertTrue(MockContract(mockAddr).calledWithSelector(afterSelector, afterParams), \"afterSelector params\");\n    }\n\n    function test_initialize_succeedsWithMaxTickSpacing(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        uninitializedKey.tickSpacing = TickMath.MAX_TICK_SPACING;\n\n        int24 tick = TickMath.getTickAtSqrtPrice(sqrtPriceX96);\n\n        vm.expectEmit(true, true, true, true);\n        emit Initialize(\n            uninitializedKey.toId(),\n            uninitializedKey.currency0,\n            uninitializedKey.currency1,\n            uninitializedKey.fee,\n            uninitializedKey.tickSpacing,\n            uninitializedKey.hooks,\n            sqrtPriceX96,\n            tick\n        );\n\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n    }\n\n    function test_initialize_succeedsWithEmptyHooks(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        address allHooksAddr = Constants.ALL_HOOKS;\n\n        MockHooks impl = new MockHooks();\n        vm.etch(allHooksAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(allHooksAddr);\n\n        uninitializedKey.hooks = mockHooks;\n\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n        (uint160 slot0SqrtPriceX96,,,) = manager.getSlot0(uninitializedKey.toId());\n        assertEq(slot0SqrtPriceX96, sqrtPriceX96);\n    }\n\n    function test_initialize_revertsWithIdenticalTokens(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        // Both currencies are currency0\n        uninitializedKey.currency1 = currency0;\n\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                IPoolManager.CurrenciesOutOfOrderOrEqual.selector,\n                Currency.unwrap(currency0),\n                Currency.unwrap(currency0)\n            )\n        );\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n    }\n\n    function test_initialize_revertsWithSameTokenCombo(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        uninitializedKey.currency1 = currency0;\n        uninitializedKey.currency0 = currency1;\n\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                IPoolManager.CurrenciesOutOfOrderOrEqual.selector,\n                Currency.unwrap(currency1),\n                Currency.unwrap(currency0)\n            )\n        );\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n    }\n\n    function test_initialize_revertsWhenPoolAlreadyInitialized(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n        vm.expectRevert(Pool.PoolAlreadyInitialized.selector);\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n    }\n\n    function test_initialize_failsWithIncorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_INITIALIZE_FLAG | Hooks.AFTER_INITIALIZE_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        uninitializedKey.hooks = mockHooks;\n\n        mockHooks.setReturnValue(mockHooks.beforeInitialize.selector, bytes4(0xdeadbeef));\n        mockHooks.setReturnValue(mockHooks.afterInitialize.selector, bytes4(0xdeadbeef));\n\n        // Fails at beforeInitialize hook.\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        manager.initialize(uninitializedKey, SQRT_PRICE_1_1);\n\n        // Fail at afterInitialize hook.\n        mockHooks.setReturnValue(mockHooks.beforeInitialize.selector, mockHooks.beforeInitialize.selector);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        manager.initialize(uninitializedKey, SQRT_PRICE_1_1);\n    }\n\n    function test_initialize_succeedsWithCorrectSelectors() public {\n        address hookAddr = address(uint160(Hooks.BEFORE_INITIALIZE_FLAG | Hooks.AFTER_INITIALIZE_FLAG));\n\n        MockHooks impl = new MockHooks();\n        vm.etch(hookAddr, address(impl).code);\n        MockHooks mockHooks = MockHooks(hookAddr);\n\n        uninitializedKey.hooks = mockHooks;\n\n        mockHooks.setReturnValue(mockHooks.beforeInitialize.selector, mockHooks.beforeInitialize.selector);\n        mockHooks.setReturnValue(mockHooks.afterInitialize.selector, mockHooks.afterInitialize.selector);\n\n        int24 tick = TickMath.getTickAtSqrtPrice(SQRT_PRICE_1_1);\n\n        vm.expectEmit(true, true, true, true);\n        emit Initialize(\n            uninitializedKey.toId(),\n            uninitializedKey.currency0,\n            uninitializedKey.currency1,\n            uninitializedKey.fee,\n            uninitializedKey.tickSpacing,\n            uninitializedKey.hooks,\n            SQRT_PRICE_1_1,\n            tick\n        );\n\n        manager.initialize(uninitializedKey, SQRT_PRICE_1_1);\n    }\n\n    function test_initialize_failsIfTickSpaceTooLarge(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        uninitializedKey.tickSpacing = TickMath.MAX_TICK_SPACING + 1;\n\n        vm.expectRevert(abi.encodeWithSelector(IPoolManager.TickSpacingTooLarge.selector, uninitializedKey.tickSpacing));\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n    }\n\n    function test_initialize_failsIfTickSpaceZero(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        uninitializedKey.tickSpacing = 0;\n\n        vm.expectRevert(abi.encodeWithSelector(IPoolManager.TickSpacingTooSmall.selector, uninitializedKey.tickSpacing));\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n    }\n\n    function test_initialize_failsIfTickSpaceNeg(uint160 sqrtPriceX96) public {\n        // Assumptions tested in Pool.t.sol\n        sqrtPriceX96 = uint160(bound(sqrtPriceX96, TickMath.MIN_SQRT_PRICE, TickMath.MAX_SQRT_PRICE - 1));\n\n        uninitializedKey.tickSpacing = -1;\n\n        vm.expectRevert(abi.encodeWithSelector(IPoolManager.TickSpacingTooSmall.selector, uninitializedKey.tickSpacing));\n        manager.initialize(uninitializedKey, sqrtPriceX96);\n    }\n\n    function test_initialize_gas() public {\n        manager.initialize(uninitializedKey, SQRT_PRICE_1_1);\n        vm.snapshotGasLastCall(\"initialize\");\n    }\n}\n"
  },
  {
    "path": "test/ProtocolFeesImplementation.t.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.15;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {ProtocolFeesImplementation} from \"../src/test/ProtocolFeesImplementation.sol\";\nimport {IProtocolFees} from \"../src/interfaces/IProtocolFees.sol\";\nimport {ProtocolFeeLibrary} from \"../src/libraries/ProtocolFeeLibrary.sol\";\nimport {PoolKey} from \"../src/types/PoolKey.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {Deployers} from \"../test/utils/Deployers.sol\";\nimport {PoolId} from \"../src/types/PoolId.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {Constants} from \"../test/utils/Constants.sol\";\n\ncontract ProtocolFeesTest is Test, Deployers {\n    using ProtocolFeeLibrary for uint24;\n\n    event ProtocolFeeControllerUpdated(address indexed feeController);\n    event ProtocolFeeUpdated(PoolId indexed id, uint24 protocolFee);\n\n    uint24 constant MAX_PROTOCOL_FEE_BOTH_TOKENS = (1000 << 12) | 1000; // 1000 1000\n\n    ProtocolFeesImplementation protocolFees;\n\n    function setUp() public {\n        protocolFees = new ProtocolFeesImplementation();\n        feeController = makeAddr(\"feeController\");\n        (currency0, currency1) = deployAndMint2Currencies();\n        MockERC20(Currency.unwrap(currency0)).transfer(address(protocolFees), 2 ** 255);\n    }\n\n    function test_setProtocolFeeController_succeedsNoRevert() public {\n        assertEq(protocolFees.protocolFeeController(), address(0));\n        vm.expectEmit(true, false, false, false, address(protocolFees));\n        emit ProtocolFeeControllerUpdated(feeController);\n        protocolFees.setProtocolFeeController(feeController);\n        assertEq(protocolFees.protocolFeeController(), feeController);\n    }\n\n    function test_setProtocolFeeController_revertsWithNotAuthorized() public {\n        assertEq(protocolFees.protocolFeeController(), address(0));\n\n        vm.prank(address(1)); // not the owner address\n        vm.expectRevert(\"UNAUTHORIZED\");\n        protocolFees.setProtocolFeeController(feeController);\n        assertEq(protocolFees.protocolFeeController(), address(0));\n    }\n\n    function test_setProtocolFee_succeeds_gas() public {\n        PoolKey memory key = PoolKey(currency0, currency1, 3000, 60, IHooks(address(0)));\n        protocolFees.setProtocolFeeController(feeController);\n        // Set price to pretend that the pool is initialized\n        protocolFees.setPrice(key, Constants.SQRT_PRICE_1_1);\n        vm.prank(feeController);\n        vm.expectEmit(true, false, false, true, address(protocolFees));\n        emit ProtocolFeeUpdated(key.toId(), MAX_PROTOCOL_FEE_BOTH_TOKENS);\n        protocolFees.setProtocolFee(key, MAX_PROTOCOL_FEE_BOTH_TOKENS);\n        vm.snapshotGasLastCall(\"set protocol fee\");\n    }\n\n    function test_setProtocolFee_revertsWithInvalidCaller() public {\n        protocolFees.setProtocolFeeController(feeController);\n        vm.expectRevert(IProtocolFees.InvalidCaller.selector);\n        protocolFees.setProtocolFee(key, 1);\n    }\n\n    function test_setProtocolFee_revertsWithInvalidFee() public {\n        uint24 protocolFee = MAX_PROTOCOL_FEE_BOTH_TOKENS + 1;\n\n        protocolFees.setProtocolFeeController(feeController);\n        vm.prank(feeController);\n        vm.expectRevert(abi.encodeWithSelector(IProtocolFees.ProtocolFeeTooLarge.selector, protocolFee));\n        protocolFees.setProtocolFee(key, protocolFee);\n\n        protocolFee = MAX_PROTOCOL_FEE_BOTH_TOKENS + (1 << 12);\n        vm.prank(feeController);\n        vm.expectRevert(abi.encodeWithSelector(IProtocolFees.ProtocolFeeTooLarge.selector, protocolFee));\n        protocolFees.setProtocolFee(key, protocolFee);\n    }\n\n    function test_fuzz_setProtocolFee(PoolKey memory key, uint24 protocolFee) public {\n        protocolFees.setProtocolFeeController(feeController);\n        // Set price to pretend that the pool is initialized\n        protocolFees.setPrice(key, Constants.SQRT_PRICE_1_1);\n        uint16 fee0 = protocolFee.getZeroForOneFee();\n        uint16 fee1 = protocolFee.getOneForZeroFee();\n        vm.prank(feeController);\n        if ((fee0 > 1000) || (fee1 > 1000)) {\n            vm.expectRevert(abi.encodeWithSelector(IProtocolFees.ProtocolFeeTooLarge.selector, protocolFee));\n            protocolFees.setProtocolFee(key, protocolFee);\n        } else {\n            vm.expectEmit(true, false, false, true, address(protocolFees));\n            emit IProtocolFees.ProtocolFeeUpdated(key.toId(), protocolFee);\n            protocolFees.setProtocolFee(key, protocolFee);\n        }\n    }\n\n    function test_collectProtocolFees_revertsWithInvalidCaller() public {\n        vm.expectRevert(IProtocolFees.InvalidCaller.selector);\n        protocolFees.collectProtocolFees(address(1), currency0, 0);\n    }\n\n    function test_collectProtocolFees_succeeds() public {\n        // set a balance of protocol fees that can be collected\n        protocolFees.updateProtocolFees(currency0, 100);\n        assertEq(protocolFees.protocolFeesAccrued(currency0), 100);\n\n        protocolFees.setProtocolFeeController(feeController);\n        vm.prank(feeController);\n        protocolFees.collectProtocolFees(address(this), currency0, 100);\n        assertEq(protocolFees.protocolFeesAccrued(currency0), 0);\n        assertEq(currency0.balanceOf(address(this)), 100);\n    }\n\n    function test_fuzz_collectProtocolFees(address recipient, uint256 amount, uint256 feesAccrued) public {\n        vm.assume(feesAccrued <= currency0.balanceOf(address(protocolFees)));\n\n        uint256 recipientBalanceBefore = currency0.balanceOf(recipient);\n        uint256 senderBalanceBefore = currency0.balanceOf(address(protocolFees));\n\n        // set a balance of protocol fees that can be collected\n        protocolFees.updateProtocolFees(currency0, feesAccrued);\n        assertEq(protocolFees.protocolFeesAccrued(currency0), feesAccrued);\n        if (amount == 0) {\n            amount = protocolFees.protocolFeesAccrued(currency0);\n        }\n\n        protocolFees.setProtocolFeeController(feeController);\n        vm.prank(feeController);\n        if (amount > feesAccrued) {\n            vm.expectRevert();\n        }\n        uint256 amountCollected = protocolFees.collectProtocolFees(recipient, currency0, amount);\n\n        if (amount <= feesAccrued) {\n            if (recipient == address(protocolFees)) {\n                assertEq(currency0.balanceOf(recipient), recipientBalanceBefore);\n            } else {\n                assertEq(currency0.balanceOf(recipient), recipientBalanceBefore + amount);\n                assertEq(currency0.balanceOf(address(protocolFees)), senderBalanceBefore - amount);\n            }\n            assertEq(protocolFees.protocolFeesAccrued(currency0), feesAccrued - amount);\n            assertEq(amountCollected, amount);\n        }\n    }\n\n    function test_updateProtocolFees_succeeds() public {\n        // set a starting balance of protocol fees\n        protocolFees.updateProtocolFees(currency0, 100);\n        assertEq(protocolFees.protocolFeesAccrued(currency0), 100);\n\n        protocolFees.updateProtocolFees(currency0, 200);\n        assertEq(protocolFees.protocolFeesAccrued(currency0), 300);\n    }\n\n    function test_fuzz_updateProtocolFees(uint256 amount, uint256 startingAmount) public {\n        // set a starting balance of protocol fees\n        protocolFees.updateProtocolFees(currency0, startingAmount);\n        assertEq(protocolFees.protocolFeesAccrued(currency0), startingAmount);\n\n        uint256 newAmount;\n        unchecked {\n            newAmount = startingAmount + amount;\n        }\n\n        protocolFees.updateProtocolFees(currency0, amount);\n        assertEq(protocolFees.protocolFeesAccrued(currency0), newAmount);\n    }\n}\n"
  },
  {
    "path": "test/SkipCallsTestHook.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {PoolId} from \"../src/types/PoolId.sol\";\nimport {Hooks} from \"../src/libraries/Hooks.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {IProtocolFees} from \"../src/interfaces/IProtocolFees.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"../src/types/PoolKey.sol\";\nimport {PoolManager} from \"../src/PoolManager.sol\";\nimport {PoolSwapTest} from \"../src/test/PoolSwapTest.sol\";\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {Constants} from \"../test/utils/Constants.sol\";\nimport {SkipCallsTestHook} from \"../src/test/SkipCallsTestHook.sol\";\n\ncontract SkipCallsTest is Test, Deployers {\n    PoolSwapTest.TestSettings testSettings = PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n    function deploy(SkipCallsTestHook skipCallsTestHook) private {\n        SkipCallsTestHook impl = new SkipCallsTestHook();\n        vm.allowCheatcodes(address(skipCallsTestHook));\n        vm.etch(address(skipCallsTestHook), address(impl).code);\n        deployFreshManagerAndRouters();\n        skipCallsTestHook.setManager(IPoolManager(manager));\n        deployMintAndApprove2Currencies();\n\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        (key,) = initPool(currency0, currency1, IHooks(address(skipCallsTestHook)), 3000, SQRT_PRICE_1_1);\n    }\n\n    function approveAndAddLiquidity(SkipCallsTestHook skipCallsTestHook) private {\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(skipCallsTestHook), Constants.MAX_UINT256);\n        MockERC20(Currency.unwrap(key.currency1)).approve(address(skipCallsTestHook), Constants.MAX_UINT256);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, abi.encode(address(this)));\n    }\n\n    function test_beforeInitialize_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.BEFORE_INITIALIZE_FLAG))\n        );\n\n        // initializes pool and increments counter\n        deploy(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 1);\n    }\n\n    function test_afterInitialize_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.AFTER_INITIALIZE_FLAG))\n        );\n\n        // initializes pool and increments counter\n        deploy(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 1);\n    }\n\n    function test_beforeAddLiquidity_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.BEFORE_ADD_LIQUIDITY_FLAG))\n        );\n\n        deploy(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // adds liquidity and increments counter\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 1);\n        // adds liquidity again and increments counter\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 2);\n    }\n\n    function test_afterAddLiquidity_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.AFTER_ADD_LIQUIDITY_FLAG))\n        );\n\n        deploy(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // adds liquidity and increments counter\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 1);\n        // adds liquidity and increments counter again\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 2);\n    }\n\n    function test_beforeRemoveLiquidity_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG))\n        );\n\n        deploy(skipCallsTestHook);\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // removes liquidity and increments counter\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 1);\n        // adds liquidity again\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, abi.encode(address(this)));\n        // removes liquidity again and increments counter\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 2);\n    }\n\n    function test_afterRemoveLiquidity_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.AFTER_REMOVE_LIQUIDITY_FLAG))\n        );\n\n        deploy(skipCallsTestHook);\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // removes liquidity and increments counter\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 1);\n        // adds liquidity again\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, abi.encode(address(this)));\n        // removes liquidity again and increments counter\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 2);\n    }\n\n    function test_beforeSwap_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.BEFORE_SWAP_FLAG))\n        );\n\n        deploy(skipCallsTestHook);\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // swaps and increments counter\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 1);\n        // swaps again and increments counter\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 2);\n    }\n\n    function test_gas_beforeSwap_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.BEFORE_SWAP_FLAG))\n        );\n\n        deploy(skipCallsTestHook);\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // swaps and increments counter\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, abi.encode(address(this)));\n        vm.snapshotGasLastCall(\"swap skips hook call if hook is caller\");\n        assertEq(skipCallsTestHook.counter(), 1);\n    }\n\n    function test_afterSwap_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook =\n            SkipCallsTestHook(address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.AFTER_SWAP_FLAG)));\n\n        deploy(skipCallsTestHook);\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // swaps and increments counter\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 1);\n        // swaps again and increments counter\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 2);\n    }\n\n    function test_beforeDonate_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.BEFORE_DONATE_FLAG))\n        );\n\n        deploy(skipCallsTestHook);\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // donates and increments counter\n        donateRouter.donate(key, 100, 200, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 1);\n        // donates again and increments counter\n        donateRouter.donate(key, 100, 200, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 2);\n    }\n\n    function test_afterDonate_skipIfCalledByHook() public {\n        SkipCallsTestHook skipCallsTestHook = SkipCallsTestHook(\n            address(uint160(type(uint160).max & clearAllHookPermissionsMask | Hooks.AFTER_DONATE_FLAG))\n        );\n\n        deploy(skipCallsTestHook);\n        approveAndAddLiquidity(skipCallsTestHook);\n        assertEq(skipCallsTestHook.counter(), 0);\n\n        // donates and increments counter\n        donateRouter.donate(key, 100, 200, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 1);\n        // donates again and increments counter\n        donateRouter.donate(key, 100, 200, abi.encode(address(this)));\n        assertEq(skipCallsTestHook.counter(), 2);\n    }\n}\n"
  },
  {
    "path": "test/Sync.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\n\nimport {Deployers} from \"./utils/Deployers.sol\";\nimport {IHooks} from \"../src/interfaces/IHooks.sol\";\nimport {Currency} from \"../src/types/Currency.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {PoolSwapTest} from \"../src/test/PoolSwapTest.sol\";\nimport {IUnlockCallback} from \"../src/interfaces/callback/IUnlockCallback.sol\";\nimport {PoolKey} from \"../src/types/PoolKey.sol\";\nimport {ModifyLiquidityParams} from \"../src/types/PoolOperation.sol\";\nimport {ActionsRouter, Actions} from \"../src/test/ActionsRouter.sol\";\nimport {SafeCast} from \"../src/libraries/SafeCast.sol\";\nimport {CurrencyReserves} from \"../src/libraries/CurrencyReserves.sol\";\nimport {StateLibrary} from \"../src/libraries/StateLibrary.sol\";\nimport {TransientStateLibrary} from \"../src/libraries/TransientStateLibrary.sol\";\nimport {NativeERC20} from \"../src/test/NativeERC20.sol\";\nimport {IPoolManager} from \"../src/interfaces/IPoolManager.sol\";\nimport {CurrencyLibrary} from \"../src/types/Currency.sol\";\n\ncontract SyncTest is Test, Deployers {\n    using StateLibrary for IPoolManager;\n    using TransientStateLibrary for IPoolManager;\n\n    // PoolManager has no balance of currency2.\n    Currency currency2;\n\n    function setUp() public {\n        initializeManagerRoutersAndPoolsWithLiq(IHooks(address(0)));\n        currency2 = deployMintAndApproveCurrency();\n    }\n\n    function test_sync_multiple_unlocked() public noIsolate {\n        manager.sync(currency1);\n        assertEq(Currency.unwrap(currency1), Currency.unwrap(manager.getSyncedCurrency()));\n        manager.sync(currency0);\n        assertEq(Currency.unwrap(currency0), Currency.unwrap(manager.getSyncedCurrency()));\n    }\n\n    function test_sync_balanceIsZero() public {\n        assertEq(currency2.balanceOf(address(manager)), uint256(0));\n\n        Actions[] memory actions = new Actions[](2);\n        bytes[] memory params = new bytes[](2);\n\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency2);\n\n        actions[1] = Actions.ASSERT_RESERVES_EQUALS;\n        params[1] = abi.encode(0);\n\n        actionsRouter.executeActions(actions, params);\n\n        assertEq(currency2.balanceOf(address(manager)), uint256(0));\n    }\n\n    function test_sync_balanceIsNonzero() public {\n        uint256 currency0Balance = currency0.balanceOf(address(manager));\n        assertGt(currency0Balance, uint256(0));\n\n        Actions[] memory actions = new Actions[](4);\n        bytes[] memory params = new bytes[](4);\n\n        actions[0] = Actions.ASSERT_RESERVES_EQUALS;\n        params[0] = abi.encode(0);\n\n        actions[1] = Actions.SYNC;\n        params[1] = abi.encode(currency0);\n\n        actions[2] = Actions.ASSERT_RESERVES_EQUALS;\n        params[2] = abi.encode(currency0Balance);\n\n        actionsRouter.executeActions(actions, params);\n\n        uint256 balance = currency0.balanceOf(address(manager));\n        assertEq(balance, currency0Balance, \"balance not equal\");\n    }\n\n    function test_settle_withStartingBalance() public {\n        assertGt(currency0.balanceOf(address(manager)), uint256(0));\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        // Sync has not been called.\n        assertEq(manager.getSyncedReserves(), 0);\n\n        swapRouter.swap(key, SWAP_PARAMS, testSettings, new bytes(0));\n        (uint256 balanceCurrency0) = currency0.balanceOf(address(manager));\n\n        Actions[] memory actions = new Actions[](2);\n        bytes[] memory params = new bytes[](2);\n\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency0);\n\n        actions[1] = Actions.ASSERT_RESERVES_EQUALS;\n        params[1] = abi.encode(balanceCurrency0);\n\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_settle_withNoStartingBalance() public {\n        assertEq(currency2.balanceOf(address(manager)), uint256(0));\n\n        (Currency cur0, Currency cur1) = currency0 < currency2 ? (currency0, currency2) : (currency2, currency0);\n        PoolKey memory key2 =\n            PoolKey({currency0: cur0, currency1: cur1, fee: 3000, tickSpacing: 60, hooks: IHooks(address(0))});\n\n        manager.initialize(key2, SQRT_PRICE_1_1);\n\n        modifyLiquidityRouter.modifyLiquidity(key2, ModifyLiquidityParams(-60, 60, 100, 0), new bytes(0));\n        (uint256 balanceCurrency2) = currency2.balanceOf(address(manager));\n\n        Actions[] memory actions = new Actions[](2);\n        bytes[] memory params = new bytes[](2);\n\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency2);\n\n        actions[1] = Actions.ASSERT_RESERVES_EQUALS;\n        params[1] = abi.encode(balanceCurrency2);\n\n        actionsRouter.executeActions(actions, params);\n    }\n\n    function test_settle_payOnBehalf(address taker, uint256 amount) public {\n        vm.assume(taker != address(actionsRouter));\n        amount = bound(amount, 1, uint256(int256(type(int128).max)));\n        MockERC20(Currency.unwrap(currency2)).approve(address(actionsRouter), type(uint256).max);\n        MockERC20(Currency.unwrap(currency2)).mint(address(manager), amount);\n\n        Actions[] memory actions = new Actions[](6);\n        bytes[] memory params = new bytes[](6);\n\n        actions[0] = Actions.PRANK_TAKE_FROM;\n        params[0] = abi.encode(currency2, taker, taker, amount);\n\n        actions[1] = Actions.ASSERT_DELTA_EQUALS;\n        params[1] = abi.encode(currency2, taker, int256(amount) * -1);\n\n        actions[2] = Actions.SYNC;\n        params[2] = abi.encode(currency2);\n\n        actions[3] = Actions.TRANSFER_FROM;\n        params[3] = abi.encode(currency2, address(this), address(manager), amount);\n\n        actions[4] = Actions.SETTLE_FOR;\n        params[4] = abi.encode(taker);\n\n        actions[5] = Actions.ASSERT_DELTA_EQUALS;\n        params[5] = abi.encode(currency2, taker, 0);\n\n        actionsRouter.executeActions(actions, params);\n    }\n\n    /// @notice When there is no balance and reserves are set to 0, no delta should be applied.\n    function test_settle_noBalanceInPool_shouldNotApplyDelta() public {\n        assertEq(currency2.balanceOf(address(manager)), uint256(0));\n\n        Actions[] memory actions = new Actions[](4);\n        bytes[] memory params = new bytes[](4);\n\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency2);\n\n        actions[1] = Actions.ASSERT_RESERVES_EQUALS;\n        params[1] = abi.encode(0);\n\n        actions[2] = Actions.SETTLE;\n\n        actions[3] = Actions.ASSERT_DELTA_EQUALS;\n        params[3] = abi.encode(currency2, address(actionsRouter), 0);\n\n        actionsRouter.executeActions(actions, params);\n    }\n\n    /// @notice When there is a balance, no delta should be applied.\n    function test_settle_balanceInPool_shouldNotApplyDelta() public {\n        uint256 currency0Balance = currency0.balanceOf(address(manager));\n        assertGt(currency0Balance, uint256(0));\n\n        Actions[] memory actions = new Actions[](5);\n        bytes[] memory params = new bytes[](5);\n\n        actions[0] = Actions.ASSERT_RESERVES_EQUALS;\n        params[0] = abi.encode(0);\n\n        actions[1] = Actions.SYNC;\n        params[1] = abi.encode(currency0);\n\n        actions[2] = Actions.ASSERT_RESERVES_EQUALS;\n        params[2] = abi.encode(currency0Balance);\n\n        actions[3] = Actions.SETTLE;\n\n        actions[4] = Actions.ASSERT_DELTA_EQUALS;\n        params[4] = abi.encode(currency0, address(actionsRouter), 0);\n\n        actionsRouter.executeActions(actions, params);\n    }\n\n    // @notice This tests expected behavior if you DO NOT call sync before a non native settle. (ie. Do not interact with the pool manager properly. You can lose funds.)\n    function test_settle_nonNative_withoutSync_loseFunds() public {\n        MockERC20(Currency.unwrap(currency0)).approve(address(actionsRouter), type(uint256).max);\n        uint256 managerCurrency0BalanceBefore = currency0.balanceOf(address(manager));\n        uint256 userCurrency0BalanceBefore = currency0.balanceOf(address(this));\n\n        Actions[] memory actions = new Actions[](9);\n        bytes[] memory params = new bytes[](9);\n\n        vm.startSnapshotGas(\"getReserves\");\n        uint256 reserves = manager.getSyncedReserves();\n        vm.stopSnapshotGas();\n        assertEq(reserves, 0); // reserves are 0.\n\n        actions[0] = Actions.TAKE;\n        params[0] = abi.encode(currency0, address(this), 10);\n\n        // Assert that the delta open on the actionsRouter is -10. (The user owes 10 to the pool).\n        actions[1] = Actions.ASSERT_DELTA_EQUALS;\n        params[1] = abi.encode(currency0, address(actionsRouter), -10);\n\n        actions[2] = Actions.TRANSFER_FROM; // NOT syned before sending tokens\n        params[2] = abi.encode(currency0, address(this), manager, 10);\n\n        actions[3] = Actions.SETTLE; // calling settle without sync is expecting a native token, but msg.value == 0 so it settles for 0.\n\n        actions[4] = Actions.ASSERT_DELTA_EQUALS;\n        params[4] = abi.encode(currency0, address(actionsRouter), -10);\n\n        actions[5] = Actions.SYNC;\n        params[5] = abi.encode(currency0);\n\n        // To now settle the delta, the user owes 10 to the pool.\n        actions[6] = Actions.TRANSFER_FROM;\n        params[6] = abi.encode(currency0, address(this), manager, 10);\n\n        actions[7] = Actions.SETTLE;\n\n        actions[8] = Actions.ASSERT_DELTA_EQUALS;\n        params[8] = abi.encode(currency0, address(actionsRouter), 0);\n\n        actionsRouter.executeActions(actions, params);\n\n        // The manager gained 10 currency0.\n        assertEq(currency0.balanceOf(address(manager)), managerCurrency0BalanceBefore + 10);\n        // The user lost 10 currency0, and can never claim it back.\n        assertEq(currency0.balanceOf(address(this)), userCurrency0BalanceBefore - 10);\n    }\n\n    function test_settle_failsWithNativeERC20IfNotSyncedInOrder(uint256 value) public {\n        value = bound(value, 1, uint256(int256(type(int128).max / 2)));\n        vm.deal(address(this), value);\n        vm.deal(address(manager), value);\n        NativeERC20 nativeERC20 = new NativeERC20();\n\n        uint256 nativeERC20Balance = nativeERC20.balanceOf(address(manager));\n\n        Actions[] memory actions = new Actions[](3);\n        bytes[] memory params = new bytes[](3);\n\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(nativeERC20);\n\n        actions[1] = Actions.ASSERT_RESERVES_EQUALS;\n        params[1] = abi.encode(nativeERC20Balance);\n\n        actions[2] = Actions.SETTLE_NATIVE;\n        params[2] = abi.encode(value);\n\n        vm.expectRevert(IPoolManager.NonzeroNativeValue.selector);\n        actionsRouter.executeActions{value: value}(actions, params);\n\n        // Reference only - see OZ C01 report - previous test confirming vulnerability\n        // uint256 balanceBefore = address(this).balance;\n\n        // actions[1] = Actions.SETTLE;\n        // params[1] = abi.encode(Currency.wrap(address(nativeERC20)));\n\n        // actions[2] = Actions.ASSERT_DELTA_EQUALS;\n        // params[2] = abi.encode(Currency.wrap(address(0)), address(actionsRouter), value);\n\n        // actions[3] = Actions.ASSERT_DELTA_EQUALS;\n        // params[3] = abi.encode(Currency.wrap(address(nativeERC20)), address(actionsRouter), value);\n\n        // actions[4] = Actions.TAKE;\n        // params[4] = abi.encode(Currency.wrap(address(0)), address(this), value);\n\n        // actions[5] = Actions.TAKE;\n        // params[5] = abi.encode(Currency.wrap(address(nativeERC20)), address(this), value);\n\n        // uint256 balanceAfter = address(this).balance;\n        // assertEq(balanceAfter - balanceBefore, value);\n    }\n\n    function test_settle_native_afterERC20Sync_succeeds(uint256 currency2Balance, uint256 ethBalance) public {\n        currency2Balance = bound(currency2Balance, 1, uint256(int256(type(int128).max / 2)));\n        ethBalance = bound(ethBalance, 1, uint256(int256(type(int128).max / 2)));\n\n        vm.deal(address(this), ethBalance);\n        // ensure the reserves balance is non 0\n        currency2.transfer(address(manager), currency2Balance);\n\n        Actions[] memory actions = new Actions[](8);\n        bytes[] memory params = new bytes[](8);\n\n        actions[0] = Actions.ASSERT_RESERVES_EQUALS;\n        params[0] = abi.encode(0);\n\n        actions[1] = Actions.SYNC;\n        params[1] = abi.encode(currency2);\n\n        actions[2] = Actions.ASSERT_RESERVES_EQUALS;\n        params[2] = abi.encode(currency2Balance);\n\n        actions[3] = Actions.SYNC;\n        params[3] = abi.encode(CurrencyLibrary.ADDRESS_ZERO);\n\n        // Under the hood this is non-zero but our transient state library overrides the value if the currency is address(0)\n        actions[4] = Actions.ASSERT_RESERVES_EQUALS;\n        params[4] = abi.encode(0);\n\n        // This calls settle with a value, of ethBalance. Since the synedCurrency slot is address(0), the call should successfully apply a positive delta on the native currency.\n        actions[5] = Actions.SETTLE_NATIVE;\n        params[5] = abi.encode(ethBalance);\n\n        actions[6] = Actions.ASSERT_DELTA_EQUALS;\n        params[6] = abi.encode(CurrencyLibrary.ADDRESS_ZERO, address(actionsRouter), ethBalance);\n\n        // take the eth to close the deltas\n        actions[7] = Actions.TAKE;\n        params[7] = abi.encode(CurrencyLibrary.ADDRESS_ZERO, address(this), ethBalance);\n\n        actionsRouter.executeActions{value: ethBalance}(actions, params);\n    }\n\n    function test_settle_twice_doesNotApplyDelta(uint256 value) public {\n        value = bound(value, 1, uint256(int256(type(int128).max / 2)));\n        currency2.transfer(address(manager), value);\n\n        Actions[] memory actions = new Actions[](8);\n        bytes[] memory params = new bytes[](8);\n\n        actions[0] = Actions.SYNC;\n        params[0] = abi.encode(currency2);\n\n        actions[1] = Actions.ASSERT_RESERVES_EQUALS;\n        params[1] = abi.encode(value);\n\n        actions[2] = Actions.TRANSFER_FROM;\n        params[2] = abi.encode(currency2, address(this), address(manager), value);\n\n        // This settles the syncedCurrency, currency2.\n        actions[3] = Actions.SETTLE;\n\n        actions[4] = Actions.ASSERT_DELTA_EQUALS;\n        params[4] = abi.encode(currency2, address(actionsRouter), value);\n\n        actions[5] = Actions.TAKE;\n        params[5] = abi.encode(currency2, address(this), value);\n\n        // This settles the syncedCurrency, which has been cleared to address(0).\n        actions[6] = Actions.SETTLE;\n\n        // Calling settle on address(0) does not apply a delta when called with no value.\n        actions[7] = Actions.ASSERT_DELTA_EQUALS;\n        params[7] = abi.encode(CurrencyLibrary.ADDRESS_ZERO, address(actionsRouter), 0);\n\n        actionsRouter.executeActions(actions, params);\n    }\n}\n"
  },
  {
    "path": "test/Tick.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {stdError} from \"forge-std/StdError.sol\";\nimport {Constants} from \"./utils/Constants.sol\";\nimport {Pool} from \"../src/libraries/Pool.sol\";\nimport {TickMath} from \"../src/libraries/TickMath.sol\";\n\ncontract LiquidityMathRef {\n    function addDelta(uint128 x, int128 y) external pure returns (uint128) {\n        return y < 0 ? x - uint128(-y) : x + uint128(y);\n    }\n\n    function addDelta(bool upper, int128 liquidityNetBefore, int128 liquidityDelta)\n        external\n        pure\n        returns (int128 liquidityNet)\n    {\n        liquidityNet = upper ? liquidityNetBefore - liquidityDelta : liquidityNetBefore + liquidityDelta;\n    }\n}\n\ncontract TickTest is Test {\n    using Pool for Pool.State;\n\n    int24 constant LOW_TICK_SPACING = 10;\n    int24 constant MEDIUM_TICK_SPACING = 60;\n    int24 constant HIGH_TICK_SPACING = 200;\n\n    Pool.State public pool;\n\n    LiquidityMathRef internal liquidityMath;\n\n    function setUp() public {\n        liquidityMath = new LiquidityMathRef();\n    }\n\n    function ticks(int24 tick) internal view returns (Pool.TickInfo memory) {\n        return pool.ticks[tick];\n    }\n\n    function tickBitmap(int16 word) internal view returns (uint256) {\n        return pool.tickBitmap[word];\n    }\n\n    function tickSpacingToMaxLiquidityPerTick(int24 tickSpacing) internal pure returns (uint128) {\n        return Pool.tickSpacingToMaxLiquidityPerTick(tickSpacing);\n    }\n\n    function setTick(int24 tick, Pool.TickInfo memory info) internal {\n        pool.ticks[tick] = info;\n    }\n\n    function setTickBitmap(int16 word, uint256 bitmap) internal {\n        pool.tickBitmap[word] = bitmap;\n    }\n\n    function getFeeGrowthInside(\n        int24 tickLower,\n        int24 tickUpper,\n        int24 tickCurrent,\n        uint256 feeGrowthGlobal0X128,\n        uint256 feeGrowthGlobal1X128\n    ) internal returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) {\n        pool.slot0 = pool.slot0.setTick(tickCurrent);\n        pool.feeGrowthGlobal0X128 = feeGrowthGlobal0X128;\n        pool.feeGrowthGlobal1X128 = feeGrowthGlobal1X128;\n        return pool.getFeeGrowthInside(tickLower, tickUpper);\n    }\n\n    function update(\n        int24 tick,\n        int24 tickCurrent,\n        int128 liquidityDelta,\n        uint256 feeGrowthGlobal0X128,\n        uint256 feeGrowthGlobal1X128,\n        bool upper\n    ) internal returns (bool flipped, uint128 liquidityGrossAfter) {\n        pool.slot0 = pool.slot0.setTick(tickCurrent);\n        pool.feeGrowthGlobal0X128 = feeGrowthGlobal0X128;\n        pool.feeGrowthGlobal1X128 = feeGrowthGlobal1X128;\n        return pool.updateTick(tick, liquidityDelta, upper);\n    }\n\n    function clear(int24 tick) internal {\n        pool.clearTick(tick);\n    }\n\n    function cross(int24 tick, uint256 feeGrowthGlobal0X128, uint256 feeGrowthGlobal1X128)\n        internal\n        returns (int128 liquidityNet)\n    {\n        return pool.crossTick(tick, feeGrowthGlobal0X128, feeGrowthGlobal1X128);\n    }\n\n    function getMinTick(int24 tickSpacing) internal pure returns (int256) {\n        return (TickMath.MIN_TICK / tickSpacing) * tickSpacing;\n    }\n\n    function getMaxTick(int24 tickSpacing) internal pure returns (int256) {\n        return (TickMath.MAX_TICK / tickSpacing) * tickSpacing;\n    }\n\n    function checkCantOverflow(int24 tickSpacing, uint128 maxLiquidityPerTick) internal pure {\n        assertLe(\n            uint256(\n                uint256(maxLiquidityPerTick)\n                    * uint256((getMaxTick(tickSpacing) - getMinTick(tickSpacing)) / tickSpacing + 1)\n            ),\n            uint256(Constants.MAX_UINT128)\n        );\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_returnsTheCorrectValueForLowFee() public pure {\n        uint128 maxLiquidityPerTick = tickSpacingToMaxLiquidityPerTick(LOW_TICK_SPACING);\n\n        assertEq(maxLiquidityPerTick, 1917559095893846719543856547154045);\n        checkCantOverflow(LOW_TICK_SPACING, maxLiquidityPerTick);\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_returnsTheCorrectValueForMediumFee() public pure {\n        uint128 maxLiquidityPerTick = tickSpacingToMaxLiquidityPerTick(MEDIUM_TICK_SPACING);\n\n        assertEq(maxLiquidityPerTick, 11505354575363080317263139282924270);\n        checkCantOverflow(MEDIUM_TICK_SPACING, maxLiquidityPerTick);\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_returnsTheCorrectValueForHighFee() public pure {\n        uint128 maxLiquidityPerTick = tickSpacingToMaxLiquidityPerTick(HIGH_TICK_SPACING);\n\n        assertEq(maxLiquidityPerTick, 38345995821606768476828330790147420);\n        checkCantOverflow(HIGH_TICK_SPACING, maxLiquidityPerTick);\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_returnsTheCorrectValueForMinTickSpacing() public pure {\n        uint128 maxLiquidityPerTick = tickSpacingToMaxLiquidityPerTick(TickMath.MIN_TICK_SPACING);\n\n        assertEq(maxLiquidityPerTick, 191757530477355301479181766273477);\n        checkCantOverflow(TickMath.MIN_TICK_SPACING, maxLiquidityPerTick);\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_returnsTheCorrectValueForMaxTickSpacing() public pure {\n        uint128 maxLiquidityPerTick = tickSpacingToMaxLiquidityPerTick(TickMath.MAX_TICK_SPACING);\n\n        assertEq(maxLiquidityPerTick, 6076470837873901133274546561281575204);\n        checkCantOverflow(TickMath.MAX_TICK_SPACING, maxLiquidityPerTick);\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_returnsTheCorrectValueForEntireRange() public pure {\n        uint128 maxLiquidityPerTick = tickSpacingToMaxLiquidityPerTick(TickMath.MAX_TICK);\n\n        assertEq(maxLiquidityPerTick, type(uint128).max / 3);\n        checkCantOverflow(TickMath.MAX_TICK, maxLiquidityPerTick);\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_returnsTheCorrectValueFor2302() public pure {\n        uint128 maxLiquidityPerTick = tickSpacingToMaxLiquidityPerTick(2302);\n\n        assertEq(maxLiquidityPerTick, 440780268032303709149448973357212709);\n        checkCantOverflow(2302, maxLiquidityPerTick);\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_gasCostMinTickSpacing() public {\n        vm.startSnapshotGas(\"tickSpacingToMaxLiquidityPerTick_gasCostMinTickSpacing\");\n        tickSpacingToMaxLiquidityPerTick(TickMath.MIN_TICK_SPACING);\n        vm.stopSnapshotGas();\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_gasCost60TickSpacing() public {\n        vm.startSnapshotGas(\"tickSpacingToMaxLiquidityPerTick_gasCost60TickSpacing\");\n        tickSpacingToMaxLiquidityPerTick(60);\n        vm.stopSnapshotGas();\n    }\n\n    function testTick_tickSpacingToMaxLiquidityPerTick_gasCostMaxTickSpacing() public {\n        vm.startSnapshotGas(\"tickSpacingToMaxLiquidityPerTick_gasCostMaxTickSpacing\");\n        tickSpacingToMaxLiquidityPerTick(TickMath.MAX_TICK_SPACING);\n        vm.stopSnapshotGas();\n    }\n\n    function testTick_getFeeGrowthInside_returnsAllForTwoUninitializedTicksIfTickIsInside() public {\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = getFeeGrowthInside(-2, 2, 0, 15, 15);\n\n        assertEq(feeGrowthInside0X128, 15);\n        assertEq(feeGrowthInside1X128, 15);\n    }\n\n    function testTick_getFeeGrowthInside_returns0ForTwoUninitializedTicksIfTickIsAbove() public {\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = getFeeGrowthInside(-2, 2, 4, 15, 15);\n\n        assertEq(feeGrowthInside0X128, 0);\n        assertEq(feeGrowthInside1X128, 0);\n    }\n\n    function testTick_getFeeGrowthInside_returns0ForTwoUninitializedTicksIfTickIsBelow() public {\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = getFeeGrowthInside(-2, 2, -4, 15, 15);\n\n        assertEq(feeGrowthInside0X128, 0);\n        assertEq(feeGrowthInside1X128, 0);\n    }\n\n    function testTick_getFeeGrowthInside_subtractsUpperTickIfBelow() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 2;\n        info.feeGrowthOutside1X128 = 3;\n        info.liquidityGross = 0;\n        info.liquidityNet = 0;\n\n        setTick(2, info);\n\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = getFeeGrowthInside(-2, 2, 0, 15, 15);\n\n        assertEq(feeGrowthInside0X128, 13);\n        assertEq(feeGrowthInside1X128, 12);\n    }\n\n    function testTick_getFeeGrowthInside_subtractsLowerTickIfAbove() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 2;\n        info.feeGrowthOutside1X128 = 3;\n        info.liquidityGross = 0;\n        info.liquidityNet = 0;\n\n        setTick(-2, info);\n\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = getFeeGrowthInside(-2, 2, 0, 15, 15);\n\n        assertEq(feeGrowthInside0X128, 13);\n        assertEq(feeGrowthInside1X128, 12);\n    }\n\n    function testTick_getFeeGrowthInside_subtractsUpperAndLowerTickIfInside() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 2;\n        info.feeGrowthOutside1X128 = 3;\n        info.liquidityGross = 0;\n        info.liquidityNet = 0;\n\n        setTick(-2, info);\n\n        info.feeGrowthOutside0X128 = 4;\n        info.feeGrowthOutside1X128 = 1;\n        info.liquidityGross = 0;\n        info.liquidityNet = 0;\n\n        setTick(2, info);\n\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = getFeeGrowthInside(-2, 2, 0, 15, 15);\n\n        assertEq(feeGrowthInside0X128, 9);\n        assertEq(feeGrowthInside1X128, 11);\n    }\n\n    function testTick_getFeeGrowthInside_worksCorrectlyWithOverflowOnInsideTick() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = Constants.MAX_UINT256 - 3;\n        info.feeGrowthOutside1X128 = Constants.MAX_UINT256 - 2;\n        info.liquidityGross = 0;\n        info.liquidityNet = 0;\n\n        setTick(-2, info);\n\n        info.feeGrowthOutside0X128 = 3;\n        info.feeGrowthOutside1X128 = 5;\n        info.liquidityGross = 0;\n        info.liquidityNet = 0;\n\n        setTick(2, info);\n\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = getFeeGrowthInside(-2, 2, 0, 15, 15);\n\n        assertEq(feeGrowthInside0X128, 16);\n        assertEq(feeGrowthInside1X128, 13);\n    }\n\n    function testTick_update_flipsFromZeroToNonzero() public {\n        (bool flipped, uint128 liquidityGrossAfter) = update(0, 0, 1, 0, 0, false);\n\n        assertEq(flipped, true);\n        assertEq(liquidityGrossAfter, 1);\n    }\n\n    function testTick_update_doesNotFlipFromNonzeroToGreaterNonzero() public {\n        update(0, 0, 1, 0, 0, false);\n        (bool flipped, uint128 liquidityGrossAfter) = update(0, 0, 1, 0, 0, false);\n\n        assertEq(flipped, false);\n        assertEq(liquidityGrossAfter, 2);\n    }\n\n    function testTick_update_flipsFromNonzeroToZero() public {\n        update(0, 0, 1, 0, 0, false);\n        (bool flipped, uint128 liquidityGrossAfter) = update(0, 0, -1, 0, 0, false);\n\n        assertEq(flipped, true);\n        assertEq(liquidityGrossAfter, 0);\n    }\n\n    function testTick_update_doesNotFlipFromNonzeroToLesserZero() public {\n        update(0, 0, 2, 0, 0, false);\n        (bool flipped, uint128 liquidityGrossAfter) = update(0, 0, -1, 0, 0, false);\n\n        assertEq(flipped, false);\n        assertEq(liquidityGrossAfter, 1);\n    }\n\n    function testTick_update_netsTheLiquidityBasedOnUpperFlag() public {\n        Pool.TickInfo memory tickInfo;\n\n        update(0, 0, 2, 0, 0, false);\n        update(0, 0, 1, 0, 0, true);\n        update(0, 0, 3, 0, 0, true);\n        update(0, 0, 1, 0, 0, false);\n        tickInfo = ticks(0);\n\n        assertEq(tickInfo.liquidityGross, 2 + 1 + 3 + 1);\n        assertEq(tickInfo.liquidityNet, 2 - 1 - 3 + 1);\n    }\n\n    function testTick_update_revertsOnOverflowLiquidityGross() public {\n        update(0, 0, int128(Constants.MAX_UINT128 / 2 - 1), 0, 0, false);\n\n        vm.expectRevert();\n        update(0, 0, int128(Constants.MAX_UINT128 / 2 - 1), 0, 0, false);\n    }\n\n    function testTick_update_assumesAllGrowthHappensBelowTicksLteCurrentTick() public {\n        Pool.TickInfo memory tickInfo;\n\n        update(1, 1, 1, 1, 2, false);\n        tickInfo = ticks(1);\n\n        assertEq(tickInfo.feeGrowthOutside0X128, 1);\n        assertEq(tickInfo.feeGrowthOutside1X128, 2);\n    }\n\n    function testTick_update_doesNotSetAnyGrowthFieldsIfTickIsAlreadyInitialized() public {\n        Pool.TickInfo memory tickInfo;\n\n        update(1, 1, 1, 1, 2, false);\n        update(1, 1, 1, 6, 7, false);\n        tickInfo = ticks(1);\n\n        assertEq(tickInfo.feeGrowthOutside0X128, 1);\n        assertEq(tickInfo.feeGrowthOutside1X128, 2);\n    }\n\n    function testTick_update_doesNotSetAnyGrowthFieldsForTicksGtCurrentTick() public {\n        Pool.TickInfo memory tickInfo;\n\n        update(2, 1, 1, 1, 2, false);\n        tickInfo = ticks(2);\n\n        assertEq(tickInfo.feeGrowthOutside0X128, 0);\n        assertEq(tickInfo.feeGrowthOutside1X128, 0);\n    }\n\n    function testTick_update_liquidityParsing_parsesMaxUint128StoredLiquidityGrossBeforeUpdate() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 0;\n        info.feeGrowthOutside1X128 = 0;\n        info.liquidityGross = Constants.MAX_UINT128;\n        info.liquidityNet = 0;\n\n        setTick(2, info);\n        update(2, 1, -1, 1, 2, false);\n\n        info = ticks(2);\n\n        assertEq(info.liquidityGross, Constants.MAX_UINT128 - 1);\n        assertEq(info.liquidityNet, -1);\n    }\n\n    function testTick_update_liquidityParsing_parsesMaxUint128StoredLiquidityGrossAfterUpdate() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 0;\n        info.feeGrowthOutside1X128 = 0;\n        info.liquidityGross = (Constants.MAX_UINT128 / 2) + 1;\n        info.liquidityNet = 0;\n\n        setTick(2, info);\n\n        update(2, 1, int128(Constants.MAX_UINT128 / 2), 1, 2, false);\n\n        info = ticks(2);\n\n        assertEq(info.liquidityGross, Constants.MAX_UINT128);\n        assertEq(info.liquidityNet, int128(Constants.MAX_UINT128 / 2));\n    }\n\n    function testTick_update_liquidityParsing_parsesMaxInt128StoredLiquidityGrossBeforeUpdate() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 0;\n        info.feeGrowthOutside1X128 = 0;\n        info.liquidityGross = 1;\n        info.liquidityNet = int128(Constants.MAX_UINT128 / 2);\n\n        setTick(2, info);\n        update(2, 1, -1, 1, 2, false);\n\n        info = ticks(2);\n\n        assertEq(info.liquidityGross, 0);\n        assertEq(info.liquidityNet, int128(Constants.MAX_UINT128 / 2 - 1));\n    }\n\n    function testTick_update_liquidityParsing_parsesMaxInt128StoredLiquidityGrossAfterUpdate() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 0;\n        info.feeGrowthOutside1X128 = 0;\n        info.liquidityGross = 0;\n        info.liquidityNet = int128(Constants.MAX_UINT128 / 2 - 1);\n\n        setTick(2, info);\n\n        update(2, 1, 1, 1, 2, false);\n\n        info = ticks(2);\n\n        assertEq(info.liquidityGross, 1);\n        assertEq(info.liquidityNet, int128(Constants.MAX_UINT128 / 2));\n    }\n\n    function testTick_update_fuzz(uint128 liquidityGross, int128 liquidityNet, int128 liquidityDelta, bool upper)\n        public\n    {\n        try liquidityMath.addDelta(liquidityGross, liquidityDelta) returns (uint128 liquidityGrossAfter) {\n            try liquidityMath.addDelta(upper, liquidityNet, liquidityDelta) returns (int128 liquidityNetAfter) {\n                Pool.TickInfo memory info = Pool.TickInfo({\n                    liquidityGross: liquidityGross,\n                    liquidityNet: liquidityNet,\n                    feeGrowthOutside0X128: 0,\n                    feeGrowthOutside1X128: 0\n                });\n\n                setTick(2, info);\n                update({\n                    tick: 2,\n                    tickCurrent: 1,\n                    liquidityDelta: liquidityDelta,\n                    feeGrowthGlobal0X128: 0,\n                    feeGrowthGlobal1X128: 0,\n                    upper: upper\n                });\n\n                info = ticks(2);\n\n                assertEq(info.liquidityGross, liquidityGrossAfter);\n                assertEq(info.liquidityNet, liquidityNetAfter);\n            } catch (bytes memory reason) {\n                assertEq(reason, stdError.arithmeticError);\n            }\n        } catch (bytes memory reason) {\n            assertEq(reason, stdError.arithmeticError);\n        }\n    }\n\n    function testTick_clear_deletesAllTheDataInTheTick() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 1;\n        info.feeGrowthOutside1X128 = 2;\n        info.liquidityGross = 3;\n        info.liquidityNet = 4;\n\n        setTick(2, info);\n\n        clear(2);\n\n        info = ticks(2);\n\n        assertEq(info.feeGrowthOutside0X128, 0);\n        assertEq(info.feeGrowthOutside1X128, 0);\n        assertEq(info.liquidityGross, 0);\n        assertEq(info.liquidityNet, 0);\n    }\n\n    function testTick_cross_flipsTheGrowthVariables() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 1;\n        info.feeGrowthOutside1X128 = 2;\n        info.liquidityGross = 3;\n        info.liquidityNet = 4;\n\n        setTick(2, info);\n\n        cross(2, 7, 9);\n\n        info = ticks(2);\n\n        assertEq(info.feeGrowthOutside0X128, 6);\n        assertEq(info.feeGrowthOutside1X128, 7);\n    }\n\n    function testTick_cross_twoFlipsAreNoOp() public {\n        Pool.TickInfo memory info;\n\n        info.feeGrowthOutside0X128 = 1;\n        info.feeGrowthOutside1X128 = 2;\n        info.liquidityGross = 3;\n        info.liquidityNet = 4;\n\n        setTick(2, info);\n\n        cross(2, 7, 9);\n        cross(2, 7, 9);\n\n        info = ticks(2);\n\n        assertEq(info.feeGrowthOutside0X128, 1);\n        assertEq(info.feeGrowthOutside1X128, 2);\n    }\n\n    function test_getPoolTickInfo(int24 tick, Pool.TickInfo memory info) public {\n        setTick(tick, info);\n        Pool.TickInfo memory actualInfo = ticks(tick);\n        assertEq(actualInfo.liquidityGross, info.liquidityGross);\n        assertEq(actualInfo.liquidityNet, info.liquidityNet);\n        assertEq(actualInfo.feeGrowthOutside0X128, info.feeGrowthOutside0X128);\n        assertEq(actualInfo.feeGrowthOutside1X128, info.feeGrowthOutside1X128);\n    }\n\n    function test_getPoolBitmapInfo(int16 word, uint256 bitmap) public {\n        setTickBitmap(word, bitmap);\n        assertEq(tickBitmap(word), bitmap);\n    }\n\n    function testTick_tickSpacingToParametersInvariants_fuzz(int24 tickSpacing) public pure {\n        tickSpacing = int24(bound(tickSpacing, TickMath.MIN_TICK_SPACING, TickMath.MAX_TICK_SPACING));\n\n        int24 minTick = (TickMath.MIN_TICK / tickSpacing) * tickSpacing;\n        int24 maxTick = (TickMath.MAX_TICK / tickSpacing) * tickSpacing;\n\n        uint128 maxLiquidityPerTick = Pool.tickSpacingToMaxLiquidityPerTick(tickSpacing);\n\n        // symmetry around 0 tick\n        assertEq(maxTick, -minTick);\n        // positive max tick\n        assertGt(maxTick, 0);\n        // divisibility\n        assertEq((maxTick - minTick) % tickSpacing, 0);\n\n        uint256 numTicks = uint256(int256((maxTick - minTick) / tickSpacing)) + 1;\n\n        // sum of max liquidity on each tick is at most the cap\n        assertGe(type(uint128).max, uint256(maxLiquidityPerTick) * numTicks);\n    }\n}\n"
  },
  {
    "path": "test/js-scripts/build.js",
    "content": "const { build } = require(\"esbuild\");\n\nconst entryPoints = [\"getModifyLiquidityResult\", \"getSqrtPriceAtTick\", \"getTickAtSqrtPrice\"];\n\nconst sharedConfig = {\n  bundle: true,\n  minify: false,\n};\n\nfor (const entryPoint of entryPoints) {\n  build({\n    entryPoints: [`src/${entryPoint}.ts`],\n    ...sharedConfig,\n    platform: \"node\",\n    outfile: `dist/${entryPoint}.js`,\n  });\n}\n"
  },
  {
    "path": "test/js-scripts/dist/getModifyLiquidityResult.js",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod) => function __require() {\n  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\n\n// node_modules/bn.js/lib/bn.js\nvar require_bn = __commonJS({\n  \"node_modules/bn.js/lib/bn.js\"(exports2, module2) {\n    (function(module3, exports3) {\n      \"use strict\";\n      function assert(val, msg) {\n        if (!val) throw new Error(msg || \"Assertion failed\");\n      }\n      function inherits(ctor, superCtor) {\n        ctor.super_ = superCtor;\n        var TempCtor = function() {\n        };\n        TempCtor.prototype = superCtor.prototype;\n        ctor.prototype = new TempCtor();\n        ctor.prototype.constructor = ctor;\n      }\n      function BN(number, base, endian) {\n        if (BN.isBN(number)) {\n          return number;\n        }\n        this.negative = 0;\n        this.words = null;\n        this.length = 0;\n        this.red = null;\n        if (number !== null) {\n          if (base === \"le\" || base === \"be\") {\n            endian = base;\n            base = 10;\n          }\n          this._init(number || 0, base || 10, endian || \"be\");\n        }\n      }\n      if (typeof module3 === \"object\") {\n        module3.exports = BN;\n      } else {\n        exports3.BN = BN;\n      }\n      BN.BN = BN;\n      BN.wordSize = 26;\n      var Buffer2;\n      try {\n        if (typeof window !== \"undefined\" && typeof window.Buffer !== \"undefined\") {\n          Buffer2 = window.Buffer;\n        } else {\n          Buffer2 = require(\"buffer\").Buffer;\n        }\n      } catch (e) {\n      }\n      BN.isBN = function isBN(num) {\n        if (num instanceof BN) {\n          return true;\n        }\n        return num !== null && typeof num === \"object\" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n      };\n      BN.max = function max(left, right) {\n        if (left.cmp(right) > 0) return left;\n        return right;\n      };\n      BN.min = function min(left, right) {\n        if (left.cmp(right) < 0) return left;\n        return right;\n      };\n      BN.prototype._init = function init(number, base, endian) {\n        if (typeof number === \"number\") {\n          return this._initNumber(number, base, endian);\n        }\n        if (typeof number === \"object\") {\n          return this._initArray(number, base, endian);\n        }\n        if (base === \"hex\") {\n          base = 16;\n        }\n        assert(base === (base | 0) && base >= 2 && base <= 36);\n        number = number.toString().replace(/\\s+/g, \"\");\n        var start = 0;\n        if (number[0] === \"-\") {\n          start++;\n          this.negative = 1;\n        }\n        if (start < number.length) {\n          if (base === 16) {\n            this._parseHex(number, start, endian);\n          } else {\n            this._parseBase(number, base, start);\n            if (endian === \"le\") {\n              this._initArray(this.toArray(), base, endian);\n            }\n          }\n        }\n      };\n      BN.prototype._initNumber = function _initNumber(number, base, endian) {\n        if (number < 0) {\n          this.negative = 1;\n          number = -number;\n        }\n        if (number < 67108864) {\n          this.words = [number & 67108863];\n          this.length = 1;\n        } else if (number < 4503599627370496) {\n          this.words = [\n            number & 67108863,\n            number / 67108864 & 67108863\n          ];\n          this.length = 2;\n        } else {\n          assert(number < 9007199254740992);\n          this.words = [\n            number & 67108863,\n            number / 67108864 & 67108863,\n            1\n          ];\n          this.length = 3;\n        }\n        if (endian !== \"le\") return;\n        this._initArray(this.toArray(), base, endian);\n      };\n      BN.prototype._initArray = function _initArray(number, base, endian) {\n        assert(typeof number.length === \"number\");\n        if (number.length <= 0) {\n          this.words = [0];\n          this.length = 1;\n          return this;\n        }\n        this.length = Math.ceil(number.length / 3);\n        this.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          this.words[i] = 0;\n        }\n        var j, w;\n        var off = 0;\n        if (endian === \"be\") {\n          for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n            w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;\n            this.words[j] |= w << off & 67108863;\n            this.words[j + 1] = w >>> 26 - off & 67108863;\n            off += 24;\n            if (off >= 26) {\n              off -= 26;\n              j++;\n            }\n          }\n        } else if (endian === \"le\") {\n          for (i = 0, j = 0; i < number.length; i += 3) {\n            w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;\n            this.words[j] |= w << off & 67108863;\n            this.words[j + 1] = w >>> 26 - off & 67108863;\n            off += 24;\n            if (off >= 26) {\n              off -= 26;\n              j++;\n            }\n          }\n        }\n        return this.strip();\n      };\n      function parseHex4Bits(string, index) {\n        var c = string.charCodeAt(index);\n        if (c >= 65 && c <= 70) {\n          return c - 55;\n        } else if (c >= 97 && c <= 102) {\n          return c - 87;\n        } else {\n          return c - 48 & 15;\n        }\n      }\n      function parseHexByte(string, lowerBound, index) {\n        var r = parseHex4Bits(string, index);\n        if (index - 1 >= lowerBound) {\n          r |= parseHex4Bits(string, index - 1) << 4;\n        }\n        return r;\n      }\n      BN.prototype._parseHex = function _parseHex(number, start, endian) {\n        this.length = Math.ceil((number.length - start) / 6);\n        this.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          this.words[i] = 0;\n        }\n        var off = 0;\n        var j = 0;\n        var w;\n        if (endian === \"be\") {\n          for (i = number.length - 1; i >= start; i -= 2) {\n            w = parseHexByte(number, start, i) << off;\n            this.words[j] |= w & 67108863;\n            if (off >= 18) {\n              off -= 18;\n              j += 1;\n              this.words[j] |= w >>> 26;\n            } else {\n              off += 8;\n            }\n          }\n        } else {\n          var parseLength = number.length - start;\n          for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n            w = parseHexByte(number, start, i) << off;\n            this.words[j] |= w & 67108863;\n            if (off >= 18) {\n              off -= 18;\n              j += 1;\n              this.words[j] |= w >>> 26;\n            } else {\n              off += 8;\n            }\n          }\n        }\n        this.strip();\n      };\n      function parseBase(str, start, end, mul) {\n        var r = 0;\n        var len = Math.min(str.length, end);\n        for (var i = start; i < len; i++) {\n          var c = str.charCodeAt(i) - 48;\n          r *= mul;\n          if (c >= 49) {\n            r += c - 49 + 10;\n          } else if (c >= 17) {\n            r += c - 17 + 10;\n          } else {\n            r += c;\n          }\n        }\n        return r;\n      }\n      BN.prototype._parseBase = function _parseBase(number, base, start) {\n        this.words = [0];\n        this.length = 1;\n        for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base) {\n          limbLen++;\n        }\n        limbLen--;\n        limbPow = limbPow / base | 0;\n        var total = number.length - start;\n        var mod = total % limbLen;\n        var end = Math.min(total, total - mod) + start;\n        var word = 0;\n        for (var i = start; i < end; i += limbLen) {\n          word = parseBase(number, i, i + limbLen, base);\n          this.imuln(limbPow);\n          if (this.words[0] + word < 67108864) {\n            this.words[0] += word;\n          } else {\n            this._iaddn(word);\n          }\n        }\n        if (mod !== 0) {\n          var pow = 1;\n          word = parseBase(number, i, number.length, base);\n          for (i = 0; i < mod; i++) {\n            pow *= base;\n          }\n          this.imuln(pow);\n          if (this.words[0] + word < 67108864) {\n            this.words[0] += word;\n          } else {\n            this._iaddn(word);\n          }\n        }\n        this.strip();\n      };\n      BN.prototype.copy = function copy(dest) {\n        dest.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          dest.words[i] = this.words[i];\n        }\n        dest.length = this.length;\n        dest.negative = this.negative;\n        dest.red = this.red;\n      };\n      BN.prototype.clone = function clone() {\n        var r = new BN(null);\n        this.copy(r);\n        return r;\n      };\n      BN.prototype._expand = function _expand(size) {\n        while (this.length < size) {\n          this.words[this.length++] = 0;\n        }\n        return this;\n      };\n      BN.prototype.strip = function strip() {\n        while (this.length > 1 && this.words[this.length - 1] === 0) {\n          this.length--;\n        }\n        return this._normSign();\n      };\n      BN.prototype._normSign = function _normSign() {\n        if (this.length === 1 && this.words[0] === 0) {\n          this.negative = 0;\n        }\n        return this;\n      };\n      BN.prototype.inspect = function inspect() {\n        return (this.red ? \"<BN-R: \" : \"<BN: \") + this.toString(16) + \">\";\n      };\n      var zeros = [\n        \"\",\n        \"0\",\n        \"00\",\n        \"000\",\n        \"0000\",\n        \"00000\",\n        \"000000\",\n        \"0000000\",\n        \"00000000\",\n        \"000000000\",\n        \"0000000000\",\n        \"00000000000\",\n        \"000000000000\",\n        \"0000000000000\",\n        \"00000000000000\",\n        \"000000000000000\",\n        \"0000000000000000\",\n        \"00000000000000000\",\n        \"000000000000000000\",\n        \"0000000000000000000\",\n        \"00000000000000000000\",\n        \"000000000000000000000\",\n        \"0000000000000000000000\",\n        \"00000000000000000000000\",\n        \"000000000000000000000000\",\n        \"0000000000000000000000000\"\n      ];\n      var groupSizes = [\n        0,\n        0,\n        25,\n        16,\n        12,\n        11,\n        10,\n        9,\n        8,\n        8,\n        7,\n        7,\n        7,\n        7,\n        6,\n        6,\n        6,\n        6,\n        6,\n        6,\n        6,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5\n      ];\n      var groupBases = [\n        0,\n        0,\n        33554432,\n        43046721,\n        16777216,\n        48828125,\n        60466176,\n        40353607,\n        16777216,\n        43046721,\n        1e7,\n        19487171,\n        35831808,\n        62748517,\n        7529536,\n        11390625,\n        16777216,\n        24137569,\n        34012224,\n        47045881,\n        64e6,\n        4084101,\n        5153632,\n        6436343,\n        7962624,\n        9765625,\n        11881376,\n        14348907,\n        17210368,\n        20511149,\n        243e5,\n        28629151,\n        33554432,\n        39135393,\n        45435424,\n        52521875,\n        60466176\n      ];\n      BN.prototype.toString = function toString(base, padding) {\n        base = base || 10;\n        padding = padding | 0 || 1;\n        var out;\n        if (base === 16 || base === \"hex\") {\n          out = \"\";\n          var off = 0;\n          var carry = 0;\n          for (var i = 0; i < this.length; i++) {\n            var w = this.words[i];\n            var word = ((w << off | carry) & 16777215).toString(16);\n            carry = w >>> 24 - off & 16777215;\n            if (carry !== 0 || i !== this.length - 1) {\n              out = zeros[6 - word.length] + word + out;\n            } else {\n              out = word + out;\n            }\n            off += 2;\n            if (off >= 26) {\n              off -= 26;\n              i--;\n            }\n          }\n          if (carry !== 0) {\n            out = carry.toString(16) + out;\n          }\n          while (out.length % padding !== 0) {\n            out = \"0\" + out;\n          }\n          if (this.negative !== 0) {\n            out = \"-\" + out;\n          }\n          return out;\n        }\n        if (base === (base | 0) && base >= 2 && base <= 36) {\n          var groupSize = groupSizes[base];\n          var groupBase = groupBases[base];\n          out = \"\";\n          var c = this.clone();\n          c.negative = 0;\n          while (!c.isZero()) {\n            var r = c.modn(groupBase).toString(base);\n            c = c.idivn(groupBase);\n            if (!c.isZero()) {\n              out = zeros[groupSize - r.length] + r + out;\n            } else {\n              out = r + out;\n            }\n          }\n          if (this.isZero()) {\n            out = \"0\" + out;\n          }\n          while (out.length % padding !== 0) {\n            out = \"0\" + out;\n          }\n          if (this.negative !== 0) {\n            out = \"-\" + out;\n          }\n          return out;\n        }\n        assert(false, \"Base should be between 2 and 36\");\n      };\n      BN.prototype.toNumber = function toNumber() {\n        var ret = this.words[0];\n        if (this.length === 2) {\n          ret += this.words[1] * 67108864;\n        } else if (this.length === 3 && this.words[2] === 1) {\n          ret += 4503599627370496 + this.words[1] * 67108864;\n        } else if (this.length > 2) {\n          assert(false, \"Number can only safely store up to 53 bits\");\n        }\n        return this.negative !== 0 ? -ret : ret;\n      };\n      BN.prototype.toJSON = function toJSON() {\n        return this.toString(16);\n      };\n      BN.prototype.toBuffer = function toBuffer(endian, length) {\n        assert(typeof Buffer2 !== \"undefined\");\n        return this.toArrayLike(Buffer2, endian, length);\n      };\n      BN.prototype.toArray = function toArray(endian, length) {\n        return this.toArrayLike(Array, endian, length);\n      };\n      BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {\n        var byteLength = this.byteLength();\n        var reqLength = length || Math.max(1, byteLength);\n        assert(byteLength <= reqLength, \"byte array longer than desired length\");\n        assert(reqLength > 0, \"Requested array length <= 0\");\n        this.strip();\n        var littleEndian = endian === \"le\";\n        var res = new ArrayType(reqLength);\n        var b, i;\n        var q = this.clone();\n        if (!littleEndian) {\n          for (i = 0; i < reqLength - byteLength; i++) {\n            res[i] = 0;\n          }\n          for (i = 0; !q.isZero(); i++) {\n            b = q.andln(255);\n            q.iushrn(8);\n            res[reqLength - i - 1] = b;\n          }\n        } else {\n          for (i = 0; !q.isZero(); i++) {\n            b = q.andln(255);\n            q.iushrn(8);\n            res[i] = b;\n          }\n          for (; i < reqLength; i++) {\n            res[i] = 0;\n          }\n        }\n        return res;\n      };\n      if (Math.clz32) {\n        BN.prototype._countBits = function _countBits(w) {\n          return 32 - Math.clz32(w);\n        };\n      } else {\n        BN.prototype._countBits = function _countBits(w) {\n          var t = w;\n          var r = 0;\n          if (t >= 4096) {\n            r += 13;\n            t >>>= 13;\n          }\n          if (t >= 64) {\n            r += 7;\n            t >>>= 7;\n          }\n          if (t >= 8) {\n            r += 4;\n            t >>>= 4;\n          }\n          if (t >= 2) {\n            r += 2;\n            t >>>= 2;\n          }\n          return r + t;\n        };\n      }\n      BN.prototype._zeroBits = function _zeroBits(w) {\n        if (w === 0) return 26;\n        var t = w;\n        var r = 0;\n        if ((t & 8191) === 0) {\n          r += 13;\n          t >>>= 13;\n        }\n        if ((t & 127) === 0) {\n          r += 7;\n          t >>>= 7;\n        }\n        if ((t & 15) === 0) {\n          r += 4;\n          t >>>= 4;\n        }\n        if ((t & 3) === 0) {\n          r += 2;\n          t >>>= 2;\n        }\n        if ((t & 1) === 0) {\n          r++;\n        }\n        return r;\n      };\n      BN.prototype.bitLength = function bitLength() {\n        var w = this.words[this.length - 1];\n        var hi = this._countBits(w);\n        return (this.length - 1) * 26 + hi;\n      };\n      function toBitArray(num) {\n        var w = new Array(num.bitLength());\n        for (var bit = 0; bit < w.length; bit++) {\n          var off = bit / 26 | 0;\n          var wbit = bit % 26;\n          w[bit] = (num.words[off] & 1 << wbit) >>> wbit;\n        }\n        return w;\n      }\n      BN.prototype.zeroBits = function zeroBits() {\n        if (this.isZero()) return 0;\n        var r = 0;\n        for (var i = 0; i < this.length; i++) {\n          var b = this._zeroBits(this.words[i]);\n          r += b;\n          if (b !== 26) break;\n        }\n        return r;\n      };\n      BN.prototype.byteLength = function byteLength() {\n        return Math.ceil(this.bitLength() / 8);\n      };\n      BN.prototype.toTwos = function toTwos(width) {\n        if (this.negative !== 0) {\n          return this.abs().inotn(width).iaddn(1);\n        }\n        return this.clone();\n      };\n      BN.prototype.fromTwos = function fromTwos(width) {\n        if (this.testn(width - 1)) {\n          return this.notn(width).iaddn(1).ineg();\n        }\n        return this.clone();\n      };\n      BN.prototype.isNeg = function isNeg() {\n        return this.negative !== 0;\n      };\n      BN.prototype.neg = function neg() {\n        return this.clone().ineg();\n      };\n      BN.prototype.ineg = function ineg() {\n        if (!this.isZero()) {\n          this.negative ^= 1;\n        }\n        return this;\n      };\n      BN.prototype.iuor = function iuor(num) {\n        while (this.length < num.length) {\n          this.words[this.length++] = 0;\n        }\n        for (var i = 0; i < num.length; i++) {\n          this.words[i] = this.words[i] | num.words[i];\n        }\n        return this.strip();\n      };\n      BN.prototype.ior = function ior(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuor(num);\n      };\n      BN.prototype.or = function or(num) {\n        if (this.length > num.length) return this.clone().ior(num);\n        return num.clone().ior(this);\n      };\n      BN.prototype.uor = function uor(num) {\n        if (this.length > num.length) return this.clone().iuor(num);\n        return num.clone().iuor(this);\n      };\n      BN.prototype.iuand = function iuand(num) {\n        var b;\n        if (this.length > num.length) {\n          b = num;\n        } else {\n          b = this;\n        }\n        for (var i = 0; i < b.length; i++) {\n          this.words[i] = this.words[i] & num.words[i];\n        }\n        this.length = b.length;\n        return this.strip();\n      };\n      BN.prototype.iand = function iand(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuand(num);\n      };\n      BN.prototype.and = function and(num) {\n        if (this.length > num.length) return this.clone().iand(num);\n        return num.clone().iand(this);\n      };\n      BN.prototype.uand = function uand(num) {\n        if (this.length > num.length) return this.clone().iuand(num);\n        return num.clone().iuand(this);\n      };\n      BN.prototype.iuxor = function iuxor(num) {\n        var a;\n        var b;\n        if (this.length > num.length) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        for (var i = 0; i < b.length; i++) {\n          this.words[i] = a.words[i] ^ b.words[i];\n        }\n        if (this !== a) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        this.length = a.length;\n        return this.strip();\n      };\n      BN.prototype.ixor = function ixor(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuxor(num);\n      };\n      BN.prototype.xor = function xor(num) {\n        if (this.length > num.length) return this.clone().ixor(num);\n        return num.clone().ixor(this);\n      };\n      BN.prototype.uxor = function uxor(num) {\n        if (this.length > num.length) return this.clone().iuxor(num);\n        return num.clone().iuxor(this);\n      };\n      BN.prototype.inotn = function inotn(width) {\n        assert(typeof width === \"number\" && width >= 0);\n        var bytesNeeded = Math.ceil(width / 26) | 0;\n        var bitsLeft = width % 26;\n        this._expand(bytesNeeded);\n        if (bitsLeft > 0) {\n          bytesNeeded--;\n        }\n        for (var i = 0; i < bytesNeeded; i++) {\n          this.words[i] = ~this.words[i] & 67108863;\n        }\n        if (bitsLeft > 0) {\n          this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;\n        }\n        return this.strip();\n      };\n      BN.prototype.notn = function notn(width) {\n        return this.clone().inotn(width);\n      };\n      BN.prototype.setn = function setn(bit, val) {\n        assert(typeof bit === \"number\" && bit >= 0);\n        var off = bit / 26 | 0;\n        var wbit = bit % 26;\n        this._expand(off + 1);\n        if (val) {\n          this.words[off] = this.words[off] | 1 << wbit;\n        } else {\n          this.words[off] = this.words[off] & ~(1 << wbit);\n        }\n        return this.strip();\n      };\n      BN.prototype.iadd = function iadd(num) {\n        var r;\n        if (this.negative !== 0 && num.negative === 0) {\n          this.negative = 0;\n          r = this.isub(num);\n          this.negative ^= 1;\n          return this._normSign();\n        } else if (this.negative === 0 && num.negative !== 0) {\n          num.negative = 0;\n          r = this.isub(num);\n          num.negative = 1;\n          return r._normSign();\n        }\n        var a, b;\n        if (this.length > num.length) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        var carry = 0;\n        for (var i = 0; i < b.length; i++) {\n          r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n          this.words[i] = r & 67108863;\n          carry = r >>> 26;\n        }\n        for (; carry !== 0 && i < a.length; i++) {\n          r = (a.words[i] | 0) + carry;\n          this.words[i] = r & 67108863;\n          carry = r >>> 26;\n        }\n        this.length = a.length;\n        if (carry !== 0) {\n          this.words[this.length] = carry;\n          this.length++;\n        } else if (a !== this) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        return this;\n      };\n      BN.prototype.add = function add(num) {\n        var res;\n        if (num.negative !== 0 && this.negative === 0) {\n          num.negative = 0;\n          res = this.sub(num);\n          num.negative ^= 1;\n          return res;\n        } else if (num.negative === 0 && this.negative !== 0) {\n          this.negative = 0;\n          res = num.sub(this);\n          this.negative = 1;\n          return res;\n        }\n        if (this.length > num.length) return this.clone().iadd(num);\n        return num.clone().iadd(this);\n      };\n      BN.prototype.isub = function isub(num) {\n        if (num.negative !== 0) {\n          num.negative = 0;\n          var r = this.iadd(num);\n          num.negative = 1;\n          return r._normSign();\n        } else if (this.negative !== 0) {\n          this.negative = 0;\n          this.iadd(num);\n          this.negative = 1;\n          return this._normSign();\n        }\n        var cmp = this.cmp(num);\n        if (cmp === 0) {\n          this.negative = 0;\n          this.length = 1;\n          this.words[0] = 0;\n          return this;\n        }\n        var a, b;\n        if (cmp > 0) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        var carry = 0;\n        for (var i = 0; i < b.length; i++) {\n          r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n          carry = r >> 26;\n          this.words[i] = r & 67108863;\n        }\n        for (; carry !== 0 && i < a.length; i++) {\n          r = (a.words[i] | 0) + carry;\n          carry = r >> 26;\n          this.words[i] = r & 67108863;\n        }\n        if (carry === 0 && i < a.length && a !== this) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        this.length = Math.max(this.length, i);\n        if (a !== this) {\n          this.negative = 1;\n        }\n        return this.strip();\n      };\n      BN.prototype.sub = function sub(num) {\n        return this.clone().isub(num);\n      };\n      function smallMulTo(self2, num, out) {\n        out.negative = num.negative ^ self2.negative;\n        var len = self2.length + num.length | 0;\n        out.length = len;\n        len = len - 1 | 0;\n        var a = self2.words[0] | 0;\n        var b = num.words[0] | 0;\n        var r = a * b;\n        var lo = r & 67108863;\n        var carry = r / 67108864 | 0;\n        out.words[0] = lo;\n        for (var k = 1; k < len; k++) {\n          var ncarry = carry >>> 26;\n          var rword = carry & 67108863;\n          var maxJ = Math.min(k, num.length - 1);\n          for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) {\n            var i = k - j | 0;\n            a = self2.words[i] | 0;\n            b = num.words[j] | 0;\n            r = a * b + rword;\n            ncarry += r / 67108864 | 0;\n            rword = r & 67108863;\n          }\n          out.words[k] = rword | 0;\n          carry = ncarry | 0;\n        }\n        if (carry !== 0) {\n          out.words[k] = carry | 0;\n        } else {\n          out.length--;\n        }\n        return out.strip();\n      }\n      var comb10MulTo = function comb10MulTo2(self2, num, out) {\n        var a = self2.words;\n        var b = num.words;\n        var o = out.words;\n        var c = 0;\n        var lo;\n        var mid;\n        var hi;\n        var a0 = a[0] | 0;\n        var al0 = a0 & 8191;\n        var ah0 = a0 >>> 13;\n        var a1 = a[1] | 0;\n        var al1 = a1 & 8191;\n        var ah1 = a1 >>> 13;\n        var a2 = a[2] | 0;\n        var al2 = a2 & 8191;\n        var ah2 = a2 >>> 13;\n        var a3 = a[3] | 0;\n        var al3 = a3 & 8191;\n        var ah3 = a3 >>> 13;\n        var a4 = a[4] | 0;\n        var al4 = a4 & 8191;\n        var ah4 = a4 >>> 13;\n        var a5 = a[5] | 0;\n        var al5 = a5 & 8191;\n        var ah5 = a5 >>> 13;\n        var a6 = a[6] | 0;\n        var al6 = a6 & 8191;\n        var ah6 = a6 >>> 13;\n        var a7 = a[7] | 0;\n        var al7 = a7 & 8191;\n        var ah7 = a7 >>> 13;\n        var a8 = a[8] | 0;\n        var al8 = a8 & 8191;\n        var ah8 = a8 >>> 13;\n        var a9 = a[9] | 0;\n        var al9 = a9 & 8191;\n        var ah9 = a9 >>> 13;\n        var b0 = b[0] | 0;\n        var bl0 = b0 & 8191;\n        var bh0 = b0 >>> 13;\n        var b1 = b[1] | 0;\n        var bl1 = b1 & 8191;\n        var bh1 = b1 >>> 13;\n        var b2 = b[2] | 0;\n        var bl2 = b2 & 8191;\n        var bh2 = b2 >>> 13;\n        var b3 = b[3] | 0;\n        var bl3 = b3 & 8191;\n        var bh3 = b3 >>> 13;\n        var b4 = b[4] | 0;\n        var bl4 = b4 & 8191;\n        var bh4 = b4 >>> 13;\n        var b5 = b[5] | 0;\n        var bl5 = b5 & 8191;\n        var bh5 = b5 >>> 13;\n        var b6 = b[6] | 0;\n        var bl6 = b6 & 8191;\n        var bh6 = b6 >>> 13;\n        var b7 = b[7] | 0;\n        var bl7 = b7 & 8191;\n        var bh7 = b7 >>> 13;\n        var b8 = b[8] | 0;\n        var bl8 = b8 & 8191;\n        var bh8 = b8 >>> 13;\n        var b9 = b[9] | 0;\n        var bl9 = b9 & 8191;\n        var bh9 = b9 >>> 13;\n        out.negative = self2.negative ^ num.negative;\n        out.length = 19;\n        lo = Math.imul(al0, bl0);\n        mid = Math.imul(al0, bh0);\n        mid = mid + Math.imul(ah0, bl0) | 0;\n        hi = Math.imul(ah0, bh0);\n        var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;\n        w0 &= 67108863;\n        lo = Math.imul(al1, bl0);\n        mid = Math.imul(al1, bh0);\n        mid = mid + Math.imul(ah1, bl0) | 0;\n        hi = Math.imul(ah1, bh0);\n        lo = lo + Math.imul(al0, bl1) | 0;\n        mid = mid + Math.imul(al0, bh1) | 0;\n        mid = mid + Math.imul(ah0, bl1) | 0;\n        hi = hi + Math.imul(ah0, bh1) | 0;\n        var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;\n        w1 &= 67108863;\n        lo = Math.imul(al2, bl0);\n        mid = Math.imul(al2, bh0);\n        mid = mid + Math.imul(ah2, bl0) | 0;\n        hi = Math.imul(ah2, bh0);\n        lo = lo + Math.imul(al1, bl1) | 0;\n        mid = mid + Math.imul(al1, bh1) | 0;\n        mid = mid + Math.imul(ah1, bl1) | 0;\n        hi = hi + Math.imul(ah1, bh1) | 0;\n        lo = lo + Math.imul(al0, bl2) | 0;\n        mid = mid + Math.imul(al0, bh2) | 0;\n        mid = mid + Math.imul(ah0, bl2) | 0;\n        hi = hi + Math.imul(ah0, bh2) | 0;\n        var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;\n        w2 &= 67108863;\n        lo = Math.imul(al3, bl0);\n        mid = Math.imul(al3, bh0);\n        mid = mid + Math.imul(ah3, bl0) | 0;\n        hi = Math.imul(ah3, bh0);\n        lo = lo + Math.imul(al2, bl1) | 0;\n        mid = mid + Math.imul(al2, bh1) | 0;\n        mid = mid + Math.imul(ah2, bl1) | 0;\n        hi = hi + Math.imul(ah2, bh1) | 0;\n        lo = lo + Math.imul(al1, bl2) | 0;\n        mid = mid + Math.imul(al1, bh2) | 0;\n        mid = mid + Math.imul(ah1, bl2) | 0;\n        hi = hi + Math.imul(ah1, bh2) | 0;\n        lo = lo + Math.imul(al0, bl3) | 0;\n        mid = mid + Math.imul(al0, bh3) | 0;\n        mid = mid + Math.imul(ah0, bl3) | 0;\n        hi = hi + Math.imul(ah0, bh3) | 0;\n        var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;\n        w3 &= 67108863;\n        lo = Math.imul(al4, bl0);\n        mid = Math.imul(al4, bh0);\n        mid = mid + Math.imul(ah4, bl0) | 0;\n        hi = Math.imul(ah4, bh0);\n        lo = lo + Math.imul(al3, bl1) | 0;\n        mid = mid + Math.imul(al3, bh1) | 0;\n        mid = mid + Math.imul(ah3, bl1) | 0;\n        hi = hi + Math.imul(ah3, bh1) | 0;\n        lo = lo + Math.imul(al2, bl2) | 0;\n        mid = mid + Math.imul(al2, bh2) | 0;\n        mid = mid + Math.imul(ah2, bl2) | 0;\n        hi = hi + Math.imul(ah2, bh2) | 0;\n        lo = lo + Math.imul(al1, bl3) | 0;\n        mid = mid + Math.imul(al1, bh3) | 0;\n        mid = mid + Math.imul(ah1, bl3) | 0;\n        hi = hi + Math.imul(ah1, bh3) | 0;\n        lo = lo + Math.imul(al0, bl4) | 0;\n        mid = mid + Math.imul(al0, bh4) | 0;\n        mid = mid + Math.imul(ah0, bl4) | 0;\n        hi = hi + Math.imul(ah0, bh4) | 0;\n        var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;\n        w4 &= 67108863;\n        lo = Math.imul(al5, bl0);\n        mid = Math.imul(al5, bh0);\n        mid = mid + Math.imul(ah5, bl0) | 0;\n        hi = Math.imul(ah5, bh0);\n        lo = lo + Math.imul(al4, bl1) | 0;\n        mid = mid + Math.imul(al4, bh1) | 0;\n        mid = mid + Math.imul(ah4, bl1) | 0;\n        hi = hi + Math.imul(ah4, bh1) | 0;\n        lo = lo + Math.imul(al3, bl2) | 0;\n        mid = mid + Math.imul(al3, bh2) | 0;\n        mid = mid + Math.imul(ah3, bl2) | 0;\n        hi = hi + Math.imul(ah3, bh2) | 0;\n        lo = lo + Math.imul(al2, bl3) | 0;\n        mid = mid + Math.imul(al2, bh3) | 0;\n        mid = mid + Math.imul(ah2, bl3) | 0;\n        hi = hi + Math.imul(ah2, bh3) | 0;\n        lo = lo + Math.imul(al1, bl4) | 0;\n        mid = mid + Math.imul(al1, bh4) | 0;\n        mid = mid + Math.imul(ah1, bl4) | 0;\n        hi = hi + Math.imul(ah1, bh4) | 0;\n        lo = lo + Math.imul(al0, bl5) | 0;\n        mid = mid + Math.imul(al0, bh5) | 0;\n        mid = mid + Math.imul(ah0, bl5) | 0;\n        hi = hi + Math.imul(ah0, bh5) | 0;\n        var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;\n        w5 &= 67108863;\n        lo = Math.imul(al6, bl0);\n        mid = Math.imul(al6, bh0);\n        mid = mid + Math.imul(ah6, bl0) | 0;\n        hi = Math.imul(ah6, bh0);\n        lo = lo + Math.imul(al5, bl1) | 0;\n        mid = mid + Math.imul(al5, bh1) | 0;\n        mid = mid + Math.imul(ah5, bl1) | 0;\n        hi = hi + Math.imul(ah5, bh1) | 0;\n        lo = lo + Math.imul(al4, bl2) | 0;\n        mid = mid + Math.imul(al4, bh2) | 0;\n        mid = mid + Math.imul(ah4, bl2) | 0;\n        hi = hi + Math.imul(ah4, bh2) | 0;\n        lo = lo + Math.imul(al3, bl3) | 0;\n        mid = mid + Math.imul(al3, bh3) | 0;\n        mid = mid + Math.imul(ah3, bl3) | 0;\n        hi = hi + Math.imul(ah3, bh3) | 0;\n        lo = lo + Math.imul(al2, bl4) | 0;\n        mid = mid + Math.imul(al2, bh4) | 0;\n        mid = mid + Math.imul(ah2, bl4) | 0;\n        hi = hi + Math.imul(ah2, bh4) | 0;\n        lo = lo + Math.imul(al1, bl5) | 0;\n        mid = mid + Math.imul(al1, bh5) | 0;\n        mid = mid + Math.imul(ah1, bl5) | 0;\n        hi = hi + Math.imul(ah1, bh5) | 0;\n        lo = lo + Math.imul(al0, bl6) | 0;\n        mid = mid + Math.imul(al0, bh6) | 0;\n        mid = mid + Math.imul(ah0, bl6) | 0;\n        hi = hi + Math.imul(ah0, bh6) | 0;\n        var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;\n        w6 &= 67108863;\n        lo = Math.imul(al7, bl0);\n        mid = Math.imul(al7, bh0);\n        mid = mid + Math.imul(ah7, bl0) | 0;\n        hi = Math.imul(ah7, bh0);\n        lo = lo + Math.imul(al6, bl1) | 0;\n        mid = mid + Math.imul(al6, bh1) | 0;\n        mid = mid + Math.imul(ah6, bl1) | 0;\n        hi = hi + Math.imul(ah6, bh1) | 0;\n        lo = lo + Math.imul(al5, bl2) | 0;\n        mid = mid + Math.imul(al5, bh2) | 0;\n        mid = mid + Math.imul(ah5, bl2) | 0;\n        hi = hi + Math.imul(ah5, bh2) | 0;\n        lo = lo + Math.imul(al4, bl3) | 0;\n        mid = mid + Math.imul(al4, bh3) | 0;\n        mid = mid + Math.imul(ah4, bl3) | 0;\n        hi = hi + Math.imul(ah4, bh3) | 0;\n        lo = lo + Math.imul(al3, bl4) | 0;\n        mid = mid + Math.imul(al3, bh4) | 0;\n        mid = mid + Math.imul(ah3, bl4) | 0;\n        hi = hi + Math.imul(ah3, bh4) | 0;\n        lo = lo + Math.imul(al2, bl5) | 0;\n        mid = mid + Math.imul(al2, bh5) | 0;\n        mid = mid + Math.imul(ah2, bl5) | 0;\n        hi = hi + Math.imul(ah2, bh5) | 0;\n        lo = lo + Math.imul(al1, bl6) | 0;\n        mid = mid + Math.imul(al1, bh6) | 0;\n        mid = mid + Math.imul(ah1, bl6) | 0;\n        hi = hi + Math.imul(ah1, bh6) | 0;\n        lo = lo + Math.imul(al0, bl7) | 0;\n        mid = mid + Math.imul(al0, bh7) | 0;\n        mid = mid + Math.imul(ah0, bl7) | 0;\n        hi = hi + Math.imul(ah0, bh7) | 0;\n        var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;\n        w7 &= 67108863;\n        lo = Math.imul(al8, bl0);\n        mid = Math.imul(al8, bh0);\n        mid = mid + Math.imul(ah8, bl0) | 0;\n        hi = Math.imul(ah8, bh0);\n        lo = lo + Math.imul(al7, bl1) | 0;\n        mid = mid + Math.imul(al7, bh1) | 0;\n        mid = mid + Math.imul(ah7, bl1) | 0;\n        hi = hi + Math.imul(ah7, bh1) | 0;\n        lo = lo + Math.imul(al6, bl2) | 0;\n        mid = mid + Math.imul(al6, bh2) | 0;\n        mid = mid + Math.imul(ah6, bl2) | 0;\n        hi = hi + Math.imul(ah6, bh2) | 0;\n        lo = lo + Math.imul(al5, bl3) | 0;\n        mid = mid + Math.imul(al5, bh3) | 0;\n        mid = mid + Math.imul(ah5, bl3) | 0;\n        hi = hi + Math.imul(ah5, bh3) | 0;\n        lo = lo + Math.imul(al4, bl4) | 0;\n        mid = mid + Math.imul(al4, bh4) | 0;\n        mid = mid + Math.imul(ah4, bl4) | 0;\n        hi = hi + Math.imul(ah4, bh4) | 0;\n        lo = lo + Math.imul(al3, bl5) | 0;\n        mid = mid + Math.imul(al3, bh5) | 0;\n        mid = mid + Math.imul(ah3, bl5) | 0;\n        hi = hi + Math.imul(ah3, bh5) | 0;\n        lo = lo + Math.imul(al2, bl6) | 0;\n        mid = mid + Math.imul(al2, bh6) | 0;\n        mid = mid + Math.imul(ah2, bl6) | 0;\n        hi = hi + Math.imul(ah2, bh6) | 0;\n        lo = lo + Math.imul(al1, bl7) | 0;\n        mid = mid + Math.imul(al1, bh7) | 0;\n        mid = mid + Math.imul(ah1, bl7) | 0;\n        hi = hi + Math.imul(ah1, bh7) | 0;\n        lo = lo + Math.imul(al0, bl8) | 0;\n        mid = mid + Math.imul(al0, bh8) | 0;\n        mid = mid + Math.imul(ah0, bl8) | 0;\n        hi = hi + Math.imul(ah0, bh8) | 0;\n        var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;\n        w8 &= 67108863;\n        lo = Math.imul(al9, bl0);\n        mid = Math.imul(al9, bh0);\n        mid = mid + Math.imul(ah9, bl0) | 0;\n        hi = Math.imul(ah9, bh0);\n        lo = lo + Math.imul(al8, bl1) | 0;\n        mid = mid + Math.imul(al8, bh1) | 0;\n        mid = mid + Math.imul(ah8, bl1) | 0;\n        hi = hi + Math.imul(ah8, bh1) | 0;\n        lo = lo + Math.imul(al7, bl2) | 0;\n        mid = mid + Math.imul(al7, bh2) | 0;\n        mid = mid + Math.imul(ah7, bl2) | 0;\n        hi = hi + Math.imul(ah7, bh2) | 0;\n        lo = lo + Math.imul(al6, bl3) | 0;\n        mid = mid + Math.imul(al6, bh3) | 0;\n        mid = mid + Math.imul(ah6, bl3) | 0;\n        hi = hi + Math.imul(ah6, bh3) | 0;\n        lo = lo + Math.imul(al5, bl4) | 0;\n        mid = mid + Math.imul(al5, bh4) | 0;\n        mid = mid + Math.imul(ah5, bl4) | 0;\n        hi = hi + Math.imul(ah5, bh4) | 0;\n        lo = lo + Math.imul(al4, bl5) | 0;\n        mid = mid + Math.imul(al4, bh5) | 0;\n        mid = mid + Math.imul(ah4, bl5) | 0;\n        hi = hi + Math.imul(ah4, bh5) | 0;\n        lo = lo + Math.imul(al3, bl6) | 0;\n        mid = mid + Math.imul(al3, bh6) | 0;\n        mid = mid + Math.imul(ah3, bl6) | 0;\n        hi = hi + Math.imul(ah3, bh6) | 0;\n        lo = lo + Math.imul(al2, bl7) | 0;\n        mid = mid + Math.imul(al2, bh7) | 0;\n        mid = mid + Math.imul(ah2, bl7) | 0;\n        hi = hi + Math.imul(ah2, bh7) | 0;\n        lo = lo + Math.imul(al1, bl8) | 0;\n        mid = mid + Math.imul(al1, bh8) | 0;\n        mid = mid + Math.imul(ah1, bl8) | 0;\n        hi = hi + Math.imul(ah1, bh8) | 0;\n        lo = lo + Math.imul(al0, bl9) | 0;\n        mid = mid + Math.imul(al0, bh9) | 0;\n        mid = mid + Math.imul(ah0, bl9) | 0;\n        hi = hi + Math.imul(ah0, bh9) | 0;\n        var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;\n        w9 &= 67108863;\n        lo = Math.imul(al9, bl1);\n        mid = Math.imul(al9, bh1);\n        mid = mid + Math.imul(ah9, bl1) | 0;\n        hi = Math.imul(ah9, bh1);\n        lo = lo + Math.imul(al8, bl2) | 0;\n        mid = mid + Math.imul(al8, bh2) | 0;\n        mid = mid + Math.imul(ah8, bl2) | 0;\n        hi = hi + Math.imul(ah8, bh2) | 0;\n        lo = lo + Math.imul(al7, bl3) | 0;\n        mid = mid + Math.imul(al7, bh3) | 0;\n        mid = mid + Math.imul(ah7, bl3) | 0;\n        hi = hi + Math.imul(ah7, bh3) | 0;\n        lo = lo + Math.imul(al6, bl4) | 0;\n        mid = mid + Math.imul(al6, bh4) | 0;\n        mid = mid + Math.imul(ah6, bl4) | 0;\n        hi = hi + Math.imul(ah6, bh4) | 0;\n        lo = lo + Math.imul(al5, bl5) | 0;\n        mid = mid + Math.imul(al5, bh5) | 0;\n        mid = mid + Math.imul(ah5, bl5) | 0;\n        hi = hi + Math.imul(ah5, bh5) | 0;\n        lo = lo + Math.imul(al4, bl6) | 0;\n        mid = mid + Math.imul(al4, bh6) | 0;\n        mid = mid + Math.imul(ah4, bl6) | 0;\n        hi = hi + Math.imul(ah4, bh6) | 0;\n        lo = lo + Math.imul(al3, bl7) | 0;\n        mid = mid + Math.imul(al3, bh7) | 0;\n        mid = mid + Math.imul(ah3, bl7) | 0;\n        hi = hi + Math.imul(ah3, bh7) | 0;\n        lo = lo + Math.imul(al2, bl8) | 0;\n        mid = mid + Math.imul(al2, bh8) | 0;\n        mid = mid + Math.imul(ah2, bl8) | 0;\n        hi = hi + Math.imul(ah2, bh8) | 0;\n        lo = lo + Math.imul(al1, bl9) | 0;\n        mid = mid + Math.imul(al1, bh9) | 0;\n        mid = mid + Math.imul(ah1, bl9) | 0;\n        hi = hi + Math.imul(ah1, bh9) | 0;\n        var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;\n        w10 &= 67108863;\n        lo = Math.imul(al9, bl2);\n        mid = Math.imul(al9, bh2);\n        mid = mid + Math.imul(ah9, bl2) | 0;\n        hi = Math.imul(ah9, bh2);\n        lo = lo + Math.imul(al8, bl3) | 0;\n        mid = mid + Math.imul(al8, bh3) | 0;\n        mid = mid + Math.imul(ah8, bl3) | 0;\n        hi = hi + Math.imul(ah8, bh3) | 0;\n        lo = lo + Math.imul(al7, bl4) | 0;\n        mid = mid + Math.imul(al7, bh4) | 0;\n        mid = mid + Math.imul(ah7, bl4) | 0;\n        hi = hi + Math.imul(ah7, bh4) | 0;\n        lo = lo + Math.imul(al6, bl5) | 0;\n        mid = mid + Math.imul(al6, bh5) | 0;\n        mid = mid + Math.imul(ah6, bl5) | 0;\n        hi = hi + Math.imul(ah6, bh5) | 0;\n        lo = lo + Math.imul(al5, bl6) | 0;\n        mid = mid + Math.imul(al5, bh6) | 0;\n        mid = mid + Math.imul(ah5, bl6) | 0;\n        hi = hi + Math.imul(ah5, bh6) | 0;\n        lo = lo + Math.imul(al4, bl7) | 0;\n        mid = mid + Math.imul(al4, bh7) | 0;\n        mid = mid + Math.imul(ah4, bl7) | 0;\n        hi = hi + Math.imul(ah4, bh7) | 0;\n        lo = lo + Math.imul(al3, bl8) | 0;\n        mid = mid + Math.imul(al3, bh8) | 0;\n        mid = mid + Math.imul(ah3, bl8) | 0;\n        hi = hi + Math.imul(ah3, bh8) | 0;\n        lo = lo + Math.imul(al2, bl9) | 0;\n        mid = mid + Math.imul(al2, bh9) | 0;\n        mid = mid + Math.imul(ah2, bl9) | 0;\n        hi = hi + Math.imul(ah2, bh9) | 0;\n        var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;\n        w11 &= 67108863;\n        lo = Math.imul(al9, bl3);\n        mid = Math.imul(al9, bh3);\n        mid = mid + Math.imul(ah9, bl3) | 0;\n        hi = Math.imul(ah9, bh3);\n        lo = lo + Math.imul(al8, bl4) | 0;\n        mid = mid + Math.imul(al8, bh4) | 0;\n        mid = mid + Math.imul(ah8, bl4) | 0;\n        hi = hi + Math.imul(ah8, bh4) | 0;\n        lo = lo + Math.imul(al7, bl5) | 0;\n        mid = mid + Math.imul(al7, bh5) | 0;\n        mid = mid + Math.imul(ah7, bl5) | 0;\n        hi = hi + Math.imul(ah7, bh5) | 0;\n        lo = lo + Math.imul(al6, bl6) | 0;\n        mid = mid + Math.imul(al6, bh6) | 0;\n        mid = mid + Math.imul(ah6, bl6) | 0;\n        hi = hi + Math.imul(ah6, bh6) | 0;\n        lo = lo + Math.imul(al5, bl7) | 0;\n        mid = mid + Math.imul(al5, bh7) | 0;\n        mid = mid + Math.imul(ah5, bl7) | 0;\n        hi = hi + Math.imul(ah5, bh7) | 0;\n        lo = lo + Math.imul(al4, bl8) | 0;\n        mid = mid + Math.imul(al4, bh8) | 0;\n        mid = mid + Math.imul(ah4, bl8) | 0;\n        hi = hi + Math.imul(ah4, bh8) | 0;\n        lo = lo + Math.imul(al3, bl9) | 0;\n        mid = mid + Math.imul(al3, bh9) | 0;\n        mid = mid + Math.imul(ah3, bl9) | 0;\n        hi = hi + Math.imul(ah3, bh9) | 0;\n        var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;\n        w12 &= 67108863;\n        lo = Math.imul(al9, bl4);\n        mid = Math.imul(al9, bh4);\n        mid = mid + Math.imul(ah9, bl4) | 0;\n        hi = Math.imul(ah9, bh4);\n        lo = lo + Math.imul(al8, bl5) | 0;\n        mid = mid + Math.imul(al8, bh5) | 0;\n        mid = mid + Math.imul(ah8, bl5) | 0;\n        hi = hi + Math.imul(ah8, bh5) | 0;\n        lo = lo + Math.imul(al7, bl6) | 0;\n        mid = mid + Math.imul(al7, bh6) | 0;\n        mid = mid + Math.imul(ah7, bl6) | 0;\n        hi = hi + Math.imul(ah7, bh6) | 0;\n        lo = lo + Math.imul(al6, bl7) | 0;\n        mid = mid + Math.imul(al6, bh7) | 0;\n        mid = mid + Math.imul(ah6, bl7) | 0;\n        hi = hi + Math.imul(ah6, bh7) | 0;\n        lo = lo + Math.imul(al5, bl8) | 0;\n        mid = mid + Math.imul(al5, bh8) | 0;\n        mid = mid + Math.imul(ah5, bl8) | 0;\n        hi = hi + Math.imul(ah5, bh8) | 0;\n        lo = lo + Math.imul(al4, bl9) | 0;\n        mid = mid + Math.imul(al4, bh9) | 0;\n        mid = mid + Math.imul(ah4, bl9) | 0;\n        hi = hi + Math.imul(ah4, bh9) | 0;\n        var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;\n        w13 &= 67108863;\n        lo = Math.imul(al9, bl5);\n        mid = Math.imul(al9, bh5);\n        mid = mid + Math.imul(ah9, bl5) | 0;\n        hi = Math.imul(ah9, bh5);\n        lo = lo + Math.imul(al8, bl6) | 0;\n        mid = mid + Math.imul(al8, bh6) | 0;\n        mid = mid + Math.imul(ah8, bl6) | 0;\n        hi = hi + Math.imul(ah8, bh6) | 0;\n        lo = lo + Math.imul(al7, bl7) | 0;\n        mid = mid + Math.imul(al7, bh7) | 0;\n        mid = mid + Math.imul(ah7, bl7) | 0;\n        hi = hi + Math.imul(ah7, bh7) | 0;\n        lo = lo + Math.imul(al6, bl8) | 0;\n        mid = mid + Math.imul(al6, bh8) | 0;\n        mid = mid + Math.imul(ah6, bl8) | 0;\n        hi = hi + Math.imul(ah6, bh8) | 0;\n        lo = lo + Math.imul(al5, bl9) | 0;\n        mid = mid + Math.imul(al5, bh9) | 0;\n        mid = mid + Math.imul(ah5, bl9) | 0;\n        hi = hi + Math.imul(ah5, bh9) | 0;\n        var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;\n        w14 &= 67108863;\n        lo = Math.imul(al9, bl6);\n        mid = Math.imul(al9, bh6);\n        mid = mid + Math.imul(ah9, bl6) | 0;\n        hi = Math.imul(ah9, bh6);\n        lo = lo + Math.imul(al8, bl7) | 0;\n        mid = mid + Math.imul(al8, bh7) | 0;\n        mid = mid + Math.imul(ah8, bl7) | 0;\n        hi = hi + Math.imul(ah8, bh7) | 0;\n        lo = lo + Math.imul(al7, bl8) | 0;\n        mid = mid + Math.imul(al7, bh8) | 0;\n        mid = mid + Math.imul(ah7, bl8) | 0;\n        hi = hi + Math.imul(ah7, bh8) | 0;\n        lo = lo + Math.imul(al6, bl9) | 0;\n        mid = mid + Math.imul(al6, bh9) | 0;\n        mid = mid + Math.imul(ah6, bl9) | 0;\n        hi = hi + Math.imul(ah6, bh9) | 0;\n        var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;\n        w15 &= 67108863;\n        lo = Math.imul(al9, bl7);\n        mid = Math.imul(al9, bh7);\n        mid = mid + Math.imul(ah9, bl7) | 0;\n        hi = Math.imul(ah9, bh7);\n        lo = lo + Math.imul(al8, bl8) | 0;\n        mid = mid + Math.imul(al8, bh8) | 0;\n        mid = mid + Math.imul(ah8, bl8) | 0;\n        hi = hi + Math.imul(ah8, bh8) | 0;\n        lo = lo + Math.imul(al7, bl9) | 0;\n        mid = mid + Math.imul(al7, bh9) | 0;\n        mid = mid + Math.imul(ah7, bl9) | 0;\n        hi = hi + Math.imul(ah7, bh9) | 0;\n        var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;\n        w16 &= 67108863;\n        lo = Math.imul(al9, bl8);\n        mid = Math.imul(al9, bh8);\n        mid = mid + Math.imul(ah9, bl8) | 0;\n        hi = Math.imul(ah9, bh8);\n        lo = lo + Math.imul(al8, bl9) | 0;\n        mid = mid + Math.imul(al8, bh9) | 0;\n        mid = mid + Math.imul(ah8, bl9) | 0;\n        hi = hi + Math.imul(ah8, bh9) | 0;\n        var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;\n        w17 &= 67108863;\n        lo = Math.imul(al9, bl9);\n        mid = Math.imul(al9, bh9);\n        mid = mid + Math.imul(ah9, bl9) | 0;\n        hi = Math.imul(ah9, bh9);\n        var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;\n        w18 &= 67108863;\n        o[0] = w0;\n        o[1] = w1;\n        o[2] = w2;\n        o[3] = w3;\n        o[4] = w4;\n        o[5] = w5;\n        o[6] = w6;\n        o[7] = w7;\n        o[8] = w8;\n        o[9] = w9;\n        o[10] = w10;\n        o[11] = w11;\n        o[12] = w12;\n        o[13] = w13;\n        o[14] = w14;\n        o[15] = w15;\n        o[16] = w16;\n        o[17] = w17;\n        o[18] = w18;\n        if (c !== 0) {\n          o[19] = c;\n          out.length++;\n        }\n        return out;\n      };\n      if (!Math.imul) {\n        comb10MulTo = smallMulTo;\n      }\n      function bigMulTo(self2, num, out) {\n        out.negative = num.negative ^ self2.negative;\n        out.length = self2.length + num.length;\n        var carry = 0;\n        var hncarry = 0;\n        for (var k = 0; k < out.length - 1; k++) {\n          var ncarry = hncarry;\n          hncarry = 0;\n          var rword = carry & 67108863;\n          var maxJ = Math.min(k, num.length - 1);\n          for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) {\n            var i = k - j;\n            var a = self2.words[i] | 0;\n            var b = num.words[j] | 0;\n            var r = a * b;\n            var lo = r & 67108863;\n            ncarry = ncarry + (r / 67108864 | 0) | 0;\n            lo = lo + rword | 0;\n            rword = lo & 67108863;\n            ncarry = ncarry + (lo >>> 26) | 0;\n            hncarry += ncarry >>> 26;\n            ncarry &= 67108863;\n          }\n          out.words[k] = rword;\n          carry = ncarry;\n          ncarry = hncarry;\n        }\n        if (carry !== 0) {\n          out.words[k] = carry;\n        } else {\n          out.length--;\n        }\n        return out.strip();\n      }\n      function jumboMulTo(self2, num, out) {\n        var fftm = new FFTM();\n        return fftm.mulp(self2, num, out);\n      }\n      BN.prototype.mulTo = function mulTo(num, out) {\n        var res;\n        var len = this.length + num.length;\n        if (this.length === 10 && num.length === 10) {\n          res = comb10MulTo(this, num, out);\n        } else if (len < 63) {\n          res = smallMulTo(this, num, out);\n        } else if (len < 1024) {\n          res = bigMulTo(this, num, out);\n        } else {\n          res = jumboMulTo(this, num, out);\n        }\n        return res;\n      };\n      function FFTM(x, y) {\n        this.x = x;\n        this.y = y;\n      }\n      FFTM.prototype.makeRBT = function makeRBT(N) {\n        var t = new Array(N);\n        var l = BN.prototype._countBits(N) - 1;\n        for (var i = 0; i < N; i++) {\n          t[i] = this.revBin(i, l, N);\n        }\n        return t;\n      };\n      FFTM.prototype.revBin = function revBin(x, l, N) {\n        if (x === 0 || x === N - 1) return x;\n        var rb = 0;\n        for (var i = 0; i < l; i++) {\n          rb |= (x & 1) << l - i - 1;\n          x >>= 1;\n        }\n        return rb;\n      };\n      FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {\n        for (var i = 0; i < N; i++) {\n          rtws[i] = rws[rbt[i]];\n          itws[i] = iws[rbt[i]];\n        }\n      };\n      FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {\n        this.permute(rbt, rws, iws, rtws, itws, N);\n        for (var s = 1; s < N; s <<= 1) {\n          var l = s << 1;\n          var rtwdf = Math.cos(2 * Math.PI / l);\n          var itwdf = Math.sin(2 * Math.PI / l);\n          for (var p = 0; p < N; p += l) {\n            var rtwdf_ = rtwdf;\n            var itwdf_ = itwdf;\n            for (var j = 0; j < s; j++) {\n              var re = rtws[p + j];\n              var ie = itws[p + j];\n              var ro = rtws[p + j + s];\n              var io = itws[p + j + s];\n              var rx = rtwdf_ * ro - itwdf_ * io;\n              io = rtwdf_ * io + itwdf_ * ro;\n              ro = rx;\n              rtws[p + j] = re + ro;\n              itws[p + j] = ie + io;\n              rtws[p + j + s] = re - ro;\n              itws[p + j + s] = ie - io;\n              if (j !== l) {\n                rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n                itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n                rtwdf_ = rx;\n              }\n            }\n          }\n        }\n      };\n      FFTM.prototype.guessLen13b = function guessLen13b(n, m) {\n        var N = Math.max(m, n) | 1;\n        var odd = N & 1;\n        var i = 0;\n        for (N = N / 2 | 0; N; N = N >>> 1) {\n          i++;\n        }\n        return 1 << i + 1 + odd;\n      };\n      FFTM.prototype.conjugate = function conjugate(rws, iws, N) {\n        if (N <= 1) return;\n        for (var i = 0; i < N / 2; i++) {\n          var t = rws[i];\n          rws[i] = rws[N - i - 1];\n          rws[N - i - 1] = t;\n          t = iws[i];\n          iws[i] = -iws[N - i - 1];\n          iws[N - i - 1] = -t;\n        }\n      };\n      FFTM.prototype.normalize13b = function normalize13b(ws, N) {\n        var carry = 0;\n        for (var i = 0; i < N / 2; i++) {\n          var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;\n          ws[i] = w & 67108863;\n          if (w < 67108864) {\n            carry = 0;\n          } else {\n            carry = w / 67108864 | 0;\n          }\n        }\n        return ws;\n      };\n      FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {\n        var carry = 0;\n        for (var i = 0; i < len; i++) {\n          carry = carry + (ws[i] | 0);\n          rws[2 * i] = carry & 8191;\n          carry = carry >>> 13;\n          rws[2 * i + 1] = carry & 8191;\n          carry = carry >>> 13;\n        }\n        for (i = 2 * len; i < N; ++i) {\n          rws[i] = 0;\n        }\n        assert(carry === 0);\n        assert((carry & ~8191) === 0);\n      };\n      FFTM.prototype.stub = function stub(N) {\n        var ph = new Array(N);\n        for (var i = 0; i < N; i++) {\n          ph[i] = 0;\n        }\n        return ph;\n      };\n      FFTM.prototype.mulp = function mulp(x, y, out) {\n        var N = 2 * this.guessLen13b(x.length, y.length);\n        var rbt = this.makeRBT(N);\n        var _ = this.stub(N);\n        var rws = new Array(N);\n        var rwst = new Array(N);\n        var iwst = new Array(N);\n        var nrws = new Array(N);\n        var nrwst = new Array(N);\n        var niwst = new Array(N);\n        var rmws = out.words;\n        rmws.length = N;\n        this.convert13b(x.words, x.length, rws, N);\n        this.convert13b(y.words, y.length, nrws, N);\n        this.transform(rws, _, rwst, iwst, N, rbt);\n        this.transform(nrws, _, nrwst, niwst, N, rbt);\n        for (var i = 0; i < N; i++) {\n          var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n          iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n          rwst[i] = rx;\n        }\n        this.conjugate(rwst, iwst, N);\n        this.transform(rwst, iwst, rmws, _, N, rbt);\n        this.conjugate(rmws, _, N);\n        this.normalize13b(rmws, N);\n        out.negative = x.negative ^ y.negative;\n        out.length = x.length + y.length;\n        return out.strip();\n      };\n      BN.prototype.mul = function mul(num) {\n        var out = new BN(null);\n        out.words = new Array(this.length + num.length);\n        return this.mulTo(num, out);\n      };\n      BN.prototype.mulf = function mulf(num) {\n        var out = new BN(null);\n        out.words = new Array(this.length + num.length);\n        return jumboMulTo(this, num, out);\n      };\n      BN.prototype.imul = function imul(num) {\n        return this.clone().mulTo(num, this);\n      };\n      BN.prototype.imuln = function imuln(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        var carry = 0;\n        for (var i = 0; i < this.length; i++) {\n          var w = (this.words[i] | 0) * num;\n          var lo = (w & 67108863) + (carry & 67108863);\n          carry >>= 26;\n          carry += w / 67108864 | 0;\n          carry += lo >>> 26;\n          this.words[i] = lo & 67108863;\n        }\n        if (carry !== 0) {\n          this.words[i] = carry;\n          this.length++;\n        }\n        return this;\n      };\n      BN.prototype.muln = function muln(num) {\n        return this.clone().imuln(num);\n      };\n      BN.prototype.sqr = function sqr() {\n        return this.mul(this);\n      };\n      BN.prototype.isqr = function isqr() {\n        return this.imul(this.clone());\n      };\n      BN.prototype.pow = function pow(num) {\n        var w = toBitArray(num);\n        if (w.length === 0) return new BN(1);\n        var res = this;\n        for (var i = 0; i < w.length; i++, res = res.sqr()) {\n          if (w[i] !== 0) break;\n        }\n        if (++i < w.length) {\n          for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n            if (w[i] === 0) continue;\n            res = res.mul(q);\n          }\n        }\n        return res;\n      };\n      BN.prototype.iushln = function iushln(bits) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var r = bits % 26;\n        var s = (bits - r) / 26;\n        var carryMask = 67108863 >>> 26 - r << 26 - r;\n        var i;\n        if (r !== 0) {\n          var carry = 0;\n          for (i = 0; i < this.length; i++) {\n            var newCarry = this.words[i] & carryMask;\n            var c = (this.words[i] | 0) - newCarry << r;\n            this.words[i] = c | carry;\n            carry = newCarry >>> 26 - r;\n          }\n          if (carry) {\n            this.words[i] = carry;\n            this.length++;\n          }\n        }\n        if (s !== 0) {\n          for (i = this.length - 1; i >= 0; i--) {\n            this.words[i + s] = this.words[i];\n          }\n          for (i = 0; i < s; i++) {\n            this.words[i] = 0;\n          }\n          this.length += s;\n        }\n        return this.strip();\n      };\n      BN.prototype.ishln = function ishln(bits) {\n        assert(this.negative === 0);\n        return this.iushln(bits);\n      };\n      BN.prototype.iushrn = function iushrn(bits, hint, extended) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var h;\n        if (hint) {\n          h = (hint - hint % 26) / 26;\n        } else {\n          h = 0;\n        }\n        var r = bits % 26;\n        var s = Math.min((bits - r) / 26, this.length);\n        var mask = 67108863 ^ 67108863 >>> r << r;\n        var maskedWords = extended;\n        h -= s;\n        h = Math.max(0, h);\n        if (maskedWords) {\n          for (var i = 0; i < s; i++) {\n            maskedWords.words[i] = this.words[i];\n          }\n          maskedWords.length = s;\n        }\n        if (s === 0) {\n        } else if (this.length > s) {\n          this.length -= s;\n          for (i = 0; i < this.length; i++) {\n            this.words[i] = this.words[i + s];\n          }\n        } else {\n          this.words[0] = 0;\n          this.length = 1;\n        }\n        var carry = 0;\n        for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n          var word = this.words[i] | 0;\n          this.words[i] = carry << 26 - r | word >>> r;\n          carry = word & mask;\n        }\n        if (maskedWords && carry !== 0) {\n          maskedWords.words[maskedWords.length++] = carry;\n        }\n        if (this.length === 0) {\n          this.words[0] = 0;\n          this.length = 1;\n        }\n        return this.strip();\n      };\n      BN.prototype.ishrn = function ishrn(bits, hint, extended) {\n        assert(this.negative === 0);\n        return this.iushrn(bits, hint, extended);\n      };\n      BN.prototype.shln = function shln(bits) {\n        return this.clone().ishln(bits);\n      };\n      BN.prototype.ushln = function ushln(bits) {\n        return this.clone().iushln(bits);\n      };\n      BN.prototype.shrn = function shrn(bits) {\n        return this.clone().ishrn(bits);\n      };\n      BN.prototype.ushrn = function ushrn(bits) {\n        return this.clone().iushrn(bits);\n      };\n      BN.prototype.testn = function testn(bit) {\n        assert(typeof bit === \"number\" && bit >= 0);\n        var r = bit % 26;\n        var s = (bit - r) / 26;\n        var q = 1 << r;\n        if (this.length <= s) return false;\n        var w = this.words[s];\n        return !!(w & q);\n      };\n      BN.prototype.imaskn = function imaskn(bits) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var r = bits % 26;\n        var s = (bits - r) / 26;\n        assert(this.negative === 0, \"imaskn works only with positive numbers\");\n        if (this.length <= s) {\n          return this;\n        }\n        if (r !== 0) {\n          s++;\n        }\n        this.length = Math.min(s, this.length);\n        if (r !== 0) {\n          var mask = 67108863 ^ 67108863 >>> r << r;\n          this.words[this.length - 1] &= mask;\n        }\n        return this.strip();\n      };\n      BN.prototype.maskn = function maskn(bits) {\n        return this.clone().imaskn(bits);\n      };\n      BN.prototype.iaddn = function iaddn(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        if (num < 0) return this.isubn(-num);\n        if (this.negative !== 0) {\n          if (this.length === 1 && (this.words[0] | 0) < num) {\n            this.words[0] = num - (this.words[0] | 0);\n            this.negative = 0;\n            return this;\n          }\n          this.negative = 0;\n          this.isubn(num);\n          this.negative = 1;\n          return this;\n        }\n        return this._iaddn(num);\n      };\n      BN.prototype._iaddn = function _iaddn(num) {\n        this.words[0] += num;\n        for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) {\n          this.words[i] -= 67108864;\n          if (i === this.length - 1) {\n            this.words[i + 1] = 1;\n          } else {\n            this.words[i + 1]++;\n          }\n        }\n        this.length = Math.max(this.length, i + 1);\n        return this;\n      };\n      BN.prototype.isubn = function isubn(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        if (num < 0) return this.iaddn(-num);\n        if (this.negative !== 0) {\n          this.negative = 0;\n          this.iaddn(num);\n          this.negative = 1;\n          return this;\n        }\n        this.words[0] -= num;\n        if (this.length === 1 && this.words[0] < 0) {\n          this.words[0] = -this.words[0];\n          this.negative = 1;\n        } else {\n          for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n            this.words[i] += 67108864;\n            this.words[i + 1] -= 1;\n          }\n        }\n        return this.strip();\n      };\n      BN.prototype.addn = function addn(num) {\n        return this.clone().iaddn(num);\n      };\n      BN.prototype.subn = function subn(num) {\n        return this.clone().isubn(num);\n      };\n      BN.prototype.iabs = function iabs() {\n        this.negative = 0;\n        return this;\n      };\n      BN.prototype.abs = function abs() {\n        return this.clone().iabs();\n      };\n      BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {\n        var len = num.length + shift;\n        var i;\n        this._expand(len);\n        var w;\n        var carry = 0;\n        for (i = 0; i < num.length; i++) {\n          w = (this.words[i + shift] | 0) + carry;\n          var right = (num.words[i] | 0) * mul;\n          w -= right & 67108863;\n          carry = (w >> 26) - (right / 67108864 | 0);\n          this.words[i + shift] = w & 67108863;\n        }\n        for (; i < this.length - shift; i++) {\n          w = (this.words[i + shift] | 0) + carry;\n          carry = w >> 26;\n          this.words[i + shift] = w & 67108863;\n        }\n        if (carry === 0) return this.strip();\n        assert(carry === -1);\n        carry = 0;\n        for (i = 0; i < this.length; i++) {\n          w = -(this.words[i] | 0) + carry;\n          carry = w >> 26;\n          this.words[i] = w & 67108863;\n        }\n        this.negative = 1;\n        return this.strip();\n      };\n      BN.prototype._wordDiv = function _wordDiv(num, mode) {\n        var shift = this.length - num.length;\n        var a = this.clone();\n        var b = num;\n        var bhi = b.words[b.length - 1] | 0;\n        var bhiBits = this._countBits(bhi);\n        shift = 26 - bhiBits;\n        if (shift !== 0) {\n          b = b.ushln(shift);\n          a.iushln(shift);\n          bhi = b.words[b.length - 1] | 0;\n        }\n        var m = a.length - b.length;\n        var q;\n        if (mode !== \"mod\") {\n          q = new BN(null);\n          q.length = m + 1;\n          q.words = new Array(q.length);\n          for (var i = 0; i < q.length; i++) {\n            q.words[i] = 0;\n          }\n        }\n        var diff = a.clone()._ishlnsubmul(b, 1, m);\n        if (diff.negative === 0) {\n          a = diff;\n          if (q) {\n            q.words[m] = 1;\n          }\n        }\n        for (var j = m - 1; j >= 0; j--) {\n          var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);\n          qj = Math.min(qj / bhi | 0, 67108863);\n          a._ishlnsubmul(b, qj, j);\n          while (a.negative !== 0) {\n            qj--;\n            a.negative = 0;\n            a._ishlnsubmul(b, 1, j);\n            if (!a.isZero()) {\n              a.negative ^= 1;\n            }\n          }\n          if (q) {\n            q.words[j] = qj;\n          }\n        }\n        if (q) {\n          q.strip();\n        }\n        a.strip();\n        if (mode !== \"div\" && shift !== 0) {\n          a.iushrn(shift);\n        }\n        return {\n          div: q || null,\n          mod: a\n        };\n      };\n      BN.prototype.divmod = function divmod(num, mode, positive) {\n        assert(!num.isZero());\n        if (this.isZero()) {\n          return {\n            div: new BN(0),\n            mod: new BN(0)\n          };\n        }\n        var div, mod, res;\n        if (this.negative !== 0 && num.negative === 0) {\n          res = this.neg().divmod(num, mode);\n          if (mode !== \"mod\") {\n            div = res.div.neg();\n          }\n          if (mode !== \"div\") {\n            mod = res.mod.neg();\n            if (positive && mod.negative !== 0) {\n              mod.iadd(num);\n            }\n          }\n          return {\n            div,\n            mod\n          };\n        }\n        if (this.negative === 0 && num.negative !== 0) {\n          res = this.divmod(num.neg(), mode);\n          if (mode !== \"mod\") {\n            div = res.div.neg();\n          }\n          return {\n            div,\n            mod: res.mod\n          };\n        }\n        if ((this.negative & num.negative) !== 0) {\n          res = this.neg().divmod(num.neg(), mode);\n          if (mode !== \"div\") {\n            mod = res.mod.neg();\n            if (positive && mod.negative !== 0) {\n              mod.isub(num);\n            }\n          }\n          return {\n            div: res.div,\n            mod\n          };\n        }\n        if (num.length > this.length || this.cmp(num) < 0) {\n          return {\n            div: new BN(0),\n            mod: this\n          };\n        }\n        if (num.length === 1) {\n          if (mode === \"div\") {\n            return {\n              div: this.divn(num.words[0]),\n              mod: null\n            };\n          }\n          if (mode === \"mod\") {\n            return {\n              div: null,\n              mod: new BN(this.modn(num.words[0]))\n            };\n          }\n          return {\n            div: this.divn(num.words[0]),\n            mod: new BN(this.modn(num.words[0]))\n          };\n        }\n        return this._wordDiv(num, mode);\n      };\n      BN.prototype.div = function div(num) {\n        return this.divmod(num, \"div\", false).div;\n      };\n      BN.prototype.mod = function mod(num) {\n        return this.divmod(num, \"mod\", false).mod;\n      };\n      BN.prototype.umod = function umod(num) {\n        return this.divmod(num, \"mod\", true).mod;\n      };\n      BN.prototype.divRound = function divRound(num) {\n        var dm = this.divmod(num);\n        if (dm.mod.isZero()) return dm.div;\n        var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n        var half = num.ushrn(1);\n        var r2 = num.andln(1);\n        var cmp = mod.cmp(half);\n        if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n        return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n      };\n      BN.prototype.modn = function modn(num) {\n        assert(num <= 67108863);\n        var p = (1 << 26) % num;\n        var acc = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          acc = (p * acc + (this.words[i] | 0)) % num;\n        }\n        return acc;\n      };\n      BN.prototype.idivn = function idivn(num) {\n        assert(num <= 67108863);\n        var carry = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          var w = (this.words[i] | 0) + carry * 67108864;\n          this.words[i] = w / num | 0;\n          carry = w % num;\n        }\n        return this.strip();\n      };\n      BN.prototype.divn = function divn(num) {\n        return this.clone().idivn(num);\n      };\n      BN.prototype.egcd = function egcd(p) {\n        assert(p.negative === 0);\n        assert(!p.isZero());\n        var x = this;\n        var y = p.clone();\n        if (x.negative !== 0) {\n          x = x.umod(p);\n        } else {\n          x = x.clone();\n        }\n        var A = new BN(1);\n        var B = new BN(0);\n        var C = new BN(0);\n        var D = new BN(1);\n        var g = 0;\n        while (x.isEven() && y.isEven()) {\n          x.iushrn(1);\n          y.iushrn(1);\n          ++g;\n        }\n        var yp = y.clone();\n        var xp = x.clone();\n        while (!x.isZero()) {\n          for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ;\n          if (i > 0) {\n            x.iushrn(i);\n            while (i-- > 0) {\n              if (A.isOdd() || B.isOdd()) {\n                A.iadd(yp);\n                B.isub(xp);\n              }\n              A.iushrn(1);\n              B.iushrn(1);\n            }\n          }\n          for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ;\n          if (j > 0) {\n            y.iushrn(j);\n            while (j-- > 0) {\n              if (C.isOdd() || D.isOdd()) {\n                C.iadd(yp);\n                D.isub(xp);\n              }\n              C.iushrn(1);\n              D.iushrn(1);\n            }\n          }\n          if (x.cmp(y) >= 0) {\n            x.isub(y);\n            A.isub(C);\n            B.isub(D);\n          } else {\n            y.isub(x);\n            C.isub(A);\n            D.isub(B);\n          }\n        }\n        return {\n          a: C,\n          b: D,\n          gcd: y.iushln(g)\n        };\n      };\n      BN.prototype._invmp = function _invmp(p) {\n        assert(p.negative === 0);\n        assert(!p.isZero());\n        var a = this;\n        var b = p.clone();\n        if (a.negative !== 0) {\n          a = a.umod(p);\n        } else {\n          a = a.clone();\n        }\n        var x1 = new BN(1);\n        var x2 = new BN(0);\n        var delta = b.clone();\n        while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n          for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ;\n          if (i > 0) {\n            a.iushrn(i);\n            while (i-- > 0) {\n              if (x1.isOdd()) {\n                x1.iadd(delta);\n              }\n              x1.iushrn(1);\n            }\n          }\n          for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ;\n          if (j > 0) {\n            b.iushrn(j);\n            while (j-- > 0) {\n              if (x2.isOdd()) {\n                x2.iadd(delta);\n              }\n              x2.iushrn(1);\n            }\n          }\n          if (a.cmp(b) >= 0) {\n            a.isub(b);\n            x1.isub(x2);\n          } else {\n            b.isub(a);\n            x2.isub(x1);\n          }\n        }\n        var res;\n        if (a.cmpn(1) === 0) {\n          res = x1;\n        } else {\n          res = x2;\n        }\n        if (res.cmpn(0) < 0) {\n          res.iadd(p);\n        }\n        return res;\n      };\n      BN.prototype.gcd = function gcd(num) {\n        if (this.isZero()) return num.abs();\n        if (num.isZero()) return this.abs();\n        var a = this.clone();\n        var b = num.clone();\n        a.negative = 0;\n        b.negative = 0;\n        for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n          a.iushrn(1);\n          b.iushrn(1);\n        }\n        do {\n          while (a.isEven()) {\n            a.iushrn(1);\n          }\n          while (b.isEven()) {\n            b.iushrn(1);\n          }\n          var r = a.cmp(b);\n          if (r < 0) {\n            var t = a;\n            a = b;\n            b = t;\n          } else if (r === 0 || b.cmpn(1) === 0) {\n            break;\n          }\n          a.isub(b);\n        } while (true);\n        return b.iushln(shift);\n      };\n      BN.prototype.invm = function invm(num) {\n        return this.egcd(num).a.umod(num);\n      };\n      BN.prototype.isEven = function isEven() {\n        return (this.words[0] & 1) === 0;\n      };\n      BN.prototype.isOdd = function isOdd() {\n        return (this.words[0] & 1) === 1;\n      };\n      BN.prototype.andln = function andln(num) {\n        return this.words[0] & num;\n      };\n      BN.prototype.bincn = function bincn(bit) {\n        assert(typeof bit === \"number\");\n        var r = bit % 26;\n        var s = (bit - r) / 26;\n        var q = 1 << r;\n        if (this.length <= s) {\n          this._expand(s + 1);\n          this.words[s] |= q;\n          return this;\n        }\n        var carry = q;\n        for (var i = s; carry !== 0 && i < this.length; i++) {\n          var w = this.words[i] | 0;\n          w += carry;\n          carry = w >>> 26;\n          w &= 67108863;\n          this.words[i] = w;\n        }\n        if (carry !== 0) {\n          this.words[i] = carry;\n          this.length++;\n        }\n        return this;\n      };\n      BN.prototype.isZero = function isZero() {\n        return this.length === 1 && this.words[0] === 0;\n      };\n      BN.prototype.cmpn = function cmpn(num) {\n        var negative = num < 0;\n        if (this.negative !== 0 && !negative) return -1;\n        if (this.negative === 0 && negative) return 1;\n        this.strip();\n        var res;\n        if (this.length > 1) {\n          res = 1;\n        } else {\n          if (negative) {\n            num = -num;\n          }\n          assert(num <= 67108863, \"Number is too big\");\n          var w = this.words[0] | 0;\n          res = w === num ? 0 : w < num ? -1 : 1;\n        }\n        if (this.negative !== 0) return -res | 0;\n        return res;\n      };\n      BN.prototype.cmp = function cmp(num) {\n        if (this.negative !== 0 && num.negative === 0) return -1;\n        if (this.negative === 0 && num.negative !== 0) return 1;\n        var res = this.ucmp(num);\n        if (this.negative !== 0) return -res | 0;\n        return res;\n      };\n      BN.prototype.ucmp = function ucmp(num) {\n        if (this.length > num.length) return 1;\n        if (this.length < num.length) return -1;\n        var res = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          var a = this.words[i] | 0;\n          var b = num.words[i] | 0;\n          if (a === b) continue;\n          if (a < b) {\n            res = -1;\n          } else if (a > b) {\n            res = 1;\n          }\n          break;\n        }\n        return res;\n      };\n      BN.prototype.gtn = function gtn(num) {\n        return this.cmpn(num) === 1;\n      };\n      BN.prototype.gt = function gt(num) {\n        return this.cmp(num) === 1;\n      };\n      BN.prototype.gten = function gten(num) {\n        return this.cmpn(num) >= 0;\n      };\n      BN.prototype.gte = function gte(num) {\n        return this.cmp(num) >= 0;\n      };\n      BN.prototype.ltn = function ltn(num) {\n        return this.cmpn(num) === -1;\n      };\n      BN.prototype.lt = function lt(num) {\n        return this.cmp(num) === -1;\n      };\n      BN.prototype.lten = function lten(num) {\n        return this.cmpn(num) <= 0;\n      };\n      BN.prototype.lte = function lte(num) {\n        return this.cmp(num) <= 0;\n      };\n      BN.prototype.eqn = function eqn(num) {\n        return this.cmpn(num) === 0;\n      };\n      BN.prototype.eq = function eq(num) {\n        return this.cmp(num) === 0;\n      };\n      BN.red = function red(num) {\n        return new Red(num);\n      };\n      BN.prototype.toRed = function toRed(ctx) {\n        assert(!this.red, \"Already a number in reduction context\");\n        assert(this.negative === 0, \"red works only with positives\");\n        return ctx.convertTo(this)._forceRed(ctx);\n      };\n      BN.prototype.fromRed = function fromRed() {\n        assert(this.red, \"fromRed works only with numbers in reduction context\");\n        return this.red.convertFrom(this);\n      };\n      BN.prototype._forceRed = function _forceRed(ctx) {\n        this.red = ctx;\n        return this;\n      };\n      BN.prototype.forceRed = function forceRed(ctx) {\n        assert(!this.red, \"Already a number in reduction context\");\n        return this._forceRed(ctx);\n      };\n      BN.prototype.redAdd = function redAdd(num) {\n        assert(this.red, \"redAdd works only with red numbers\");\n        return this.red.add(this, num);\n      };\n      BN.prototype.redIAdd = function redIAdd(num) {\n        assert(this.red, \"redIAdd works only with red numbers\");\n        return this.red.iadd(this, num);\n      };\n      BN.prototype.redSub = function redSub(num) {\n        assert(this.red, \"redSub works only with red numbers\");\n        return this.red.sub(this, num);\n      };\n      BN.prototype.redISub = function redISub(num) {\n        assert(this.red, \"redISub works only with red numbers\");\n        return this.red.isub(this, num);\n      };\n      BN.prototype.redShl = function redShl(num) {\n        assert(this.red, \"redShl works only with red numbers\");\n        return this.red.shl(this, num);\n      };\n      BN.prototype.redMul = function redMul(num) {\n        assert(this.red, \"redMul works only with red numbers\");\n        this.red._verify2(this, num);\n        return this.red.mul(this, num);\n      };\n      BN.prototype.redIMul = function redIMul(num) {\n        assert(this.red, \"redMul works only with red numbers\");\n        this.red._verify2(this, num);\n        return this.red.imul(this, num);\n      };\n      BN.prototype.redSqr = function redSqr() {\n        assert(this.red, \"redSqr works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.sqr(this);\n      };\n      BN.prototype.redISqr = function redISqr() {\n        assert(this.red, \"redISqr works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.isqr(this);\n      };\n      BN.prototype.redSqrt = function redSqrt() {\n        assert(this.red, \"redSqrt works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.sqrt(this);\n      };\n      BN.prototype.redInvm = function redInvm() {\n        assert(this.red, \"redInvm works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.invm(this);\n      };\n      BN.prototype.redNeg = function redNeg() {\n        assert(this.red, \"redNeg works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.neg(this);\n      };\n      BN.prototype.redPow = function redPow(num) {\n        assert(this.red && !num.red, \"redPow(normalNum)\");\n        this.red._verify1(this);\n        return this.red.pow(this, num);\n      };\n      var primes = {\n        k256: null,\n        p224: null,\n        p192: null,\n        p25519: null\n      };\n      function MPrime(name2, p) {\n        this.name = name2;\n        this.p = new BN(p, 16);\n        this.n = this.p.bitLength();\n        this.k = new BN(1).iushln(this.n).isub(this.p);\n        this.tmp = this._tmp();\n      }\n      MPrime.prototype._tmp = function _tmp() {\n        var tmp = new BN(null);\n        tmp.words = new Array(Math.ceil(this.n / 13));\n        return tmp;\n      };\n      MPrime.prototype.ireduce = function ireduce(num) {\n        var r = num;\n        var rlen;\n        do {\n          this.split(r, this.tmp);\n          r = this.imulK(r);\n          r = r.iadd(this.tmp);\n          rlen = r.bitLength();\n        } while (rlen > this.n);\n        var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n        if (cmp === 0) {\n          r.words[0] = 0;\n          r.length = 1;\n        } else if (cmp > 0) {\n          r.isub(this.p);\n        } else {\n          if (r.strip !== void 0) {\n            r.strip();\n          } else {\n            r._strip();\n          }\n        }\n        return r;\n      };\n      MPrime.prototype.split = function split(input, out) {\n        input.iushrn(this.n, 0, out);\n      };\n      MPrime.prototype.imulK = function imulK(num) {\n        return num.imul(this.k);\n      };\n      function K256() {\n        MPrime.call(\n          this,\n          \"k256\",\n          \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\"\n        );\n      }\n      inherits(K256, MPrime);\n      K256.prototype.split = function split(input, output) {\n        var mask = 4194303;\n        var outLen = Math.min(input.length, 9);\n        for (var i = 0; i < outLen; i++) {\n          output.words[i] = input.words[i];\n        }\n        output.length = outLen;\n        if (input.length <= 9) {\n          input.words[0] = 0;\n          input.length = 1;\n          return;\n        }\n        var prev = input.words[9];\n        output.words[output.length++] = prev & mask;\n        for (i = 10; i < input.length; i++) {\n          var next = input.words[i] | 0;\n          input.words[i - 10] = (next & mask) << 4 | prev >>> 22;\n          prev = next;\n        }\n        prev >>>= 22;\n        input.words[i - 10] = prev;\n        if (prev === 0 && input.length > 10) {\n          input.length -= 10;\n        } else {\n          input.length -= 9;\n        }\n      };\n      K256.prototype.imulK = function imulK(num) {\n        num.words[num.length] = 0;\n        num.words[num.length + 1] = 0;\n        num.length += 2;\n        var lo = 0;\n        for (var i = 0; i < num.length; i++) {\n          var w = num.words[i] | 0;\n          lo += w * 977;\n          num.words[i] = lo & 67108863;\n          lo = w * 64 + (lo / 67108864 | 0);\n        }\n        if (num.words[num.length - 1] === 0) {\n          num.length--;\n          if (num.words[num.length - 1] === 0) {\n            num.length--;\n          }\n        }\n        return num;\n      };\n      function P224() {\n        MPrime.call(\n          this,\n          \"p224\",\n          \"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\"\n        );\n      }\n      inherits(P224, MPrime);\n      function P192() {\n        MPrime.call(\n          this,\n          \"p192\",\n          \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\"\n        );\n      }\n      inherits(P192, MPrime);\n      function P25519() {\n        MPrime.call(\n          this,\n          \"25519\",\n          \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\"\n        );\n      }\n      inherits(P25519, MPrime);\n      P25519.prototype.imulK = function imulK(num) {\n        var carry = 0;\n        for (var i = 0; i < num.length; i++) {\n          var hi = (num.words[i] | 0) * 19 + carry;\n          var lo = hi & 67108863;\n          hi >>>= 26;\n          num.words[i] = lo;\n          carry = hi;\n        }\n        if (carry !== 0) {\n          num.words[num.length++] = carry;\n        }\n        return num;\n      };\n      BN._prime = function prime(name2) {\n        if (primes[name2]) return primes[name2];\n        var prime2;\n        if (name2 === \"k256\") {\n          prime2 = new K256();\n        } else if (name2 === \"p224\") {\n          prime2 = new P224();\n        } else if (name2 === \"p192\") {\n          prime2 = new P192();\n        } else if (name2 === \"p25519\") {\n          prime2 = new P25519();\n        } else {\n          throw new Error(\"Unknown prime \" + name2);\n        }\n        primes[name2] = prime2;\n        return prime2;\n      };\n      function Red(m) {\n        if (typeof m === \"string\") {\n          var prime = BN._prime(m);\n          this.m = prime.p;\n          this.prime = prime;\n        } else {\n          assert(m.gtn(1), \"modulus must be greater than 1\");\n          this.m = m;\n          this.prime = null;\n        }\n      }\n      Red.prototype._verify1 = function _verify1(a) {\n        assert(a.negative === 0, \"red works only with positives\");\n        assert(a.red, \"red works only with red numbers\");\n      };\n      Red.prototype._verify2 = function _verify2(a, b) {\n        assert((a.negative | b.negative) === 0, \"red works only with positives\");\n        assert(\n          a.red && a.red === b.red,\n          \"red works only with red numbers\"\n        );\n      };\n      Red.prototype.imod = function imod(a) {\n        if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n        return a.umod(this.m)._forceRed(this);\n      };\n      Red.prototype.neg = function neg(a) {\n        if (a.isZero()) {\n          return a.clone();\n        }\n        return this.m.sub(a)._forceRed(this);\n      };\n      Red.prototype.add = function add(a, b) {\n        this._verify2(a, b);\n        var res = a.add(b);\n        if (res.cmp(this.m) >= 0) {\n          res.isub(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Red.prototype.iadd = function iadd(a, b) {\n        this._verify2(a, b);\n        var res = a.iadd(b);\n        if (res.cmp(this.m) >= 0) {\n          res.isub(this.m);\n        }\n        return res;\n      };\n      Red.prototype.sub = function sub(a, b) {\n        this._verify2(a, b);\n        var res = a.sub(b);\n        if (res.cmpn(0) < 0) {\n          res.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Red.prototype.isub = function isub(a, b) {\n        this._verify2(a, b);\n        var res = a.isub(b);\n        if (res.cmpn(0) < 0) {\n          res.iadd(this.m);\n        }\n        return res;\n      };\n      Red.prototype.shl = function shl(a, num) {\n        this._verify1(a);\n        return this.imod(a.ushln(num));\n      };\n      Red.prototype.imul = function imul(a, b) {\n        this._verify2(a, b);\n        return this.imod(a.imul(b));\n      };\n      Red.prototype.mul = function mul(a, b) {\n        this._verify2(a, b);\n        return this.imod(a.mul(b));\n      };\n      Red.prototype.isqr = function isqr(a) {\n        return this.imul(a, a.clone());\n      };\n      Red.prototype.sqr = function sqr(a) {\n        return this.mul(a, a);\n      };\n      Red.prototype.sqrt = function sqrt(a) {\n        if (a.isZero()) return a.clone();\n        var mod3 = this.m.andln(3);\n        assert(mod3 % 2 === 1);\n        if (mod3 === 3) {\n          var pow = this.m.add(new BN(1)).iushrn(2);\n          return this.pow(a, pow);\n        }\n        var q = this.m.subn(1);\n        var s = 0;\n        while (!q.isZero() && q.andln(1) === 0) {\n          s++;\n          q.iushrn(1);\n        }\n        assert(!q.isZero());\n        var one = new BN(1).toRed(this);\n        var nOne = one.redNeg();\n        var lpow = this.m.subn(1).iushrn(1);\n        var z = this.m.bitLength();\n        z = new BN(2 * z * z).toRed(this);\n        while (this.pow(z, lpow).cmp(nOne) !== 0) {\n          z.redIAdd(nOne);\n        }\n        var c = this.pow(z, q);\n        var r = this.pow(a, q.addn(1).iushrn(1));\n        var t = this.pow(a, q);\n        var m = s;\n        while (t.cmp(one) !== 0) {\n          var tmp = t;\n          for (var i = 0; tmp.cmp(one) !== 0; i++) {\n            tmp = tmp.redSqr();\n          }\n          assert(i < m);\n          var b = this.pow(c, new BN(1).iushln(m - i - 1));\n          r = r.redMul(b);\n          c = b.redSqr();\n          t = t.redMul(c);\n          m = i;\n        }\n        return r;\n      };\n      Red.prototype.invm = function invm(a) {\n        var inv = a._invmp(this.m);\n        if (inv.negative !== 0) {\n          inv.negative = 0;\n          return this.imod(inv).redNeg();\n        } else {\n          return this.imod(inv);\n        }\n      };\n      Red.prototype.pow = function pow(a, num) {\n        if (num.isZero()) return new BN(1).toRed(this);\n        if (num.cmpn(1) === 0) return a.clone();\n        var windowSize = 4;\n        var wnd = new Array(1 << windowSize);\n        wnd[0] = new BN(1).toRed(this);\n        wnd[1] = a;\n        for (var i = 2; i < wnd.length; i++) {\n          wnd[i] = this.mul(wnd[i - 1], a);\n        }\n        var res = wnd[0];\n        var current = 0;\n        var currentLen = 0;\n        var start = num.bitLength() % 26;\n        if (start === 0) {\n          start = 26;\n        }\n        for (i = num.length - 1; i >= 0; i--) {\n          var word = num.words[i];\n          for (var j = start - 1; j >= 0; j--) {\n            var bit = word >> j & 1;\n            if (res !== wnd[0]) {\n              res = this.sqr(res);\n            }\n            if (bit === 0 && current === 0) {\n              currentLen = 0;\n              continue;\n            }\n            current <<= 1;\n            current |= bit;\n            currentLen++;\n            if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n            res = this.mul(res, wnd[current]);\n            currentLen = 0;\n            current = 0;\n          }\n          start = 26;\n        }\n        return res;\n      };\n      Red.prototype.convertTo = function convertTo(num) {\n        var r = num.umod(this.m);\n        return r === num ? r.clone() : r;\n      };\n      Red.prototype.convertFrom = function convertFrom(num) {\n        var res = num.clone();\n        res.red = null;\n        return res;\n      };\n      BN.mont = function mont(num) {\n        return new Mont(num);\n      };\n      function Mont(m) {\n        Red.call(this, m);\n        this.shift = this.m.bitLength();\n        if (this.shift % 26 !== 0) {\n          this.shift += 26 - this.shift % 26;\n        }\n        this.r = new BN(1).iushln(this.shift);\n        this.r2 = this.imod(this.r.sqr());\n        this.rinv = this.r._invmp(this.m);\n        this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n        this.minv = this.minv.umod(this.r);\n        this.minv = this.r.sub(this.minv);\n      }\n      inherits(Mont, Red);\n      Mont.prototype.convertTo = function convertTo(num) {\n        return this.imod(num.ushln(this.shift));\n      };\n      Mont.prototype.convertFrom = function convertFrom(num) {\n        var r = this.imod(num.mul(this.rinv));\n        r.red = null;\n        return r;\n      };\n      Mont.prototype.imul = function imul(a, b) {\n        if (a.isZero() || b.isZero()) {\n          a.words[0] = 0;\n          a.length = 1;\n          return a;\n        }\n        var t = a.imul(b);\n        var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n        var u = t.isub(c).iushrn(this.shift);\n        var res = u;\n        if (u.cmp(this.m) >= 0) {\n          res = u.isub(this.m);\n        } else if (u.cmpn(0) < 0) {\n          res = u.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Mont.prototype.mul = function mul(a, b) {\n        if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n        var t = a.mul(b);\n        var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n        var u = t.isub(c).iushrn(this.shift);\n        var res = u;\n        if (u.cmp(this.m) >= 0) {\n          res = u.isub(this.m);\n        } else if (u.cmpn(0) < 0) {\n          res = u.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Mont.prototype.invm = function invm(a) {\n        var res = this.imod(a._invmp(this.m).mul(this.r2));\n        return res._forceRed(this);\n      };\n    })(typeof module2 === \"undefined\" || module2, exports2);\n  }\n});\n\n// node_modules/@ethersproject/logger/lib/_version.js\nvar require_version = __commonJS({\n  \"node_modules/@ethersproject/logger/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"logger/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/logger/lib/index.js\nvar require_lib = __commonJS({\n  \"node_modules/@ethersproject/logger/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Logger = exports2.ErrorCode = exports2.LogLevel = void 0;\n    var _permanentCensorErrors = false;\n    var _censorErrors = false;\n    var LogLevels = { debug: 1, \"default\": 2, info: 2, warning: 3, error: 4, off: 5 };\n    var _logLevel = LogLevels[\"default\"];\n    var _version_1 = require_version();\n    var _globalLogger = null;\n    function _checkNormalize() {\n      try {\n        var missing_1 = [];\n        [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].forEach(function(form) {\n          try {\n            if (\"test\".normalize(form) !== \"test\") {\n              throw new Error(\"bad normalize\");\n            }\n            ;\n          } catch (error) {\n            missing_1.push(form);\n          }\n        });\n        if (missing_1.length) {\n          throw new Error(\"missing \" + missing_1.join(\", \"));\n        }\n        if (String.fromCharCode(233).normalize(\"NFD\") !== String.fromCharCode(101, 769)) {\n          throw new Error(\"broken implementation\");\n        }\n      } catch (error) {\n        return error.message;\n      }\n      return null;\n    }\n    var _normalizeError = _checkNormalize();\n    var LogLevel;\n    (function(LogLevel2) {\n      LogLevel2[\"DEBUG\"] = \"DEBUG\";\n      LogLevel2[\"INFO\"] = \"INFO\";\n      LogLevel2[\"WARNING\"] = \"WARNING\";\n      LogLevel2[\"ERROR\"] = \"ERROR\";\n      LogLevel2[\"OFF\"] = \"OFF\";\n    })(LogLevel = exports2.LogLevel || (exports2.LogLevel = {}));\n    var ErrorCode;\n    (function(ErrorCode2) {\n      ErrorCode2[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n      ErrorCode2[\"NOT_IMPLEMENTED\"] = \"NOT_IMPLEMENTED\";\n      ErrorCode2[\"UNSUPPORTED_OPERATION\"] = \"UNSUPPORTED_OPERATION\";\n      ErrorCode2[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n      ErrorCode2[\"SERVER_ERROR\"] = \"SERVER_ERROR\";\n      ErrorCode2[\"TIMEOUT\"] = \"TIMEOUT\";\n      ErrorCode2[\"BUFFER_OVERRUN\"] = \"BUFFER_OVERRUN\";\n      ErrorCode2[\"NUMERIC_FAULT\"] = \"NUMERIC_FAULT\";\n      ErrorCode2[\"MISSING_NEW\"] = \"MISSING_NEW\";\n      ErrorCode2[\"INVALID_ARGUMENT\"] = \"INVALID_ARGUMENT\";\n      ErrorCode2[\"MISSING_ARGUMENT\"] = \"MISSING_ARGUMENT\";\n      ErrorCode2[\"UNEXPECTED_ARGUMENT\"] = \"UNEXPECTED_ARGUMENT\";\n      ErrorCode2[\"CALL_EXCEPTION\"] = \"CALL_EXCEPTION\";\n      ErrorCode2[\"INSUFFICIENT_FUNDS\"] = \"INSUFFICIENT_FUNDS\";\n      ErrorCode2[\"NONCE_EXPIRED\"] = \"NONCE_EXPIRED\";\n      ErrorCode2[\"REPLACEMENT_UNDERPRICED\"] = \"REPLACEMENT_UNDERPRICED\";\n      ErrorCode2[\"UNPREDICTABLE_GAS_LIMIT\"] = \"UNPREDICTABLE_GAS_LIMIT\";\n      ErrorCode2[\"TRANSACTION_REPLACED\"] = \"TRANSACTION_REPLACED\";\n    })(ErrorCode = exports2.ErrorCode || (exports2.ErrorCode = {}));\n    var HEX = \"0123456789abcdef\";\n    var Logger = (\n      /** @class */\n      function() {\n        function Logger2(version) {\n          Object.defineProperty(this, \"version\", {\n            enumerable: true,\n            value: version,\n            writable: false\n          });\n        }\n        Logger2.prototype._log = function(logLevel, args) {\n          var level = logLevel.toLowerCase();\n          if (LogLevels[level] == null) {\n            this.throwArgumentError(\"invalid log level name\", \"logLevel\", logLevel);\n          }\n          if (_logLevel > LogLevels[level]) {\n            return;\n          }\n          console.log.apply(console, args);\n        };\n        Logger2.prototype.debug = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.DEBUG, args);\n        };\n        Logger2.prototype.info = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.INFO, args);\n        };\n        Logger2.prototype.warn = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.WARNING, args);\n        };\n        Logger2.prototype.makeError = function(message, code, params2) {\n          if (_censorErrors) {\n            return this.makeError(\"censored error\", code, {});\n          }\n          if (!code) {\n            code = Logger2.errors.UNKNOWN_ERROR;\n          }\n          if (!params2) {\n            params2 = {};\n          }\n          var messageDetails = [];\n          Object.keys(params2).forEach(function(key) {\n            var value = params2[key];\n            try {\n              if (value instanceof Uint8Array) {\n                var hex = \"\";\n                for (var i = 0; i < value.length; i++) {\n                  hex += HEX[value[i] >> 4];\n                  hex += HEX[value[i] & 15];\n                }\n                messageDetails.push(key + \"=Uint8Array(0x\" + hex + \")\");\n              } else {\n                messageDetails.push(key + \"=\" + JSON.stringify(value));\n              }\n            } catch (error2) {\n              messageDetails.push(key + \"=\" + JSON.stringify(params2[key].toString()));\n            }\n          });\n          messageDetails.push(\"code=\" + code);\n          messageDetails.push(\"version=\" + this.version);\n          var reason = message;\n          if (messageDetails.length) {\n            message += \" (\" + messageDetails.join(\", \") + \")\";\n          }\n          var error = new Error(message);\n          error.reason = reason;\n          error.code = code;\n          Object.keys(params2).forEach(function(key) {\n            error[key] = params2[key];\n          });\n          return error;\n        };\n        Logger2.prototype.throwError = function(message, code, params2) {\n          throw this.makeError(message, code, params2);\n        };\n        Logger2.prototype.throwArgumentError = function(message, name2, value) {\n          return this.throwError(message, Logger2.errors.INVALID_ARGUMENT, {\n            argument: name2,\n            value\n          });\n        };\n        Logger2.prototype.assert = function(condition, message, code, params2) {\n          if (!!condition) {\n            return;\n          }\n          this.throwError(message, code, params2);\n        };\n        Logger2.prototype.assertArgument = function(condition, message, name2, value) {\n          if (!!condition) {\n            return;\n          }\n          this.throwArgumentError(message, name2, value);\n        };\n        Logger2.prototype.checkNormalize = function(message) {\n          if (message == null) {\n            message = \"platform missing String.prototype.normalize\";\n          }\n          if (_normalizeError) {\n            this.throwError(\"platform missing String.prototype.normalize\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"String.prototype.normalize\",\n              form: _normalizeError\n            });\n          }\n        };\n        Logger2.prototype.checkSafeUint53 = function(value, message) {\n          if (typeof value !== \"number\") {\n            return;\n          }\n          if (message == null) {\n            message = \"value not safe\";\n          }\n          if (value < 0 || value >= 9007199254740991) {\n            this.throwError(message, Logger2.errors.NUMERIC_FAULT, {\n              operation: \"checkSafeInteger\",\n              fault: \"out-of-safe-range\",\n              value\n            });\n          }\n          if (value % 1) {\n            this.throwError(message, Logger2.errors.NUMERIC_FAULT, {\n              operation: \"checkSafeInteger\",\n              fault: \"non-integer\",\n              value\n            });\n          }\n        };\n        Logger2.prototype.checkArgumentCount = function(count, expectedCount, message) {\n          if (message) {\n            message = \": \" + message;\n          } else {\n            message = \"\";\n          }\n          if (count < expectedCount) {\n            this.throwError(\"missing argument\" + message, Logger2.errors.MISSING_ARGUMENT, {\n              count,\n              expectedCount\n            });\n          }\n          if (count > expectedCount) {\n            this.throwError(\"too many arguments\" + message, Logger2.errors.UNEXPECTED_ARGUMENT, {\n              count,\n              expectedCount\n            });\n          }\n        };\n        Logger2.prototype.checkNew = function(target, kind) {\n          if (target === Object || target == null) {\n            this.throwError(\"missing new\", Logger2.errors.MISSING_NEW, { name: kind.name });\n          }\n        };\n        Logger2.prototype.checkAbstract = function(target, kind) {\n          if (target === kind) {\n            this.throwError(\"cannot instantiate abstract class \" + JSON.stringify(kind.name) + \" directly; use a sub-class\", Logger2.errors.UNSUPPORTED_OPERATION, { name: target.name, operation: \"new\" });\n          } else if (target === Object || target == null) {\n            this.throwError(\"missing new\", Logger2.errors.MISSING_NEW, { name: kind.name });\n          }\n        };\n        Logger2.globalLogger = function() {\n          if (!_globalLogger) {\n            _globalLogger = new Logger2(_version_1.version);\n          }\n          return _globalLogger;\n        };\n        Logger2.setCensorship = function(censorship, permanent) {\n          if (!censorship && permanent) {\n            this.globalLogger().throwError(\"cannot permanently disable censorship\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setCensorship\"\n            });\n          }\n          if (_permanentCensorErrors) {\n            if (!censorship) {\n              return;\n            }\n            this.globalLogger().throwError(\"error censorship permanent\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setCensorship\"\n            });\n          }\n          _censorErrors = !!censorship;\n          _permanentCensorErrors = !!permanent;\n        };\n        Logger2.setLogLevel = function(logLevel) {\n          var level = LogLevels[logLevel.toLowerCase()];\n          if (level == null) {\n            Logger2.globalLogger().warn(\"invalid log level - \" + logLevel);\n            return;\n          }\n          _logLevel = level;\n        };\n        Logger2.from = function(version) {\n          return new Logger2(version);\n        };\n        Logger2.errors = ErrorCode;\n        Logger2.levels = LogLevel;\n        return Logger2;\n      }()\n    );\n    exports2.Logger = Logger;\n  }\n});\n\n// node_modules/@ethersproject/bytes/lib/_version.js\nvar require_version2 = __commonJS({\n  \"node_modules/@ethersproject/bytes/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"bytes/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/bytes/lib/index.js\nvar require_lib2 = __commonJS({\n  \"node_modules/@ethersproject/bytes/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.joinSignature = exports2.splitSignature = exports2.hexZeroPad = exports2.hexStripZeros = exports2.hexValue = exports2.hexConcat = exports2.hexDataSlice = exports2.hexDataLength = exports2.hexlify = exports2.isHexString = exports2.zeroPad = exports2.stripZeros = exports2.concat = exports2.arrayify = exports2.isBytes = exports2.isBytesLike = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version2();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isHexable(value) {\n      return !!value.toHexString;\n    }\n    function addSlice(array) {\n      if (array.slice) {\n        return array;\n      }\n      array.slice = function() {\n        var args = Array.prototype.slice.call(arguments);\n        return addSlice(new Uint8Array(Array.prototype.slice.apply(array, args)));\n      };\n      return array;\n    }\n    function isBytesLike(value) {\n      return isHexString(value) && !(value.length % 2) || isBytes(value);\n    }\n    exports2.isBytesLike = isBytesLike;\n    function isInteger(value) {\n      return typeof value === \"number\" && value == value && value % 1 === 0;\n    }\n    function isBytes(value) {\n      if (value == null) {\n        return false;\n      }\n      if (value.constructor === Uint8Array) {\n        return true;\n      }\n      if (typeof value === \"string\") {\n        return false;\n      }\n      if (!isInteger(value.length) || value.length < 0) {\n        return false;\n      }\n      for (var i = 0; i < value.length; i++) {\n        var v = value[i];\n        if (!isInteger(v) || v < 0 || v >= 256) {\n          return false;\n        }\n      }\n      return true;\n    }\n    exports2.isBytes = isBytes;\n    function arrayify(value, options) {\n      if (!options) {\n        options = {};\n      }\n      if (typeof value === \"number\") {\n        logger.checkSafeUint53(value, \"invalid arrayify value\");\n        var result2 = [];\n        while (value) {\n          result2.unshift(value & 255);\n          value = parseInt(String(value / 256));\n        }\n        if (result2.length === 0) {\n          result2.push(0);\n        }\n        return addSlice(new Uint8Array(result2));\n      }\n      if (options.allowMissingPrefix && typeof value === \"string\" && value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (isHexable(value)) {\n        value = value.toHexString();\n      }\n      if (isHexString(value)) {\n        var hex = value.substring(2);\n        if (hex.length % 2) {\n          if (options.hexPad === \"left\") {\n            hex = \"0x0\" + hex.substring(2);\n          } else if (options.hexPad === \"right\") {\n            hex += \"0\";\n          } else {\n            logger.throwArgumentError(\"hex data is odd-length\", \"value\", value);\n          }\n        }\n        var result2 = [];\n        for (var i = 0; i < hex.length; i += 2) {\n          result2.push(parseInt(hex.substring(i, i + 2), 16));\n        }\n        return addSlice(new Uint8Array(result2));\n      }\n      if (isBytes(value)) {\n        return addSlice(new Uint8Array(value));\n      }\n      return logger.throwArgumentError(\"invalid arrayify value\", \"value\", value);\n    }\n    exports2.arrayify = arrayify;\n    function concat(items) {\n      var objects = items.map(function(item) {\n        return arrayify(item);\n      });\n      var length = objects.reduce(function(accum, item) {\n        return accum + item.length;\n      }, 0);\n      var result2 = new Uint8Array(length);\n      objects.reduce(function(offset, object) {\n        result2.set(object, offset);\n        return offset + object.length;\n      }, 0);\n      return addSlice(result2);\n    }\n    exports2.concat = concat;\n    function stripZeros(value) {\n      var result2 = arrayify(value);\n      if (result2.length === 0) {\n        return result2;\n      }\n      var start = 0;\n      while (start < result2.length && result2[start] === 0) {\n        start++;\n      }\n      if (start) {\n        result2 = result2.slice(start);\n      }\n      return result2;\n    }\n    exports2.stripZeros = stripZeros;\n    function zeroPad(value, length) {\n      value = arrayify(value);\n      if (value.length > length) {\n        logger.throwArgumentError(\"value out of range\", \"value\", arguments[0]);\n      }\n      var result2 = new Uint8Array(length);\n      result2.set(value, length - value.length);\n      return addSlice(result2);\n    }\n    exports2.zeroPad = zeroPad;\n    function isHexString(value, length) {\n      if (typeof value !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n        return false;\n      }\n      if (length && value.length !== 2 + 2 * length) {\n        return false;\n      }\n      return true;\n    }\n    exports2.isHexString = isHexString;\n    var HexCharacters = \"0123456789abcdef\";\n    function hexlify(value, options) {\n      if (!options) {\n        options = {};\n      }\n      if (typeof value === \"number\") {\n        logger.checkSafeUint53(value, \"invalid hexlify value\");\n        var hex = \"\";\n        while (value) {\n          hex = HexCharacters[value & 15] + hex;\n          value = Math.floor(value / 16);\n        }\n        if (hex.length) {\n          if (hex.length % 2) {\n            hex = \"0\" + hex;\n          }\n          return \"0x\" + hex;\n        }\n        return \"0x00\";\n      }\n      if (typeof value === \"bigint\") {\n        value = value.toString(16);\n        if (value.length % 2) {\n          return \"0x0\" + value;\n        }\n        return \"0x\" + value;\n      }\n      if (options.allowMissingPrefix && typeof value === \"string\" && value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (isHexable(value)) {\n        return value.toHexString();\n      }\n      if (isHexString(value)) {\n        if (value.length % 2) {\n          if (options.hexPad === \"left\") {\n            value = \"0x0\" + value.substring(2);\n          } else if (options.hexPad === \"right\") {\n            value += \"0\";\n          } else {\n            logger.throwArgumentError(\"hex data is odd-length\", \"value\", value);\n          }\n        }\n        return value.toLowerCase();\n      }\n      if (isBytes(value)) {\n        var result2 = \"0x\";\n        for (var i = 0; i < value.length; i++) {\n          var v = value[i];\n          result2 += HexCharacters[(v & 240) >> 4] + HexCharacters[v & 15];\n        }\n        return result2;\n      }\n      return logger.throwArgumentError(\"invalid hexlify value\", \"value\", value);\n    }\n    exports2.hexlify = hexlify;\n    function hexDataLength(data) {\n      if (typeof data !== \"string\") {\n        data = hexlify(data);\n      } else if (!isHexString(data) || data.length % 2) {\n        return null;\n      }\n      return (data.length - 2) / 2;\n    }\n    exports2.hexDataLength = hexDataLength;\n    function hexDataSlice(data, offset, endOffset) {\n      if (typeof data !== \"string\") {\n        data = hexlify(data);\n      } else if (!isHexString(data) || data.length % 2) {\n        logger.throwArgumentError(\"invalid hexData\", \"value\", data);\n      }\n      offset = 2 + 2 * offset;\n      if (endOffset != null) {\n        return \"0x\" + data.substring(offset, 2 + 2 * endOffset);\n      }\n      return \"0x\" + data.substring(offset);\n    }\n    exports2.hexDataSlice = hexDataSlice;\n    function hexConcat(items) {\n      var result2 = \"0x\";\n      items.forEach(function(item) {\n        result2 += hexlify(item).substring(2);\n      });\n      return result2;\n    }\n    exports2.hexConcat = hexConcat;\n    function hexValue(value) {\n      var trimmed = hexStripZeros(hexlify(value, { hexPad: \"left\" }));\n      if (trimmed === \"0x\") {\n        return \"0x0\";\n      }\n      return trimmed;\n    }\n    exports2.hexValue = hexValue;\n    function hexStripZeros(value) {\n      if (typeof value !== \"string\") {\n        value = hexlify(value);\n      }\n      if (!isHexString(value)) {\n        logger.throwArgumentError(\"invalid hex string\", \"value\", value);\n      }\n      value = value.substring(2);\n      var offset = 0;\n      while (offset < value.length && value[offset] === \"0\") {\n        offset++;\n      }\n      return \"0x\" + value.substring(offset);\n    }\n    exports2.hexStripZeros = hexStripZeros;\n    function hexZeroPad(value, length) {\n      if (typeof value !== \"string\") {\n        value = hexlify(value);\n      } else if (!isHexString(value)) {\n        logger.throwArgumentError(\"invalid hex string\", \"value\", value);\n      }\n      if (value.length > 2 * length + 2) {\n        logger.throwArgumentError(\"value out of range\", \"value\", arguments[1]);\n      }\n      while (value.length < 2 * length + 2) {\n        value = \"0x0\" + value.substring(2);\n      }\n      return value;\n    }\n    exports2.hexZeroPad = hexZeroPad;\n    function splitSignature(signature) {\n      var result2 = {\n        r: \"0x\",\n        s: \"0x\",\n        _vs: \"0x\",\n        recoveryParam: 0,\n        v: 0\n      };\n      if (isBytesLike(signature)) {\n        var bytes = arrayify(signature);\n        if (bytes.length !== 65) {\n          logger.throwArgumentError(\"invalid signature string; must be 65 bytes\", \"signature\", signature);\n        }\n        result2.r = hexlify(bytes.slice(0, 32));\n        result2.s = hexlify(bytes.slice(32, 64));\n        result2.v = bytes[64];\n        if (result2.v < 27) {\n          if (result2.v === 0 || result2.v === 1) {\n            result2.v += 27;\n          } else {\n            logger.throwArgumentError(\"signature invalid v byte\", \"signature\", signature);\n          }\n        }\n        result2.recoveryParam = 1 - result2.v % 2;\n        if (result2.recoveryParam) {\n          bytes[32] |= 128;\n        }\n        result2._vs = hexlify(bytes.slice(32, 64));\n      } else {\n        result2.r = signature.r;\n        result2.s = signature.s;\n        result2.v = signature.v;\n        result2.recoveryParam = signature.recoveryParam;\n        result2._vs = signature._vs;\n        if (result2._vs != null) {\n          var vs_1 = zeroPad(arrayify(result2._vs), 32);\n          result2._vs = hexlify(vs_1);\n          var recoveryParam = vs_1[0] >= 128 ? 1 : 0;\n          if (result2.recoveryParam == null) {\n            result2.recoveryParam = recoveryParam;\n          } else if (result2.recoveryParam !== recoveryParam) {\n            logger.throwArgumentError(\"signature recoveryParam mismatch _vs\", \"signature\", signature);\n          }\n          vs_1[0] &= 127;\n          var s = hexlify(vs_1);\n          if (result2.s == null) {\n            result2.s = s;\n          } else if (result2.s !== s) {\n            logger.throwArgumentError(\"signature v mismatch _vs\", \"signature\", signature);\n          }\n        }\n        if (result2.recoveryParam == null) {\n          if (result2.v == null) {\n            logger.throwArgumentError(\"signature missing v and recoveryParam\", \"signature\", signature);\n          } else if (result2.v === 0 || result2.v === 1) {\n            result2.recoveryParam = result2.v;\n          } else {\n            result2.recoveryParam = 1 - result2.v % 2;\n          }\n        } else {\n          if (result2.v == null) {\n            result2.v = 27 + result2.recoveryParam;\n          } else {\n            var recId = result2.v === 0 || result2.v === 1 ? result2.v : 1 - result2.v % 2;\n            if (result2.recoveryParam !== recId) {\n              logger.throwArgumentError(\"signature recoveryParam mismatch v\", \"signature\", signature);\n            }\n          }\n        }\n        if (result2.r == null || !isHexString(result2.r)) {\n          logger.throwArgumentError(\"signature missing or invalid r\", \"signature\", signature);\n        } else {\n          result2.r = hexZeroPad(result2.r, 32);\n        }\n        if (result2.s == null || !isHexString(result2.s)) {\n          logger.throwArgumentError(\"signature missing or invalid s\", \"signature\", signature);\n        } else {\n          result2.s = hexZeroPad(result2.s, 32);\n        }\n        var vs = arrayify(result2.s);\n        if (vs[0] >= 128) {\n          logger.throwArgumentError(\"signature s out of range\", \"signature\", signature);\n        }\n        if (result2.recoveryParam) {\n          vs[0] |= 128;\n        }\n        var _vs = hexlify(vs);\n        if (result2._vs) {\n          if (!isHexString(result2._vs)) {\n            logger.throwArgumentError(\"signature invalid _vs\", \"signature\", signature);\n          }\n          result2._vs = hexZeroPad(result2._vs, 32);\n        }\n        if (result2._vs == null) {\n          result2._vs = _vs;\n        } else if (result2._vs !== _vs) {\n          logger.throwArgumentError(\"signature _vs mismatch v and s\", \"signature\", signature);\n        }\n      }\n      return result2;\n    }\n    exports2.splitSignature = splitSignature;\n    function joinSignature(signature) {\n      signature = splitSignature(signature);\n      return hexlify(concat([\n        signature.r,\n        signature.s,\n        signature.recoveryParam ? \"0x1c\" : \"0x1b\"\n      ]));\n    }\n    exports2.joinSignature = joinSignature;\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/_version.js\nvar require_version3 = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"bignumber/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/bignumber.js\nvar require_bignumber = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/bignumber.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._base16To36 = exports2._base36To16 = exports2.BigNumber = exports2.isBigNumberish = void 0;\n    var bn_js_1 = __importDefault(require_bn());\n    var BN = bn_js_1.default.BN;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version3();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _constructorGuard = {};\n    var MAX_SAFE = 9007199254740991;\n    function isBigNumberish(value) {\n      return value != null && (BigNumber2.isBigNumber(value) || typeof value === \"number\" && value % 1 === 0 || typeof value === \"string\" && !!value.match(/^-?[0-9]+$/) || (0, bytes_1.isHexString)(value) || typeof value === \"bigint\" || (0, bytes_1.isBytes)(value));\n    }\n    exports2.isBigNumberish = isBigNumberish;\n    var _warnedToStringRadix = false;\n    var BigNumber2 = (\n      /** @class */\n      function() {\n        function BigNumber3(constructorGuard, hex) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, BigNumber3);\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot call constructor directly; use BigNumber.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new (BigNumber)\"\n            });\n          }\n          this._hex = hex;\n          this._isBigNumber = true;\n          Object.freeze(this);\n        }\n        BigNumber3.prototype.fromTwos = function(value) {\n          return toBigNumber(toBN(this).fromTwos(value));\n        };\n        BigNumber3.prototype.toTwos = function(value) {\n          return toBigNumber(toBN(this).toTwos(value));\n        };\n        BigNumber3.prototype.abs = function() {\n          if (this._hex[0] === \"-\") {\n            return BigNumber3.from(this._hex.substring(1));\n          }\n          return this;\n        };\n        BigNumber3.prototype.add = function(other) {\n          return toBigNumber(toBN(this).add(toBN(other)));\n        };\n        BigNumber3.prototype.sub = function(other) {\n          return toBigNumber(toBN(this).sub(toBN(other)));\n        };\n        BigNumber3.prototype.div = function(other) {\n          var o = BigNumber3.from(other);\n          if (o.isZero()) {\n            throwFault(\"division by zero\", \"div\");\n          }\n          return toBigNumber(toBN(this).div(toBN(other)));\n        };\n        BigNumber3.prototype.mul = function(other) {\n          return toBigNumber(toBN(this).mul(toBN(other)));\n        };\n        BigNumber3.prototype.mod = function(other) {\n          var value = toBN(other);\n          if (value.isNeg()) {\n            throwFault(\"cannot modulo negative values\", \"mod\");\n          }\n          return toBigNumber(toBN(this).umod(value));\n        };\n        BigNumber3.prototype.pow = function(other) {\n          var value = toBN(other);\n          if (value.isNeg()) {\n            throwFault(\"cannot raise to negative values\", \"pow\");\n          }\n          return toBigNumber(toBN(this).pow(value));\n        };\n        BigNumber3.prototype.and = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'and' negative values\", \"and\");\n          }\n          return toBigNumber(toBN(this).and(value));\n        };\n        BigNumber3.prototype.or = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'or' negative values\", \"or\");\n          }\n          return toBigNumber(toBN(this).or(value));\n        };\n        BigNumber3.prototype.xor = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'xor' negative values\", \"xor\");\n          }\n          return toBigNumber(toBN(this).xor(value));\n        };\n        BigNumber3.prototype.mask = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot mask negative values\", \"mask\");\n          }\n          return toBigNumber(toBN(this).maskn(value));\n        };\n        BigNumber3.prototype.shl = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot shift negative values\", \"shl\");\n          }\n          return toBigNumber(toBN(this).shln(value));\n        };\n        BigNumber3.prototype.shr = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot shift negative values\", \"shr\");\n          }\n          return toBigNumber(toBN(this).shrn(value));\n        };\n        BigNumber3.prototype.eq = function(other) {\n          return toBN(this).eq(toBN(other));\n        };\n        BigNumber3.prototype.lt = function(other) {\n          return toBN(this).lt(toBN(other));\n        };\n        BigNumber3.prototype.lte = function(other) {\n          return toBN(this).lte(toBN(other));\n        };\n        BigNumber3.prototype.gt = function(other) {\n          return toBN(this).gt(toBN(other));\n        };\n        BigNumber3.prototype.gte = function(other) {\n          return toBN(this).gte(toBN(other));\n        };\n        BigNumber3.prototype.isNegative = function() {\n          return this._hex[0] === \"-\";\n        };\n        BigNumber3.prototype.isZero = function() {\n          return toBN(this).isZero();\n        };\n        BigNumber3.prototype.toNumber = function() {\n          try {\n            return toBN(this).toNumber();\n          } catch (error) {\n            throwFault(\"overflow\", \"toNumber\", this.toString());\n          }\n          return null;\n        };\n        BigNumber3.prototype.toBigInt = function() {\n          try {\n            return BigInt(this.toString());\n          } catch (e) {\n          }\n          return logger.throwError(\"this platform does not support BigInt\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            value: this.toString()\n          });\n        };\n        BigNumber3.prototype.toString = function() {\n          if (arguments.length > 0) {\n            if (arguments[0] === 10) {\n              if (!_warnedToStringRadix) {\n                _warnedToStringRadix = true;\n                logger.warn(\"BigNumber.toString does not accept any parameters; base-10 is assumed\");\n              }\n            } else if (arguments[0] === 16) {\n              logger.throwError(\"BigNumber.toString does not accept any parameters; use bigNumber.toHexString()\", logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {});\n            } else {\n              logger.throwError(\"BigNumber.toString does not accept parameters\", logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {});\n            }\n          }\n          return toBN(this).toString(10);\n        };\n        BigNumber3.prototype.toHexString = function() {\n          return this._hex;\n        };\n        BigNumber3.prototype.toJSON = function(key) {\n          return { type: \"BigNumber\", hex: this.toHexString() };\n        };\n        BigNumber3.from = function(value) {\n          if (value instanceof BigNumber3) {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            if (value.match(/^-?0x[0-9a-f]+$/i)) {\n              return new BigNumber3(_constructorGuard, toHex(value));\n            }\n            if (value.match(/^-?[0-9]+$/)) {\n              return new BigNumber3(_constructorGuard, toHex(new BN(value)));\n            }\n            return logger.throwArgumentError(\"invalid BigNumber string\", \"value\", value);\n          }\n          if (typeof value === \"number\") {\n            if (value % 1) {\n              throwFault(\"underflow\", \"BigNumber.from\", value);\n            }\n            if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n              throwFault(\"overflow\", \"BigNumber.from\", value);\n            }\n            return BigNumber3.from(String(value));\n          }\n          var anyValue = value;\n          if (typeof anyValue === \"bigint\") {\n            return BigNumber3.from(anyValue.toString());\n          }\n          if ((0, bytes_1.isBytes)(anyValue)) {\n            return BigNumber3.from((0, bytes_1.hexlify)(anyValue));\n          }\n          if (anyValue) {\n            if (anyValue.toHexString) {\n              var hex = anyValue.toHexString();\n              if (typeof hex === \"string\") {\n                return BigNumber3.from(hex);\n              }\n            } else {\n              var hex = anyValue._hex;\n              if (hex == null && anyValue.type === \"BigNumber\") {\n                hex = anyValue.hex;\n              }\n              if (typeof hex === \"string\") {\n                if ((0, bytes_1.isHexString)(hex) || hex[0] === \"-\" && (0, bytes_1.isHexString)(hex.substring(1))) {\n                  return BigNumber3.from(hex);\n                }\n              }\n            }\n          }\n          return logger.throwArgumentError(\"invalid BigNumber value\", \"value\", value);\n        };\n        BigNumber3.isBigNumber = function(value) {\n          return !!(value && value._isBigNumber);\n        };\n        return BigNumber3;\n      }()\n    );\n    exports2.BigNumber = BigNumber2;\n    function toHex(value) {\n      if (typeof value !== \"string\") {\n        return toHex(value.toString(16));\n      }\n      if (value[0] === \"-\") {\n        value = value.substring(1);\n        if (value[0] === \"-\") {\n          logger.throwArgumentError(\"invalid hex\", \"value\", value);\n        }\n        value = toHex(value);\n        if (value === \"0x00\") {\n          return value;\n        }\n        return \"-\" + value;\n      }\n      if (value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (value === \"0x\") {\n        return \"0x00\";\n      }\n      if (value.length % 2) {\n        value = \"0x0\" + value.substring(2);\n      }\n      while (value.length > 4 && value.substring(0, 4) === \"0x00\") {\n        value = \"0x\" + value.substring(4);\n      }\n      return value;\n    }\n    function toBigNumber(value) {\n      return BigNumber2.from(toHex(value));\n    }\n    function toBN(value) {\n      var hex = BigNumber2.from(value).toHexString();\n      if (hex[0] === \"-\") {\n        return new BN(\"-\" + hex.substring(3), 16);\n      }\n      return new BN(hex.substring(2), 16);\n    }\n    function throwFault(fault, operation, value) {\n      var params2 = { fault, operation };\n      if (value != null) {\n        params2.value = value;\n      }\n      return logger.throwError(fault, logger_1.Logger.errors.NUMERIC_FAULT, params2);\n    }\n    function _base36To16(value) {\n      return new BN(value, 36).toString(16);\n    }\n    exports2._base36To16 = _base36To16;\n    function _base16To36(value) {\n      return new BN(value, 16).toString(36);\n    }\n    exports2._base16To36 = _base16To36;\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/fixednumber.js\nvar require_fixednumber = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/fixednumber.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FixedNumber = exports2.FixedFormat = exports2.parseFixed = exports2.formatFixed = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version3();\n    var logger = new logger_1.Logger(_version_1.version);\n    var bignumber_1 = require_bignumber();\n    var _constructorGuard = {};\n    var Zero = bignumber_1.BigNumber.from(0);\n    var NegativeOne = bignumber_1.BigNumber.from(-1);\n    function throwFault(message, fault, operation, value) {\n      var params2 = { fault, operation };\n      if (value !== void 0) {\n        params2.value = value;\n      }\n      return logger.throwError(message, logger_1.Logger.errors.NUMERIC_FAULT, params2);\n    }\n    var zeros = \"0\";\n    while (zeros.length < 256) {\n      zeros += zeros;\n    }\n    function getMultiplier(decimals) {\n      if (typeof decimals !== \"number\") {\n        try {\n          decimals = bignumber_1.BigNumber.from(decimals).toNumber();\n        } catch (e) {\n        }\n      }\n      if (typeof decimals === \"number\" && decimals >= 0 && decimals <= 256 && !(decimals % 1)) {\n        return \"1\" + zeros.substring(0, decimals);\n      }\n      return logger.throwArgumentError(\"invalid decimal size\", \"decimals\", decimals);\n    }\n    function formatFixed(value, decimals) {\n      if (decimals == null) {\n        decimals = 0;\n      }\n      var multiplier = getMultiplier(decimals);\n      value = bignumber_1.BigNumber.from(value);\n      var negative = value.lt(Zero);\n      if (negative) {\n        value = value.mul(NegativeOne);\n      }\n      var fraction = value.mod(multiplier).toString();\n      while (fraction.length < multiplier.length - 1) {\n        fraction = \"0\" + fraction;\n      }\n      fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1];\n      var whole = value.div(multiplier).toString();\n      if (multiplier.length === 1) {\n        value = whole;\n      } else {\n        value = whole + \".\" + fraction;\n      }\n      if (negative) {\n        value = \"-\" + value;\n      }\n      return value;\n    }\n    exports2.formatFixed = formatFixed;\n    function parseFixed(value, decimals) {\n      if (decimals == null) {\n        decimals = 0;\n      }\n      var multiplier = getMultiplier(decimals);\n      if (typeof value !== \"string\" || !value.match(/^-?[0-9.]+$/)) {\n        logger.throwArgumentError(\"invalid decimal value\", \"value\", value);\n      }\n      var negative = value.substring(0, 1) === \"-\";\n      if (negative) {\n        value = value.substring(1);\n      }\n      if (value === \".\") {\n        logger.throwArgumentError(\"missing value\", \"value\", value);\n      }\n      var comps = value.split(\".\");\n      if (comps.length > 2) {\n        logger.throwArgumentError(\"too many decimal points\", \"value\", value);\n      }\n      var whole = comps[0], fraction = comps[1];\n      if (!whole) {\n        whole = \"0\";\n      }\n      if (!fraction) {\n        fraction = \"0\";\n      }\n      while (fraction[fraction.length - 1] === \"0\") {\n        fraction = fraction.substring(0, fraction.length - 1);\n      }\n      if (fraction.length > multiplier.length - 1) {\n        throwFault(\"fractional component exceeds decimals\", \"underflow\", \"parseFixed\");\n      }\n      if (fraction === \"\") {\n        fraction = \"0\";\n      }\n      while (fraction.length < multiplier.length - 1) {\n        fraction += \"0\";\n      }\n      var wholeValue = bignumber_1.BigNumber.from(whole);\n      var fractionValue = bignumber_1.BigNumber.from(fraction);\n      var wei = wholeValue.mul(multiplier).add(fractionValue);\n      if (negative) {\n        wei = wei.mul(NegativeOne);\n      }\n      return wei;\n    }\n    exports2.parseFixed = parseFixed;\n    var FixedFormat = (\n      /** @class */\n      function() {\n        function FixedFormat2(constructorGuard, signed, width, decimals) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot use FixedFormat constructor; use FixedFormat.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new FixedFormat\"\n            });\n          }\n          this.signed = signed;\n          this.width = width;\n          this.decimals = decimals;\n          this.name = (signed ? \"\" : \"u\") + \"fixed\" + String(width) + \"x\" + String(decimals);\n          this._multiplier = getMultiplier(decimals);\n          Object.freeze(this);\n        }\n        FixedFormat2.from = function(value) {\n          if (value instanceof FixedFormat2) {\n            return value;\n          }\n          if (typeof value === \"number\") {\n            value = \"fixed128x\" + value;\n          }\n          var signed = true;\n          var width = 128;\n          var decimals = 18;\n          if (typeof value === \"string\") {\n            if (value === \"fixed\") {\n            } else if (value === \"ufixed\") {\n              signed = false;\n            } else {\n              var match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/);\n              if (!match) {\n                logger.throwArgumentError(\"invalid fixed format\", \"format\", value);\n              }\n              signed = match[1] !== \"u\";\n              width = parseInt(match[2]);\n              decimals = parseInt(match[3]);\n            }\n          } else if (value) {\n            var check = function(key, type, defaultValue) {\n              if (value[key] == null) {\n                return defaultValue;\n              }\n              if (typeof value[key] !== type) {\n                logger.throwArgumentError(\"invalid fixed format (\" + key + \" not \" + type + \")\", \"format.\" + key, value[key]);\n              }\n              return value[key];\n            };\n            signed = check(\"signed\", \"boolean\", signed);\n            width = check(\"width\", \"number\", width);\n            decimals = check(\"decimals\", \"number\", decimals);\n          }\n          if (width % 8) {\n            logger.throwArgumentError(\"invalid fixed format width (not byte aligned)\", \"format.width\", width);\n          }\n          if (decimals > 80) {\n            logger.throwArgumentError(\"invalid fixed format (decimals too large)\", \"format.decimals\", decimals);\n          }\n          return new FixedFormat2(_constructorGuard, signed, width, decimals);\n        };\n        return FixedFormat2;\n      }()\n    );\n    exports2.FixedFormat = FixedFormat;\n    var FixedNumber = (\n      /** @class */\n      function() {\n        function FixedNumber2(constructorGuard, hex, value, format) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, FixedNumber2);\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot use FixedNumber constructor; use FixedNumber.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new FixedFormat\"\n            });\n          }\n          this.format = format;\n          this._hex = hex;\n          this._value = value;\n          this._isFixedNumber = true;\n          Object.freeze(this);\n        }\n        FixedNumber2.prototype._checkFormat = function(other) {\n          if (this.format.name !== other.format.name) {\n            logger.throwArgumentError(\"incompatible format; use fixedNumber.toFormat\", \"other\", other);\n          }\n        };\n        FixedNumber2.prototype.addUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.add(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.subUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.sub(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.mulUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.mul(b).div(this.format._multiplier), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.divUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.mul(this.format._multiplier).div(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.floor = function() {\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          var result2 = FixedNumber2.from(comps[0], this.format);\n          var hasFraction = !comps[1].match(/^(0*)$/);\n          if (this.isNegative() && hasFraction) {\n            result2 = result2.subUnsafe(ONE.toFormat(result2.format));\n          }\n          return result2;\n        };\n        FixedNumber2.prototype.ceiling = function() {\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          var result2 = FixedNumber2.from(comps[0], this.format);\n          var hasFraction = !comps[1].match(/^(0*)$/);\n          if (!this.isNegative() && hasFraction) {\n            result2 = result2.addUnsafe(ONE.toFormat(result2.format));\n          }\n          return result2;\n        };\n        FixedNumber2.prototype.round = function(decimals) {\n          if (decimals == null) {\n            decimals = 0;\n          }\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          if (decimals < 0 || decimals > 80 || decimals % 1) {\n            logger.throwArgumentError(\"invalid decimal count\", \"decimals\", decimals);\n          }\n          if (comps[1].length <= decimals) {\n            return this;\n          }\n          var factor = FixedNumber2.from(\"1\" + zeros.substring(0, decimals), this.format);\n          var bump = BUMP.toFormat(this.format);\n          return this.mulUnsafe(factor).addUnsafe(bump).floor().divUnsafe(factor);\n        };\n        FixedNumber2.prototype.isZero = function() {\n          return this._value === \"0.0\" || this._value === \"0\";\n        };\n        FixedNumber2.prototype.isNegative = function() {\n          return this._value[0] === \"-\";\n        };\n        FixedNumber2.prototype.toString = function() {\n          return this._value;\n        };\n        FixedNumber2.prototype.toHexString = function(width) {\n          if (width == null) {\n            return this._hex;\n          }\n          if (width % 8) {\n            logger.throwArgumentError(\"invalid byte width\", \"width\", width);\n          }\n          var hex = bignumber_1.BigNumber.from(this._hex).fromTwos(this.format.width).toTwos(width).toHexString();\n          return (0, bytes_1.hexZeroPad)(hex, width / 8);\n        };\n        FixedNumber2.prototype.toUnsafeFloat = function() {\n          return parseFloat(this.toString());\n        };\n        FixedNumber2.prototype.toFormat = function(format) {\n          return FixedNumber2.fromString(this._value, format);\n        };\n        FixedNumber2.fromValue = function(value, decimals, format) {\n          if (format == null && decimals != null && !(0, bignumber_1.isBigNumberish)(decimals)) {\n            format = decimals;\n            decimals = null;\n          }\n          if (decimals == null) {\n            decimals = 0;\n          }\n          if (format == null) {\n            format = \"fixed\";\n          }\n          return FixedNumber2.fromString(formatFixed(value, decimals), FixedFormat.from(format));\n        };\n        FixedNumber2.fromString = function(value, format) {\n          if (format == null) {\n            format = \"fixed\";\n          }\n          var fixedFormat = FixedFormat.from(format);\n          var numeric = parseFixed(value, fixedFormat.decimals);\n          if (!fixedFormat.signed && numeric.lt(Zero)) {\n            throwFault(\"unsigned value cannot be negative\", \"overflow\", \"value\", value);\n          }\n          var hex = null;\n          if (fixedFormat.signed) {\n            hex = numeric.toTwos(fixedFormat.width).toHexString();\n          } else {\n            hex = numeric.toHexString();\n            hex = (0, bytes_1.hexZeroPad)(hex, fixedFormat.width / 8);\n          }\n          var decimal = formatFixed(numeric, fixedFormat.decimals);\n          return new FixedNumber2(_constructorGuard, hex, decimal, fixedFormat);\n        };\n        FixedNumber2.fromBytes = function(value, format) {\n          if (format == null) {\n            format = \"fixed\";\n          }\n          var fixedFormat = FixedFormat.from(format);\n          if ((0, bytes_1.arrayify)(value).length > fixedFormat.width / 8) {\n            throw new Error(\"overflow\");\n          }\n          var numeric = bignumber_1.BigNumber.from(value);\n          if (fixedFormat.signed) {\n            numeric = numeric.fromTwos(fixedFormat.width);\n          }\n          var hex = numeric.toTwos((fixedFormat.signed ? 0 : 1) + fixedFormat.width).toHexString();\n          var decimal = formatFixed(numeric, fixedFormat.decimals);\n          return new FixedNumber2(_constructorGuard, hex, decimal, fixedFormat);\n        };\n        FixedNumber2.from = function(value, format) {\n          if (typeof value === \"string\") {\n            return FixedNumber2.fromString(value, format);\n          }\n          if ((0, bytes_1.isBytes)(value)) {\n            return FixedNumber2.fromBytes(value, format);\n          }\n          try {\n            return FixedNumber2.fromValue(value, 0, format);\n          } catch (error) {\n            if (error.code !== logger_1.Logger.errors.INVALID_ARGUMENT) {\n              throw error;\n            }\n          }\n          return logger.throwArgumentError(\"invalid FixedNumber value\", \"value\", value);\n        };\n        FixedNumber2.isFixedNumber = function(value) {\n          return !!(value && value._isFixedNumber);\n        };\n        return FixedNumber2;\n      }()\n    );\n    exports2.FixedNumber = FixedNumber;\n    var ONE = FixedNumber.from(1);\n    var BUMP = FixedNumber.from(\"0.5\");\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/index.js\nvar require_lib3 = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._base36To16 = exports2._base16To36 = exports2.parseFixed = exports2.FixedNumber = exports2.FixedFormat = exports2.formatFixed = exports2.BigNumber = void 0;\n    var bignumber_1 = require_bignumber();\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return bignumber_1.BigNumber;\n    } });\n    var fixednumber_1 = require_fixednumber();\n    Object.defineProperty(exports2, \"formatFixed\", { enumerable: true, get: function() {\n      return fixednumber_1.formatFixed;\n    } });\n    Object.defineProperty(exports2, \"FixedFormat\", { enumerable: true, get: function() {\n      return fixednumber_1.FixedFormat;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return fixednumber_1.FixedNumber;\n    } });\n    Object.defineProperty(exports2, \"parseFixed\", { enumerable: true, get: function() {\n      return fixednumber_1.parseFixed;\n    } });\n    var bignumber_2 = require_bignumber();\n    Object.defineProperty(exports2, \"_base16To36\", { enumerable: true, get: function() {\n      return bignumber_2._base16To36;\n    } });\n    Object.defineProperty(exports2, \"_base36To16\", { enumerable: true, get: function() {\n      return bignumber_2._base36To16;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/properties/lib/_version.js\nvar require_version4 = __commonJS({\n  \"node_modules/@ethersproject/properties/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"properties/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/properties/lib/index.js\nvar require_lib4 = __commonJS({\n  \"node_modules/@ethersproject/properties/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Description = exports2.deepCopy = exports2.shallowCopy = exports2.checkProperties = exports2.resolveProperties = exports2.getStatic = exports2.defineReadOnly = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version4();\n    var logger = new logger_1.Logger(_version_1.version);\n    function defineReadOnly(object, name2, value) {\n      Object.defineProperty(object, name2, {\n        enumerable: true,\n        value,\n        writable: false\n      });\n    }\n    exports2.defineReadOnly = defineReadOnly;\n    function getStatic(ctor, key) {\n      for (var i = 0; i < 32; i++) {\n        if (ctor[key]) {\n          return ctor[key];\n        }\n        if (!ctor.prototype || typeof ctor.prototype !== \"object\") {\n          break;\n        }\n        ctor = Object.getPrototypeOf(ctor.prototype).constructor;\n      }\n      return null;\n    }\n    exports2.getStatic = getStatic;\n    function resolveProperties(object) {\n      return __awaiter(this, void 0, void 0, function() {\n        var promises, results;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              promises = Object.keys(object).map(function(key) {\n                var value = object[key];\n                return Promise.resolve(value).then(function(v) {\n                  return { key, value: v };\n                });\n              });\n              return [4, Promise.all(promises)];\n            case 1:\n              results = _a.sent();\n              return [2, results.reduce(function(accum, result2) {\n                accum[result2.key] = result2.value;\n                return accum;\n              }, {})];\n          }\n        });\n      });\n    }\n    exports2.resolveProperties = resolveProperties;\n    function checkProperties(object, properties) {\n      if (!object || typeof object !== \"object\") {\n        logger.throwArgumentError(\"invalid object\", \"object\", object);\n      }\n      Object.keys(object).forEach(function(key) {\n        if (!properties[key]) {\n          logger.throwArgumentError(\"invalid object key - \" + key, \"transaction:\" + key, object);\n        }\n      });\n    }\n    exports2.checkProperties = checkProperties;\n    function shallowCopy(object) {\n      var result2 = {};\n      for (var key in object) {\n        result2[key] = object[key];\n      }\n      return result2;\n    }\n    exports2.shallowCopy = shallowCopy;\n    var opaque = { bigint: true, boolean: true, \"function\": true, number: true, string: true };\n    function _isFrozen(object) {\n      if (object === void 0 || object === null || opaque[typeof object]) {\n        return true;\n      }\n      if (Array.isArray(object) || typeof object === \"object\") {\n        if (!Object.isFrozen(object)) {\n          return false;\n        }\n        var keys = Object.keys(object);\n        for (var i = 0; i < keys.length; i++) {\n          var value = null;\n          try {\n            value = object[keys[i]];\n          } catch (error) {\n            continue;\n          }\n          if (!_isFrozen(value)) {\n            return false;\n          }\n        }\n        return true;\n      }\n      return logger.throwArgumentError(\"Cannot deepCopy \" + typeof object, \"object\", object);\n    }\n    function _deepCopy(object) {\n      if (_isFrozen(object)) {\n        return object;\n      }\n      if (Array.isArray(object)) {\n        return Object.freeze(object.map(function(item) {\n          return deepCopy(item);\n        }));\n      }\n      if (typeof object === \"object\") {\n        var result2 = {};\n        for (var key in object) {\n          var value = object[key];\n          if (value === void 0) {\n            continue;\n          }\n          defineReadOnly(result2, key, deepCopy(value));\n        }\n        return result2;\n      }\n      return logger.throwArgumentError(\"Cannot deepCopy \" + typeof object, \"object\", object);\n    }\n    function deepCopy(object) {\n      return _deepCopy(object);\n    }\n    exports2.deepCopy = deepCopy;\n    var Description = (\n      /** @class */\n      /* @__PURE__ */ function() {\n        function Description2(info) {\n          for (var key in info) {\n            this[key] = deepCopy(info[key]);\n          }\n        }\n        return Description2;\n      }()\n    );\n    exports2.Description = Description;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/_version.js\nvar require_version5 = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abi/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/fragments.js\nvar require_fragments = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/fragments.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ErrorFragment = exports2.FunctionFragment = exports2.ConstructorFragment = exports2.EventFragment = exports2.Fragment = exports2.ParamType = exports2.FormatTypes = void 0;\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _constructorGuard = {};\n    var ModifiersBytes = { calldata: true, memory: true, storage: true };\n    var ModifiersNest = { calldata: true, memory: true };\n    function checkModifier(type, name2) {\n      if (type === \"bytes\" || type === \"string\") {\n        if (ModifiersBytes[name2]) {\n          return true;\n        }\n      } else if (type === \"address\") {\n        if (name2 === \"payable\") {\n          return true;\n        }\n      } else if (type.indexOf(\"[\") >= 0 || type === \"tuple\") {\n        if (ModifiersNest[name2]) {\n          return true;\n        }\n      }\n      if (ModifiersBytes[name2] || name2 === \"payable\") {\n        logger.throwArgumentError(\"invalid modifier\", \"name\", name2);\n      }\n      return false;\n    }\n    function parseParamType(param, allowIndexed) {\n      var originalParam = param;\n      function throwError(i2) {\n        logger.throwArgumentError(\"unexpected character at position \" + i2, \"param\", param);\n      }\n      param = param.replace(/\\s/g, \" \");\n      function newNode(parent2) {\n        var node2 = { type: \"\", name: \"\", parent: parent2, state: { allowType: true } };\n        if (allowIndexed) {\n          node2.indexed = false;\n        }\n        return node2;\n      }\n      var parent = { type: \"\", name: \"\", state: { allowType: true } };\n      var node = parent;\n      for (var i = 0; i < param.length; i++) {\n        var c = param[i];\n        switch (c) {\n          case \"(\":\n            if (node.state.allowType && node.type === \"\") {\n              node.type = \"tuple\";\n            } else if (!node.state.allowParams) {\n              throwError(i);\n            }\n            node.state.allowType = false;\n            node.type = verifyType(node.type);\n            node.components = [newNode(node)];\n            node = node.components[0];\n            break;\n          case \")\":\n            delete node.state;\n            if (node.name === \"indexed\") {\n              if (!allowIndexed) {\n                throwError(i);\n              }\n              node.indexed = true;\n              node.name = \"\";\n            }\n            if (checkModifier(node.type, node.name)) {\n              node.name = \"\";\n            }\n            node.type = verifyType(node.type);\n            var child = node;\n            node = node.parent;\n            if (!node) {\n              throwError(i);\n            }\n            delete child.parent;\n            node.state.allowParams = false;\n            node.state.allowName = true;\n            node.state.allowArray = true;\n            break;\n          case \",\":\n            delete node.state;\n            if (node.name === \"indexed\") {\n              if (!allowIndexed) {\n                throwError(i);\n              }\n              node.indexed = true;\n              node.name = \"\";\n            }\n            if (checkModifier(node.type, node.name)) {\n              node.name = \"\";\n            }\n            node.type = verifyType(node.type);\n            var sibling = newNode(node.parent);\n            node.parent.components.push(sibling);\n            delete node.parent;\n            node = sibling;\n            break;\n          case \" \":\n            if (node.state.allowType) {\n              if (node.type !== \"\") {\n                node.type = verifyType(node.type);\n                delete node.state.allowType;\n                node.state.allowName = true;\n                node.state.allowParams = true;\n              }\n            }\n            if (node.state.allowName) {\n              if (node.name !== \"\") {\n                if (node.name === \"indexed\") {\n                  if (!allowIndexed) {\n                    throwError(i);\n                  }\n                  if (node.indexed) {\n                    throwError(i);\n                  }\n                  node.indexed = true;\n                  node.name = \"\";\n                } else if (checkModifier(node.type, node.name)) {\n                  node.name = \"\";\n                } else {\n                  node.state.allowName = false;\n                }\n              }\n            }\n            break;\n          case \"[\":\n            if (!node.state.allowArray) {\n              throwError(i);\n            }\n            node.type += c;\n            node.state.allowArray = false;\n            node.state.allowName = false;\n            node.state.readArray = true;\n            break;\n          case \"]\":\n            if (!node.state.readArray) {\n              throwError(i);\n            }\n            node.type += c;\n            node.state.readArray = false;\n            node.state.allowArray = true;\n            node.state.allowName = true;\n            break;\n          default:\n            if (node.state.allowType) {\n              node.type += c;\n              node.state.allowParams = true;\n              node.state.allowArray = true;\n            } else if (node.state.allowName) {\n              node.name += c;\n              delete node.state.allowArray;\n            } else if (node.state.readArray) {\n              node.type += c;\n            } else {\n              throwError(i);\n            }\n        }\n      }\n      if (node.parent) {\n        logger.throwArgumentError(\"unexpected eof\", \"param\", param);\n      }\n      delete parent.state;\n      if (node.name === \"indexed\") {\n        if (!allowIndexed) {\n          throwError(originalParam.length - 7);\n        }\n        if (node.indexed) {\n          throwError(originalParam.length - 7);\n        }\n        node.indexed = true;\n        node.name = \"\";\n      } else if (checkModifier(node.type, node.name)) {\n        node.name = \"\";\n      }\n      parent.type = verifyType(parent.type);\n      return parent;\n    }\n    function populate(object, params2) {\n      for (var key in params2) {\n        (0, properties_1.defineReadOnly)(object, key, params2[key]);\n      }\n    }\n    exports2.FormatTypes = Object.freeze({\n      // Bare formatting, as is needed for computing a sighash of an event or function\n      sighash: \"sighash\",\n      // Human-Readable with Minimal spacing and without names (compact human-readable)\n      minimal: \"minimal\",\n      // Human-Readable with nice spacing, including all names\n      full: \"full\",\n      // JSON-format a la Solidity\n      json: \"json\"\n    });\n    var paramTypeArray = new RegExp(/^(.*)\\[([0-9]*)\\]$/);\n    var ParamType = (\n      /** @class */\n      function() {\n        function ParamType2(constructorGuard, params2) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"use fromString\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new ParamType()\"\n            });\n          }\n          populate(this, params2);\n          var match = this.type.match(paramTypeArray);\n          if (match) {\n            populate(this, {\n              arrayLength: parseInt(match[2] || \"-1\"),\n              arrayChildren: ParamType2.fromObject({\n                type: match[1],\n                components: this.components\n              }),\n              baseType: \"array\"\n            });\n          } else {\n            populate(this, {\n              arrayLength: null,\n              arrayChildren: null,\n              baseType: this.components != null ? \"tuple\" : this.type\n            });\n          }\n          this._isParamType = true;\n          Object.freeze(this);\n        }\n        ParamType2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            var result_1 = {\n              type: this.baseType === \"tuple\" ? \"tuple\" : this.type,\n              name: this.name || void 0\n            };\n            if (typeof this.indexed === \"boolean\") {\n              result_1.indexed = this.indexed;\n            }\n            if (this.components) {\n              result_1.components = this.components.map(function(comp) {\n                return JSON.parse(comp.format(format));\n              });\n            }\n            return JSON.stringify(result_1);\n          }\n          var result2 = \"\";\n          if (this.baseType === \"array\") {\n            result2 += this.arrayChildren.format(format);\n            result2 += \"[\" + (this.arrayLength < 0 ? \"\" : String(this.arrayLength)) + \"]\";\n          } else {\n            if (this.baseType === \"tuple\") {\n              if (format !== exports2.FormatTypes.sighash) {\n                result2 += this.type;\n              }\n              result2 += \"(\" + this.components.map(function(comp) {\n                return comp.format(format);\n              }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \")\";\n            } else {\n              result2 += this.type;\n            }\n          }\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.indexed === true) {\n              result2 += \" indexed\";\n            }\n            if (format === exports2.FormatTypes.full && this.name) {\n              result2 += \" \" + this.name;\n            }\n          }\n          return result2;\n        };\n        ParamType2.from = function(value, allowIndexed) {\n          if (typeof value === \"string\") {\n            return ParamType2.fromString(value, allowIndexed);\n          }\n          return ParamType2.fromObject(value);\n        };\n        ParamType2.fromObject = function(value) {\n          if (ParamType2.isParamType(value)) {\n            return value;\n          }\n          return new ParamType2(_constructorGuard, {\n            name: value.name || null,\n            type: verifyType(value.type),\n            indexed: value.indexed == null ? null : !!value.indexed,\n            components: value.components ? value.components.map(ParamType2.fromObject) : null\n          });\n        };\n        ParamType2.fromString = function(value, allowIndexed) {\n          function ParamTypify(node) {\n            return ParamType2.fromObject({\n              name: node.name,\n              type: node.type,\n              indexed: node.indexed,\n              components: node.components\n            });\n          }\n          return ParamTypify(parseParamType(value, !!allowIndexed));\n        };\n        ParamType2.isParamType = function(value) {\n          return !!(value != null && value._isParamType);\n        };\n        return ParamType2;\n      }()\n    );\n    exports2.ParamType = ParamType;\n    function parseParams(value, allowIndex) {\n      return splitNesting(value).map(function(param) {\n        return ParamType.fromString(param, allowIndex);\n      });\n    }\n    var Fragment = (\n      /** @class */\n      function() {\n        function Fragment2(constructorGuard, params2) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"use a static from method\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new Fragment()\"\n            });\n          }\n          populate(this, params2);\n          this._isFragment = true;\n          Object.freeze(this);\n        }\n        Fragment2.from = function(value) {\n          if (Fragment2.isFragment(value)) {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            return Fragment2.fromString(value);\n          }\n          return Fragment2.fromObject(value);\n        };\n        Fragment2.fromObject = function(value) {\n          if (Fragment2.isFragment(value)) {\n            return value;\n          }\n          switch (value.type) {\n            case \"function\":\n              return FunctionFragment.fromObject(value);\n            case \"event\":\n              return EventFragment.fromObject(value);\n            case \"constructor\":\n              return ConstructorFragment.fromObject(value);\n            case \"error\":\n              return ErrorFragment.fromObject(value);\n            case \"fallback\":\n            case \"receive\":\n              return null;\n          }\n          return logger.throwArgumentError(\"invalid fragment object\", \"value\", value);\n        };\n        Fragment2.fromString = function(value) {\n          value = value.replace(/\\s/g, \" \");\n          value = value.replace(/\\(/g, \" (\").replace(/\\)/g, \") \").replace(/\\s+/g, \" \");\n          value = value.trim();\n          if (value.split(\" \")[0] === \"event\") {\n            return EventFragment.fromString(value.substring(5).trim());\n          } else if (value.split(\" \")[0] === \"function\") {\n            return FunctionFragment.fromString(value.substring(8).trim());\n          } else if (value.split(\"(\")[0].trim() === \"constructor\") {\n            return ConstructorFragment.fromString(value.trim());\n          } else if (value.split(\" \")[0] === \"error\") {\n            return ErrorFragment.fromString(value.substring(5).trim());\n          }\n          return logger.throwArgumentError(\"unsupported fragment\", \"value\", value);\n        };\n        Fragment2.isFragment = function(value) {\n          return !!(value && value._isFragment);\n        };\n        return Fragment2;\n      }()\n    );\n    exports2.Fragment = Fragment;\n    var EventFragment = (\n      /** @class */\n      function(_super) {\n        __extends(EventFragment2, _super);\n        function EventFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"event\",\n              anonymous: this.anonymous,\n              name: this.name,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          var result2 = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result2 += \"event \";\n          }\n          result2 += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.anonymous) {\n              result2 += \"anonymous \";\n            }\n          }\n          return result2.trim();\n        };\n        EventFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return EventFragment2.fromString(value);\n          }\n          return EventFragment2.fromObject(value);\n        };\n        EventFragment2.fromObject = function(value) {\n          if (EventFragment2.isEventFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"event\") {\n            logger.throwArgumentError(\"invalid event object\", \"value\", value);\n          }\n          var params2 = {\n            name: verifyIdentifier(value.name),\n            anonymous: value.anonymous,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            type: \"event\"\n          };\n          return new EventFragment2(_constructorGuard, params2);\n        };\n        EventFragment2.fromString = function(value) {\n          var match = value.match(regexParen);\n          if (!match) {\n            logger.throwArgumentError(\"invalid event string\", \"value\", value);\n          }\n          var anonymous = false;\n          match[3].split(\" \").forEach(function(modifier) {\n            switch (modifier.trim()) {\n              case \"anonymous\":\n                anonymous = true;\n                break;\n              case \"\":\n                break;\n              default:\n                logger.warn(\"unknown modifier: \" + modifier);\n            }\n          });\n          return EventFragment2.fromObject({\n            name: match[1].trim(),\n            anonymous,\n            inputs: parseParams(match[2], true),\n            type: \"event\"\n          });\n        };\n        EventFragment2.isEventFragment = function(value) {\n          return value && value._isFragment && value.type === \"event\";\n        };\n        return EventFragment2;\n      }(Fragment)\n    );\n    exports2.EventFragment = EventFragment;\n    function parseGas(value, params2) {\n      params2.gas = null;\n      var comps = value.split(\"@\");\n      if (comps.length !== 1) {\n        if (comps.length > 2) {\n          logger.throwArgumentError(\"invalid human-readable ABI signature\", \"value\", value);\n        }\n        if (!comps[1].match(/^[0-9]+$/)) {\n          logger.throwArgumentError(\"invalid human-readable ABI signature gas\", \"value\", value);\n        }\n        params2.gas = bignumber_1.BigNumber.from(comps[1]);\n        return comps[0];\n      }\n      return value;\n    }\n    function parseModifiers(value, params2) {\n      params2.constant = false;\n      params2.payable = false;\n      params2.stateMutability = \"nonpayable\";\n      value.split(\" \").forEach(function(modifier) {\n        switch (modifier.trim()) {\n          case \"constant\":\n            params2.constant = true;\n            break;\n          case \"payable\":\n            params2.payable = true;\n            params2.stateMutability = \"payable\";\n            break;\n          case \"nonpayable\":\n            params2.payable = false;\n            params2.stateMutability = \"nonpayable\";\n            break;\n          case \"pure\":\n            params2.constant = true;\n            params2.stateMutability = \"pure\";\n            break;\n          case \"view\":\n            params2.constant = true;\n            params2.stateMutability = \"view\";\n            break;\n          case \"external\":\n          case \"public\":\n          case \"\":\n            break;\n          default:\n            console.log(\"unknown modifier: \" + modifier);\n        }\n      });\n    }\n    function verifyState(value) {\n      var result2 = {\n        constant: false,\n        payable: true,\n        stateMutability: \"payable\"\n      };\n      if (value.stateMutability != null) {\n        result2.stateMutability = value.stateMutability;\n        result2.constant = result2.stateMutability === \"view\" || result2.stateMutability === \"pure\";\n        if (value.constant != null) {\n          if (!!value.constant !== result2.constant) {\n            logger.throwArgumentError(\"cannot have constant function with mutability \" + result2.stateMutability, \"value\", value);\n          }\n        }\n        result2.payable = result2.stateMutability === \"payable\";\n        if (value.payable != null) {\n          if (!!value.payable !== result2.payable) {\n            logger.throwArgumentError(\"cannot have payable function with mutability \" + result2.stateMutability, \"value\", value);\n          }\n        }\n      } else if (value.payable != null) {\n        result2.payable = !!value.payable;\n        if (value.constant == null && !result2.payable && value.type !== \"constructor\") {\n          logger.throwArgumentError(\"unable to determine stateMutability\", \"value\", value);\n        }\n        result2.constant = !!value.constant;\n        if (result2.constant) {\n          result2.stateMutability = \"view\";\n        } else {\n          result2.stateMutability = result2.payable ? \"payable\" : \"nonpayable\";\n        }\n        if (result2.payable && result2.constant) {\n          logger.throwArgumentError(\"cannot have constant payable function\", \"value\", value);\n        }\n      } else if (value.constant != null) {\n        result2.constant = !!value.constant;\n        result2.payable = !result2.constant;\n        result2.stateMutability = result2.constant ? \"view\" : \"payable\";\n      } else if (value.type !== \"constructor\") {\n        logger.throwArgumentError(\"unable to determine stateMutability\", \"value\", value);\n      }\n      return result2;\n    }\n    var ConstructorFragment = (\n      /** @class */\n      function(_super) {\n        __extends(ConstructorFragment2, _super);\n        function ConstructorFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ConstructorFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"constructor\",\n              stateMutability: this.stateMutability !== \"nonpayable\" ? this.stateMutability : void 0,\n              payable: this.payable,\n              gas: this.gas ? this.gas.toNumber() : void 0,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          if (format === exports2.FormatTypes.sighash) {\n            logger.throwError(\"cannot format a constructor for sighash\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"format(sighash)\"\n            });\n          }\n          var result2 = \"constructor(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (this.stateMutability && this.stateMutability !== \"nonpayable\") {\n            result2 += this.stateMutability + \" \";\n          }\n          return result2.trim();\n        };\n        ConstructorFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return ConstructorFragment2.fromString(value);\n          }\n          return ConstructorFragment2.fromObject(value);\n        };\n        ConstructorFragment2.fromObject = function(value) {\n          if (ConstructorFragment2.isConstructorFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"constructor\") {\n            logger.throwArgumentError(\"invalid constructor object\", \"value\", value);\n          }\n          var state = verifyState(value);\n          if (state.constant) {\n            logger.throwArgumentError(\"constructor cannot be constant\", \"value\", value);\n          }\n          var params2 = {\n            name: null,\n            type: value.type,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            payable: state.payable,\n            stateMutability: state.stateMutability,\n            gas: value.gas ? bignumber_1.BigNumber.from(value.gas) : null\n          };\n          return new ConstructorFragment2(_constructorGuard, params2);\n        };\n        ConstructorFragment2.fromString = function(value) {\n          var params2 = { type: \"constructor\" };\n          value = parseGas(value, params2);\n          var parens = value.match(regexParen);\n          if (!parens || parens[1].trim() !== \"constructor\") {\n            logger.throwArgumentError(\"invalid constructor string\", \"value\", value);\n          }\n          params2.inputs = parseParams(parens[2].trim(), false);\n          parseModifiers(parens[3].trim(), params2);\n          return ConstructorFragment2.fromObject(params2);\n        };\n        ConstructorFragment2.isConstructorFragment = function(value) {\n          return value && value._isFragment && value.type === \"constructor\";\n        };\n        return ConstructorFragment2;\n      }(Fragment)\n    );\n    exports2.ConstructorFragment = ConstructorFragment;\n    var FunctionFragment = (\n      /** @class */\n      function(_super) {\n        __extends(FunctionFragment2, _super);\n        function FunctionFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        FunctionFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"function\",\n              name: this.name,\n              constant: this.constant,\n              stateMutability: this.stateMutability !== \"nonpayable\" ? this.stateMutability : void 0,\n              payable: this.payable,\n              gas: this.gas ? this.gas.toNumber() : void 0,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              }),\n              outputs: this.outputs.map(function(output) {\n                return JSON.parse(output.format(format));\n              })\n            });\n          }\n          var result2 = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result2 += \"function \";\n          }\n          result2 += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.stateMutability) {\n              if (this.stateMutability !== \"nonpayable\") {\n                result2 += this.stateMutability + \" \";\n              }\n            } else if (this.constant) {\n              result2 += \"view \";\n            }\n            if (this.outputs && this.outputs.length) {\n              result2 += \"returns (\" + this.outputs.map(function(output) {\n                return output.format(format);\n              }).join(\", \") + \") \";\n            }\n            if (this.gas != null) {\n              result2 += \"@\" + this.gas.toString() + \" \";\n            }\n          }\n          return result2.trim();\n        };\n        FunctionFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return FunctionFragment2.fromString(value);\n          }\n          return FunctionFragment2.fromObject(value);\n        };\n        FunctionFragment2.fromObject = function(value) {\n          if (FunctionFragment2.isFunctionFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"function\") {\n            logger.throwArgumentError(\"invalid function object\", \"value\", value);\n          }\n          var state = verifyState(value);\n          var params2 = {\n            type: value.type,\n            name: verifyIdentifier(value.name),\n            constant: state.constant,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            outputs: value.outputs ? value.outputs.map(ParamType.fromObject) : [],\n            payable: state.payable,\n            stateMutability: state.stateMutability,\n            gas: value.gas ? bignumber_1.BigNumber.from(value.gas) : null\n          };\n          return new FunctionFragment2(_constructorGuard, params2);\n        };\n        FunctionFragment2.fromString = function(value) {\n          var params2 = { type: \"function\" };\n          value = parseGas(value, params2);\n          var comps = value.split(\" returns \");\n          if (comps.length > 2) {\n            logger.throwArgumentError(\"invalid function string\", \"value\", value);\n          }\n          var parens = comps[0].match(regexParen);\n          if (!parens) {\n            logger.throwArgumentError(\"invalid function signature\", \"value\", value);\n          }\n          params2.name = parens[1].trim();\n          if (params2.name) {\n            verifyIdentifier(params2.name);\n          }\n          params2.inputs = parseParams(parens[2], false);\n          parseModifiers(parens[3].trim(), params2);\n          if (comps.length > 1) {\n            var returns = comps[1].match(regexParen);\n            if (returns[1].trim() != \"\" || returns[3].trim() != \"\") {\n              logger.throwArgumentError(\"unexpected tokens\", \"value\", value);\n            }\n            params2.outputs = parseParams(returns[2], false);\n          } else {\n            params2.outputs = [];\n          }\n          return FunctionFragment2.fromObject(params2);\n        };\n        FunctionFragment2.isFunctionFragment = function(value) {\n          return value && value._isFragment && value.type === \"function\";\n        };\n        return FunctionFragment2;\n      }(ConstructorFragment)\n    );\n    exports2.FunctionFragment = FunctionFragment;\n    function checkForbidden(fragment) {\n      var sig = fragment.format();\n      if (sig === \"Error(string)\" || sig === \"Panic(uint256)\") {\n        logger.throwArgumentError(\"cannot specify user defined \" + sig + \" error\", \"fragment\", fragment);\n      }\n      return fragment;\n    }\n    var ErrorFragment = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorFragment2, _super);\n        function ErrorFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ErrorFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"error\",\n              name: this.name,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          var result2 = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result2 += \"error \";\n          }\n          result2 += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          return result2.trim();\n        };\n        ErrorFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return ErrorFragment2.fromString(value);\n          }\n          return ErrorFragment2.fromObject(value);\n        };\n        ErrorFragment2.fromObject = function(value) {\n          if (ErrorFragment2.isErrorFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"error\") {\n            logger.throwArgumentError(\"invalid error object\", \"value\", value);\n          }\n          var params2 = {\n            type: value.type,\n            name: verifyIdentifier(value.name),\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : []\n          };\n          return checkForbidden(new ErrorFragment2(_constructorGuard, params2));\n        };\n        ErrorFragment2.fromString = function(value) {\n          var params2 = { type: \"error\" };\n          var parens = value.match(regexParen);\n          if (!parens) {\n            logger.throwArgumentError(\"invalid error signature\", \"value\", value);\n          }\n          params2.name = parens[1].trim();\n          if (params2.name) {\n            verifyIdentifier(params2.name);\n          }\n          params2.inputs = parseParams(parens[2], false);\n          return checkForbidden(ErrorFragment2.fromObject(params2));\n        };\n        ErrorFragment2.isErrorFragment = function(value) {\n          return value && value._isFragment && value.type === \"error\";\n        };\n        return ErrorFragment2;\n      }(Fragment)\n    );\n    exports2.ErrorFragment = ErrorFragment;\n    function verifyType(type) {\n      if (type.match(/^uint($|[^1-9])/)) {\n        type = \"uint256\" + type.substring(4);\n      } else if (type.match(/^int($|[^1-9])/)) {\n        type = \"int256\" + type.substring(3);\n      }\n      return type;\n    }\n    var regexIdentifier = new RegExp(\"^[a-zA-Z$_][a-zA-Z0-9$_]*$\");\n    function verifyIdentifier(value) {\n      if (!value || !value.match(regexIdentifier)) {\n        logger.throwArgumentError('invalid identifier \"' + value + '\"', \"value\", value);\n      }\n      return value;\n    }\n    var regexParen = new RegExp(\"^([^)(]*)\\\\((.*)\\\\)([^)(]*)$\");\n    function splitNesting(value) {\n      value = value.trim();\n      var result2 = [];\n      var accum = \"\";\n      var depth = 0;\n      for (var offset = 0; offset < value.length; offset++) {\n        var c = value[offset];\n        if (c === \",\" && depth === 0) {\n          result2.push(accum);\n          accum = \"\";\n        } else {\n          accum += c;\n          if (c === \"(\") {\n            depth++;\n          } else if (c === \")\") {\n            depth--;\n            if (depth === -1) {\n              logger.throwArgumentError(\"unbalanced parenthesis\", \"value\", value);\n            }\n          }\n        }\n      }\n      if (accum) {\n        result2.push(accum);\n      }\n      return result2;\n    }\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/abstract-coder.js\nvar require_abstract_coder = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/abstract-coder.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Reader = exports2.Writer = exports2.Coder = exports2.checkResultErrors = void 0;\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    function checkResultErrors(result2) {\n      var errors = [];\n      var checkErrors = function(path, object) {\n        if (!Array.isArray(object)) {\n          return;\n        }\n        for (var key in object) {\n          var childPath = path.slice();\n          childPath.push(key);\n          try {\n            checkErrors(childPath, object[key]);\n          } catch (error) {\n            errors.push({ path: childPath, error });\n          }\n        }\n      };\n      checkErrors([], result2);\n      return errors;\n    }\n    exports2.checkResultErrors = checkResultErrors;\n    var Coder = (\n      /** @class */\n      function() {\n        function Coder2(name2, type, localName, dynamic) {\n          this.name = name2;\n          this.type = type;\n          this.localName = localName;\n          this.dynamic = dynamic;\n        }\n        Coder2.prototype._throwError = function(message, value) {\n          logger.throwArgumentError(message, this.localName, value);\n        };\n        return Coder2;\n      }()\n    );\n    exports2.Coder = Coder;\n    var Writer = (\n      /** @class */\n      function() {\n        function Writer2(wordSize) {\n          (0, properties_1.defineReadOnly)(this, \"wordSize\", wordSize || 32);\n          this._data = [];\n          this._dataLength = 0;\n          this._padding = new Uint8Array(wordSize);\n        }\n        Object.defineProperty(Writer2.prototype, \"data\", {\n          get: function() {\n            return (0, bytes_1.hexConcat)(this._data);\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Writer2.prototype, \"length\", {\n          get: function() {\n            return this._dataLength;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Writer2.prototype._writeData = function(data) {\n          this._data.push(data);\n          this._dataLength += data.length;\n          return data.length;\n        };\n        Writer2.prototype.appendWriter = function(writer) {\n          return this._writeData((0, bytes_1.concat)(writer._data));\n        };\n        Writer2.prototype.writeBytes = function(value) {\n          var bytes = (0, bytes_1.arrayify)(value);\n          var paddingOffset = bytes.length % this.wordSize;\n          if (paddingOffset) {\n            bytes = (0, bytes_1.concat)([bytes, this._padding.slice(paddingOffset)]);\n          }\n          return this._writeData(bytes);\n        };\n        Writer2.prototype._getValue = function(value) {\n          var bytes = (0, bytes_1.arrayify)(bignumber_1.BigNumber.from(value));\n          if (bytes.length > this.wordSize) {\n            logger.throwError(\"value out-of-bounds\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n              length: this.wordSize,\n              offset: bytes.length\n            });\n          }\n          if (bytes.length % this.wordSize) {\n            bytes = (0, bytes_1.concat)([this._padding.slice(bytes.length % this.wordSize), bytes]);\n          }\n          return bytes;\n        };\n        Writer2.prototype.writeValue = function(value) {\n          return this._writeData(this._getValue(value));\n        };\n        Writer2.prototype.writeUpdatableValue = function() {\n          var _this = this;\n          var offset = this._data.length;\n          this._data.push(this._padding);\n          this._dataLength += this.wordSize;\n          return function(value) {\n            _this._data[offset] = _this._getValue(value);\n          };\n        };\n        return Writer2;\n      }()\n    );\n    exports2.Writer = Writer;\n    var Reader = (\n      /** @class */\n      function() {\n        function Reader2(data, wordSize, coerceFunc, allowLoose) {\n          (0, properties_1.defineReadOnly)(this, \"_data\", (0, bytes_1.arrayify)(data));\n          (0, properties_1.defineReadOnly)(this, \"wordSize\", wordSize || 32);\n          (0, properties_1.defineReadOnly)(this, \"_coerceFunc\", coerceFunc);\n          (0, properties_1.defineReadOnly)(this, \"allowLoose\", allowLoose);\n          this._offset = 0;\n        }\n        Object.defineProperty(Reader2.prototype, \"data\", {\n          get: function() {\n            return (0, bytes_1.hexlify)(this._data);\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Reader2.prototype, \"consumed\", {\n          get: function() {\n            return this._offset;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Reader2.coerce = function(name2, value) {\n          var match = name2.match(\"^u?int([0-9]+)$\");\n          if (match && parseInt(match[1]) <= 48) {\n            value = value.toNumber();\n          }\n          return value;\n        };\n        Reader2.prototype.coerce = function(name2, value) {\n          if (this._coerceFunc) {\n            return this._coerceFunc(name2, value);\n          }\n          return Reader2.coerce(name2, value);\n        };\n        Reader2.prototype._peekBytes = function(offset, length, loose) {\n          var alignedLength = Math.ceil(length / this.wordSize) * this.wordSize;\n          if (this._offset + alignedLength > this._data.length) {\n            if (this.allowLoose && loose && this._offset + length <= this._data.length) {\n              alignedLength = length;\n            } else {\n              logger.throwError(\"data out-of-bounds\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n                length: this._data.length,\n                offset: this._offset + alignedLength\n              });\n            }\n          }\n          return this._data.slice(this._offset, this._offset + alignedLength);\n        };\n        Reader2.prototype.subReader = function(offset) {\n          return new Reader2(this._data.slice(this._offset + offset), this.wordSize, this._coerceFunc, this.allowLoose);\n        };\n        Reader2.prototype.readBytes = function(length, loose) {\n          var bytes = this._peekBytes(0, length, !!loose);\n          this._offset += bytes.length;\n          return bytes.slice(0, length);\n        };\n        Reader2.prototype.readValue = function() {\n          return bignumber_1.BigNumber.from(this.readBytes(this.wordSize));\n        };\n        return Reader2;\n      }()\n    );\n    exports2.Reader = Reader;\n  }\n});\n\n// node_modules/js-sha3/src/sha3.js\nvar require_sha3 = __commonJS({\n  \"node_modules/js-sha3/src/sha3.js\"(exports2, module2) {\n    (function() {\n      \"use strict\";\n      var INPUT_ERROR = \"input is invalid type\";\n      var FINALIZE_ERROR = \"finalize already called\";\n      var WINDOW = typeof window === \"object\";\n      var root = WINDOW ? window : {};\n      if (root.JS_SHA3_NO_WINDOW) {\n        WINDOW = false;\n      }\n      var WEB_WORKER = !WINDOW && typeof self === \"object\";\n      var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === \"object\" && process.versions && process.versions.node;\n      if (NODE_JS) {\n        root = global;\n      } else if (WEB_WORKER) {\n        root = self;\n      }\n      var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module2 === \"object\" && module2.exports;\n      var AMD = typeof define === \"function\" && define.amd;\n      var ARRAY_BUFFER = !root.JS_SHA3_NO_ARRAY_BUFFER && typeof ArrayBuffer !== \"undefined\";\n      var HEX_CHARS = \"0123456789abcdef\".split(\"\");\n      var SHAKE_PADDING = [31, 7936, 2031616, 520093696];\n      var CSHAKE_PADDING = [4, 1024, 262144, 67108864];\n      var KECCAK_PADDING = [1, 256, 65536, 16777216];\n      var PADDING = [6, 1536, 393216, 100663296];\n      var SHIFT = [0, 8, 16, 24];\n      var RC = [\n        1,\n        0,\n        32898,\n        0,\n        32906,\n        2147483648,\n        2147516416,\n        2147483648,\n        32907,\n        0,\n        2147483649,\n        0,\n        2147516545,\n        2147483648,\n        32777,\n        2147483648,\n        138,\n        0,\n        136,\n        0,\n        2147516425,\n        0,\n        2147483658,\n        0,\n        2147516555,\n        0,\n        139,\n        2147483648,\n        32905,\n        2147483648,\n        32771,\n        2147483648,\n        32770,\n        2147483648,\n        128,\n        2147483648,\n        32778,\n        0,\n        2147483658,\n        2147483648,\n        2147516545,\n        2147483648,\n        32896,\n        2147483648,\n        2147483649,\n        0,\n        2147516424,\n        2147483648\n      ];\n      var BITS = [224, 256, 384, 512];\n      var SHAKE_BITS = [128, 256];\n      var OUTPUT_TYPES = [\"hex\", \"buffer\", \"arrayBuffer\", \"array\", \"digest\"];\n      var CSHAKE_BYTEPAD = {\n        \"128\": 168,\n        \"256\": 136\n      };\n      if (root.JS_SHA3_NO_NODE_JS || !Array.isArray) {\n        Array.isArray = function(obj) {\n          return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n      }\n      if (ARRAY_BUFFER && (root.JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {\n        ArrayBuffer.isView = function(obj) {\n          return typeof obj === \"object\" && obj.buffer && obj.buffer.constructor === ArrayBuffer;\n        };\n      }\n      var createOutputMethod = function(bits2, padding, outputType) {\n        return function(message) {\n          return new Keccak(bits2, padding, bits2).update(message)[outputType]();\n        };\n      };\n      var createShakeOutputMethod = function(bits2, padding, outputType) {\n        return function(message, outputBits) {\n          return new Keccak(bits2, padding, outputBits).update(message)[outputType]();\n        };\n      };\n      var createCshakeOutputMethod = function(bits2, padding, outputType) {\n        return function(message, outputBits, n, s) {\n          return methods[\"cshake\" + bits2].update(message, outputBits, n, s)[outputType]();\n        };\n      };\n      var createKmacOutputMethod = function(bits2, padding, outputType) {\n        return function(key, message, outputBits, s) {\n          return methods[\"kmac\" + bits2].update(key, message, outputBits, s)[outputType]();\n        };\n      };\n      var createOutputMethods = function(method, createMethod2, bits2, padding) {\n        for (var i2 = 0; i2 < OUTPUT_TYPES.length; ++i2) {\n          var type = OUTPUT_TYPES[i2];\n          method[type] = createMethod2(bits2, padding, type);\n        }\n        return method;\n      };\n      var createMethod = function(bits2, padding) {\n        var method = createOutputMethod(bits2, padding, \"hex\");\n        method.create = function() {\n          return new Keccak(bits2, padding, bits2);\n        };\n        method.update = function(message) {\n          return method.create().update(message);\n        };\n        return createOutputMethods(method, createOutputMethod, bits2, padding);\n      };\n      var createShakeMethod = function(bits2, padding) {\n        var method = createShakeOutputMethod(bits2, padding, \"hex\");\n        method.create = function(outputBits) {\n          return new Keccak(bits2, padding, outputBits);\n        };\n        method.update = function(message, outputBits) {\n          return method.create(outputBits).update(message);\n        };\n        return createOutputMethods(method, createShakeOutputMethod, bits2, padding);\n      };\n      var createCshakeMethod = function(bits2, padding) {\n        var w = CSHAKE_BYTEPAD[bits2];\n        var method = createCshakeOutputMethod(bits2, padding, \"hex\");\n        method.create = function(outputBits, n, s) {\n          if (!n && !s) {\n            return methods[\"shake\" + bits2].create(outputBits);\n          } else {\n            return new Keccak(bits2, padding, outputBits).bytepad([n, s], w);\n          }\n        };\n        method.update = function(message, outputBits, n, s) {\n          return method.create(outputBits, n, s).update(message);\n        };\n        return createOutputMethods(method, createCshakeOutputMethod, bits2, padding);\n      };\n      var createKmacMethod = function(bits2, padding) {\n        var w = CSHAKE_BYTEPAD[bits2];\n        var method = createKmacOutputMethod(bits2, padding, \"hex\");\n        method.create = function(key, outputBits, s) {\n          return new Kmac(bits2, padding, outputBits).bytepad([\"KMAC\", s], w).bytepad([key], w);\n        };\n        method.update = function(key, message, outputBits, s) {\n          return method.create(key, outputBits, s).update(message);\n        };\n        return createOutputMethods(method, createKmacOutputMethod, bits2, padding);\n      };\n      var algorithms = [\n        { name: \"keccak\", padding: KECCAK_PADDING, bits: BITS, createMethod },\n        { name: \"sha3\", padding: PADDING, bits: BITS, createMethod },\n        { name: \"shake\", padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod },\n        { name: \"cshake\", padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createCshakeMethod },\n        { name: \"kmac\", padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createKmacMethod }\n      ];\n      var methods = {}, methodNames = [];\n      for (var i = 0; i < algorithms.length; ++i) {\n        var algorithm = algorithms[i];\n        var bits = algorithm.bits;\n        for (var j = 0; j < bits.length; ++j) {\n          var methodName = algorithm.name + \"_\" + bits[j];\n          methodNames.push(methodName);\n          methods[methodName] = algorithm.createMethod(bits[j], algorithm.padding);\n          if (algorithm.name !== \"sha3\") {\n            var newMethodName = algorithm.name + bits[j];\n            methodNames.push(newMethodName);\n            methods[newMethodName] = methods[methodName];\n          }\n        }\n      }\n      function Keccak(bits2, padding, outputBits) {\n        this.blocks = [];\n        this.s = [];\n        this.padding = padding;\n        this.outputBits = outputBits;\n        this.reset = true;\n        this.finalized = false;\n        this.block = 0;\n        this.start = 0;\n        this.blockCount = 1600 - (bits2 << 1) >> 5;\n        this.byteCount = this.blockCount << 2;\n        this.outputBlocks = outputBits >> 5;\n        this.extraBytes = (outputBits & 31) >> 3;\n        for (var i2 = 0; i2 < 50; ++i2) {\n          this.s[i2] = 0;\n        }\n      }\n      Keccak.prototype.update = function(message) {\n        if (this.finalized) {\n          throw new Error(FINALIZE_ERROR);\n        }\n        var notString, type = typeof message;\n        if (type !== \"string\") {\n          if (type === \"object\") {\n            if (message === null) {\n              throw new Error(INPUT_ERROR);\n            } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {\n              message = new Uint8Array(message);\n            } else if (!Array.isArray(message)) {\n              if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {\n                throw new Error(INPUT_ERROR);\n              }\n            }\n          } else {\n            throw new Error(INPUT_ERROR);\n          }\n          notString = true;\n        }\n        var blocks = this.blocks, byteCount = this.byteCount, length = message.length, blockCount = this.blockCount, index = 0, s = this.s, i2, code;\n        while (index < length) {\n          if (this.reset) {\n            this.reset = false;\n            blocks[0] = this.block;\n            for (i2 = 1; i2 < blockCount + 1; ++i2) {\n              blocks[i2] = 0;\n            }\n          }\n          if (notString) {\n            for (i2 = this.start; index < length && i2 < byteCount; ++index) {\n              blocks[i2 >> 2] |= message[index] << SHIFT[i2++ & 3];\n            }\n          } else {\n            for (i2 = this.start; index < length && i2 < byteCount; ++index) {\n              code = message.charCodeAt(index);\n              if (code < 128) {\n                blocks[i2 >> 2] |= code << SHIFT[i2++ & 3];\n              } else if (code < 2048) {\n                blocks[i2 >> 2] |= (192 | code >> 6) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              } else if (code < 55296 || code >= 57344) {\n                blocks[i2 >> 2] |= (224 | code >> 12) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 6 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              } else {\n                code = 65536 + ((code & 1023) << 10 | message.charCodeAt(++index) & 1023);\n                blocks[i2 >> 2] |= (240 | code >> 18) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 12 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 6 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              }\n            }\n          }\n          this.lastByteIndex = i2;\n          if (i2 >= byteCount) {\n            this.start = i2 - byteCount;\n            this.block = blocks[blockCount];\n            for (i2 = 0; i2 < blockCount; ++i2) {\n              s[i2] ^= blocks[i2];\n            }\n            f(s);\n            this.reset = true;\n          } else {\n            this.start = i2;\n          }\n        }\n        return this;\n      };\n      Keccak.prototype.encode = function(x, right) {\n        var o = x & 255, n = 1;\n        var bytes = [o];\n        x = x >> 8;\n        o = x & 255;\n        while (o > 0) {\n          bytes.unshift(o);\n          x = x >> 8;\n          o = x & 255;\n          ++n;\n        }\n        if (right) {\n          bytes.push(n);\n        } else {\n          bytes.unshift(n);\n        }\n        this.update(bytes);\n        return bytes.length;\n      };\n      Keccak.prototype.encodeString = function(str) {\n        var notString, type = typeof str;\n        if (type !== \"string\") {\n          if (type === \"object\") {\n            if (str === null) {\n              throw new Error(INPUT_ERROR);\n            } else if (ARRAY_BUFFER && str.constructor === ArrayBuffer) {\n              str = new Uint8Array(str);\n            } else if (!Array.isArray(str)) {\n              if (!ARRAY_BUFFER || !ArrayBuffer.isView(str)) {\n                throw new Error(INPUT_ERROR);\n              }\n            }\n          } else {\n            throw new Error(INPUT_ERROR);\n          }\n          notString = true;\n        }\n        var bytes = 0, length = str.length;\n        if (notString) {\n          bytes = length;\n        } else {\n          for (var i2 = 0; i2 < str.length; ++i2) {\n            var code = str.charCodeAt(i2);\n            if (code < 128) {\n              bytes += 1;\n            } else if (code < 2048) {\n              bytes += 2;\n            } else if (code < 55296 || code >= 57344) {\n              bytes += 3;\n            } else {\n              code = 65536 + ((code & 1023) << 10 | str.charCodeAt(++i2) & 1023);\n              bytes += 4;\n            }\n          }\n        }\n        bytes += this.encode(bytes * 8);\n        this.update(str);\n        return bytes;\n      };\n      Keccak.prototype.bytepad = function(strs, w) {\n        var bytes = this.encode(w);\n        for (var i2 = 0; i2 < strs.length; ++i2) {\n          bytes += this.encodeString(strs[i2]);\n        }\n        var paddingBytes = w - bytes % w;\n        var zeros = [];\n        zeros.length = paddingBytes;\n        this.update(zeros);\n        return this;\n      };\n      Keccak.prototype.finalize = function() {\n        if (this.finalized) {\n          return;\n        }\n        this.finalized = true;\n        var blocks = this.blocks, i2 = this.lastByteIndex, blockCount = this.blockCount, s = this.s;\n        blocks[i2 >> 2] |= this.padding[i2 & 3];\n        if (this.lastByteIndex === this.byteCount) {\n          blocks[0] = blocks[blockCount];\n          for (i2 = 1; i2 < blockCount + 1; ++i2) {\n            blocks[i2] = 0;\n          }\n        }\n        blocks[blockCount - 1] |= 2147483648;\n        for (i2 = 0; i2 < blockCount; ++i2) {\n          s[i2] ^= blocks[i2];\n        }\n        f(s);\n      };\n      Keccak.prototype.toString = Keccak.prototype.hex = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var hex = \"\", block;\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            block = s[i2];\n            hex += HEX_CHARS[block >> 4 & 15] + HEX_CHARS[block & 15] + HEX_CHARS[block >> 12 & 15] + HEX_CHARS[block >> 8 & 15] + HEX_CHARS[block >> 20 & 15] + HEX_CHARS[block >> 16 & 15] + HEX_CHARS[block >> 28 & 15] + HEX_CHARS[block >> 24 & 15];\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n            i2 = 0;\n          }\n        }\n        if (extraBytes) {\n          block = s[i2];\n          hex += HEX_CHARS[block >> 4 & 15] + HEX_CHARS[block & 15];\n          if (extraBytes > 1) {\n            hex += HEX_CHARS[block >> 12 & 15] + HEX_CHARS[block >> 8 & 15];\n          }\n          if (extraBytes > 2) {\n            hex += HEX_CHARS[block >> 20 & 15] + HEX_CHARS[block >> 16 & 15];\n          }\n        }\n        return hex;\n      };\n      Keccak.prototype.arrayBuffer = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var bytes = this.outputBits >> 3;\n        var buffer;\n        if (extraBytes) {\n          buffer = new ArrayBuffer(outputBlocks + 1 << 2);\n        } else {\n          buffer = new ArrayBuffer(bytes);\n        }\n        var array = new Uint32Array(buffer);\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            array[j2] = s[i2];\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n          }\n        }\n        if (extraBytes) {\n          array[i2] = s[i2];\n          buffer = buffer.slice(0, bytes);\n        }\n        return buffer;\n      };\n      Keccak.prototype.buffer = Keccak.prototype.arrayBuffer;\n      Keccak.prototype.digest = Keccak.prototype.array = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var array = [], offset, block;\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            offset = j2 << 2;\n            block = s[i2];\n            array[offset] = block & 255;\n            array[offset + 1] = block >> 8 & 255;\n            array[offset + 2] = block >> 16 & 255;\n            array[offset + 3] = block >> 24 & 255;\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n          }\n        }\n        if (extraBytes) {\n          offset = j2 << 2;\n          block = s[i2];\n          array[offset] = block & 255;\n          if (extraBytes > 1) {\n            array[offset + 1] = block >> 8 & 255;\n          }\n          if (extraBytes > 2) {\n            array[offset + 2] = block >> 16 & 255;\n          }\n        }\n        return array;\n      };\n      function Kmac(bits2, padding, outputBits) {\n        Keccak.call(this, bits2, padding, outputBits);\n      }\n      Kmac.prototype = new Keccak();\n      Kmac.prototype.finalize = function() {\n        this.encode(this.outputBits, true);\n        return Keccak.prototype.finalize.call(this);\n      };\n      var f = function(s) {\n        var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;\n        for (n = 0; n < 48; n += 2) {\n          c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];\n          c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];\n          c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];\n          c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];\n          c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];\n          c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];\n          c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];\n          c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];\n          c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];\n          c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];\n          h = c8 ^ (c2 << 1 | c3 >>> 31);\n          l = c9 ^ (c3 << 1 | c2 >>> 31);\n          s[0] ^= h;\n          s[1] ^= l;\n          s[10] ^= h;\n          s[11] ^= l;\n          s[20] ^= h;\n          s[21] ^= l;\n          s[30] ^= h;\n          s[31] ^= l;\n          s[40] ^= h;\n          s[41] ^= l;\n          h = c0 ^ (c4 << 1 | c5 >>> 31);\n          l = c1 ^ (c5 << 1 | c4 >>> 31);\n          s[2] ^= h;\n          s[3] ^= l;\n          s[12] ^= h;\n          s[13] ^= l;\n          s[22] ^= h;\n          s[23] ^= l;\n          s[32] ^= h;\n          s[33] ^= l;\n          s[42] ^= h;\n          s[43] ^= l;\n          h = c2 ^ (c6 << 1 | c7 >>> 31);\n          l = c3 ^ (c7 << 1 | c6 >>> 31);\n          s[4] ^= h;\n          s[5] ^= l;\n          s[14] ^= h;\n          s[15] ^= l;\n          s[24] ^= h;\n          s[25] ^= l;\n          s[34] ^= h;\n          s[35] ^= l;\n          s[44] ^= h;\n          s[45] ^= l;\n          h = c4 ^ (c8 << 1 | c9 >>> 31);\n          l = c5 ^ (c9 << 1 | c8 >>> 31);\n          s[6] ^= h;\n          s[7] ^= l;\n          s[16] ^= h;\n          s[17] ^= l;\n          s[26] ^= h;\n          s[27] ^= l;\n          s[36] ^= h;\n          s[37] ^= l;\n          s[46] ^= h;\n          s[47] ^= l;\n          h = c6 ^ (c0 << 1 | c1 >>> 31);\n          l = c7 ^ (c1 << 1 | c0 >>> 31);\n          s[8] ^= h;\n          s[9] ^= l;\n          s[18] ^= h;\n          s[19] ^= l;\n          s[28] ^= h;\n          s[29] ^= l;\n          s[38] ^= h;\n          s[39] ^= l;\n          s[48] ^= h;\n          s[49] ^= l;\n          b0 = s[0];\n          b1 = s[1];\n          b32 = s[11] << 4 | s[10] >>> 28;\n          b33 = s[10] << 4 | s[11] >>> 28;\n          b14 = s[20] << 3 | s[21] >>> 29;\n          b15 = s[21] << 3 | s[20] >>> 29;\n          b46 = s[31] << 9 | s[30] >>> 23;\n          b47 = s[30] << 9 | s[31] >>> 23;\n          b28 = s[40] << 18 | s[41] >>> 14;\n          b29 = s[41] << 18 | s[40] >>> 14;\n          b20 = s[2] << 1 | s[3] >>> 31;\n          b21 = s[3] << 1 | s[2] >>> 31;\n          b2 = s[13] << 12 | s[12] >>> 20;\n          b3 = s[12] << 12 | s[13] >>> 20;\n          b34 = s[22] << 10 | s[23] >>> 22;\n          b35 = s[23] << 10 | s[22] >>> 22;\n          b16 = s[33] << 13 | s[32] >>> 19;\n          b17 = s[32] << 13 | s[33] >>> 19;\n          b48 = s[42] << 2 | s[43] >>> 30;\n          b49 = s[43] << 2 | s[42] >>> 30;\n          b40 = s[5] << 30 | s[4] >>> 2;\n          b41 = s[4] << 30 | s[5] >>> 2;\n          b22 = s[14] << 6 | s[15] >>> 26;\n          b23 = s[15] << 6 | s[14] >>> 26;\n          b4 = s[25] << 11 | s[24] >>> 21;\n          b5 = s[24] << 11 | s[25] >>> 21;\n          b36 = s[34] << 15 | s[35] >>> 17;\n          b37 = s[35] << 15 | s[34] >>> 17;\n          b18 = s[45] << 29 | s[44] >>> 3;\n          b19 = s[44] << 29 | s[45] >>> 3;\n          b10 = s[6] << 28 | s[7] >>> 4;\n          b11 = s[7] << 28 | s[6] >>> 4;\n          b42 = s[17] << 23 | s[16] >>> 9;\n          b43 = s[16] << 23 | s[17] >>> 9;\n          b24 = s[26] << 25 | s[27] >>> 7;\n          b25 = s[27] << 25 | s[26] >>> 7;\n          b6 = s[36] << 21 | s[37] >>> 11;\n          b7 = s[37] << 21 | s[36] >>> 11;\n          b38 = s[47] << 24 | s[46] >>> 8;\n          b39 = s[46] << 24 | s[47] >>> 8;\n          b30 = s[8] << 27 | s[9] >>> 5;\n          b31 = s[9] << 27 | s[8] >>> 5;\n          b12 = s[18] << 20 | s[19] >>> 12;\n          b13 = s[19] << 20 | s[18] >>> 12;\n          b44 = s[29] << 7 | s[28] >>> 25;\n          b45 = s[28] << 7 | s[29] >>> 25;\n          b26 = s[38] << 8 | s[39] >>> 24;\n          b27 = s[39] << 8 | s[38] >>> 24;\n          b8 = s[48] << 14 | s[49] >>> 18;\n          b9 = s[49] << 14 | s[48] >>> 18;\n          s[0] = b0 ^ ~b2 & b4;\n          s[1] = b1 ^ ~b3 & b5;\n          s[10] = b10 ^ ~b12 & b14;\n          s[11] = b11 ^ ~b13 & b15;\n          s[20] = b20 ^ ~b22 & b24;\n          s[21] = b21 ^ ~b23 & b25;\n          s[30] = b30 ^ ~b32 & b34;\n          s[31] = b31 ^ ~b33 & b35;\n          s[40] = b40 ^ ~b42 & b44;\n          s[41] = b41 ^ ~b43 & b45;\n          s[2] = b2 ^ ~b4 & b6;\n          s[3] = b3 ^ ~b5 & b7;\n          s[12] = b12 ^ ~b14 & b16;\n          s[13] = b13 ^ ~b15 & b17;\n          s[22] = b22 ^ ~b24 & b26;\n          s[23] = b23 ^ ~b25 & b27;\n          s[32] = b32 ^ ~b34 & b36;\n          s[33] = b33 ^ ~b35 & b37;\n          s[42] = b42 ^ ~b44 & b46;\n          s[43] = b43 ^ ~b45 & b47;\n          s[4] = b4 ^ ~b6 & b8;\n          s[5] = b5 ^ ~b7 & b9;\n          s[14] = b14 ^ ~b16 & b18;\n          s[15] = b15 ^ ~b17 & b19;\n          s[24] = b24 ^ ~b26 & b28;\n          s[25] = b25 ^ ~b27 & b29;\n          s[34] = b34 ^ ~b36 & b38;\n          s[35] = b35 ^ ~b37 & b39;\n          s[44] = b44 ^ ~b46 & b48;\n          s[45] = b45 ^ ~b47 & b49;\n          s[6] = b6 ^ ~b8 & b0;\n          s[7] = b7 ^ ~b9 & b1;\n          s[16] = b16 ^ ~b18 & b10;\n          s[17] = b17 ^ ~b19 & b11;\n          s[26] = b26 ^ ~b28 & b20;\n          s[27] = b27 ^ ~b29 & b21;\n          s[36] = b36 ^ ~b38 & b30;\n          s[37] = b37 ^ ~b39 & b31;\n          s[46] = b46 ^ ~b48 & b40;\n          s[47] = b47 ^ ~b49 & b41;\n          s[8] = b8 ^ ~b0 & b2;\n          s[9] = b9 ^ ~b1 & b3;\n          s[18] = b18 ^ ~b10 & b12;\n          s[19] = b19 ^ ~b11 & b13;\n          s[28] = b28 ^ ~b20 & b22;\n          s[29] = b29 ^ ~b21 & b23;\n          s[38] = b38 ^ ~b30 & b32;\n          s[39] = b39 ^ ~b31 & b33;\n          s[48] = b48 ^ ~b40 & b42;\n          s[49] = b49 ^ ~b41 & b43;\n          s[0] ^= RC[n];\n          s[1] ^= RC[n + 1];\n        }\n      };\n      if (COMMON_JS) {\n        module2.exports = methods;\n      } else {\n        for (i = 0; i < methodNames.length; ++i) {\n          root[methodNames[i]] = methods[methodNames[i]];\n        }\n        if (AMD) {\n          define(function() {\n            return methods;\n          });\n        }\n      }\n    })();\n  }\n});\n\n// node_modules/@ethersproject/keccak256/lib/index.js\nvar require_lib5 = __commonJS({\n  \"node_modules/@ethersproject/keccak256/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.keccak256 = void 0;\n    var js_sha3_1 = __importDefault(require_sha3());\n    var bytes_1 = require_lib2();\n    function keccak256(data) {\n      return \"0x\" + js_sha3_1.default.keccak_256((0, bytes_1.arrayify)(data));\n    }\n    exports2.keccak256 = keccak256;\n  }\n});\n\n// node_modules/@ethersproject/rlp/lib/_version.js\nvar require_version6 = __commonJS({\n  \"node_modules/@ethersproject/rlp/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"rlp/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/rlp/lib/index.js\nvar require_lib6 = __commonJS({\n  \"node_modules/@ethersproject/rlp/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decode = exports2.encode = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version6();\n    var logger = new logger_1.Logger(_version_1.version);\n    function arrayifyInteger(value) {\n      var result2 = [];\n      while (value) {\n        result2.unshift(value & 255);\n        value >>= 8;\n      }\n      return result2;\n    }\n    function unarrayifyInteger(data, offset, length) {\n      var result2 = 0;\n      for (var i = 0; i < length; i++) {\n        result2 = result2 * 256 + data[offset + i];\n      }\n      return result2;\n    }\n    function _encode(object) {\n      if (Array.isArray(object)) {\n        var payload_1 = [];\n        object.forEach(function(child) {\n          payload_1 = payload_1.concat(_encode(child));\n        });\n        if (payload_1.length <= 55) {\n          payload_1.unshift(192 + payload_1.length);\n          return payload_1;\n        }\n        var length_1 = arrayifyInteger(payload_1.length);\n        length_1.unshift(247 + length_1.length);\n        return length_1.concat(payload_1);\n      }\n      if (!(0, bytes_1.isBytesLike)(object)) {\n        logger.throwArgumentError(\"RLP object must be BytesLike\", \"object\", object);\n      }\n      var data = Array.prototype.slice.call((0, bytes_1.arrayify)(object));\n      if (data.length === 1 && data[0] <= 127) {\n        return data;\n      } else if (data.length <= 55) {\n        data.unshift(128 + data.length);\n        return data;\n      }\n      var length = arrayifyInteger(data.length);\n      length.unshift(183 + length.length);\n      return length.concat(data);\n    }\n    function encode(object) {\n      return (0, bytes_1.hexlify)(_encode(object));\n    }\n    exports2.encode = encode;\n    function _decodeChildren(data, offset, childOffset, length) {\n      var result2 = [];\n      while (childOffset < offset + 1 + length) {\n        var decoded = _decode(data, childOffset);\n        result2.push(decoded.result);\n        childOffset += decoded.consumed;\n        if (childOffset > offset + 1 + length) {\n          logger.throwError(\"child data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n      }\n      return { consumed: 1 + length, result: result2 };\n    }\n    function _decode(data, offset) {\n      if (data.length === 0) {\n        logger.throwError(\"data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n      }\n      if (data[offset] >= 248) {\n        var lengthLength = data[offset] - 247;\n        if (offset + 1 + lengthLength > data.length) {\n          logger.throwError(\"data short segment too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var length_2 = unarrayifyInteger(data, offset + 1, lengthLength);\n        if (offset + 1 + lengthLength + length_2 > data.length) {\n          logger.throwError(\"data long segment too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        return _decodeChildren(data, offset, offset + 1 + lengthLength, lengthLength + length_2);\n      } else if (data[offset] >= 192) {\n        var length_3 = data[offset] - 192;\n        if (offset + 1 + length_3 > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        return _decodeChildren(data, offset, offset + 1, length_3);\n      } else if (data[offset] >= 184) {\n        var lengthLength = data[offset] - 183;\n        if (offset + 1 + lengthLength > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var length_4 = unarrayifyInteger(data, offset + 1, lengthLength);\n        if (offset + 1 + lengthLength + length_4 > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var result2 = (0, bytes_1.hexlify)(data.slice(offset + 1 + lengthLength, offset + 1 + lengthLength + length_4));\n        return { consumed: 1 + lengthLength + length_4, result: result2 };\n      } else if (data[offset] >= 128) {\n        var length_5 = data[offset] - 128;\n        if (offset + 1 + length_5 > data.length) {\n          logger.throwError(\"data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var result2 = (0, bytes_1.hexlify)(data.slice(offset + 1, offset + 1 + length_5));\n        return { consumed: 1 + length_5, result: result2 };\n      }\n      return { consumed: 1, result: (0, bytes_1.hexlify)(data[offset]) };\n    }\n    function decode(data) {\n      var bytes = (0, bytes_1.arrayify)(data);\n      var decoded = _decode(bytes, 0);\n      if (decoded.consumed !== bytes.length) {\n        logger.throwArgumentError(\"invalid rlp data\", \"data\", data);\n      }\n      return decoded.result;\n    }\n    exports2.decode = decode;\n  }\n});\n\n// node_modules/@ethersproject/address/lib/_version.js\nvar require_version7 = __commonJS({\n  \"node_modules/@ethersproject/address/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"address/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/address/lib/index.js\nvar require_lib7 = __commonJS({\n  \"node_modules/@ethersproject/address/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getCreate2Address = exports2.getContractAddress = exports2.getIcapAddress = exports2.isAddress = exports2.getAddress = void 0;\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var keccak256_1 = require_lib5();\n    var rlp_1 = require_lib6();\n    var logger_1 = require_lib();\n    var _version_1 = require_version7();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getChecksumAddress(address) {\n      if (!(0, bytes_1.isHexString)(address, 20)) {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      address = address.toLowerCase();\n      var chars = address.substring(2).split(\"\");\n      var expanded = new Uint8Array(40);\n      for (var i2 = 0; i2 < 40; i2++) {\n        expanded[i2] = chars[i2].charCodeAt(0);\n      }\n      var hashed = (0, bytes_1.arrayify)((0, keccak256_1.keccak256)(expanded));\n      for (var i2 = 0; i2 < 40; i2 += 2) {\n        if (hashed[i2 >> 1] >> 4 >= 8) {\n          chars[i2] = chars[i2].toUpperCase();\n        }\n        if ((hashed[i2 >> 1] & 15) >= 8) {\n          chars[i2 + 1] = chars[i2 + 1].toUpperCase();\n        }\n      }\n      return \"0x\" + chars.join(\"\");\n    }\n    var MAX_SAFE_INTEGER = 9007199254740991;\n    function log10(x) {\n      if (Math.log10) {\n        return Math.log10(x);\n      }\n      return Math.log(x) / Math.LN10;\n    }\n    var ibanLookup = {};\n    for (i = 0; i < 10; i++) {\n      ibanLookup[String(i)] = String(i);\n    }\n    var i;\n    for (i = 0; i < 26; i++) {\n      ibanLookup[String.fromCharCode(65 + i)] = String(10 + i);\n    }\n    var i;\n    var safeDigits = Math.floor(log10(MAX_SAFE_INTEGER));\n    function ibanChecksum(address) {\n      address = address.toUpperCase();\n      address = address.substring(4) + address.substring(0, 2) + \"00\";\n      var expanded = address.split(\"\").map(function(c) {\n        return ibanLookup[c];\n      }).join(\"\");\n      while (expanded.length >= safeDigits) {\n        var block = expanded.substring(0, safeDigits);\n        expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);\n      }\n      var checksum = String(98 - parseInt(expanded, 10) % 97);\n      while (checksum.length < 2) {\n        checksum = \"0\" + checksum;\n      }\n      return checksum;\n    }\n    function getAddress(address) {\n      var result2 = null;\n      if (typeof address !== \"string\") {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\n        if (address.substring(0, 2) !== \"0x\") {\n          address = \"0x\" + address;\n        }\n        result2 = getChecksumAddress(address);\n        if (address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) && result2 !== address) {\n          logger.throwArgumentError(\"bad address checksum\", \"address\", address);\n        }\n      } else if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\n        if (address.substring(2, 4) !== ibanChecksum(address)) {\n          logger.throwArgumentError(\"bad icap checksum\", \"address\", address);\n        }\n        result2 = (0, bignumber_1._base36To16)(address.substring(4));\n        while (result2.length < 40) {\n          result2 = \"0\" + result2;\n        }\n        result2 = getChecksumAddress(\"0x\" + result2);\n      } else {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      return result2;\n    }\n    exports2.getAddress = getAddress;\n    function isAddress(address) {\n      try {\n        getAddress(address);\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isAddress = isAddress;\n    function getIcapAddress(address) {\n      var base36 = (0, bignumber_1._base16To36)(getAddress(address).substring(2)).toUpperCase();\n      while (base36.length < 30) {\n        base36 = \"0\" + base36;\n      }\n      return \"XE\" + ibanChecksum(\"XE00\" + base36) + base36;\n    }\n    exports2.getIcapAddress = getIcapAddress;\n    function getContractAddress(transaction) {\n      var from = null;\n      try {\n        from = getAddress(transaction.from);\n      } catch (error) {\n        logger.throwArgumentError(\"missing from address\", \"transaction\", transaction);\n      }\n      var nonce = (0, bytes_1.stripZeros)((0, bytes_1.arrayify)(bignumber_1.BigNumber.from(transaction.nonce).toHexString()));\n      return getAddress((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, rlp_1.encode)([from, nonce])), 12));\n    }\n    exports2.getContractAddress = getContractAddress;\n    function getCreate2Address(from, salt, initCodeHash) {\n      if ((0, bytes_1.hexDataLength)(salt) !== 32) {\n        logger.throwArgumentError(\"salt must be 32 bytes\", \"salt\", salt);\n      }\n      if ((0, bytes_1.hexDataLength)(initCodeHash) !== 32) {\n        logger.throwArgumentError(\"initCodeHash must be 32 bytes\", \"initCodeHash\", initCodeHash);\n      }\n      return getAddress((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.concat)([\"0xff\", getAddress(from), salt, initCodeHash])), 12));\n    }\n    exports2.getCreate2Address = getCreate2Address;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/address.js\nvar require_address = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/address.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AddressCoder = void 0;\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var AddressCoder = (\n      /** @class */\n      function(_super) {\n        __extends(AddressCoder2, _super);\n        function AddressCoder2(localName) {\n          return _super.call(this, \"address\", \"address\", localName, false) || this;\n        }\n        AddressCoder2.prototype.defaultValue = function() {\n          return \"0x0000000000000000000000000000000000000000\";\n        };\n        AddressCoder2.prototype.encode = function(writer, value) {\n          try {\n            value = (0, address_1.getAddress)(value);\n          } catch (error) {\n            this._throwError(error.message, value);\n          }\n          return writer.writeValue(value);\n        };\n        AddressCoder2.prototype.decode = function(reader) {\n          return (0, address_1.getAddress)((0, bytes_1.hexZeroPad)(reader.readValue().toHexString(), 20));\n        };\n        return AddressCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.AddressCoder = AddressCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/anonymous.js\nvar require_anonymous = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/anonymous.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AnonymousCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var AnonymousCoder = (\n      /** @class */\n      function(_super) {\n        __extends(AnonymousCoder2, _super);\n        function AnonymousCoder2(coder) {\n          var _this = _super.call(this, coder.name, coder.type, void 0, coder.dynamic) || this;\n          _this.coder = coder;\n          return _this;\n        }\n        AnonymousCoder2.prototype.defaultValue = function() {\n          return this.coder.defaultValue();\n        };\n        AnonymousCoder2.prototype.encode = function(writer, value) {\n          return this.coder.encode(writer, value);\n        };\n        AnonymousCoder2.prototype.decode = function(reader) {\n          return this.coder.decode(reader);\n        };\n        return AnonymousCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.AnonymousCoder = AnonymousCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/array.js\nvar require_array = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/array.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ArrayCoder = exports2.unpack = exports2.pack = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var abstract_coder_1 = require_abstract_coder();\n    var anonymous_1 = require_anonymous();\n    function pack(writer, coders, values) {\n      var arrayValues = null;\n      if (Array.isArray(values)) {\n        arrayValues = values;\n      } else if (values && typeof values === \"object\") {\n        var unique_1 = {};\n        arrayValues = coders.map(function(coder) {\n          var name2 = coder.localName;\n          if (!name2) {\n            logger.throwError(\"cannot encode object for signature with missing names\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              argument: \"values\",\n              coder,\n              value: values\n            });\n          }\n          if (unique_1[name2]) {\n            logger.throwError(\"cannot encode object for signature with duplicate names\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              argument: \"values\",\n              coder,\n              value: values\n            });\n          }\n          unique_1[name2] = true;\n          return values[name2];\n        });\n      } else {\n        logger.throwArgumentError(\"invalid tuple value\", \"tuple\", values);\n      }\n      if (coders.length !== arrayValues.length) {\n        logger.throwArgumentError(\"types/value length mismatch\", \"tuple\", values);\n      }\n      var staticWriter = new abstract_coder_1.Writer(writer.wordSize);\n      var dynamicWriter = new abstract_coder_1.Writer(writer.wordSize);\n      var updateFuncs = [];\n      coders.forEach(function(coder, index) {\n        var value = arrayValues[index];\n        if (coder.dynamic) {\n          var dynamicOffset_1 = dynamicWriter.length;\n          coder.encode(dynamicWriter, value);\n          var updateFunc_1 = staticWriter.writeUpdatableValue();\n          updateFuncs.push(function(baseOffset) {\n            updateFunc_1(baseOffset + dynamicOffset_1);\n          });\n        } else {\n          coder.encode(staticWriter, value);\n        }\n      });\n      updateFuncs.forEach(function(func) {\n        func(staticWriter.length);\n      });\n      var length = writer.appendWriter(staticWriter);\n      length += writer.appendWriter(dynamicWriter);\n      return length;\n    }\n    exports2.pack = pack;\n    function unpack(reader, coders) {\n      var values = [];\n      var baseReader = reader.subReader(0);\n      coders.forEach(function(coder) {\n        var value = null;\n        if (coder.dynamic) {\n          var offset = reader.readValue();\n          var offsetReader = baseReader.subReader(offset.toNumber());\n          try {\n            value = coder.decode(offsetReader);\n          } catch (error) {\n            if (error.code === logger_1.Logger.errors.BUFFER_OVERRUN) {\n              throw error;\n            }\n            value = error;\n            value.baseType = coder.name;\n            value.name = coder.localName;\n            value.type = coder.type;\n          }\n        } else {\n          try {\n            value = coder.decode(reader);\n          } catch (error) {\n            if (error.code === logger_1.Logger.errors.BUFFER_OVERRUN) {\n              throw error;\n            }\n            value = error;\n            value.baseType = coder.name;\n            value.name = coder.localName;\n            value.type = coder.type;\n          }\n        }\n        if (value != void 0) {\n          values.push(value);\n        }\n      });\n      var uniqueNames = coders.reduce(function(accum, coder) {\n        var name2 = coder.localName;\n        if (name2) {\n          if (!accum[name2]) {\n            accum[name2] = 0;\n          }\n          accum[name2]++;\n        }\n        return accum;\n      }, {});\n      coders.forEach(function(coder, index) {\n        var name2 = coder.localName;\n        if (!name2 || uniqueNames[name2] !== 1) {\n          return;\n        }\n        if (name2 === \"length\") {\n          name2 = \"_length\";\n        }\n        if (values[name2] != null) {\n          return;\n        }\n        var value = values[index];\n        if (value instanceof Error) {\n          Object.defineProperty(values, name2, {\n            enumerable: true,\n            get: function() {\n              throw value;\n            }\n          });\n        } else {\n          values[name2] = value;\n        }\n      });\n      var _loop_1 = function(i2) {\n        var value = values[i2];\n        if (value instanceof Error) {\n          Object.defineProperty(values, i2, {\n            enumerable: true,\n            get: function() {\n              throw value;\n            }\n          });\n        }\n      };\n      for (var i = 0; i < values.length; i++) {\n        _loop_1(i);\n      }\n      return Object.freeze(values);\n    }\n    exports2.unpack = unpack;\n    var ArrayCoder = (\n      /** @class */\n      function(_super) {\n        __extends(ArrayCoder2, _super);\n        function ArrayCoder2(coder, length, localName) {\n          var _this = this;\n          var type = coder.type + \"[\" + (length >= 0 ? length : \"\") + \"]\";\n          var dynamic = length === -1 || coder.dynamic;\n          _this = _super.call(this, \"array\", type, localName, dynamic) || this;\n          _this.coder = coder;\n          _this.length = length;\n          return _this;\n        }\n        ArrayCoder2.prototype.defaultValue = function() {\n          var defaultChild = this.coder.defaultValue();\n          var result2 = [];\n          for (var i = 0; i < this.length; i++) {\n            result2.push(defaultChild);\n          }\n          return result2;\n        };\n        ArrayCoder2.prototype.encode = function(writer, value) {\n          if (!Array.isArray(value)) {\n            this._throwError(\"expected array value\", value);\n          }\n          var count = this.length;\n          if (count === -1) {\n            count = value.length;\n            writer.writeValue(value.length);\n          }\n          logger.checkArgumentCount(value.length, count, \"coder array\" + (this.localName ? \" \" + this.localName : \"\"));\n          var coders = [];\n          for (var i = 0; i < value.length; i++) {\n            coders.push(this.coder);\n          }\n          return pack(writer, coders, value);\n        };\n        ArrayCoder2.prototype.decode = function(reader) {\n          var count = this.length;\n          if (count === -1) {\n            count = reader.readValue().toNumber();\n            if (count * 32 > reader._data.length) {\n              logger.throwError(\"insufficient data length\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n                length: reader._data.length,\n                count\n              });\n            }\n          }\n          var coders = [];\n          for (var i = 0; i < count; i++) {\n            coders.push(new anonymous_1.AnonymousCoder(this.coder));\n          }\n          return reader.coerce(this.name, unpack(reader, coders));\n        };\n        return ArrayCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.ArrayCoder = ArrayCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/boolean.js\nvar require_boolean = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/boolean.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BooleanCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var BooleanCoder = (\n      /** @class */\n      function(_super) {\n        __extends(BooleanCoder2, _super);\n        function BooleanCoder2(localName) {\n          return _super.call(this, \"bool\", \"bool\", localName, false) || this;\n        }\n        BooleanCoder2.prototype.defaultValue = function() {\n          return false;\n        };\n        BooleanCoder2.prototype.encode = function(writer, value) {\n          return writer.writeValue(value ? 1 : 0);\n        };\n        BooleanCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.type, !reader.readValue().isZero());\n        };\n        return BooleanCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.BooleanCoder = BooleanCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/bytes.js\nvar require_bytes = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/bytes.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BytesCoder = exports2.DynamicBytesCoder = void 0;\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var DynamicBytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(DynamicBytesCoder2, _super);\n        function DynamicBytesCoder2(type, localName) {\n          return _super.call(this, type, type, localName, true) || this;\n        }\n        DynamicBytesCoder2.prototype.defaultValue = function() {\n          return \"0x\";\n        };\n        DynamicBytesCoder2.prototype.encode = function(writer, value) {\n          value = (0, bytes_1.arrayify)(value);\n          var length = writer.writeValue(value.length);\n          length += writer.writeBytes(value);\n          return length;\n        };\n        DynamicBytesCoder2.prototype.decode = function(reader) {\n          return reader.readBytes(reader.readValue().toNumber(), true);\n        };\n        return DynamicBytesCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.DynamicBytesCoder = DynamicBytesCoder;\n    var BytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(BytesCoder2, _super);\n        function BytesCoder2(localName) {\n          return _super.call(this, \"bytes\", localName) || this;\n        }\n        BytesCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, bytes_1.hexlify)(_super.prototype.decode.call(this, reader)));\n        };\n        return BytesCoder2;\n      }(DynamicBytesCoder)\n    );\n    exports2.BytesCoder = BytesCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/fixed-bytes.js\nvar require_fixed_bytes = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/fixed-bytes.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FixedBytesCoder = void 0;\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var FixedBytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(FixedBytesCoder2, _super);\n        function FixedBytesCoder2(size, localName) {\n          var _this = this;\n          var name2 = \"bytes\" + String(size);\n          _this = _super.call(this, name2, name2, localName, false) || this;\n          _this.size = size;\n          return _this;\n        }\n        FixedBytesCoder2.prototype.defaultValue = function() {\n          return \"0x0000000000000000000000000000000000000000000000000000000000000000\".substring(0, 2 + this.size * 2);\n        };\n        FixedBytesCoder2.prototype.encode = function(writer, value) {\n          var data = (0, bytes_1.arrayify)(value);\n          if (data.length !== this.size) {\n            this._throwError(\"incorrect data length\", value);\n          }\n          return writer.writeBytes(data);\n        };\n        FixedBytesCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, bytes_1.hexlify)(reader.readBytes(this.size)));\n        };\n        return FixedBytesCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.FixedBytesCoder = FixedBytesCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/null.js\nvar require_null = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/null.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NullCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var NullCoder = (\n      /** @class */\n      function(_super) {\n        __extends(NullCoder2, _super);\n        function NullCoder2(localName) {\n          return _super.call(this, \"null\", \"\", localName, false) || this;\n        }\n        NullCoder2.prototype.defaultValue = function() {\n          return null;\n        };\n        NullCoder2.prototype.encode = function(writer, value) {\n          if (value != null) {\n            this._throwError(\"not null\", value);\n          }\n          return writer.writeBytes([]);\n        };\n        NullCoder2.prototype.decode = function(reader) {\n          reader.readBytes(0);\n          return reader.coerce(this.name, null);\n        };\n        return NullCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.NullCoder = NullCoder;\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/addresses.js\nvar require_addresses = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/addresses.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AddressZero = void 0;\n    exports2.AddressZero = \"0x0000000000000000000000000000000000000000\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/bignumbers.js\nvar require_bignumbers = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/bignumbers.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.MaxInt256 = exports2.MinInt256 = exports2.MaxUint256 = exports2.WeiPerEther = exports2.Two = exports2.One = exports2.Zero = exports2.NegativeOne = void 0;\n    var bignumber_1 = require_lib3();\n    var NegativeOne = /* @__PURE__ */ bignumber_1.BigNumber.from(-1);\n    exports2.NegativeOne = NegativeOne;\n    var Zero = /* @__PURE__ */ bignumber_1.BigNumber.from(0);\n    exports2.Zero = Zero;\n    var One = /* @__PURE__ */ bignumber_1.BigNumber.from(1);\n    exports2.One = One;\n    var Two = /* @__PURE__ */ bignumber_1.BigNumber.from(2);\n    exports2.Two = Two;\n    var WeiPerEther = /* @__PURE__ */ bignumber_1.BigNumber.from(\"1000000000000000000\");\n    exports2.WeiPerEther = WeiPerEther;\n    var MaxUint256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    exports2.MaxUint256 = MaxUint256;\n    var MinInt256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"-0x8000000000000000000000000000000000000000000000000000000000000000\");\n    exports2.MinInt256 = MinInt256;\n    var MaxInt256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    exports2.MaxInt256 = MaxInt256;\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/hashes.js\nvar require_hashes = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/hashes.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.HashZero = void 0;\n    exports2.HashZero = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/strings.js\nvar require_strings = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/strings.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherSymbol = void 0;\n    exports2.EtherSymbol = \"\\u039E\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/index.js\nvar require_lib8 = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherSymbol = exports2.HashZero = exports2.MaxInt256 = exports2.MinInt256 = exports2.MaxUint256 = exports2.WeiPerEther = exports2.Two = exports2.One = exports2.Zero = exports2.NegativeOne = exports2.AddressZero = void 0;\n    var addresses_1 = require_addresses();\n    Object.defineProperty(exports2, \"AddressZero\", { enumerable: true, get: function() {\n      return addresses_1.AddressZero;\n    } });\n    var bignumbers_1 = require_bignumbers();\n    Object.defineProperty(exports2, \"NegativeOne\", { enumerable: true, get: function() {\n      return bignumbers_1.NegativeOne;\n    } });\n    Object.defineProperty(exports2, \"Zero\", { enumerable: true, get: function() {\n      return bignumbers_1.Zero;\n    } });\n    Object.defineProperty(exports2, \"One\", { enumerable: true, get: function() {\n      return bignumbers_1.One;\n    } });\n    Object.defineProperty(exports2, \"Two\", { enumerable: true, get: function() {\n      return bignumbers_1.Two;\n    } });\n    Object.defineProperty(exports2, \"WeiPerEther\", { enumerable: true, get: function() {\n      return bignumbers_1.WeiPerEther;\n    } });\n    Object.defineProperty(exports2, \"MaxUint256\", { enumerable: true, get: function() {\n      return bignumbers_1.MaxUint256;\n    } });\n    Object.defineProperty(exports2, \"MinInt256\", { enumerable: true, get: function() {\n      return bignumbers_1.MinInt256;\n    } });\n    Object.defineProperty(exports2, \"MaxInt256\", { enumerable: true, get: function() {\n      return bignumbers_1.MaxInt256;\n    } });\n    var hashes_1 = require_hashes();\n    Object.defineProperty(exports2, \"HashZero\", { enumerable: true, get: function() {\n      return hashes_1.HashZero;\n    } });\n    var strings_1 = require_strings();\n    Object.defineProperty(exports2, \"EtherSymbol\", { enumerable: true, get: function() {\n      return strings_1.EtherSymbol;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/number.js\nvar require_number = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/number.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NumberCoder = void 0;\n    var bignumber_1 = require_lib3();\n    var constants_1 = require_lib8();\n    var abstract_coder_1 = require_abstract_coder();\n    var NumberCoder = (\n      /** @class */\n      function(_super) {\n        __extends(NumberCoder2, _super);\n        function NumberCoder2(size, signed, localName) {\n          var _this = this;\n          var name2 = (signed ? \"int\" : \"uint\") + size * 8;\n          _this = _super.call(this, name2, name2, localName, false) || this;\n          _this.size = size;\n          _this.signed = signed;\n          return _this;\n        }\n        NumberCoder2.prototype.defaultValue = function() {\n          return 0;\n        };\n        NumberCoder2.prototype.encode = function(writer, value) {\n          var v = bignumber_1.BigNumber.from(value);\n          var maxUintValue = constants_1.MaxUint256.mask(writer.wordSize * 8);\n          if (this.signed) {\n            var bounds = maxUintValue.mask(this.size * 8 - 1);\n            if (v.gt(bounds) || v.lt(bounds.add(constants_1.One).mul(constants_1.NegativeOne))) {\n              this._throwError(\"value out-of-bounds\", value);\n            }\n          } else if (v.lt(constants_1.Zero) || v.gt(maxUintValue.mask(this.size * 8))) {\n            this._throwError(\"value out-of-bounds\", value);\n          }\n          v = v.toTwos(this.size * 8).mask(this.size * 8);\n          if (this.signed) {\n            v = v.fromTwos(this.size * 8).toTwos(8 * writer.wordSize);\n          }\n          return writer.writeValue(v);\n        };\n        NumberCoder2.prototype.decode = function(reader) {\n          var value = reader.readValue().mask(this.size * 8);\n          if (this.signed) {\n            value = value.fromTwos(this.size * 8);\n          }\n          return reader.coerce(this.name, value);\n        };\n        return NumberCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.NumberCoder = NumberCoder;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/_version.js\nvar require_version8 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"strings/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/utf8.js\nvar require_utf8 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/utf8.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.toUtf8CodePoints = exports2.toUtf8String = exports2._toUtf8String = exports2._toEscapedUtf8String = exports2.toUtf8Bytes = exports2.Utf8ErrorFuncs = exports2.Utf8ErrorReason = exports2.UnicodeNormalizationForm = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version8();\n    var logger = new logger_1.Logger(_version_1.version);\n    var UnicodeNormalizationForm;\n    (function(UnicodeNormalizationForm2) {\n      UnicodeNormalizationForm2[\"current\"] = \"\";\n      UnicodeNormalizationForm2[\"NFC\"] = \"NFC\";\n      UnicodeNormalizationForm2[\"NFD\"] = \"NFD\";\n      UnicodeNormalizationForm2[\"NFKC\"] = \"NFKC\";\n      UnicodeNormalizationForm2[\"NFKD\"] = \"NFKD\";\n    })(UnicodeNormalizationForm = exports2.UnicodeNormalizationForm || (exports2.UnicodeNormalizationForm = {}));\n    var Utf8ErrorReason;\n    (function(Utf8ErrorReason2) {\n      Utf8ErrorReason2[\"UNEXPECTED_CONTINUE\"] = \"unexpected continuation byte\";\n      Utf8ErrorReason2[\"BAD_PREFIX\"] = \"bad codepoint prefix\";\n      Utf8ErrorReason2[\"OVERRUN\"] = \"string overrun\";\n      Utf8ErrorReason2[\"MISSING_CONTINUE\"] = \"missing continuation byte\";\n      Utf8ErrorReason2[\"OUT_OF_RANGE\"] = \"out of UTF-8 range\";\n      Utf8ErrorReason2[\"UTF16_SURROGATE\"] = \"UTF-16 surrogate\";\n      Utf8ErrorReason2[\"OVERLONG\"] = \"overlong representation\";\n    })(Utf8ErrorReason = exports2.Utf8ErrorReason || (exports2.Utf8ErrorReason = {}));\n    function errorFunc(reason, offset, bytes, output, badCodepoint) {\n      return logger.throwArgumentError(\"invalid codepoint at offset \" + offset + \"; \" + reason, \"bytes\", bytes);\n    }\n    function ignoreFunc(reason, offset, bytes, output, badCodepoint) {\n      if (reason === Utf8ErrorReason.BAD_PREFIX || reason === Utf8ErrorReason.UNEXPECTED_CONTINUE) {\n        var i = 0;\n        for (var o = offset + 1; o < bytes.length; o++) {\n          if (bytes[o] >> 6 !== 2) {\n            break;\n          }\n          i++;\n        }\n        return i;\n      }\n      if (reason === Utf8ErrorReason.OVERRUN) {\n        return bytes.length - offset - 1;\n      }\n      return 0;\n    }\n    function replaceFunc(reason, offset, bytes, output, badCodepoint) {\n      if (reason === Utf8ErrorReason.OVERLONG) {\n        output.push(badCodepoint);\n        return 0;\n      }\n      output.push(65533);\n      return ignoreFunc(reason, offset, bytes, output, badCodepoint);\n    }\n    exports2.Utf8ErrorFuncs = Object.freeze({\n      error: errorFunc,\n      ignore: ignoreFunc,\n      replace: replaceFunc\n    });\n    function getUtf8CodePoints(bytes, onError) {\n      if (onError == null) {\n        onError = exports2.Utf8ErrorFuncs.error;\n      }\n      bytes = (0, bytes_1.arrayify)(bytes);\n      var result2 = [];\n      var i = 0;\n      while (i < bytes.length) {\n        var c = bytes[i++];\n        if (c >> 7 === 0) {\n          result2.push(c);\n          continue;\n        }\n        var extraLength = null;\n        var overlongMask = null;\n        if ((c & 224) === 192) {\n          extraLength = 1;\n          overlongMask = 127;\n        } else if ((c & 240) === 224) {\n          extraLength = 2;\n          overlongMask = 2047;\n        } else if ((c & 248) === 240) {\n          extraLength = 3;\n          overlongMask = 65535;\n        } else {\n          if ((c & 192) === 128) {\n            i += onError(Utf8ErrorReason.UNEXPECTED_CONTINUE, i - 1, bytes, result2);\n          } else {\n            i += onError(Utf8ErrorReason.BAD_PREFIX, i - 1, bytes, result2);\n          }\n          continue;\n        }\n        if (i - 1 + extraLength >= bytes.length) {\n          i += onError(Utf8ErrorReason.OVERRUN, i - 1, bytes, result2);\n          continue;\n        }\n        var res = c & (1 << 8 - extraLength - 1) - 1;\n        for (var j = 0; j < extraLength; j++) {\n          var nextChar = bytes[i];\n          if ((nextChar & 192) != 128) {\n            i += onError(Utf8ErrorReason.MISSING_CONTINUE, i, bytes, result2);\n            res = null;\n            break;\n          }\n          ;\n          res = res << 6 | nextChar & 63;\n          i++;\n        }\n        if (res === null) {\n          continue;\n        }\n        if (res > 1114111) {\n          i += onError(Utf8ErrorReason.OUT_OF_RANGE, i - 1 - extraLength, bytes, result2, res);\n          continue;\n        }\n        if (res >= 55296 && res <= 57343) {\n          i += onError(Utf8ErrorReason.UTF16_SURROGATE, i - 1 - extraLength, bytes, result2, res);\n          continue;\n        }\n        if (res <= overlongMask) {\n          i += onError(Utf8ErrorReason.OVERLONG, i - 1 - extraLength, bytes, result2, res);\n          continue;\n        }\n        result2.push(res);\n      }\n      return result2;\n    }\n    function toUtf8Bytes(str, form) {\n      if (form === void 0) {\n        form = UnicodeNormalizationForm.current;\n      }\n      if (form != UnicodeNormalizationForm.current) {\n        logger.checkNormalize();\n        str = str.normalize(form);\n      }\n      var result2 = [];\n      for (var i = 0; i < str.length; i++) {\n        var c = str.charCodeAt(i);\n        if (c < 128) {\n          result2.push(c);\n        } else if (c < 2048) {\n          result2.push(c >> 6 | 192);\n          result2.push(c & 63 | 128);\n        } else if ((c & 64512) == 55296) {\n          i++;\n          var c2 = str.charCodeAt(i);\n          if (i >= str.length || (c2 & 64512) !== 56320) {\n            throw new Error(\"invalid utf-8 string\");\n          }\n          var pair = 65536 + ((c & 1023) << 10) + (c2 & 1023);\n          result2.push(pair >> 18 | 240);\n          result2.push(pair >> 12 & 63 | 128);\n          result2.push(pair >> 6 & 63 | 128);\n          result2.push(pair & 63 | 128);\n        } else {\n          result2.push(c >> 12 | 224);\n          result2.push(c >> 6 & 63 | 128);\n          result2.push(c & 63 | 128);\n        }\n      }\n      return (0, bytes_1.arrayify)(result2);\n    }\n    exports2.toUtf8Bytes = toUtf8Bytes;\n    function escapeChar(value) {\n      var hex = \"0000\" + value.toString(16);\n      return \"\\\\u\" + hex.substring(hex.length - 4);\n    }\n    function _toEscapedUtf8String(bytes, onError) {\n      return '\"' + getUtf8CodePoints(bytes, onError).map(function(codePoint) {\n        if (codePoint < 256) {\n          switch (codePoint) {\n            case 8:\n              return \"\\\\b\";\n            case 9:\n              return \"\\\\t\";\n            case 10:\n              return \"\\\\n\";\n            case 13:\n              return \"\\\\r\";\n            case 34:\n              return '\\\\\"';\n            case 92:\n              return \"\\\\\\\\\";\n          }\n          if (codePoint >= 32 && codePoint < 127) {\n            return String.fromCharCode(codePoint);\n          }\n        }\n        if (codePoint <= 65535) {\n          return escapeChar(codePoint);\n        }\n        codePoint -= 65536;\n        return escapeChar((codePoint >> 10 & 1023) + 55296) + escapeChar((codePoint & 1023) + 56320);\n      }).join(\"\") + '\"';\n    }\n    exports2._toEscapedUtf8String = _toEscapedUtf8String;\n    function _toUtf8String(codePoints) {\n      return codePoints.map(function(codePoint) {\n        if (codePoint <= 65535) {\n          return String.fromCharCode(codePoint);\n        }\n        codePoint -= 65536;\n        return String.fromCharCode((codePoint >> 10 & 1023) + 55296, (codePoint & 1023) + 56320);\n      }).join(\"\");\n    }\n    exports2._toUtf8String = _toUtf8String;\n    function toUtf8String(bytes, onError) {\n      return _toUtf8String(getUtf8CodePoints(bytes, onError));\n    }\n    exports2.toUtf8String = toUtf8String;\n    function toUtf8CodePoints(str, form) {\n      if (form === void 0) {\n        form = UnicodeNormalizationForm.current;\n      }\n      return getUtf8CodePoints(toUtf8Bytes(str, form));\n    }\n    exports2.toUtf8CodePoints = toUtf8CodePoints;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/bytes32.js\nvar require_bytes32 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/bytes32.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parseBytes32String = exports2.formatBytes32String = void 0;\n    var constants_1 = require_lib8();\n    var bytes_1 = require_lib2();\n    var utf8_1 = require_utf8();\n    function formatBytes32String(text) {\n      var bytes = (0, utf8_1.toUtf8Bytes)(text);\n      if (bytes.length > 31) {\n        throw new Error(\"bytes32 string must be less than 32 bytes\");\n      }\n      return (0, bytes_1.hexlify)((0, bytes_1.concat)([bytes, constants_1.HashZero]).slice(0, 32));\n    }\n    exports2.formatBytes32String = formatBytes32String;\n    function parseBytes32String(bytes) {\n      var data = (0, bytes_1.arrayify)(bytes);\n      if (data.length !== 32) {\n        throw new Error(\"invalid bytes32 - not 32 bytes long\");\n      }\n      if (data[31] !== 0) {\n        throw new Error(\"invalid bytes32 string - no null terminator\");\n      }\n      var length = 31;\n      while (data[length - 1] === 0) {\n        length--;\n      }\n      return (0, utf8_1.toUtf8String)(data.slice(0, length));\n    }\n    exports2.parseBytes32String = parseBytes32String;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/idna.js\nvar require_idna = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/idna.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.nameprep = exports2._nameprepTableC = exports2._nameprepTableB2 = exports2._nameprepTableA1 = void 0;\n    var utf8_1 = require_utf8();\n    function bytes2(data) {\n      if (data.length % 4 !== 0) {\n        throw new Error(\"bad data\");\n      }\n      var result2 = [];\n      for (var i = 0; i < data.length; i += 4) {\n        result2.push(parseInt(data.substring(i, i + 4), 16));\n      }\n      return result2;\n    }\n    function createTable(data, func) {\n      if (!func) {\n        func = function(value) {\n          return [parseInt(value, 16)];\n        };\n      }\n      var lo = 0;\n      var result2 = {};\n      data.split(\",\").forEach(function(pair) {\n        var comps = pair.split(\":\");\n        lo += parseInt(comps[0], 16);\n        result2[lo] = func(comps[1]);\n      });\n      return result2;\n    }\n    function createRangeTable(data) {\n      var hi = 0;\n      return data.split(\",\").map(function(v) {\n        var comps = v.split(\"-\");\n        if (comps.length === 1) {\n          comps[1] = \"0\";\n        } else if (comps[1] === \"\") {\n          comps[1] = \"1\";\n        }\n        var lo = hi + parseInt(comps[0], 16);\n        hi = parseInt(comps[1], 16);\n        return { l: lo, h: hi };\n      });\n    }\n    function matchMap(value, ranges) {\n      var lo = 0;\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        lo += range.l;\n        if (value >= lo && value <= lo + range.h && (value - lo) % (range.d || 1) === 0) {\n          if (range.e && range.e.indexOf(value - lo) !== -1) {\n            continue;\n          }\n          return range;\n        }\n      }\n      return null;\n    }\n    var Table_A_1_ranges = createRangeTable(\"221,13-1b,5f-,40-10,51-f,11-3,3-3,2-2,2-4,8,2,15,2d,28-8,88,48,27-,3-5,11-20,27-,8,28,3-5,12,18,b-a,1c-4,6-16,2-d,2-2,2,1b-4,17-9,8f-,10,f,1f-2,1c-34,33-14e,4,36-,13-,6-2,1a-f,4,9-,3-,17,8,2-2,5-,2,8-,3-,4-8,2-3,3,6-,16-6,2-,7-3,3-,17,8,3,3,3-,2,6-3,3-,4-a,5,2-6,10-b,4,8,2,4,17,8,3,6-,b,4,4-,2-e,2-4,b-10,4,9-,3-,17,8,3-,5-,9-2,3-,4-7,3-3,3,4-3,c-10,3,7-2,4,5-2,3,2,3-2,3-2,4-2,9,4-3,6-2,4,5-8,2-e,d-d,4,9,4,18,b,6-3,8,4,5-6,3-8,3-3,b-11,3,9,4,18,b,6-3,8,4,5-6,3-6,2,3-3,b-11,3,9,4,18,11-3,7-,4,5-8,2-7,3-3,b-11,3,13-2,19,a,2-,8-2,2-3,7,2,9-11,4-b,3b-3,1e-24,3,2-,3,2-,2-5,5,8,4,2,2-,3,e,4-,6,2,7-,b-,3-21,49,23-5,1c-3,9,25,10-,2-2f,23,6,3,8-2,5-5,1b-45,27-9,2a-,2-3,5b-4,45-4,53-5,8,40,2,5-,8,2,5-,28,2,5-,20,2,5-,8,2,5-,8,8,18,20,2,5-,8,28,14-5,1d-22,56-b,277-8,1e-2,52-e,e,8-a,18-8,15-b,e,4,3-b,5e-2,b-15,10,b-5,59-7,2b-555,9d-3,5b-5,17-,7-,27-,7-,9,2,2,2,20-,36,10,f-,7,14-,4,a,54-3,2-6,6-5,9-,1c-10,13-1d,1c-14,3c-,10-6,32-b,240-30,28-18,c-14,a0,115-,3,66-,b-76,5,5-,1d,24,2,5-2,2,8-,35-2,19,f-10,1d-3,311-37f,1b,5a-b,d7-19,d-3,41,57-,68-4,29-3,5f,29-37,2e-2,25-c,2c-2,4e-3,30,78-3,64-,20,19b7-49,51a7-59,48e-2,38-738,2ba5-5b,222f-,3c-94,8-b,6-4,1b,6,2,3,3,6d-20,16e-f,41-,37-7,2e-2,11-f,5-b,18-,b,14,5-3,6,88-,2,bf-2,7-,7-,7-,4-2,8,8-9,8-2ff,20,5-b,1c-b4,27-,27-cbb1,f7-9,28-2,b5-221,56,48,3-,2-,3-,5,d,2,5,3,42,5-,9,8,1d,5,6,2-2,8,153-3,123-3,33-27fd,a6da-5128,21f-5df,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3,2-1d,61-ff7d\");\n    var Table_B_1_flags = \"ad,34f,1806,180b,180c,180d,200b,200c,200d,2060,feff\".split(\",\").map(function(v) {\n      return parseInt(v, 16);\n    });\n    var Table_B_2_ranges = [\n      { h: 25, s: 32, l: 65 },\n      { h: 30, s: 32, e: [23], l: 127 },\n      { h: 54, s: 1, e: [48], l: 64, d: 2 },\n      { h: 14, s: 1, l: 57, d: 2 },\n      { h: 44, s: 1, l: 17, d: 2 },\n      { h: 10, s: 1, e: [2, 6, 8], l: 61, d: 2 },\n      { h: 16, s: 1, l: 68, d: 2 },\n      { h: 84, s: 1, e: [18, 24, 66], l: 19, d: 2 },\n      { h: 26, s: 32, e: [17], l: 435 },\n      { h: 22, s: 1, l: 71, d: 2 },\n      { h: 15, s: 80, l: 40 },\n      { h: 31, s: 32, l: 16 },\n      { h: 32, s: 1, l: 80, d: 2 },\n      { h: 52, s: 1, l: 42, d: 2 },\n      { h: 12, s: 1, l: 55, d: 2 },\n      { h: 40, s: 1, e: [38], l: 15, d: 2 },\n      { h: 14, s: 1, l: 48, d: 2 },\n      { h: 37, s: 48, l: 49 },\n      { h: 148, s: 1, l: 6351, d: 2 },\n      { h: 88, s: 1, l: 160, d: 2 },\n      { h: 15, s: 16, l: 704 },\n      { h: 25, s: 26, l: 854 },\n      { h: 25, s: 32, l: 55915 },\n      { h: 37, s: 40, l: 1247 },\n      { h: 25, s: -119711, l: 53248 },\n      { h: 25, s: -119763, l: 52 },\n      { h: 25, s: -119815, l: 52 },\n      { h: 25, s: -119867, e: [1, 4, 5, 7, 8, 11, 12, 17], l: 52 },\n      { h: 25, s: -119919, l: 52 },\n      { h: 24, s: -119971, e: [2, 7, 8, 17], l: 52 },\n      { h: 24, s: -120023, e: [2, 7, 13, 15, 16, 17], l: 52 },\n      { h: 25, s: -120075, l: 52 },\n      { h: 25, s: -120127, l: 52 },\n      { h: 25, s: -120179, l: 52 },\n      { h: 25, s: -120231, l: 52 },\n      { h: 25, s: -120283, l: 52 },\n      { h: 25, s: -120335, l: 52 },\n      { h: 24, s: -119543, e: [17], l: 56 },\n      { h: 24, s: -119601, e: [17], l: 58 },\n      { h: 24, s: -119659, e: [17], l: 58 },\n      { h: 24, s: -119717, e: [17], l: 58 },\n      { h: 24, s: -119775, e: [17], l: 58 }\n    ];\n    var Table_B_2_lut_abs = createTable(\"b5:3bc,c3:ff,7:73,2:253,5:254,3:256,1:257,5:259,1:25b,3:260,1:263,2:269,1:268,5:26f,1:272,2:275,7:280,3:283,5:288,3:28a,1:28b,5:292,3f:195,1:1bf,29:19e,125:3b9,8b:3b2,1:3b8,1:3c5,3:3c6,1:3c0,1a:3ba,1:3c1,1:3c3,2:3b8,1:3b5,1bc9:3b9,1c:1f76,1:1f77,f:1f7a,1:1f7b,d:1f78,1:1f79,1:1f7c,1:1f7d,107:63,5:25b,4:68,1:68,1:68,3:69,1:69,1:6c,3:6e,4:70,1:71,1:72,1:72,1:72,7:7a,2:3c9,2:7a,2:6b,1:e5,1:62,1:63,3:65,1:66,2:6d,b:3b3,1:3c0,6:64,1b574:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3\");\n    var Table_B_2_lut_rel = createTable(\"179:1,2:1,2:1,5:1,2:1,a:4f,a:1,8:1,2:1,2:1,3:1,5:1,3:1,4:1,2:1,3:1,4:1,8:2,1:1,2:2,1:1,2:2,27:2,195:26,2:25,1:25,1:25,2:40,2:3f,1:3f,33:1,11:-6,1:-9,1ac7:-3a,6d:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,b:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,c:-8,2:-8,2:-8,2:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,49:-8,1:-8,1:-4a,1:-4a,d:-56,1:-56,1:-56,1:-56,d:-8,1:-8,f:-8,1:-8,3:-7\");\n    var Table_B_2_complex = createTable(\"df:00730073,51:00690307,19:02BC006E,a7:006A030C,18a:002003B9,16:03B903080301,20:03C503080301,1d7:05650582,190f:00680331,1:00740308,1:0077030A,1:0079030A,1:006102BE,b6:03C50313,2:03C503130300,2:03C503130301,2:03C503130342,2a:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,3:1F7003B9,1:03B103B9,1:03AC03B9,2:03B10342,1:03B1034203B9,5:03B103B9,6:1F7403B9,1:03B703B9,1:03AE03B9,2:03B70342,1:03B7034203B9,5:03B703B9,6:03B903080300,1:03B903080301,3:03B90342,1:03B903080342,b:03C503080300,1:03C503080301,1:03C10313,2:03C50342,1:03C503080342,b:1F7C03B9,1:03C903B9,1:03CE03B9,2:03C90342,1:03C9034203B9,5:03C903B9,ac:00720073,5b:00B00063,6:00B00066,d:006E006F,a:0073006D,1:00740065006C,1:0074006D,124f:006800700061,2:00610075,2:006F0076,b:00700061,1:006E0061,1:03BC0061,1:006D0061,1:006B0061,1:006B0062,1:006D0062,1:00670062,3:00700066,1:006E0066,1:03BC0066,4:0068007A,1:006B0068007A,1:006D0068007A,1:00670068007A,1:00740068007A,15:00700061,1:006B00700061,1:006D00700061,1:006700700061,8:00700076,1:006E0076,1:03BC0076,1:006D0076,1:006B0076,1:006D0076,1:00700077,1:006E0077,1:03BC0077,1:006D0077,1:006B0077,1:006D0077,1:006B03C9,1:006D03C9,2:00620071,3:00632215006B0067,1:0063006F002E,1:00640062,1:00670079,2:00680070,2:006B006B,1:006B006D,9:00700068,2:00700070006D,1:00700072,2:00730076,1:00770062,c723:00660066,1:00660069,1:0066006C,1:006600660069,1:00660066006C,1:00730074,1:00730074,d:05740576,1:05740565,1:0574056B,1:057E0576,1:0574056D\", bytes2);\n    var Table_C_ranges = createRangeTable(\"80-20,2a0-,39c,32,f71,18e,7f2-f,19-7,30-4,7-5,f81-b,5,a800-20ff,4d1-1f,110,fa-6,d174-7,2e84-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,2,1f-5f,ff7f-20001\");\n    function flatten(values) {\n      return values.reduce(function(accum, value) {\n        value.forEach(function(value2) {\n          accum.push(value2);\n        });\n        return accum;\n      }, []);\n    }\n    function _nameprepTableA1(codepoint) {\n      return !!matchMap(codepoint, Table_A_1_ranges);\n    }\n    exports2._nameprepTableA1 = _nameprepTableA1;\n    function _nameprepTableB2(codepoint) {\n      var range = matchMap(codepoint, Table_B_2_ranges);\n      if (range) {\n        return [codepoint + range.s];\n      }\n      var codes = Table_B_2_lut_abs[codepoint];\n      if (codes) {\n        return codes;\n      }\n      var shift = Table_B_2_lut_rel[codepoint];\n      if (shift) {\n        return [codepoint + shift[0]];\n      }\n      var complex = Table_B_2_complex[codepoint];\n      if (complex) {\n        return complex;\n      }\n      return null;\n    }\n    exports2._nameprepTableB2 = _nameprepTableB2;\n    function _nameprepTableC(codepoint) {\n      return !!matchMap(codepoint, Table_C_ranges);\n    }\n    exports2._nameprepTableC = _nameprepTableC;\n    function nameprep(value) {\n      if (value.match(/^[a-z0-9-]*$/i) && value.length <= 59) {\n        return value.toLowerCase();\n      }\n      var codes = (0, utf8_1.toUtf8CodePoints)(value);\n      codes = flatten(codes.map(function(code) {\n        if (Table_B_1_flags.indexOf(code) >= 0) {\n          return [];\n        }\n        if (code >= 65024 && code <= 65039) {\n          return [];\n        }\n        var codesTableB2 = _nameprepTableB2(code);\n        if (codesTableB2) {\n          return codesTableB2;\n        }\n        return [code];\n      }));\n      codes = (0, utf8_1.toUtf8CodePoints)((0, utf8_1._toUtf8String)(codes), utf8_1.UnicodeNormalizationForm.NFKC);\n      codes.forEach(function(code) {\n        if (_nameprepTableC(code)) {\n          throw new Error(\"STRINGPREP_CONTAINS_PROHIBITED\");\n        }\n      });\n      codes.forEach(function(code) {\n        if (_nameprepTableA1(code)) {\n          throw new Error(\"STRINGPREP_CONTAINS_UNASSIGNED\");\n        }\n      });\n      var name2 = (0, utf8_1._toUtf8String)(codes);\n      if (name2.substring(0, 1) === \"-\" || name2.substring(2, 4) === \"--\" || name2.substring(name2.length - 1) === \"-\") {\n        throw new Error(\"invalid hyphen\");\n      }\n      if (name2.length > 63) {\n        throw new Error(\"too long\");\n      }\n      return name2;\n    }\n    exports2.nameprep = nameprep;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/index.js\nvar require_lib9 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.nameprep = exports2.parseBytes32String = exports2.formatBytes32String = exports2.UnicodeNormalizationForm = exports2.Utf8ErrorReason = exports2.Utf8ErrorFuncs = exports2.toUtf8String = exports2.toUtf8CodePoints = exports2.toUtf8Bytes = exports2._toEscapedUtf8String = void 0;\n    var bytes32_1 = require_bytes32();\n    Object.defineProperty(exports2, \"formatBytes32String\", { enumerable: true, get: function() {\n      return bytes32_1.formatBytes32String;\n    } });\n    Object.defineProperty(exports2, \"parseBytes32String\", { enumerable: true, get: function() {\n      return bytes32_1.parseBytes32String;\n    } });\n    var idna_1 = require_idna();\n    Object.defineProperty(exports2, \"nameprep\", { enumerable: true, get: function() {\n      return idna_1.nameprep;\n    } });\n    var utf8_1 = require_utf8();\n    Object.defineProperty(exports2, \"_toEscapedUtf8String\", { enumerable: true, get: function() {\n      return utf8_1._toEscapedUtf8String;\n    } });\n    Object.defineProperty(exports2, \"toUtf8Bytes\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8Bytes;\n    } });\n    Object.defineProperty(exports2, \"toUtf8CodePoints\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8CodePoints;\n    } });\n    Object.defineProperty(exports2, \"toUtf8String\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8String;\n    } });\n    Object.defineProperty(exports2, \"UnicodeNormalizationForm\", { enumerable: true, get: function() {\n      return utf8_1.UnicodeNormalizationForm;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorFuncs\", { enumerable: true, get: function() {\n      return utf8_1.Utf8ErrorFuncs;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorReason\", { enumerable: true, get: function() {\n      return utf8_1.Utf8ErrorReason;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/string.js\nvar require_string = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/string.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.StringCoder = void 0;\n    var strings_1 = require_lib9();\n    var bytes_1 = require_bytes();\n    var StringCoder = (\n      /** @class */\n      function(_super) {\n        __extends(StringCoder2, _super);\n        function StringCoder2(localName) {\n          return _super.call(this, \"string\", localName) || this;\n        }\n        StringCoder2.prototype.defaultValue = function() {\n          return \"\";\n        };\n        StringCoder2.prototype.encode = function(writer, value) {\n          return _super.prototype.encode.call(this, writer, (0, strings_1.toUtf8Bytes)(value));\n        };\n        StringCoder2.prototype.decode = function(reader) {\n          return (0, strings_1.toUtf8String)(_super.prototype.decode.call(this, reader));\n        };\n        return StringCoder2;\n      }(bytes_1.DynamicBytesCoder)\n    );\n    exports2.StringCoder = StringCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/tuple.js\nvar require_tuple = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/tuple.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TupleCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var array_1 = require_array();\n    var TupleCoder = (\n      /** @class */\n      function(_super) {\n        __extends(TupleCoder2, _super);\n        function TupleCoder2(coders, localName) {\n          var _this = this;\n          var dynamic = false;\n          var types = [];\n          coders.forEach(function(coder) {\n            if (coder.dynamic) {\n              dynamic = true;\n            }\n            types.push(coder.type);\n          });\n          var type = \"tuple(\" + types.join(\",\") + \")\";\n          _this = _super.call(this, \"tuple\", type, localName, dynamic) || this;\n          _this.coders = coders;\n          return _this;\n        }\n        TupleCoder2.prototype.defaultValue = function() {\n          var values = [];\n          this.coders.forEach(function(coder) {\n            values.push(coder.defaultValue());\n          });\n          var uniqueNames = this.coders.reduce(function(accum, coder) {\n            var name2 = coder.localName;\n            if (name2) {\n              if (!accum[name2]) {\n                accum[name2] = 0;\n              }\n              accum[name2]++;\n            }\n            return accum;\n          }, {});\n          this.coders.forEach(function(coder, index) {\n            var name2 = coder.localName;\n            if (!name2 || uniqueNames[name2] !== 1) {\n              return;\n            }\n            if (name2 === \"length\") {\n              name2 = \"_length\";\n            }\n            if (values[name2] != null) {\n              return;\n            }\n            values[name2] = values[index];\n          });\n          return Object.freeze(values);\n        };\n        TupleCoder2.prototype.encode = function(writer, value) {\n          return (0, array_1.pack)(writer, this.coders, value);\n        };\n        TupleCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, array_1.unpack)(reader, this.coders));\n        };\n        return TupleCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.TupleCoder = TupleCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/abi-coder.js\nvar require_abi_coder = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/abi-coder.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.defaultAbiCoder = exports2.AbiCoder = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var abstract_coder_1 = require_abstract_coder();\n    var address_1 = require_address();\n    var array_1 = require_array();\n    var boolean_1 = require_boolean();\n    var bytes_2 = require_bytes();\n    var fixed_bytes_1 = require_fixed_bytes();\n    var null_1 = require_null();\n    var number_1 = require_number();\n    var string_1 = require_string();\n    var tuple_1 = require_tuple();\n    var fragments_1 = require_fragments();\n    var paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);\n    var paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);\n    var AbiCoder = (\n      /** @class */\n      function() {\n        function AbiCoder2(coerceFunc) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, AbiCoder2);\n          (0, properties_1.defineReadOnly)(this, \"coerceFunc\", coerceFunc || null);\n        }\n        AbiCoder2.prototype._getCoder = function(param) {\n          var _this = this;\n          switch (param.baseType) {\n            case \"address\":\n              return new address_1.AddressCoder(param.name);\n            case \"bool\":\n              return new boolean_1.BooleanCoder(param.name);\n            case \"string\":\n              return new string_1.StringCoder(param.name);\n            case \"bytes\":\n              return new bytes_2.BytesCoder(param.name);\n            case \"array\":\n              return new array_1.ArrayCoder(this._getCoder(param.arrayChildren), param.arrayLength, param.name);\n            case \"tuple\":\n              return new tuple_1.TupleCoder((param.components || []).map(function(component) {\n                return _this._getCoder(component);\n              }), param.name);\n            case \"\":\n              return new null_1.NullCoder(param.name);\n          }\n          var match = param.type.match(paramTypeNumber);\n          if (match) {\n            var size = parseInt(match[2] || \"256\");\n            if (size === 0 || size > 256 || size % 8 !== 0) {\n              logger.throwArgumentError(\"invalid \" + match[1] + \" bit length\", \"param\", param);\n            }\n            return new number_1.NumberCoder(size / 8, match[1] === \"int\", param.name);\n          }\n          match = param.type.match(paramTypeBytes);\n          if (match) {\n            var size = parseInt(match[1]);\n            if (size === 0 || size > 32) {\n              logger.throwArgumentError(\"invalid bytes length\", \"param\", param);\n            }\n            return new fixed_bytes_1.FixedBytesCoder(size, param.name);\n          }\n          return logger.throwArgumentError(\"invalid type\", \"type\", param.type);\n        };\n        AbiCoder2.prototype._getWordSize = function() {\n          return 32;\n        };\n        AbiCoder2.prototype._getReader = function(data, allowLoose) {\n          return new abstract_coder_1.Reader(data, this._getWordSize(), this.coerceFunc, allowLoose);\n        };\n        AbiCoder2.prototype._getWriter = function() {\n          return new abstract_coder_1.Writer(this._getWordSize());\n        };\n        AbiCoder2.prototype.getDefaultValue = function(types) {\n          var _this = this;\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          return coder.defaultValue();\n        };\n        AbiCoder2.prototype.encode = function(types, values) {\n          var _this = this;\n          if (types.length !== values.length) {\n            logger.throwError(\"types/values length mismatch\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              count: { types: types.length, values: values.length },\n              value: { types, values }\n            });\n          }\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          var writer = this._getWriter();\n          coder.encode(writer, values);\n          return writer.data;\n        };\n        AbiCoder2.prototype.decode = function(types, data, loose) {\n          var _this = this;\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          return coder.decode(this._getReader((0, bytes_1.arrayify)(data), loose));\n        };\n        return AbiCoder2;\n      }()\n    );\n    exports2.AbiCoder = AbiCoder;\n    exports2.defaultAbiCoder = new AbiCoder();\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/id.js\nvar require_id = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/id.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.id = void 0;\n    var keccak256_1 = require_lib5();\n    var strings_1 = require_lib9();\n    function id(text) {\n      return (0, keccak256_1.keccak256)((0, strings_1.toUtf8Bytes)(text));\n    }\n    exports2.id = id;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/_version.js\nvar require_version9 = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"hash/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/namehash.js\nvar require_namehash = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/namehash.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.namehash = exports2.isValidName = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    var keccak256_1 = require_lib5();\n    var logger_1 = require_lib();\n    var _version_1 = require_version9();\n    var logger = new logger_1.Logger(_version_1.version);\n    var Zeros = new Uint8Array(32);\n    Zeros.fill(0);\n    var Partition = new RegExp(\"^((.*)\\\\.)?([^.]+)$\");\n    function isValidName(name2) {\n      try {\n        var comps = name2.split(\".\");\n        for (var i = 0; i < comps.length; i++) {\n          if ((0, strings_1.nameprep)(comps[i]).length === 0) {\n            throw new Error(\"empty\");\n          }\n        }\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isValidName = isValidName;\n    function namehash(name2) {\n      if (typeof name2 !== \"string\") {\n        logger.throwArgumentError(\"invalid ENS name; not a string\", \"name\", name2);\n      }\n      var current = name2;\n      var result2 = Zeros;\n      while (current.length) {\n        var partition = current.match(Partition);\n        if (partition == null || partition[2] === \"\") {\n          logger.throwArgumentError(\"invalid ENS address; missing component\", \"name\", name2);\n        }\n        var label = (0, strings_1.toUtf8Bytes)((0, strings_1.nameprep)(partition[3]));\n        result2 = (0, keccak256_1.keccak256)((0, bytes_1.concat)([result2, (0, keccak256_1.keccak256)(label)]));\n        current = partition[2] || \"\";\n      }\n      return (0, bytes_1.hexlify)(result2);\n    }\n    exports2.namehash = namehash;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/message.js\nvar require_message = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/message.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.hashMessage = exports2.messagePrefix = void 0;\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var strings_1 = require_lib9();\n    exports2.messagePrefix = \"\u0019Ethereum Signed Message:\\n\";\n    function hashMessage(message) {\n      if (typeof message === \"string\") {\n        message = (0, strings_1.toUtf8Bytes)(message);\n      }\n      return (0, keccak256_1.keccak256)((0, bytes_1.concat)([\n        (0, strings_1.toUtf8Bytes)(exports2.messagePrefix),\n        (0, strings_1.toUtf8Bytes)(String(message.length)),\n        message\n      ]));\n    }\n    exports2.hashMessage = hashMessage;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/typed-data.js\nvar require_typed_data = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/typed-data.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TypedDataEncoder = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version9();\n    var logger = new logger_1.Logger(_version_1.version);\n    var id_1 = require_id();\n    var padding = new Uint8Array(32);\n    padding.fill(0);\n    var NegativeOne = bignumber_1.BigNumber.from(-1);\n    var Zero = bignumber_1.BigNumber.from(0);\n    var One = bignumber_1.BigNumber.from(1);\n    var MaxUint256 = bignumber_1.BigNumber.from(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    function hexPadRight(value) {\n      var bytes = (0, bytes_1.arrayify)(value);\n      var padOffset = bytes.length % 32;\n      if (padOffset) {\n        return (0, bytes_1.hexConcat)([bytes, padding.slice(padOffset)]);\n      }\n      return (0, bytes_1.hexlify)(bytes);\n    }\n    var hexTrue = (0, bytes_1.hexZeroPad)(One.toHexString(), 32);\n    var hexFalse = (0, bytes_1.hexZeroPad)(Zero.toHexString(), 32);\n    var domainFieldTypes = {\n      name: \"string\",\n      version: \"string\",\n      chainId: \"uint256\",\n      verifyingContract: \"address\",\n      salt: \"bytes32\"\n    };\n    var domainFieldNames = [\n      \"name\",\n      \"version\",\n      \"chainId\",\n      \"verifyingContract\",\n      \"salt\"\n    ];\n    function checkString(key) {\n      return function(value) {\n        if (typeof value !== \"string\") {\n          logger.throwArgumentError(\"invalid domain value for \" + JSON.stringify(key), \"domain.\" + key, value);\n        }\n        return value;\n      };\n    }\n    var domainChecks = {\n      name: checkString(\"name\"),\n      version: checkString(\"version\"),\n      chainId: function(value) {\n        try {\n          return bignumber_1.BigNumber.from(value).toString();\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value for \"chainId\"', \"domain.chainId\", value);\n      },\n      verifyingContract: function(value) {\n        try {\n          return (0, address_1.getAddress)(value).toLowerCase();\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value \"verifyingContract\"', \"domain.verifyingContract\", value);\n      },\n      salt: function(value) {\n        try {\n          var bytes = (0, bytes_1.arrayify)(value);\n          if (bytes.length !== 32) {\n            throw new Error(\"bad length\");\n          }\n          return (0, bytes_1.hexlify)(bytes);\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value \"salt\"', \"domain.salt\", value);\n      }\n    };\n    function getBaseEncoder(type) {\n      {\n        var match = type.match(/^(u?)int(\\d*)$/);\n        if (match) {\n          var signed = match[1] === \"\";\n          var width = parseInt(match[2] || \"256\");\n          if (width % 8 !== 0 || width > 256 || match[2] && match[2] !== String(width)) {\n            logger.throwArgumentError(\"invalid numeric width\", \"type\", type);\n          }\n          var boundsUpper_1 = MaxUint256.mask(signed ? width - 1 : width);\n          var boundsLower_1 = signed ? boundsUpper_1.add(One).mul(NegativeOne) : Zero;\n          return function(value) {\n            var v = bignumber_1.BigNumber.from(value);\n            if (v.lt(boundsLower_1) || v.gt(boundsUpper_1)) {\n              logger.throwArgumentError(\"value out-of-bounds for \" + type, \"value\", value);\n            }\n            return (0, bytes_1.hexZeroPad)(v.toTwos(256).toHexString(), 32);\n          };\n        }\n      }\n      {\n        var match = type.match(/^bytes(\\d+)$/);\n        if (match) {\n          var width_1 = parseInt(match[1]);\n          if (width_1 === 0 || width_1 > 32 || match[1] !== String(width_1)) {\n            logger.throwArgumentError(\"invalid bytes width\", \"type\", type);\n          }\n          return function(value) {\n            var bytes = (0, bytes_1.arrayify)(value);\n            if (bytes.length !== width_1) {\n              logger.throwArgumentError(\"invalid length for \" + type, \"value\", value);\n            }\n            return hexPadRight(value);\n          };\n        }\n      }\n      switch (type) {\n        case \"address\":\n          return function(value) {\n            return (0, bytes_1.hexZeroPad)((0, address_1.getAddress)(value), 32);\n          };\n        case \"bool\":\n          return function(value) {\n            return !value ? hexFalse : hexTrue;\n          };\n        case \"bytes\":\n          return function(value) {\n            return (0, keccak256_1.keccak256)(value);\n          };\n        case \"string\":\n          return function(value) {\n            return (0, id_1.id)(value);\n          };\n      }\n      return null;\n    }\n    function encodeType(name2, fields) {\n      return name2 + \"(\" + fields.map(function(_a) {\n        var name3 = _a.name, type = _a.type;\n        return type + \" \" + name3;\n      }).join(\",\") + \")\";\n    }\n    var TypedDataEncoder = (\n      /** @class */\n      function() {\n        function TypedDataEncoder2(types) {\n          (0, properties_1.defineReadOnly)(this, \"types\", Object.freeze((0, properties_1.deepCopy)(types)));\n          (0, properties_1.defineReadOnly)(this, \"_encoderCache\", {});\n          (0, properties_1.defineReadOnly)(this, \"_types\", {});\n          var links = {};\n          var parents = {};\n          var subtypes = {};\n          Object.keys(types).forEach(function(type) {\n            links[type] = {};\n            parents[type] = [];\n            subtypes[type] = {};\n          });\n          var _loop_1 = function(name_12) {\n            var uniqueNames = {};\n            types[name_12].forEach(function(field) {\n              if (uniqueNames[field.name]) {\n                logger.throwArgumentError(\"duplicate variable name \" + JSON.stringify(field.name) + \" in \" + JSON.stringify(name_12), \"types\", types);\n              }\n              uniqueNames[field.name] = true;\n              var baseType = field.type.match(/^([^\\x5b]*)(\\x5b|$)/)[1];\n              if (baseType === name_12) {\n                logger.throwArgumentError(\"circular type reference to \" + JSON.stringify(baseType), \"types\", types);\n              }\n              var encoder = getBaseEncoder(baseType);\n              if (encoder) {\n                return;\n              }\n              if (!parents[baseType]) {\n                logger.throwArgumentError(\"unknown type \" + JSON.stringify(baseType), \"types\", types);\n              }\n              parents[baseType].push(name_12);\n              links[name_12][baseType] = true;\n            });\n          };\n          for (var name_1 in types) {\n            _loop_1(name_1);\n          }\n          var primaryTypes = Object.keys(parents).filter(function(n) {\n            return parents[n].length === 0;\n          });\n          if (primaryTypes.length === 0) {\n            logger.throwArgumentError(\"missing primary type\", \"types\", types);\n          } else if (primaryTypes.length > 1) {\n            logger.throwArgumentError(\"ambiguous primary types or unused types: \" + primaryTypes.map(function(t) {\n              return JSON.stringify(t);\n            }).join(\", \"), \"types\", types);\n          }\n          (0, properties_1.defineReadOnly)(this, \"primaryType\", primaryTypes[0]);\n          function checkCircular(type, found) {\n            if (found[type]) {\n              logger.throwArgumentError(\"circular type reference to \" + JSON.stringify(type), \"types\", types);\n            }\n            found[type] = true;\n            Object.keys(links[type]).forEach(function(child) {\n              if (!parents[child]) {\n                return;\n              }\n              checkCircular(child, found);\n              Object.keys(found).forEach(function(subtype) {\n                subtypes[subtype][child] = true;\n              });\n            });\n            delete found[type];\n          }\n          checkCircular(this.primaryType, {});\n          for (var name_2 in subtypes) {\n            var st = Object.keys(subtypes[name_2]);\n            st.sort();\n            this._types[name_2] = encodeType(name_2, types[name_2]) + st.map(function(t) {\n              return encodeType(t, types[t]);\n            }).join(\"\");\n          }\n        }\n        TypedDataEncoder2.prototype.getEncoder = function(type) {\n          var encoder = this._encoderCache[type];\n          if (!encoder) {\n            encoder = this._encoderCache[type] = this._getEncoder(type);\n          }\n          return encoder;\n        };\n        TypedDataEncoder2.prototype._getEncoder = function(type) {\n          var _this = this;\n          {\n            var encoder = getBaseEncoder(type);\n            if (encoder) {\n              return encoder;\n            }\n          }\n          var match = type.match(/^(.*)(\\x5b(\\d*)\\x5d)$/);\n          if (match) {\n            var subtype_1 = match[1];\n            var subEncoder_1 = this.getEncoder(subtype_1);\n            var length_1 = parseInt(match[3]);\n            return function(value) {\n              if (length_1 >= 0 && value.length !== length_1) {\n                logger.throwArgumentError(\"array length mismatch; expected length ${ arrayLength }\", \"value\", value);\n              }\n              var result2 = value.map(subEncoder_1);\n              if (_this._types[subtype_1]) {\n                result2 = result2.map(keccak256_1.keccak256);\n              }\n              return (0, keccak256_1.keccak256)((0, bytes_1.hexConcat)(result2));\n            };\n          }\n          var fields = this.types[type];\n          if (fields) {\n            var encodedType_1 = (0, id_1.id)(this._types[type]);\n            return function(value) {\n              var values = fields.map(function(_a) {\n                var name2 = _a.name, type2 = _a.type;\n                var result2 = _this.getEncoder(type2)(value[name2]);\n                if (_this._types[type2]) {\n                  return (0, keccak256_1.keccak256)(result2);\n                }\n                return result2;\n              });\n              values.unshift(encodedType_1);\n              return (0, bytes_1.hexConcat)(values);\n            };\n          }\n          return logger.throwArgumentError(\"unknown type: \" + type, \"type\", type);\n        };\n        TypedDataEncoder2.prototype.encodeType = function(name2) {\n          var result2 = this._types[name2];\n          if (!result2) {\n            logger.throwArgumentError(\"unknown type: \" + JSON.stringify(name2), \"name\", name2);\n          }\n          return result2;\n        };\n        TypedDataEncoder2.prototype.encodeData = function(type, value) {\n          return this.getEncoder(type)(value);\n        };\n        TypedDataEncoder2.prototype.hashStruct = function(name2, value) {\n          return (0, keccak256_1.keccak256)(this.encodeData(name2, value));\n        };\n        TypedDataEncoder2.prototype.encode = function(value) {\n          return this.encodeData(this.primaryType, value);\n        };\n        TypedDataEncoder2.prototype.hash = function(value) {\n          return this.hashStruct(this.primaryType, value);\n        };\n        TypedDataEncoder2.prototype._visit = function(type, value, callback) {\n          var _this = this;\n          {\n            var encoder = getBaseEncoder(type);\n            if (encoder) {\n              return callback(type, value);\n            }\n          }\n          var match = type.match(/^(.*)(\\x5b(\\d*)\\x5d)$/);\n          if (match) {\n            var subtype_2 = match[1];\n            var length_2 = parseInt(match[3]);\n            if (length_2 >= 0 && value.length !== length_2) {\n              logger.throwArgumentError(\"array length mismatch; expected length ${ arrayLength }\", \"value\", value);\n            }\n            return value.map(function(v) {\n              return _this._visit(subtype_2, v, callback);\n            });\n          }\n          var fields = this.types[type];\n          if (fields) {\n            return fields.reduce(function(accum, _a) {\n              var name2 = _a.name, type2 = _a.type;\n              accum[name2] = _this._visit(type2, value[name2], callback);\n              return accum;\n            }, {});\n          }\n          return logger.throwArgumentError(\"unknown type: \" + type, \"type\", type);\n        };\n        TypedDataEncoder2.prototype.visit = function(value, callback) {\n          return this._visit(this.primaryType, value, callback);\n        };\n        TypedDataEncoder2.from = function(types) {\n          return new TypedDataEncoder2(types);\n        };\n        TypedDataEncoder2.getPrimaryType = function(types) {\n          return TypedDataEncoder2.from(types).primaryType;\n        };\n        TypedDataEncoder2.hashStruct = function(name2, types, value) {\n          return TypedDataEncoder2.from(types).hashStruct(name2, value);\n        };\n        TypedDataEncoder2.hashDomain = function(domain) {\n          var domainFields = [];\n          for (var name_3 in domain) {\n            var type = domainFieldTypes[name_3];\n            if (!type) {\n              logger.throwArgumentError(\"invalid typed-data domain key: \" + JSON.stringify(name_3), \"domain\", domain);\n            }\n            domainFields.push({ name: name_3, type });\n          }\n          domainFields.sort(function(a, b) {\n            return domainFieldNames.indexOf(a.name) - domainFieldNames.indexOf(b.name);\n          });\n          return TypedDataEncoder2.hashStruct(\"EIP712Domain\", { EIP712Domain: domainFields }, domain);\n        };\n        TypedDataEncoder2.encode = function(domain, types, value) {\n          return (0, bytes_1.hexConcat)([\n            \"0x1901\",\n            TypedDataEncoder2.hashDomain(domain),\n            TypedDataEncoder2.from(types).hash(value)\n          ]);\n        };\n        TypedDataEncoder2.hash = function(domain, types, value) {\n          return (0, keccak256_1.keccak256)(TypedDataEncoder2.encode(domain, types, value));\n        };\n        TypedDataEncoder2.resolveNames = function(domain, types, value, resolveName) {\n          return __awaiter(this, void 0, void 0, function() {\n            var ensCache, encoder, _a, _b, _i, name_4, _c, _d;\n            return __generator(this, function(_e) {\n              switch (_e.label) {\n                case 0:\n                  domain = (0, properties_1.shallowCopy)(domain);\n                  ensCache = {};\n                  if (domain.verifyingContract && !(0, bytes_1.isHexString)(domain.verifyingContract, 20)) {\n                    ensCache[domain.verifyingContract] = \"0x\";\n                  }\n                  encoder = TypedDataEncoder2.from(types);\n                  encoder.visit(value, function(type, value2) {\n                    if (type === \"address\" && !(0, bytes_1.isHexString)(value2, 20)) {\n                      ensCache[value2] = \"0x\";\n                    }\n                    return value2;\n                  });\n                  _a = [];\n                  for (_b in ensCache)\n                    _a.push(_b);\n                  _i = 0;\n                  _e.label = 1;\n                case 1:\n                  if (!(_i < _a.length)) return [3, 4];\n                  name_4 = _a[_i];\n                  _c = ensCache;\n                  _d = name_4;\n                  return [4, resolveName(name_4)];\n                case 2:\n                  _c[_d] = _e.sent();\n                  _e.label = 3;\n                case 3:\n                  _i++;\n                  return [3, 1];\n                case 4:\n                  if (domain.verifyingContract && ensCache[domain.verifyingContract]) {\n                    domain.verifyingContract = ensCache[domain.verifyingContract];\n                  }\n                  value = encoder.visit(value, function(type, value2) {\n                    if (type === \"address\" && ensCache[value2]) {\n                      return ensCache[value2];\n                    }\n                    return value2;\n                  });\n                  return [2, { domain, value }];\n              }\n            });\n          });\n        };\n        TypedDataEncoder2.getPayload = function(domain, types, value) {\n          TypedDataEncoder2.hashDomain(domain);\n          var domainValues = {};\n          var domainTypes = [];\n          domainFieldNames.forEach(function(name2) {\n            var value2 = domain[name2];\n            if (value2 == null) {\n              return;\n            }\n            domainValues[name2] = domainChecks[name2](value2);\n            domainTypes.push({ name: name2, type: domainFieldTypes[name2] });\n          });\n          var encoder = TypedDataEncoder2.from(types);\n          var typesWithDomain = (0, properties_1.shallowCopy)(types);\n          if (typesWithDomain.EIP712Domain) {\n            logger.throwArgumentError(\"types must not contain EIP712Domain type\", \"types.EIP712Domain\", types);\n          } else {\n            typesWithDomain.EIP712Domain = domainTypes;\n          }\n          encoder.encode(value);\n          return {\n            types: typesWithDomain,\n            domain: domainValues,\n            primaryType: encoder.primaryType,\n            message: encoder.visit(value, function(type, value2) {\n              if (type.match(/^bytes(\\d*)/)) {\n                return (0, bytes_1.hexlify)((0, bytes_1.arrayify)(value2));\n              }\n              if (type.match(/^u?int/)) {\n                return bignumber_1.BigNumber.from(value2).toString();\n              }\n              switch (type) {\n                case \"address\":\n                  return value2.toLowerCase();\n                case \"bool\":\n                  return !!value2;\n                case \"string\":\n                  if (typeof value2 !== \"string\") {\n                    logger.throwArgumentError(\"invalid string\", \"value\", value2);\n                  }\n                  return value2;\n              }\n              return logger.throwArgumentError(\"unsupported type\", \"type\", type);\n            })\n          };\n        };\n        return TypedDataEncoder2;\n      }()\n    );\n    exports2.TypedDataEncoder = TypedDataEncoder;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/index.js\nvar require_lib10 = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._TypedDataEncoder = exports2.hashMessage = exports2.messagePrefix = exports2.isValidName = exports2.namehash = exports2.id = void 0;\n    var id_1 = require_id();\n    Object.defineProperty(exports2, \"id\", { enumerable: true, get: function() {\n      return id_1.id;\n    } });\n    var namehash_1 = require_namehash();\n    Object.defineProperty(exports2, \"isValidName\", { enumerable: true, get: function() {\n      return namehash_1.isValidName;\n    } });\n    Object.defineProperty(exports2, \"namehash\", { enumerable: true, get: function() {\n      return namehash_1.namehash;\n    } });\n    var message_1 = require_message();\n    Object.defineProperty(exports2, \"hashMessage\", { enumerable: true, get: function() {\n      return message_1.hashMessage;\n    } });\n    Object.defineProperty(exports2, \"messagePrefix\", { enumerable: true, get: function() {\n      return message_1.messagePrefix;\n    } });\n    var typed_data_1 = require_typed_data();\n    Object.defineProperty(exports2, \"_TypedDataEncoder\", { enumerable: true, get: function() {\n      return typed_data_1.TypedDataEncoder;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/interface.js\nvar require_interface = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/interface.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Interface = exports2.Indexed = exports2.ErrorDescription = exports2.TransactionDescription = exports2.LogDescription = exports2.checkResultErrors = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var abi_coder_1 = require_abi_coder();\n    var abstract_coder_1 = require_abstract_coder();\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return abstract_coder_1.checkResultErrors;\n    } });\n    var fragments_1 = require_fragments();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var LogDescription = (\n      /** @class */\n      function(_super) {\n        __extends(LogDescription2, _super);\n        function LogDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return LogDescription2;\n      }(properties_1.Description)\n    );\n    exports2.LogDescription = LogDescription;\n    var TransactionDescription = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionDescription2, _super);\n        function TransactionDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return TransactionDescription2;\n      }(properties_1.Description)\n    );\n    exports2.TransactionDescription = TransactionDescription;\n    var ErrorDescription = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorDescription2, _super);\n        function ErrorDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return ErrorDescription2;\n      }(properties_1.Description)\n    );\n    exports2.ErrorDescription = ErrorDescription;\n    var Indexed = (\n      /** @class */\n      function(_super) {\n        __extends(Indexed2, _super);\n        function Indexed2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        Indexed2.isIndexed = function(value) {\n          return !!(value && value._isIndexed);\n        };\n        return Indexed2;\n      }(properties_1.Description)\n    );\n    exports2.Indexed = Indexed;\n    var BuiltinErrors = {\n      \"0x08c379a0\": { signature: \"Error(string)\", name: \"Error\", inputs: [\"string\"], reason: true },\n      \"0x4e487b71\": { signature: \"Panic(uint256)\", name: \"Panic\", inputs: [\"uint256\"] }\n    };\n    function wrapAccessError(property, error) {\n      var wrap = new Error(\"deferred error during ABI decoding triggered accessing \" + property);\n      wrap.error = error;\n      return wrap;\n    }\n    var Interface = (\n      /** @class */\n      function() {\n        function Interface2(fragments) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Interface2);\n          var abi = [];\n          if (typeof fragments === \"string\") {\n            abi = JSON.parse(fragments);\n          } else {\n            abi = fragments;\n          }\n          (0, properties_1.defineReadOnly)(this, \"fragments\", abi.map(function(fragment) {\n            return fragments_1.Fragment.from(fragment);\n          }).filter(function(fragment) {\n            return fragment != null;\n          }));\n          (0, properties_1.defineReadOnly)(this, \"_abiCoder\", (0, properties_1.getStatic)(_newTarget, \"getAbiCoder\")());\n          (0, properties_1.defineReadOnly)(this, \"functions\", {});\n          (0, properties_1.defineReadOnly)(this, \"errors\", {});\n          (0, properties_1.defineReadOnly)(this, \"events\", {});\n          (0, properties_1.defineReadOnly)(this, \"structs\", {});\n          this.fragments.forEach(function(fragment) {\n            var bucket = null;\n            switch (fragment.type) {\n              case \"constructor\":\n                if (_this.deploy) {\n                  logger.warn(\"duplicate definition - constructor\");\n                  return;\n                }\n                (0, properties_1.defineReadOnly)(_this, \"deploy\", fragment);\n                return;\n              case \"function\":\n                bucket = _this.functions;\n                break;\n              case \"event\":\n                bucket = _this.events;\n                break;\n              case \"error\":\n                bucket = _this.errors;\n                break;\n              default:\n                return;\n            }\n            var signature = fragment.format();\n            if (bucket[signature]) {\n              logger.warn(\"duplicate definition - \" + signature);\n              return;\n            }\n            bucket[signature] = fragment;\n          });\n          if (!this.deploy) {\n            (0, properties_1.defineReadOnly)(this, \"deploy\", fragments_1.ConstructorFragment.from({\n              payable: false,\n              type: \"constructor\"\n            }));\n          }\n          (0, properties_1.defineReadOnly)(this, \"_isInterface\", true);\n        }\n        Interface2.prototype.format = function(format) {\n          if (!format) {\n            format = fragments_1.FormatTypes.full;\n          }\n          if (format === fragments_1.FormatTypes.sighash) {\n            logger.throwArgumentError(\"interface does not support formatting sighash\", \"format\", format);\n          }\n          var abi = this.fragments.map(function(fragment) {\n            return fragment.format(format);\n          });\n          if (format === fragments_1.FormatTypes.json) {\n            return JSON.stringify(abi.map(function(j) {\n              return JSON.parse(j);\n            }));\n          }\n          return abi;\n        };\n        Interface2.getAbiCoder = function() {\n          return abi_coder_1.defaultAbiCoder;\n        };\n        Interface2.getAddress = function(address) {\n          return (0, address_1.getAddress)(address);\n        };\n        Interface2.getSighash = function(fragment) {\n          return (0, bytes_1.hexDataSlice)((0, hash_1.id)(fragment.format()), 0, 4);\n        };\n        Interface2.getEventTopic = function(eventFragment) {\n          return (0, hash_1.id)(eventFragment.format());\n        };\n        Interface2.prototype.getFunction = function(nameOrSignatureOrSighash) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrSighash)) {\n            for (var name_1 in this.functions) {\n              if (nameOrSignatureOrSighash === this.getSighash(name_1)) {\n                return this.functions[name_1];\n              }\n            }\n            logger.throwArgumentError(\"no matching function\", \"sighash\", nameOrSignatureOrSighash);\n          }\n          if (nameOrSignatureOrSighash.indexOf(\"(\") === -1) {\n            var name_2 = nameOrSignatureOrSighash.trim();\n            var matching = Object.keys(this.functions).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_2;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching function\", \"name\", name_2);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching functions\", \"name\", name_2);\n            }\n            return this.functions[matching[0]];\n          }\n          var result2 = this.functions[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()];\n          if (!result2) {\n            logger.throwArgumentError(\"no matching function\", \"signature\", nameOrSignatureOrSighash);\n          }\n          return result2;\n        };\n        Interface2.prototype.getEvent = function(nameOrSignatureOrTopic) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrTopic)) {\n            var topichash = nameOrSignatureOrTopic.toLowerCase();\n            for (var name_3 in this.events) {\n              if (topichash === this.getEventTopic(name_3)) {\n                return this.events[name_3];\n              }\n            }\n            logger.throwArgumentError(\"no matching event\", \"topichash\", topichash);\n          }\n          if (nameOrSignatureOrTopic.indexOf(\"(\") === -1) {\n            var name_4 = nameOrSignatureOrTopic.trim();\n            var matching = Object.keys(this.events).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_4;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching event\", \"name\", name_4);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching events\", \"name\", name_4);\n            }\n            return this.events[matching[0]];\n          }\n          var result2 = this.events[fragments_1.EventFragment.fromString(nameOrSignatureOrTopic).format()];\n          if (!result2) {\n            logger.throwArgumentError(\"no matching event\", \"signature\", nameOrSignatureOrTopic);\n          }\n          return result2;\n        };\n        Interface2.prototype.getError = function(nameOrSignatureOrSighash) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrSighash)) {\n            var getSighash = (0, properties_1.getStatic)(this.constructor, \"getSighash\");\n            for (var name_5 in this.errors) {\n              var error = this.errors[name_5];\n              if (nameOrSignatureOrSighash === getSighash(error)) {\n                return this.errors[name_5];\n              }\n            }\n            logger.throwArgumentError(\"no matching error\", \"sighash\", nameOrSignatureOrSighash);\n          }\n          if (nameOrSignatureOrSighash.indexOf(\"(\") === -1) {\n            var name_6 = nameOrSignatureOrSighash.trim();\n            var matching = Object.keys(this.errors).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_6;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching error\", \"name\", name_6);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching errors\", \"name\", name_6);\n            }\n            return this.errors[matching[0]];\n          }\n          var result2 = this.errors[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()];\n          if (!result2) {\n            logger.throwArgumentError(\"no matching error\", \"signature\", nameOrSignatureOrSighash);\n          }\n          return result2;\n        };\n        Interface2.prototype.getSighash = function(fragment) {\n          if (typeof fragment === \"string\") {\n            try {\n              fragment = this.getFunction(fragment);\n            } catch (error) {\n              try {\n                fragment = this.getError(fragment);\n              } catch (_) {\n                throw error;\n              }\n            }\n          }\n          return (0, properties_1.getStatic)(this.constructor, \"getSighash\")(fragment);\n        };\n        Interface2.prototype.getEventTopic = function(eventFragment) {\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          return (0, properties_1.getStatic)(this.constructor, \"getEventTopic\")(eventFragment);\n        };\n        Interface2.prototype._decodeParams = function(params2, data) {\n          return this._abiCoder.decode(params2, data);\n        };\n        Interface2.prototype._encodeParams = function(params2, values) {\n          return this._abiCoder.encode(params2, values);\n        };\n        Interface2.prototype.encodeDeploy = function(values) {\n          return this._encodeParams(this.deploy.inputs, values || []);\n        };\n        Interface2.prototype.decodeErrorResult = function(fragment, data) {\n          if (typeof fragment === \"string\") {\n            fragment = this.getError(fragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          if ((0, bytes_1.hexlify)(bytes.slice(0, 4)) !== this.getSighash(fragment)) {\n            logger.throwArgumentError(\"data signature does not match error \" + fragment.name + \".\", \"data\", (0, bytes_1.hexlify)(bytes));\n          }\n          return this._decodeParams(fragment.inputs, bytes.slice(4));\n        };\n        Interface2.prototype.encodeErrorResult = function(fragment, values) {\n          if (typeof fragment === \"string\") {\n            fragment = this.getError(fragment);\n          }\n          return (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.getSighash(fragment),\n            this._encodeParams(fragment.inputs, values || [])\n          ]));\n        };\n        Interface2.prototype.decodeFunctionData = function(functionFragment, data) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          if ((0, bytes_1.hexlify)(bytes.slice(0, 4)) !== this.getSighash(functionFragment)) {\n            logger.throwArgumentError(\"data signature does not match function \" + functionFragment.name + \".\", \"data\", (0, bytes_1.hexlify)(bytes));\n          }\n          return this._decodeParams(functionFragment.inputs, bytes.slice(4));\n        };\n        Interface2.prototype.encodeFunctionData = function(functionFragment, values) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          return (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.getSighash(functionFragment),\n            this._encodeParams(functionFragment.inputs, values || [])\n          ]));\n        };\n        Interface2.prototype.decodeFunctionResult = function(functionFragment, data) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          var reason = null;\n          var errorArgs = null;\n          var errorName = null;\n          var errorSignature = null;\n          switch (bytes.length % this._abiCoder._getWordSize()) {\n            case 0:\n              try {\n                return this._abiCoder.decode(functionFragment.outputs, bytes);\n              } catch (error2) {\n              }\n              break;\n            case 4: {\n              var selector = (0, bytes_1.hexlify)(bytes.slice(0, 4));\n              var builtin = BuiltinErrors[selector];\n              if (builtin) {\n                errorArgs = this._abiCoder.decode(builtin.inputs, bytes.slice(4));\n                errorName = builtin.name;\n                errorSignature = builtin.signature;\n                if (builtin.reason) {\n                  reason = errorArgs[0];\n                }\n              } else {\n                try {\n                  var error = this.getError(selector);\n                  errorArgs = this._abiCoder.decode(error.inputs, bytes.slice(4));\n                  errorName = error.name;\n                  errorSignature = error.format();\n                } catch (error2) {\n                  console.log(error2);\n                }\n              }\n              break;\n            }\n          }\n          return logger.throwError(\"call revert exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n            method: functionFragment.format(),\n            errorArgs,\n            errorName,\n            errorSignature,\n            reason\n          });\n        };\n        Interface2.prototype.encodeFunctionResult = function(functionFragment, values) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          return (0, bytes_1.hexlify)(this._abiCoder.encode(functionFragment.outputs, values || []));\n        };\n        Interface2.prototype.encodeFilterTopics = function(eventFragment, values) {\n          var _this = this;\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          if (values.length > eventFragment.inputs.length) {\n            logger.throwError(\"too many arguments for \" + eventFragment.format(), logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {\n              argument: \"values\",\n              value: values\n            });\n          }\n          var topics = [];\n          if (!eventFragment.anonymous) {\n            topics.push(this.getEventTopic(eventFragment));\n          }\n          var encodeTopic = function(param, value) {\n            if (param.type === \"string\") {\n              return (0, hash_1.id)(value);\n            } else if (param.type === \"bytes\") {\n              return (0, keccak256_1.keccak256)((0, bytes_1.hexlify)(value));\n            }\n            if (param.type === \"address\") {\n              _this._abiCoder.encode([\"address\"], [value]);\n            }\n            return (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(value), 32);\n          };\n          values.forEach(function(value, index) {\n            var param = eventFragment.inputs[index];\n            if (!param.indexed) {\n              if (value != null) {\n                logger.throwArgumentError(\"cannot filter non-indexed parameters; must be null\", \"contract.\" + param.name, value);\n              }\n              return;\n            }\n            if (value == null) {\n              topics.push(null);\n            } else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n              logger.throwArgumentError(\"filtering with tuples or arrays not supported\", \"contract.\" + param.name, value);\n            } else if (Array.isArray(value)) {\n              topics.push(value.map(function(value2) {\n                return encodeTopic(param, value2);\n              }));\n            } else {\n              topics.push(encodeTopic(param, value));\n            }\n          });\n          while (topics.length && topics[topics.length - 1] === null) {\n            topics.pop();\n          }\n          return topics;\n        };\n        Interface2.prototype.encodeEventLog = function(eventFragment, values) {\n          var _this = this;\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          var topics = [];\n          var dataTypes = [];\n          var dataValues = [];\n          if (!eventFragment.anonymous) {\n            topics.push(this.getEventTopic(eventFragment));\n          }\n          if (values.length !== eventFragment.inputs.length) {\n            logger.throwArgumentError(\"event arguments/values mismatch\", \"values\", values);\n          }\n          eventFragment.inputs.forEach(function(param, index) {\n            var value = values[index];\n            if (param.indexed) {\n              if (param.type === \"string\") {\n                topics.push((0, hash_1.id)(value));\n              } else if (param.type === \"bytes\") {\n                topics.push((0, keccak256_1.keccak256)(value));\n              } else if (param.baseType === \"tuple\" || param.baseType === \"array\") {\n                throw new Error(\"not implemented\");\n              } else {\n                topics.push(_this._abiCoder.encode([param.type], [value]));\n              }\n            } else {\n              dataTypes.push(param);\n              dataValues.push(value);\n            }\n          });\n          return {\n            data: this._abiCoder.encode(dataTypes, dataValues),\n            topics\n          };\n        };\n        Interface2.prototype.decodeEventLog = function(eventFragment, data, topics) {\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          if (topics != null && !eventFragment.anonymous) {\n            var topicHash = this.getEventTopic(eventFragment);\n            if (!(0, bytes_1.isHexString)(topics[0], 32) || topics[0].toLowerCase() !== topicHash) {\n              logger.throwError(\"fragment/topic mismatch\", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: \"topics[0]\", expected: topicHash, value: topics[0] });\n            }\n            topics = topics.slice(1);\n          }\n          var indexed = [];\n          var nonIndexed = [];\n          var dynamic = [];\n          eventFragment.inputs.forEach(function(param, index) {\n            if (param.indexed) {\n              if (param.type === \"string\" || param.type === \"bytes\" || param.baseType === \"tuple\" || param.baseType === \"array\") {\n                indexed.push(fragments_1.ParamType.fromObject({ type: \"bytes32\", name: param.name }));\n                dynamic.push(true);\n              } else {\n                indexed.push(param);\n                dynamic.push(false);\n              }\n            } else {\n              nonIndexed.push(param);\n              dynamic.push(false);\n            }\n          });\n          var resultIndexed = topics != null ? this._abiCoder.decode(indexed, (0, bytes_1.concat)(topics)) : null;\n          var resultNonIndexed = this._abiCoder.decode(nonIndexed, data, true);\n          var result2 = [];\n          var nonIndexedIndex = 0, indexedIndex = 0;\n          eventFragment.inputs.forEach(function(param, index) {\n            if (param.indexed) {\n              if (resultIndexed == null) {\n                result2[index] = new Indexed({ _isIndexed: true, hash: null });\n              } else if (dynamic[index]) {\n                result2[index] = new Indexed({ _isIndexed: true, hash: resultIndexed[indexedIndex++] });\n              } else {\n                try {\n                  result2[index] = resultIndexed[indexedIndex++];\n                } catch (error) {\n                  result2[index] = error;\n                }\n              }\n            } else {\n              try {\n                result2[index] = resultNonIndexed[nonIndexedIndex++];\n              } catch (error) {\n                result2[index] = error;\n              }\n            }\n            if (param.name && result2[param.name] == null) {\n              var value_1 = result2[index];\n              if (value_1 instanceof Error) {\n                Object.defineProperty(result2, param.name, {\n                  enumerable: true,\n                  get: function() {\n                    throw wrapAccessError(\"property \" + JSON.stringify(param.name), value_1);\n                  }\n                });\n              } else {\n                result2[param.name] = value_1;\n              }\n            }\n          });\n          var _loop_1 = function(i2) {\n            var value = result2[i2];\n            if (value instanceof Error) {\n              Object.defineProperty(result2, i2, {\n                enumerable: true,\n                get: function() {\n                  throw wrapAccessError(\"index \" + i2, value);\n                }\n              });\n            }\n          };\n          for (var i = 0; i < result2.length; i++) {\n            _loop_1(i);\n          }\n          return Object.freeze(result2);\n        };\n        Interface2.prototype.parseTransaction = function(tx) {\n          var fragment = this.getFunction(tx.data.substring(0, 10).toLowerCase());\n          if (!fragment) {\n            return null;\n          }\n          return new TransactionDescription({\n            args: this._abiCoder.decode(fragment.inputs, \"0x\" + tx.data.substring(10)),\n            functionFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            sighash: this.getSighash(fragment),\n            value: bignumber_1.BigNumber.from(tx.value || \"0\")\n          });\n        };\n        Interface2.prototype.parseLog = function(log) {\n          var fragment = this.getEvent(log.topics[0]);\n          if (!fragment || fragment.anonymous) {\n            return null;\n          }\n          return new LogDescription({\n            eventFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            topic: this.getEventTopic(fragment),\n            args: this.decodeEventLog(fragment, log.data, log.topics)\n          });\n        };\n        Interface2.prototype.parseError = function(data) {\n          var hexData = (0, bytes_1.hexlify)(data);\n          var fragment = this.getError(hexData.substring(0, 10).toLowerCase());\n          if (!fragment) {\n            return null;\n          }\n          return new ErrorDescription({\n            args: this._abiCoder.decode(fragment.inputs, \"0x\" + hexData.substring(10)),\n            errorFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            sighash: this.getSighash(fragment)\n          });\n        };\n        Interface2.isInterface = function(value) {\n          return !!(value && value._isInterface);\n        };\n        return Interface2;\n      }()\n    );\n    exports2.Interface = Interface;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/index.js\nvar require_lib11 = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TransactionDescription = exports2.LogDescription = exports2.checkResultErrors = exports2.Indexed = exports2.Interface = exports2.defaultAbiCoder = exports2.AbiCoder = exports2.FormatTypes = exports2.ParamType = exports2.FunctionFragment = exports2.Fragment = exports2.EventFragment = exports2.ErrorFragment = exports2.ConstructorFragment = void 0;\n    var fragments_1 = require_fragments();\n    Object.defineProperty(exports2, \"ConstructorFragment\", { enumerable: true, get: function() {\n      return fragments_1.ConstructorFragment;\n    } });\n    Object.defineProperty(exports2, \"ErrorFragment\", { enumerable: true, get: function() {\n      return fragments_1.ErrorFragment;\n    } });\n    Object.defineProperty(exports2, \"EventFragment\", { enumerable: true, get: function() {\n      return fragments_1.EventFragment;\n    } });\n    Object.defineProperty(exports2, \"FormatTypes\", { enumerable: true, get: function() {\n      return fragments_1.FormatTypes;\n    } });\n    Object.defineProperty(exports2, \"Fragment\", { enumerable: true, get: function() {\n      return fragments_1.Fragment;\n    } });\n    Object.defineProperty(exports2, \"FunctionFragment\", { enumerable: true, get: function() {\n      return fragments_1.FunctionFragment;\n    } });\n    Object.defineProperty(exports2, \"ParamType\", { enumerable: true, get: function() {\n      return fragments_1.ParamType;\n    } });\n    var abi_coder_1 = require_abi_coder();\n    Object.defineProperty(exports2, \"AbiCoder\", { enumerable: true, get: function() {\n      return abi_coder_1.AbiCoder;\n    } });\n    Object.defineProperty(exports2, \"defaultAbiCoder\", { enumerable: true, get: function() {\n      return abi_coder_1.defaultAbiCoder;\n    } });\n    var interface_1 = require_interface();\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return interface_1.checkResultErrors;\n    } });\n    Object.defineProperty(exports2, \"Indexed\", { enumerable: true, get: function() {\n      return interface_1.Indexed;\n    } });\n    Object.defineProperty(exports2, \"Interface\", { enumerable: true, get: function() {\n      return interface_1.Interface;\n    } });\n    Object.defineProperty(exports2, \"LogDescription\", { enumerable: true, get: function() {\n      return interface_1.LogDescription;\n    } });\n    Object.defineProperty(exports2, \"TransactionDescription\", { enumerable: true, get: function() {\n      return interface_1.TransactionDescription;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abstract-provider/lib/_version.js\nvar require_version10 = __commonJS({\n  \"node_modules/@ethersproject/abstract-provider/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abstract-provider/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/abstract-provider/lib/index.js\nvar require_lib12 = __commonJS({\n  \"node_modules/@ethersproject/abstract-provider/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Provider = exports2.TransactionOrderForkEvent = exports2.TransactionForkEvent = exports2.BlockForkEvent = exports2.ForkEvent = void 0;\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version10();\n    var logger = new logger_1.Logger(_version_1.version);\n    var ForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(ForkEvent2, _super);\n        function ForkEvent2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ForkEvent2.isForkEvent = function(value) {\n          return !!(value && value._isForkEvent);\n        };\n        return ForkEvent2;\n      }(properties_1.Description)\n    );\n    exports2.ForkEvent = ForkEvent;\n    var BlockForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(BlockForkEvent2, _super);\n        function BlockForkEvent2(blockHash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(blockHash, 32)) {\n            logger.throwArgumentError(\"invalid blockHash\", \"blockHash\", blockHash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isBlockForkEvent: true,\n            expiry: expiry || 0,\n            blockHash\n          }) || this;\n          return _this;\n        }\n        return BlockForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.BlockForkEvent = BlockForkEvent;\n    var TransactionForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionForkEvent2, _super);\n        function TransactionForkEvent2(hash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(hash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"hash\", hash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isTransactionForkEvent: true,\n            expiry: expiry || 0,\n            hash\n          }) || this;\n          return _this;\n        }\n        return TransactionForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.TransactionForkEvent = TransactionForkEvent;\n    var TransactionOrderForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionOrderForkEvent2, _super);\n        function TransactionOrderForkEvent2(beforeHash, afterHash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(beforeHash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"beforeHash\", beforeHash);\n          }\n          if (!(0, bytes_1.isHexString)(afterHash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"afterHash\", afterHash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isTransactionOrderForkEvent: true,\n            expiry: expiry || 0,\n            beforeHash,\n            afterHash\n          }) || this;\n          return _this;\n        }\n        return TransactionOrderForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.TransactionOrderForkEvent = TransactionOrderForkEvent;\n    var Provider = (\n      /** @class */\n      function() {\n        function Provider2() {\n          var _newTarget = this.constructor;\n          logger.checkAbstract(_newTarget, Provider2);\n          (0, properties_1.defineReadOnly)(this, \"_isProvider\", true);\n        }\n        Provider2.prototype.getFeeData = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var _a, block, gasPrice, maxFeePerGas, maxPriorityFeePerGas;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, (0, properties_1.resolveProperties)({\n                    block: this.getBlock(\"latest\"),\n                    gasPrice: this.getGasPrice().catch(function(error) {\n                      return null;\n                    })\n                  })];\n                case 1:\n                  _a = _b.sent(), block = _a.block, gasPrice = _a.gasPrice;\n                  maxFeePerGas = null, maxPriorityFeePerGas = null;\n                  if (block && block.baseFeePerGas) {\n                    maxPriorityFeePerGas = bignumber_1.BigNumber.from(\"2500000000\");\n                    maxFeePerGas = block.baseFeePerGas.mul(2).add(maxPriorityFeePerGas);\n                  }\n                  return [2, { maxFeePerGas, maxPriorityFeePerGas, gasPrice }];\n              }\n            });\n          });\n        };\n        Provider2.prototype.addListener = function(eventName, listener) {\n          return this.on(eventName, listener);\n        };\n        Provider2.prototype.removeListener = function(eventName, listener) {\n          return this.off(eventName, listener);\n        };\n        Provider2.isProvider = function(value) {\n          return !!(value && value._isProvider);\n        };\n        return Provider2;\n      }()\n    );\n    exports2.Provider = Provider;\n  }\n});\n\n// node_modules/@ethersproject/abstract-signer/lib/_version.js\nvar require_version11 = __commonJS({\n  \"node_modules/@ethersproject/abstract-signer/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abstract-signer/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/abstract-signer/lib/index.js\nvar require_lib13 = __commonJS({\n  \"node_modules/@ethersproject/abstract-signer/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.VoidSigner = exports2.Signer = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version11();\n    var logger = new logger_1.Logger(_version_1.version);\n    var allowedTransactionKeys = [\n      \"accessList\",\n      \"chainId\",\n      \"customData\",\n      \"data\",\n      \"from\",\n      \"gasLimit\",\n      \"gasPrice\",\n      \"maxFeePerGas\",\n      \"maxPriorityFeePerGas\",\n      \"nonce\",\n      \"to\",\n      \"type\",\n      \"value\"\n    ];\n    var forwardErrors = [\n      logger_1.Logger.errors.INSUFFICIENT_FUNDS,\n      logger_1.Logger.errors.NONCE_EXPIRED,\n      logger_1.Logger.errors.REPLACEMENT_UNDERPRICED\n    ];\n    var Signer = (\n      /** @class */\n      function() {\n        function Signer2() {\n          var _newTarget = this.constructor;\n          logger.checkAbstract(_newTarget, Signer2);\n          (0, properties_1.defineReadOnly)(this, \"_isSigner\", true);\n        }\n        Signer2.prototype.getBalance = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getBalance\");\n                  return [4, this.provider.getBalance(this.getAddress(), blockTag)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getTransactionCount = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getTransactionCount\");\n                  return [4, this.provider.getTransactionCount(this.getAddress(), blockTag)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.estimateGas = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"estimateGas\");\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.provider.estimateGas(tx)];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.call = function(transaction, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"call\");\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.provider.call(tx, blockTag)];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.sendTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, signedTx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"sendTransaction\");\n                  return [4, this.populateTransaction(transaction)];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.signTransaction(tx)];\n                case 2:\n                  signedTx = _a.sent();\n                  return [4, this.provider.sendTransaction(signedTx)];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getChainId = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getChainId\");\n                  return [4, this.provider.getNetwork()];\n                case 1:\n                  network = _a.sent();\n                  return [2, network.chainId];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getGasPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getGasPrice\");\n                  return [4, this.provider.getGasPrice()];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getFeeData = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getFeeData\");\n                  return [4, this.provider.getFeeData()];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.resolveName = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"resolveName\");\n                  return [4, this.provider.resolveName(name2)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.checkTransaction = function(transaction) {\n          for (var key in transaction) {\n            if (allowedTransactionKeys.indexOf(key) === -1) {\n              logger.throwArgumentError(\"invalid transaction key: \" + key, \"transaction\", transaction);\n            }\n          }\n          var tx = (0, properties_1.shallowCopy)(transaction);\n          if (tx.from == null) {\n            tx.from = this.getAddress();\n          } else {\n            tx.from = Promise.all([\n              Promise.resolve(tx.from),\n              this.getAddress()\n            ]).then(function(result2) {\n              if (result2[0].toLowerCase() !== result2[1].toLowerCase()) {\n                logger.throwArgumentError(\"from address mismatch\", \"transaction\", transaction);\n              }\n              return result2[0];\n            });\n          }\n          return tx;\n        };\n        Signer2.prototype.populateTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, hasEip1559, feeData, gasPrice;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  if (tx.to != null) {\n                    tx.to = Promise.resolve(tx.to).then(function(to) {\n                      return __awaiter(_this, void 0, void 0, function() {\n                        var address;\n                        return __generator(this, function(_a2) {\n                          switch (_a2.label) {\n                            case 0:\n                              if (to == null) {\n                                return [2, null];\n                              }\n                              return [4, this.resolveName(to)];\n                            case 1:\n                              address = _a2.sent();\n                              if (address == null) {\n                                logger.throwArgumentError(\"provided ENS name resolves to null\", \"tx.to\", to);\n                              }\n                              return [2, address];\n                          }\n                        });\n                      });\n                    });\n                    tx.to.catch(function(error) {\n                    });\n                  }\n                  hasEip1559 = tx.maxFeePerGas != null || tx.maxPriorityFeePerGas != null;\n                  if (tx.gasPrice != null && (tx.type === 2 || hasEip1559)) {\n                    logger.throwArgumentError(\"eip-1559 transaction do not support gasPrice\", \"transaction\", transaction);\n                  } else if ((tx.type === 0 || tx.type === 1) && hasEip1559) {\n                    logger.throwArgumentError(\"pre-eip-1559 transaction do not support maxFeePerGas/maxPriorityFeePerGas\", \"transaction\", transaction);\n                  }\n                  if (!((tx.type === 2 || tx.type == null) && (tx.maxFeePerGas != null && tx.maxPriorityFeePerGas != null))) return [3, 2];\n                  tx.type = 2;\n                  return [3, 5];\n                case 2:\n                  if (!(tx.type === 0 || tx.type === 1)) return [3, 3];\n                  if (tx.gasPrice == null) {\n                    tx.gasPrice = this.getGasPrice();\n                  }\n                  return [3, 5];\n                case 3:\n                  return [4, this.getFeeData()];\n                case 4:\n                  feeData = _a.sent();\n                  if (tx.type == null) {\n                    if (feeData.maxFeePerGas != null && feeData.maxPriorityFeePerGas != null) {\n                      tx.type = 2;\n                      if (tx.gasPrice != null) {\n                        gasPrice = tx.gasPrice;\n                        delete tx.gasPrice;\n                        tx.maxFeePerGas = gasPrice;\n                        tx.maxPriorityFeePerGas = gasPrice;\n                      } else {\n                        if (tx.maxFeePerGas == null) {\n                          tx.maxFeePerGas = feeData.maxFeePerGas;\n                        }\n                        if (tx.maxPriorityFeePerGas == null) {\n                          tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n                        }\n                      }\n                    } else if (feeData.gasPrice != null) {\n                      if (hasEip1559) {\n                        logger.throwError(\"network does not support EIP-1559\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                          operation: \"populateTransaction\"\n                        });\n                      }\n                      if (tx.gasPrice == null) {\n                        tx.gasPrice = feeData.gasPrice;\n                      }\n                      tx.type = 0;\n                    } else {\n                      logger.throwError(\"failed to get consistent fee data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                        operation: \"signer.getFeeData\"\n                      });\n                    }\n                  } else if (tx.type === 2) {\n                    if (tx.maxFeePerGas == null) {\n                      tx.maxFeePerGas = feeData.maxFeePerGas;\n                    }\n                    if (tx.maxPriorityFeePerGas == null) {\n                      tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n                    }\n                  }\n                  _a.label = 5;\n                case 5:\n                  if (tx.nonce == null) {\n                    tx.nonce = this.getTransactionCount(\"pending\");\n                  }\n                  if (tx.gasLimit == null) {\n                    tx.gasLimit = this.estimateGas(tx).catch(function(error) {\n                      if (forwardErrors.indexOf(error.code) >= 0) {\n                        throw error;\n                      }\n                      return logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n                        error,\n                        tx\n                      });\n                    });\n                  }\n                  if (tx.chainId == null) {\n                    tx.chainId = this.getChainId();\n                  } else {\n                    tx.chainId = Promise.all([\n                      Promise.resolve(tx.chainId),\n                      this.getChainId()\n                    ]).then(function(results) {\n                      if (results[1] !== 0 && results[0] !== results[1]) {\n                        logger.throwArgumentError(\"chainId address mismatch\", \"transaction\", transaction);\n                      }\n                      return results[0];\n                    });\n                  }\n                  return [4, (0, properties_1.resolveProperties)(tx)];\n                case 6:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype._checkProvider = function(operation) {\n          if (!this.provider) {\n            logger.throwError(\"missing provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: operation || \"_checkProvider\"\n            });\n          }\n        };\n        Signer2.isSigner = function(value) {\n          return !!(value && value._isSigner);\n        };\n        return Signer2;\n      }()\n    );\n    exports2.Signer = Signer;\n    var VoidSigner = (\n      /** @class */\n      function(_super) {\n        __extends(VoidSigner2, _super);\n        function VoidSigner2(address, provider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, VoidSigner2);\n          _this = _super.call(this) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider || null);\n          return _this;\n        }\n        VoidSigner2.prototype.getAddress = function() {\n          return Promise.resolve(this.address);\n        };\n        VoidSigner2.prototype._fail = function(message, operation) {\n          return Promise.resolve().then(function() {\n            logger.throwError(message, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation });\n          });\n        };\n        VoidSigner2.prototype.signMessage = function(message) {\n          return this._fail(\"VoidSigner cannot sign messages\", \"signMessage\");\n        };\n        VoidSigner2.prototype.signTransaction = function(transaction) {\n          return this._fail(\"VoidSigner cannot sign transactions\", \"signTransaction\");\n        };\n        VoidSigner2.prototype._signTypedData = function(domain, types, value) {\n          return this._fail(\"VoidSigner cannot sign typed data\", \"signTypedData\");\n        };\n        VoidSigner2.prototype.connect = function(provider) {\n          return new VoidSigner2(this.address, provider);\n        };\n        return VoidSigner2;\n      }(Signer)\n    );\n    exports2.VoidSigner = VoidSigner;\n  }\n});\n\n// node_modules/elliptic/package.json\nvar require_package = __commonJS({\n  \"node_modules/elliptic/package.json\"(exports2, module2) {\n    module2.exports = {\n      name: \"elliptic\",\n      version: \"6.5.4\",\n      description: \"EC cryptography\",\n      main: \"lib/elliptic.js\",\n      files: [\n        \"lib\"\n      ],\n      scripts: {\n        lint: \"eslint lib test\",\n        \"lint:fix\": \"npm run lint -- --fix\",\n        unit: \"istanbul test _mocha --reporter=spec test/index.js\",\n        test: \"npm run lint && npm run unit\",\n        version: \"grunt dist && git add dist/\"\n      },\n      repository: {\n        type: \"git\",\n        url: \"git@github.com:indutny/elliptic\"\n      },\n      keywords: [\n        \"EC\",\n        \"Elliptic\",\n        \"curve\",\n        \"Cryptography\"\n      ],\n      author: \"Fedor Indutny <fedor@indutny.com>\",\n      license: \"MIT\",\n      bugs: {\n        url: \"https://github.com/indutny/elliptic/issues\"\n      },\n      homepage: \"https://github.com/indutny/elliptic\",\n      devDependencies: {\n        brfs: \"^2.0.2\",\n        coveralls: \"^3.1.0\",\n        eslint: \"^7.6.0\",\n        grunt: \"^1.2.1\",\n        \"grunt-browserify\": \"^5.3.0\",\n        \"grunt-cli\": \"^1.3.2\",\n        \"grunt-contrib-connect\": \"^3.0.0\",\n        \"grunt-contrib-copy\": \"^1.0.0\",\n        \"grunt-contrib-uglify\": \"^5.0.0\",\n        \"grunt-mocha-istanbul\": \"^5.0.2\",\n        \"grunt-saucelabs\": \"^9.0.1\",\n        istanbul: \"^0.4.5\",\n        mocha: \"^8.0.1\"\n      },\n      dependencies: {\n        \"bn.js\": \"^4.11.9\",\n        brorand: \"^1.1.0\",\n        \"hash.js\": \"^1.0.0\",\n        \"hmac-drbg\": \"^1.0.1\",\n        inherits: \"^2.0.4\",\n        \"minimalistic-assert\": \"^1.0.1\",\n        \"minimalistic-crypto-utils\": \"^1.0.1\"\n      }\n    };\n  }\n});\n\n// node_modules/minimalistic-assert/index.js\nvar require_minimalistic_assert = __commonJS({\n  \"node_modules/minimalistic-assert/index.js\"(exports2, module2) {\n    module2.exports = assert;\n    function assert(val, msg) {\n      if (!val)\n        throw new Error(msg || \"Assertion failed\");\n    }\n    assert.equal = function assertEqual(l, r, msg) {\n      if (l != r)\n        throw new Error(msg || \"Assertion failed: \" + l + \" != \" + r);\n    };\n  }\n});\n\n// node_modules/minimalistic-crypto-utils/lib/utils.js\nvar require_utils = __commonJS({\n  \"node_modules/minimalistic-crypto-utils/lib/utils.js\"(exports2) {\n    \"use strict\";\n    var utils = exports2;\n    function toArray(msg, enc) {\n      if (Array.isArray(msg))\n        return msg.slice();\n      if (!msg)\n        return [];\n      var res = [];\n      if (typeof msg !== \"string\") {\n        for (var i = 0; i < msg.length; i++)\n          res[i] = msg[i] | 0;\n        return res;\n      }\n      if (enc === \"hex\") {\n        msg = msg.replace(/[^a-z0-9]+/ig, \"\");\n        if (msg.length % 2 !== 0)\n          msg = \"0\" + msg;\n        for (var i = 0; i < msg.length; i += 2)\n          res.push(parseInt(msg[i] + msg[i + 1], 16));\n      } else {\n        for (var i = 0; i < msg.length; i++) {\n          var c = msg.charCodeAt(i);\n          var hi = c >> 8;\n          var lo = c & 255;\n          if (hi)\n            res.push(hi, lo);\n          else\n            res.push(lo);\n        }\n      }\n      return res;\n    }\n    utils.toArray = toArray;\n    function zero2(word) {\n      if (word.length === 1)\n        return \"0\" + word;\n      else\n        return word;\n    }\n    utils.zero2 = zero2;\n    function toHex(msg) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++)\n        res += zero2(msg[i].toString(16));\n      return res;\n    }\n    utils.toHex = toHex;\n    utils.encode = function encode(arr, enc) {\n      if (enc === \"hex\")\n        return toHex(arr);\n      else\n        return arr;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/utils.js\nvar require_utils2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/utils.js\"(exports2) {\n    \"use strict\";\n    var utils = exports2;\n    var BN = require_bn();\n    var minAssert = require_minimalistic_assert();\n    var minUtils = require_utils();\n    utils.assert = minAssert;\n    utils.toArray = minUtils.toArray;\n    utils.zero2 = minUtils.zero2;\n    utils.toHex = minUtils.toHex;\n    utils.encode = minUtils.encode;\n    function getNAF(num, w, bits) {\n      var naf = new Array(Math.max(num.bitLength(), bits) + 1);\n      naf.fill(0);\n      var ws = 1 << w + 1;\n      var k = num.clone();\n      for (var i = 0; i < naf.length; i++) {\n        var z;\n        var mod = k.andln(ws - 1);\n        if (k.isOdd()) {\n          if (mod > (ws >> 1) - 1)\n            z = (ws >> 1) - mod;\n          else\n            z = mod;\n          k.isubn(z);\n        } else {\n          z = 0;\n        }\n        naf[i] = z;\n        k.iushrn(1);\n      }\n      return naf;\n    }\n    utils.getNAF = getNAF;\n    function getJSF(k1, k2) {\n      var jsf = [\n        [],\n        []\n      ];\n      k1 = k1.clone();\n      k2 = k2.clone();\n      var d1 = 0;\n      var d2 = 0;\n      var m8;\n      while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {\n        var m14 = k1.andln(3) + d1 & 3;\n        var m24 = k2.andln(3) + d2 & 3;\n        if (m14 === 3)\n          m14 = -1;\n        if (m24 === 3)\n          m24 = -1;\n        var u1;\n        if ((m14 & 1) === 0) {\n          u1 = 0;\n        } else {\n          m8 = k1.andln(7) + d1 & 7;\n          if ((m8 === 3 || m8 === 5) && m24 === 2)\n            u1 = -m14;\n          else\n            u1 = m14;\n        }\n        jsf[0].push(u1);\n        var u2;\n        if ((m24 & 1) === 0) {\n          u2 = 0;\n        } else {\n          m8 = k2.andln(7) + d2 & 7;\n          if ((m8 === 3 || m8 === 5) && m14 === 2)\n            u2 = -m24;\n          else\n            u2 = m24;\n        }\n        jsf[1].push(u2);\n        if (2 * d1 === u1 + 1)\n          d1 = 1 - d1;\n        if (2 * d2 === u2 + 1)\n          d2 = 1 - d2;\n        k1.iushrn(1);\n        k2.iushrn(1);\n      }\n      return jsf;\n    }\n    utils.getJSF = getJSF;\n    function cachedProperty(obj, name2, computer) {\n      var key = \"_\" + name2;\n      obj.prototype[name2] = function cachedProperty2() {\n        return this[key] !== void 0 ? this[key] : this[key] = computer.call(this);\n      };\n    }\n    utils.cachedProperty = cachedProperty;\n    function parseBytes(bytes) {\n      return typeof bytes === \"string\" ? utils.toArray(bytes, \"hex\") : bytes;\n    }\n    utils.parseBytes = parseBytes;\n    function intFromLE(bytes) {\n      return new BN(bytes, \"hex\", \"le\");\n    }\n    utils.intFromLE = intFromLE;\n  }\n});\n\n// node_modules/brorand/index.js\nvar require_brorand = __commonJS({\n  \"node_modules/brorand/index.js\"(exports2, module2) {\n    var r;\n    module2.exports = function rand(len) {\n      if (!r)\n        r = new Rand(null);\n      return r.generate(len);\n    };\n    function Rand(rand) {\n      this.rand = rand;\n    }\n    module2.exports.Rand = Rand;\n    Rand.prototype.generate = function generate(len) {\n      return this._rand(len);\n    };\n    Rand.prototype._rand = function _rand(n) {\n      if (this.rand.getBytes)\n        return this.rand.getBytes(n);\n      var res = new Uint8Array(n);\n      for (var i = 0; i < res.length; i++)\n        res[i] = this.rand.getByte();\n      return res;\n    };\n    if (typeof self === \"object\") {\n      if (self.crypto && self.crypto.getRandomValues) {\n        Rand.prototype._rand = function _rand(n) {\n          var arr = new Uint8Array(n);\n          self.crypto.getRandomValues(arr);\n          return arr;\n        };\n      } else if (self.msCrypto && self.msCrypto.getRandomValues) {\n        Rand.prototype._rand = function _rand(n) {\n          var arr = new Uint8Array(n);\n          self.msCrypto.getRandomValues(arr);\n          return arr;\n        };\n      } else if (typeof window === \"object\") {\n        Rand.prototype._rand = function() {\n          throw new Error(\"Not implemented yet\");\n        };\n      }\n    } else {\n      try {\n        crypto2 = require(\"crypto\");\n        if (typeof crypto2.randomBytes !== \"function\")\n          throw new Error(\"Not supported\");\n        Rand.prototype._rand = function _rand(n) {\n          return crypto2.randomBytes(n);\n        };\n      } catch (e) {\n      }\n    }\n    var crypto2;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/base.js\nvar require_base = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/base.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var getNAF = utils.getNAF;\n    var getJSF = utils.getJSF;\n    var assert = utils.assert;\n    function BaseCurve(type, conf) {\n      this.type = type;\n      this.p = new BN(conf.p, 16);\n      this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);\n      this.zero = new BN(0).toRed(this.red);\n      this.one = new BN(1).toRed(this.red);\n      this.two = new BN(2).toRed(this.red);\n      this.n = conf.n && new BN(conf.n, 16);\n      this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);\n      this._wnafT1 = new Array(4);\n      this._wnafT2 = new Array(4);\n      this._wnafT3 = new Array(4);\n      this._wnafT4 = new Array(4);\n      this._bitLength = this.n ? this.n.bitLength() : 0;\n      var adjustCount = this.n && this.p.div(this.n);\n      if (!adjustCount || adjustCount.cmpn(100) > 0) {\n        this.redN = null;\n      } else {\n        this._maxwellTrick = true;\n        this.redN = this.n.toRed(this.red);\n      }\n    }\n    module2.exports = BaseCurve;\n    BaseCurve.prototype.point = function point() {\n      throw new Error(\"Not implemented\");\n    };\n    BaseCurve.prototype.validate = function validate() {\n      throw new Error(\"Not implemented\");\n    };\n    BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {\n      assert(p.precomputed);\n      var doubles = p._getDoubles();\n      var naf = getNAF(k, 1, this._bitLength);\n      var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);\n      I /= 3;\n      var repr = [];\n      var j;\n      var nafW;\n      for (j = 0; j < naf.length; j += doubles.step) {\n        nafW = 0;\n        for (var l = j + doubles.step - 1; l >= j; l--)\n          nafW = (nafW << 1) + naf[l];\n        repr.push(nafW);\n      }\n      var a = this.jpoint(null, null, null);\n      var b = this.jpoint(null, null, null);\n      for (var i = I; i > 0; i--) {\n        for (j = 0; j < repr.length; j++) {\n          nafW = repr[j];\n          if (nafW === i)\n            b = b.mixedAdd(doubles.points[j]);\n          else if (nafW === -i)\n            b = b.mixedAdd(doubles.points[j].neg());\n        }\n        a = a.add(b);\n      }\n      return a.toP();\n    };\n    BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {\n      var w = 4;\n      var nafPoints = p._getNAFPoints(w);\n      w = nafPoints.wnd;\n      var wnd = nafPoints.points;\n      var naf = getNAF(k, w, this._bitLength);\n      var acc = this.jpoint(null, null, null);\n      for (var i = naf.length - 1; i >= 0; i--) {\n        for (var l = 0; i >= 0 && naf[i] === 0; i--)\n          l++;\n        if (i >= 0)\n          l++;\n        acc = acc.dblp(l);\n        if (i < 0)\n          break;\n        var z = naf[i];\n        assert(z !== 0);\n        if (p.type === \"affine\") {\n          if (z > 0)\n            acc = acc.mixedAdd(wnd[z - 1 >> 1]);\n          else\n            acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());\n        } else {\n          if (z > 0)\n            acc = acc.add(wnd[z - 1 >> 1]);\n          else\n            acc = acc.add(wnd[-z - 1 >> 1].neg());\n        }\n      }\n      return p.type === \"affine\" ? acc.toP() : acc;\n    };\n    BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {\n      var wndWidth = this._wnafT1;\n      var wnd = this._wnafT2;\n      var naf = this._wnafT3;\n      var max = 0;\n      var i;\n      var j;\n      var p;\n      for (i = 0; i < len; i++) {\n        p = points[i];\n        var nafPoints = p._getNAFPoints(defW);\n        wndWidth[i] = nafPoints.wnd;\n        wnd[i] = nafPoints.points;\n      }\n      for (i = len - 1; i >= 1; i -= 2) {\n        var a = i - 1;\n        var b = i;\n        if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n          naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);\n          naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);\n          max = Math.max(naf[a].length, max);\n          max = Math.max(naf[b].length, max);\n          continue;\n        }\n        var comb = [\n          points[a],\n          /* 1 */\n          null,\n          /* 3 */\n          null,\n          /* 5 */\n          points[b]\n          /* 7 */\n        ];\n        if (points[a].y.cmp(points[b].y) === 0) {\n          comb[1] = points[a].add(points[b]);\n          comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n        } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {\n          comb[1] = points[a].toJ().mixedAdd(points[b]);\n          comb[2] = points[a].add(points[b].neg());\n        } else {\n          comb[1] = points[a].toJ().mixedAdd(points[b]);\n          comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n        }\n        var index = [\n          -3,\n          /* -1 -1 */\n          -1,\n          /* -1 0 */\n          -5,\n          /* -1 1 */\n          -7,\n          /* 0 -1 */\n          0,\n          /* 0 0 */\n          7,\n          /* 0 1 */\n          5,\n          /* 1 -1 */\n          1,\n          /* 1 0 */\n          3\n          /* 1 1 */\n        ];\n        var jsf = getJSF(coeffs[a], coeffs[b]);\n        max = Math.max(jsf[0].length, max);\n        naf[a] = new Array(max);\n        naf[b] = new Array(max);\n        for (j = 0; j < max; j++) {\n          var ja = jsf[0][j] | 0;\n          var jb = jsf[1][j] | 0;\n          naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];\n          naf[b][j] = 0;\n          wnd[a] = comb;\n        }\n      }\n      var acc = this.jpoint(null, null, null);\n      var tmp = this._wnafT4;\n      for (i = max; i >= 0; i--) {\n        var k = 0;\n        while (i >= 0) {\n          var zero = true;\n          for (j = 0; j < len; j++) {\n            tmp[j] = naf[j][i] | 0;\n            if (tmp[j] !== 0)\n              zero = false;\n          }\n          if (!zero)\n            break;\n          k++;\n          i--;\n        }\n        if (i >= 0)\n          k++;\n        acc = acc.dblp(k);\n        if (i < 0)\n          break;\n        for (j = 0; j < len; j++) {\n          var z = tmp[j];\n          p;\n          if (z === 0)\n            continue;\n          else if (z > 0)\n            p = wnd[j][z - 1 >> 1];\n          else if (z < 0)\n            p = wnd[j][-z - 1 >> 1].neg();\n          if (p.type === \"affine\")\n            acc = acc.mixedAdd(p);\n          else\n            acc = acc.add(p);\n        }\n      }\n      for (i = 0; i < len; i++)\n        wnd[i] = null;\n      if (jacobianResult)\n        return acc;\n      else\n        return acc.toP();\n    };\n    function BasePoint(curve, type) {\n      this.curve = curve;\n      this.type = type;\n      this.precomputed = null;\n    }\n    BaseCurve.BasePoint = BasePoint;\n    BasePoint.prototype.eq = function eq() {\n      throw new Error(\"Not implemented\");\n    };\n    BasePoint.prototype.validate = function validate() {\n      return this.curve.validate(this);\n    };\n    BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n      bytes = utils.toArray(bytes, enc);\n      var len = this.p.byteLength();\n      if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {\n        if (bytes[0] === 6)\n          assert(bytes[bytes.length - 1] % 2 === 0);\n        else if (bytes[0] === 7)\n          assert(bytes[bytes.length - 1] % 2 === 1);\n        var res = this.point(\n          bytes.slice(1, 1 + len),\n          bytes.slice(1 + len, 1 + 2 * len)\n        );\n        return res;\n      } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {\n        return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);\n      }\n      throw new Error(\"Unknown point format\");\n    };\n    BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {\n      return this.encode(enc, true);\n    };\n    BasePoint.prototype._encode = function _encode(compact) {\n      var len = this.curve.p.byteLength();\n      var x = this.getX().toArray(\"be\", len);\n      if (compact)\n        return [this.getY().isEven() ? 2 : 3].concat(x);\n      return [4].concat(x, this.getY().toArray(\"be\", len));\n    };\n    BasePoint.prototype.encode = function encode(enc, compact) {\n      return utils.encode(this._encode(compact), enc);\n    };\n    BasePoint.prototype.precompute = function precompute(power) {\n      if (this.precomputed)\n        return this;\n      var precomputed = {\n        doubles: null,\n        naf: null,\n        beta: null\n      };\n      precomputed.naf = this._getNAFPoints(8);\n      precomputed.doubles = this._getDoubles(4, power);\n      precomputed.beta = this._getBeta();\n      this.precomputed = precomputed;\n      return this;\n    };\n    BasePoint.prototype._hasDoubles = function _hasDoubles(k) {\n      if (!this.precomputed)\n        return false;\n      var doubles = this.precomputed.doubles;\n      if (!doubles)\n        return false;\n      return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);\n    };\n    BasePoint.prototype._getDoubles = function _getDoubles(step, power) {\n      if (this.precomputed && this.precomputed.doubles)\n        return this.precomputed.doubles;\n      var doubles = [this];\n      var acc = this;\n      for (var i = 0; i < power; i += step) {\n        for (var j = 0; j < step; j++)\n          acc = acc.dbl();\n        doubles.push(acc);\n      }\n      return {\n        step,\n        points: doubles\n      };\n    };\n    BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {\n      if (this.precomputed && this.precomputed.naf)\n        return this.precomputed.naf;\n      var res = [this];\n      var max = (1 << wnd) - 1;\n      var dbl = max === 1 ? null : this.dbl();\n      for (var i = 1; i < max; i++)\n        res[i] = res[i - 1].add(dbl);\n      return {\n        wnd,\n        points: res\n      };\n    };\n    BasePoint.prototype._getBeta = function _getBeta() {\n      return null;\n    };\n    BasePoint.prototype.dblp = function dblp(k) {\n      var r = this;\n      for (var i = 0; i < k; i++)\n        r = r.dbl();\n      return r;\n    };\n  }\n});\n\n// node_modules/inherits/inherits_browser.js\nvar require_inherits_browser = __commonJS({\n  \"node_modules/inherits/inherits_browser.js\"(exports2, module2) {\n    if (typeof Object.create === \"function\") {\n      module2.exports = function inherits(ctor, superCtor) {\n        if (superCtor) {\n          ctor.super_ = superCtor;\n          ctor.prototype = Object.create(superCtor.prototype, {\n            constructor: {\n              value: ctor,\n              enumerable: false,\n              writable: true,\n              configurable: true\n            }\n          });\n        }\n      };\n    } else {\n      module2.exports = function inherits(ctor, superCtor) {\n        if (superCtor) {\n          ctor.super_ = superCtor;\n          var TempCtor = function() {\n          };\n          TempCtor.prototype = superCtor.prototype;\n          ctor.prototype = new TempCtor();\n          ctor.prototype.constructor = ctor;\n        }\n      };\n    }\n  }\n});\n\n// node_modules/inherits/inherits.js\nvar require_inherits = __commonJS({\n  \"node_modules/inherits/inherits.js\"(exports2, module2) {\n    try {\n      util = require(\"util\");\n      if (typeof util.inherits !== \"function\") throw \"\";\n      module2.exports = util.inherits;\n    } catch (e) {\n      module2.exports = require_inherits_browser();\n    }\n    var util;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/short.js\nvar require_short = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/short.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var assert = utils.assert;\n    function ShortCurve(conf) {\n      Base.call(this, \"short\", conf);\n      this.a = new BN(conf.a, 16).toRed(this.red);\n      this.b = new BN(conf.b, 16).toRed(this.red);\n      this.tinv = this.two.redInvm();\n      this.zeroA = this.a.fromRed().cmpn(0) === 0;\n      this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;\n      this.endo = this._getEndomorphism(conf);\n      this._endoWnafT1 = new Array(4);\n      this._endoWnafT2 = new Array(4);\n    }\n    inherits(ShortCurve, Base);\n    module2.exports = ShortCurve;\n    ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {\n      if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)\n        return;\n      var beta;\n      var lambda;\n      if (conf.beta) {\n        beta = new BN(conf.beta, 16).toRed(this.red);\n      } else {\n        var betas = this._getEndoRoots(this.p);\n        beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];\n        beta = beta.toRed(this.red);\n      }\n      if (conf.lambda) {\n        lambda = new BN(conf.lambda, 16);\n      } else {\n        var lambdas = this._getEndoRoots(this.n);\n        if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {\n          lambda = lambdas[0];\n        } else {\n          lambda = lambdas[1];\n          assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);\n        }\n      }\n      var basis;\n      if (conf.basis) {\n        basis = conf.basis.map(function(vec) {\n          return {\n            a: new BN(vec.a, 16),\n            b: new BN(vec.b, 16)\n          };\n        });\n      } else {\n        basis = this._getEndoBasis(lambda);\n      }\n      return {\n        beta,\n        lambda,\n        basis\n      };\n    };\n    ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {\n      var red = num === this.p ? this.red : BN.mont(num);\n      var tinv = new BN(2).toRed(red).redInvm();\n      var ntinv = tinv.redNeg();\n      var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);\n      var l1 = ntinv.redAdd(s).fromRed();\n      var l2 = ntinv.redSub(s).fromRed();\n      return [l1, l2];\n    };\n    ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {\n      var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));\n      var u = lambda;\n      var v = this.n.clone();\n      var x1 = new BN(1);\n      var y1 = new BN(0);\n      var x2 = new BN(0);\n      var y2 = new BN(1);\n      var a0;\n      var b0;\n      var a1;\n      var b1;\n      var a2;\n      var b2;\n      var prevR;\n      var i = 0;\n      var r;\n      var x;\n      while (u.cmpn(0) !== 0) {\n        var q = v.div(u);\n        r = v.sub(q.mul(u));\n        x = x2.sub(q.mul(x1));\n        var y = y2.sub(q.mul(y1));\n        if (!a1 && r.cmp(aprxSqrt) < 0) {\n          a0 = prevR.neg();\n          b0 = x1;\n          a1 = r.neg();\n          b1 = x;\n        } else if (a1 && ++i === 2) {\n          break;\n        }\n        prevR = r;\n        v = u;\n        u = r;\n        x2 = x1;\n        x1 = x;\n        y2 = y1;\n        y1 = y;\n      }\n      a2 = r.neg();\n      b2 = x;\n      var len1 = a1.sqr().add(b1.sqr());\n      var len2 = a2.sqr().add(b2.sqr());\n      if (len2.cmp(len1) >= 0) {\n        a2 = a0;\n        b2 = b0;\n      }\n      if (a1.negative) {\n        a1 = a1.neg();\n        b1 = b1.neg();\n      }\n      if (a2.negative) {\n        a2 = a2.neg();\n        b2 = b2.neg();\n      }\n      return [\n        { a: a1, b: b1 },\n        { a: a2, b: b2 }\n      ];\n    };\n    ShortCurve.prototype._endoSplit = function _endoSplit(k) {\n      var basis = this.endo.basis;\n      var v1 = basis[0];\n      var v2 = basis[1];\n      var c1 = v2.b.mul(k).divRound(this.n);\n      var c2 = v1.b.neg().mul(k).divRound(this.n);\n      var p1 = c1.mul(v1.a);\n      var p2 = c2.mul(v2.a);\n      var q1 = c1.mul(v1.b);\n      var q2 = c2.mul(v2.b);\n      var k1 = k.sub(p1).sub(p2);\n      var k2 = q1.add(q2).neg();\n      return { k1, k2 };\n    };\n    ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {\n      x = new BN(x, 16);\n      if (!x.red)\n        x = x.toRed(this.red);\n      var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);\n      var y = y2.redSqrt();\n      if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      var isOdd = y.fromRed().isOdd();\n      if (odd && !isOdd || !odd && isOdd)\n        y = y.redNeg();\n      return this.point(x, y);\n    };\n    ShortCurve.prototype.validate = function validate(point) {\n      if (point.inf)\n        return true;\n      var x = point.x;\n      var y = point.y;\n      var ax = this.a.redMul(x);\n      var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);\n      return y.redSqr().redISub(rhs).cmpn(0) === 0;\n    };\n    ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {\n      var npoints = this._endoWnafT1;\n      var ncoeffs = this._endoWnafT2;\n      for (var i = 0; i < points.length; i++) {\n        var split = this._endoSplit(coeffs[i]);\n        var p = points[i];\n        var beta = p._getBeta();\n        if (split.k1.negative) {\n          split.k1.ineg();\n          p = p.neg(true);\n        }\n        if (split.k2.negative) {\n          split.k2.ineg();\n          beta = beta.neg(true);\n        }\n        npoints[i * 2] = p;\n        npoints[i * 2 + 1] = beta;\n        ncoeffs[i * 2] = split.k1;\n        ncoeffs[i * 2 + 1] = split.k2;\n      }\n      var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);\n      for (var j = 0; j < i * 2; j++) {\n        npoints[j] = null;\n        ncoeffs[j] = null;\n      }\n      return res;\n    };\n    function Point(curve, x, y, isRed) {\n      Base.BasePoint.call(this, curve, \"affine\");\n      if (x === null && y === null) {\n        this.x = null;\n        this.y = null;\n        this.inf = true;\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        if (isRed) {\n          this.x.forceRed(this.curve.red);\n          this.y.forceRed(this.curve.red);\n        }\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.y.red)\n          this.y = this.y.toRed(this.curve.red);\n        this.inf = false;\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    ShortCurve.prototype.point = function point(x, y, isRed) {\n      return new Point(this, x, y, isRed);\n    };\n    ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {\n      return Point.fromJSON(this, obj, red);\n    };\n    Point.prototype._getBeta = function _getBeta() {\n      if (!this.curve.endo)\n        return;\n      var pre = this.precomputed;\n      if (pre && pre.beta)\n        return pre.beta;\n      var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);\n      if (pre) {\n        var curve = this.curve;\n        var endoMul = function(p) {\n          return curve.point(p.x.redMul(curve.endo.beta), p.y);\n        };\n        pre.beta = beta;\n        beta.precomputed = {\n          beta: null,\n          naf: pre.naf && {\n            wnd: pre.naf.wnd,\n            points: pre.naf.points.map(endoMul)\n          },\n          doubles: pre.doubles && {\n            step: pre.doubles.step,\n            points: pre.doubles.points.map(endoMul)\n          }\n        };\n      }\n      return beta;\n    };\n    Point.prototype.toJSON = function toJSON() {\n      if (!this.precomputed)\n        return [this.x, this.y];\n      return [this.x, this.y, this.precomputed && {\n        doubles: this.precomputed.doubles && {\n          step: this.precomputed.doubles.step,\n          points: this.precomputed.doubles.points.slice(1)\n        },\n        naf: this.precomputed.naf && {\n          wnd: this.precomputed.naf.wnd,\n          points: this.precomputed.naf.points.slice(1)\n        }\n      }];\n    };\n    Point.fromJSON = function fromJSON(curve, obj, red) {\n      if (typeof obj === \"string\")\n        obj = JSON.parse(obj);\n      var res = curve.point(obj[0], obj[1], red);\n      if (!obj[2])\n        return res;\n      function obj2point(obj2) {\n        return curve.point(obj2[0], obj2[1], red);\n      }\n      var pre = obj[2];\n      res.precomputed = {\n        beta: null,\n        doubles: pre.doubles && {\n          step: pre.doubles.step,\n          points: [res].concat(pre.doubles.points.map(obj2point))\n        },\n        naf: pre.naf && {\n          wnd: pre.naf.wnd,\n          points: [res].concat(pre.naf.points.map(obj2point))\n        }\n      };\n      return res;\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" y: \" + this.y.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.inf;\n    };\n    Point.prototype.add = function add(p) {\n      if (this.inf)\n        return p;\n      if (p.inf)\n        return this;\n      if (this.eq(p))\n        return this.dbl();\n      if (this.neg().eq(p))\n        return this.curve.point(null, null);\n      if (this.x.cmp(p.x) === 0)\n        return this.curve.point(null, null);\n      var c = this.y.redSub(p.y);\n      if (c.cmpn(0) !== 0)\n        c = c.redMul(this.x.redSub(p.x).redInvm());\n      var nx = c.redSqr().redISub(this.x).redISub(p.x);\n      var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n      return this.curve.point(nx, ny);\n    };\n    Point.prototype.dbl = function dbl() {\n      if (this.inf)\n        return this;\n      var ys1 = this.y.redAdd(this.y);\n      if (ys1.cmpn(0) === 0)\n        return this.curve.point(null, null);\n      var a = this.curve.a;\n      var x2 = this.x.redSqr();\n      var dyinv = ys1.redInvm();\n      var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);\n      var nx = c.redSqr().redISub(this.x.redAdd(this.x));\n      var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n      return this.curve.point(nx, ny);\n    };\n    Point.prototype.getX = function getX() {\n      return this.x.fromRed();\n    };\n    Point.prototype.getY = function getY() {\n      return this.y.fromRed();\n    };\n    Point.prototype.mul = function mul(k) {\n      k = new BN(k, 16);\n      if (this.isInfinity())\n        return this;\n      else if (this._hasDoubles(k))\n        return this.curve._fixedNafMul(this, k);\n      else if (this.curve.endo)\n        return this.curve._endoWnafMulAdd([this], [k]);\n      else\n        return this.curve._wnafMul(this, k);\n    };\n    Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {\n      var points = [this, p2];\n      var coeffs = [k1, k2];\n      if (this.curve.endo)\n        return this.curve._endoWnafMulAdd(points, coeffs);\n      else\n        return this.curve._wnafMulAdd(1, points, coeffs, 2);\n    };\n    Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {\n      var points = [this, p2];\n      var coeffs = [k1, k2];\n      if (this.curve.endo)\n        return this.curve._endoWnafMulAdd(points, coeffs, true);\n      else\n        return this.curve._wnafMulAdd(1, points, coeffs, 2, true);\n    };\n    Point.prototype.eq = function eq(p) {\n      return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);\n    };\n    Point.prototype.neg = function neg(_precompute) {\n      if (this.inf)\n        return this;\n      var res = this.curve.point(this.x, this.y.redNeg());\n      if (_precompute && this.precomputed) {\n        var pre = this.precomputed;\n        var negate = function(p) {\n          return p.neg();\n        };\n        res.precomputed = {\n          naf: pre.naf && {\n            wnd: pre.naf.wnd,\n            points: pre.naf.points.map(negate)\n          },\n          doubles: pre.doubles && {\n            step: pre.doubles.step,\n            points: pre.doubles.points.map(negate)\n          }\n        };\n      }\n      return res;\n    };\n    Point.prototype.toJ = function toJ() {\n      if (this.inf)\n        return this.curve.jpoint(null, null, null);\n      var res = this.curve.jpoint(this.x, this.y, this.curve.one);\n      return res;\n    };\n    function JPoint(curve, x, y, z) {\n      Base.BasePoint.call(this, curve, \"jacobian\");\n      if (x === null && y === null && z === null) {\n        this.x = this.curve.one;\n        this.y = this.curve.one;\n        this.z = new BN(0);\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        this.z = new BN(z, 16);\n      }\n      if (!this.x.red)\n        this.x = this.x.toRed(this.curve.red);\n      if (!this.y.red)\n        this.y = this.y.toRed(this.curve.red);\n      if (!this.z.red)\n        this.z = this.z.toRed(this.curve.red);\n      this.zOne = this.z === this.curve.one;\n    }\n    inherits(JPoint, Base.BasePoint);\n    ShortCurve.prototype.jpoint = function jpoint(x, y, z) {\n      return new JPoint(this, x, y, z);\n    };\n    JPoint.prototype.toP = function toP() {\n      if (this.isInfinity())\n        return this.curve.point(null, null);\n      var zinv = this.z.redInvm();\n      var zinv2 = zinv.redSqr();\n      var ax = this.x.redMul(zinv2);\n      var ay = this.y.redMul(zinv2).redMul(zinv);\n      return this.curve.point(ax, ay);\n    };\n    JPoint.prototype.neg = function neg() {\n      return this.curve.jpoint(this.x, this.y.redNeg(), this.z);\n    };\n    JPoint.prototype.add = function add(p) {\n      if (this.isInfinity())\n        return p;\n      if (p.isInfinity())\n        return this;\n      var pz2 = p.z.redSqr();\n      var z2 = this.z.redSqr();\n      var u1 = this.x.redMul(pz2);\n      var u2 = p.x.redMul(z2);\n      var s1 = this.y.redMul(pz2.redMul(p.z));\n      var s2 = p.y.redMul(z2.redMul(this.z));\n      var h = u1.redSub(u2);\n      var r = s1.redSub(s2);\n      if (h.cmpn(0) === 0) {\n        if (r.cmpn(0) !== 0)\n          return this.curve.jpoint(null, null, null);\n        else\n          return this.dbl();\n      }\n      var h2 = h.redSqr();\n      var h3 = h2.redMul(h);\n      var v = u1.redMul(h2);\n      var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n      var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n      var nz = this.z.redMul(p.z).redMul(h);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.mixedAdd = function mixedAdd(p) {\n      if (this.isInfinity())\n        return p.toJ();\n      if (p.isInfinity())\n        return this;\n      var z2 = this.z.redSqr();\n      var u1 = this.x;\n      var u2 = p.x.redMul(z2);\n      var s1 = this.y;\n      var s2 = p.y.redMul(z2).redMul(this.z);\n      var h = u1.redSub(u2);\n      var r = s1.redSub(s2);\n      if (h.cmpn(0) === 0) {\n        if (r.cmpn(0) !== 0)\n          return this.curve.jpoint(null, null, null);\n        else\n          return this.dbl();\n      }\n      var h2 = h.redSqr();\n      var h3 = h2.redMul(h);\n      var v = u1.redMul(h2);\n      var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n      var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n      var nz = this.z.redMul(h);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.dblp = function dblp(pow) {\n      if (pow === 0)\n        return this;\n      if (this.isInfinity())\n        return this;\n      if (!pow)\n        return this.dbl();\n      var i;\n      if (this.curve.zeroA || this.curve.threeA) {\n        var r = this;\n        for (i = 0; i < pow; i++)\n          r = r.dbl();\n        return r;\n      }\n      var a = this.curve.a;\n      var tinv = this.curve.tinv;\n      var jx = this.x;\n      var jy = this.y;\n      var jz = this.z;\n      var jz4 = jz.redSqr().redSqr();\n      var jyd = jy.redAdd(jy);\n      for (i = 0; i < pow; i++) {\n        var jx2 = jx.redSqr();\n        var jyd2 = jyd.redSqr();\n        var jyd4 = jyd2.redSqr();\n        var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n        var t1 = jx.redMul(jyd2);\n        var nx = c.redSqr().redISub(t1.redAdd(t1));\n        var t2 = t1.redISub(nx);\n        var dny = c.redMul(t2);\n        dny = dny.redIAdd(dny).redISub(jyd4);\n        var nz = jyd.redMul(jz);\n        if (i + 1 < pow)\n          jz4 = jz4.redMul(jyd4);\n        jx = nx;\n        jz = nz;\n        jyd = dny;\n      }\n      return this.curve.jpoint(jx, jyd.redMul(tinv), jz);\n    };\n    JPoint.prototype.dbl = function dbl() {\n      if (this.isInfinity())\n        return this;\n      if (this.curve.zeroA)\n        return this._zeroDbl();\n      else if (this.curve.threeA)\n        return this._threeDbl();\n      else\n        return this._dbl();\n    };\n    JPoint.prototype._zeroDbl = function _zeroDbl() {\n      var nx;\n      var ny;\n      var nz;\n      if (this.zOne) {\n        var xx = this.x.redSqr();\n        var yy = this.y.redSqr();\n        var yyyy = yy.redSqr();\n        var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n        s = s.redIAdd(s);\n        var m = xx.redAdd(xx).redIAdd(xx);\n        var t = m.redSqr().redISub(s).redISub(s);\n        var yyyy8 = yyyy.redIAdd(yyyy);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        nx = t;\n        ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n        nz = this.y.redAdd(this.y);\n      } else {\n        var a = this.x.redSqr();\n        var b = this.y.redSqr();\n        var c = b.redSqr();\n        var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);\n        d = d.redIAdd(d);\n        var e = a.redAdd(a).redIAdd(a);\n        var f = e.redSqr();\n        var c8 = c.redIAdd(c);\n        c8 = c8.redIAdd(c8);\n        c8 = c8.redIAdd(c8);\n        nx = f.redISub(d).redISub(d);\n        ny = e.redMul(d.redISub(nx)).redISub(c8);\n        nz = this.y.redMul(this.z);\n        nz = nz.redIAdd(nz);\n      }\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype._threeDbl = function _threeDbl() {\n      var nx;\n      var ny;\n      var nz;\n      if (this.zOne) {\n        var xx = this.x.redSqr();\n        var yy = this.y.redSqr();\n        var yyyy = yy.redSqr();\n        var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n        s = s.redIAdd(s);\n        var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);\n        var t = m.redSqr().redISub(s).redISub(s);\n        nx = t;\n        var yyyy8 = yyyy.redIAdd(yyyy);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n        nz = this.y.redAdd(this.y);\n      } else {\n        var delta = this.z.redSqr();\n        var gamma = this.y.redSqr();\n        var beta = this.x.redMul(gamma);\n        var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));\n        alpha = alpha.redAdd(alpha).redIAdd(alpha);\n        var beta4 = beta.redIAdd(beta);\n        beta4 = beta4.redIAdd(beta4);\n        var beta8 = beta4.redAdd(beta4);\n        nx = alpha.redSqr().redISub(beta8);\n        nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);\n        var ggamma8 = gamma.redSqr();\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);\n      }\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype._dbl = function _dbl() {\n      var a = this.curve.a;\n      var jx = this.x;\n      var jy = this.y;\n      var jz = this.z;\n      var jz4 = jz.redSqr().redSqr();\n      var jx2 = jx.redSqr();\n      var jy2 = jy.redSqr();\n      var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n      var jxd4 = jx.redAdd(jx);\n      jxd4 = jxd4.redIAdd(jxd4);\n      var t1 = jxd4.redMul(jy2);\n      var nx = c.redSqr().redISub(t1.redAdd(t1));\n      var t2 = t1.redISub(nx);\n      var jyd8 = jy2.redSqr();\n      jyd8 = jyd8.redIAdd(jyd8);\n      jyd8 = jyd8.redIAdd(jyd8);\n      jyd8 = jyd8.redIAdd(jyd8);\n      var ny = c.redMul(t2).redISub(jyd8);\n      var nz = jy.redAdd(jy).redMul(jz);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.trpl = function trpl() {\n      if (!this.curve.zeroA)\n        return this.dbl().add(this);\n      var xx = this.x.redSqr();\n      var yy = this.y.redSqr();\n      var zz = this.z.redSqr();\n      var yyyy = yy.redSqr();\n      var m = xx.redAdd(xx).redIAdd(xx);\n      var mm = m.redSqr();\n      var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n      e = e.redIAdd(e);\n      e = e.redAdd(e).redIAdd(e);\n      e = e.redISub(mm);\n      var ee = e.redSqr();\n      var t = yyyy.redIAdd(yyyy);\n      t = t.redIAdd(t);\n      t = t.redIAdd(t);\n      t = t.redIAdd(t);\n      var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);\n      var yyu4 = yy.redMul(u);\n      yyu4 = yyu4.redIAdd(yyu4);\n      yyu4 = yyu4.redIAdd(yyu4);\n      var nx = this.x.redMul(ee).redISub(yyu4);\n      nx = nx.redIAdd(nx);\n      nx = nx.redIAdd(nx);\n      var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));\n      ny = ny.redIAdd(ny);\n      ny = ny.redIAdd(ny);\n      ny = ny.redIAdd(ny);\n      var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.mul = function mul(k, kbase) {\n      k = new BN(k, kbase);\n      return this.curve._wnafMul(this, k);\n    };\n    JPoint.prototype.eq = function eq(p) {\n      if (p.type === \"affine\")\n        return this.eq(p.toJ());\n      if (this === p)\n        return true;\n      var z2 = this.z.redSqr();\n      var pz2 = p.z.redSqr();\n      if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)\n        return false;\n      var z3 = z2.redMul(this.z);\n      var pz3 = pz2.redMul(p.z);\n      return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;\n    };\n    JPoint.prototype.eqXToP = function eqXToP(x) {\n      var zs = this.z.redSqr();\n      var rx = x.toRed(this.curve.red).redMul(zs);\n      if (this.x.cmp(rx) === 0)\n        return true;\n      var xc = x.clone();\n      var t = this.curve.redN.redMul(zs);\n      for (; ; ) {\n        xc.iadd(this.curve.n);\n        if (xc.cmp(this.curve.p) >= 0)\n          return false;\n        rx.redIAdd(t);\n        if (this.x.cmp(rx) === 0)\n          return true;\n      }\n    };\n    JPoint.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC JPoint Infinity>\";\n      return \"<EC JPoint x: \" + this.x.toString(16, 2) + \" y: \" + this.y.toString(16, 2) + \" z: \" + this.z.toString(16, 2) + \">\";\n    };\n    JPoint.prototype.isInfinity = function isInfinity() {\n      return this.z.cmpn(0) === 0;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/mont.js\nvar require_mont = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/mont.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var utils = require_utils2();\n    function MontCurve(conf) {\n      Base.call(this, \"mont\", conf);\n      this.a = new BN(conf.a, 16).toRed(this.red);\n      this.b = new BN(conf.b, 16).toRed(this.red);\n      this.i4 = new BN(4).toRed(this.red).redInvm();\n      this.two = new BN(2).toRed(this.red);\n      this.a24 = this.i4.redMul(this.a.redAdd(this.two));\n    }\n    inherits(MontCurve, Base);\n    module2.exports = MontCurve;\n    MontCurve.prototype.validate = function validate(point) {\n      var x = point.normalize().x;\n      var x2 = x.redSqr();\n      var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);\n      var y = rhs.redSqrt();\n      return y.redSqr().cmp(rhs) === 0;\n    };\n    function Point(curve, x, z) {\n      Base.BasePoint.call(this, curve, \"projective\");\n      if (x === null && z === null) {\n        this.x = this.curve.one;\n        this.z = this.curve.zero;\n      } else {\n        this.x = new BN(x, 16);\n        this.z = new BN(z, 16);\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.z.red)\n          this.z = this.z.toRed(this.curve.red);\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n      return this.point(utils.toArray(bytes, enc), 1);\n    };\n    MontCurve.prototype.point = function point(x, z) {\n      return new Point(this, x, z);\n    };\n    MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n      return Point.fromJSON(this, obj);\n    };\n    Point.prototype.precompute = function precompute() {\n    };\n    Point.prototype._encode = function _encode() {\n      return this.getX().toArray(\"be\", this.curve.p.byteLength());\n    };\n    Point.fromJSON = function fromJSON(curve, obj) {\n      return new Point(curve, obj[0], obj[1] || curve.one);\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" z: \" + this.z.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.z.cmpn(0) === 0;\n    };\n    Point.prototype.dbl = function dbl() {\n      var a = this.x.redAdd(this.z);\n      var aa = a.redSqr();\n      var b = this.x.redSub(this.z);\n      var bb = b.redSqr();\n      var c = aa.redSub(bb);\n      var nx = aa.redMul(bb);\n      var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));\n      return this.curve.point(nx, nz);\n    };\n    Point.prototype.add = function add() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.diffAdd = function diffAdd(p, diff) {\n      var a = this.x.redAdd(this.z);\n      var b = this.x.redSub(this.z);\n      var c = p.x.redAdd(p.z);\n      var d = p.x.redSub(p.z);\n      var da = d.redMul(a);\n      var cb = c.redMul(b);\n      var nx = diff.z.redMul(da.redAdd(cb).redSqr());\n      var nz = diff.x.redMul(da.redISub(cb).redSqr());\n      return this.curve.point(nx, nz);\n    };\n    Point.prototype.mul = function mul(k) {\n      var t = k.clone();\n      var a = this;\n      var b = this.curve.point(null, null);\n      var c = this;\n      for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1))\n        bits.push(t.andln(1));\n      for (var i = bits.length - 1; i >= 0; i--) {\n        if (bits[i] === 0) {\n          a = a.diffAdd(b, c);\n          b = b.dbl();\n        } else {\n          b = a.diffAdd(b, c);\n          a = a.dbl();\n        }\n      }\n      return b;\n    };\n    Point.prototype.mulAdd = function mulAdd() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.jumlAdd = function jumlAdd() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.eq = function eq(other) {\n      return this.getX().cmp(other.getX()) === 0;\n    };\n    Point.prototype.normalize = function normalize() {\n      this.x = this.x.redMul(this.z.redInvm());\n      this.z = this.curve.one;\n      return this;\n    };\n    Point.prototype.getX = function getX() {\n      this.normalize();\n      return this.x.fromRed();\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/edwards.js\nvar require_edwards = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/edwards.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var assert = utils.assert;\n    function EdwardsCurve(conf) {\n      this.twisted = (conf.a | 0) !== 1;\n      this.mOneA = this.twisted && (conf.a | 0) === -1;\n      this.extended = this.mOneA;\n      Base.call(this, \"edwards\", conf);\n      this.a = new BN(conf.a, 16).umod(this.red.m);\n      this.a = this.a.toRed(this.red);\n      this.c = new BN(conf.c, 16).toRed(this.red);\n      this.c2 = this.c.redSqr();\n      this.d = new BN(conf.d, 16).toRed(this.red);\n      this.dd = this.d.redAdd(this.d);\n      assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);\n      this.oneC = (conf.c | 0) === 1;\n    }\n    inherits(EdwardsCurve, Base);\n    module2.exports = EdwardsCurve;\n    EdwardsCurve.prototype._mulA = function _mulA(num) {\n      if (this.mOneA)\n        return num.redNeg();\n      else\n        return this.a.redMul(num);\n    };\n    EdwardsCurve.prototype._mulC = function _mulC(num) {\n      if (this.oneC)\n        return num;\n      else\n        return this.c.redMul(num);\n    };\n    EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {\n      return this.point(x, y, z, t);\n    };\n    EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {\n      x = new BN(x, 16);\n      if (!x.red)\n        x = x.toRed(this.red);\n      var x2 = x.redSqr();\n      var rhs = this.c2.redSub(this.a.redMul(x2));\n      var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));\n      var y2 = rhs.redMul(lhs.redInvm());\n      var y = y2.redSqrt();\n      if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      var isOdd = y.fromRed().isOdd();\n      if (odd && !isOdd || !odd && isOdd)\n        y = y.redNeg();\n      return this.point(x, y);\n    };\n    EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {\n      y = new BN(y, 16);\n      if (!y.red)\n        y = y.toRed(this.red);\n      var y2 = y.redSqr();\n      var lhs = y2.redSub(this.c2);\n      var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);\n      var x2 = lhs.redMul(rhs.redInvm());\n      if (x2.cmp(this.zero) === 0) {\n        if (odd)\n          throw new Error(\"invalid point\");\n        else\n          return this.point(this.zero, y);\n      }\n      var x = x2.redSqrt();\n      if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      if (x.fromRed().isOdd() !== odd)\n        x = x.redNeg();\n      return this.point(x, y);\n    };\n    EdwardsCurve.prototype.validate = function validate(point) {\n      if (point.isInfinity())\n        return true;\n      point.normalize();\n      var x2 = point.x.redSqr();\n      var y2 = point.y.redSqr();\n      var lhs = x2.redMul(this.a).redAdd(y2);\n      var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));\n      return lhs.cmp(rhs) === 0;\n    };\n    function Point(curve, x, y, z, t) {\n      Base.BasePoint.call(this, curve, \"projective\");\n      if (x === null && y === null && z === null) {\n        this.x = this.curve.zero;\n        this.y = this.curve.one;\n        this.z = this.curve.one;\n        this.t = this.curve.zero;\n        this.zOne = true;\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        this.z = z ? new BN(z, 16) : this.curve.one;\n        this.t = t && new BN(t, 16);\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.y.red)\n          this.y = this.y.toRed(this.curve.red);\n        if (!this.z.red)\n          this.z = this.z.toRed(this.curve.red);\n        if (this.t && !this.t.red)\n          this.t = this.t.toRed(this.curve.red);\n        this.zOne = this.z === this.curve.one;\n        if (this.curve.extended && !this.t) {\n          this.t = this.x.redMul(this.y);\n          if (!this.zOne)\n            this.t = this.t.redMul(this.z.redInvm());\n        }\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n      return Point.fromJSON(this, obj);\n    };\n    EdwardsCurve.prototype.point = function point(x, y, z, t) {\n      return new Point(this, x, y, z, t);\n    };\n    Point.fromJSON = function fromJSON(curve, obj) {\n      return new Point(curve, obj[0], obj[1], obj[2]);\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" y: \" + this.y.fromRed().toString(16, 2) + \" z: \" + this.z.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);\n    };\n    Point.prototype._extDbl = function _extDbl() {\n      var a = this.x.redSqr();\n      var b = this.y.redSqr();\n      var c = this.z.redSqr();\n      c = c.redIAdd(c);\n      var d = this.curve._mulA(a);\n      var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);\n      var g = d.redAdd(b);\n      var f = g.redSub(c);\n      var h = d.redSub(b);\n      var nx = e.redMul(f);\n      var ny = g.redMul(h);\n      var nt = e.redMul(h);\n      var nz = f.redMul(g);\n      return this.curve.point(nx, ny, nz, nt);\n    };\n    Point.prototype._projDbl = function _projDbl() {\n      var b = this.x.redAdd(this.y).redSqr();\n      var c = this.x.redSqr();\n      var d = this.y.redSqr();\n      var nx;\n      var ny;\n      var nz;\n      var e;\n      var h;\n      var j;\n      if (this.curve.twisted) {\n        e = this.curve._mulA(c);\n        var f = e.redAdd(d);\n        if (this.zOne) {\n          nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));\n          ny = f.redMul(e.redSub(d));\n          nz = f.redSqr().redSub(f).redSub(f);\n        } else {\n          h = this.z.redSqr();\n          j = f.redSub(h).redISub(h);\n          nx = b.redSub(c).redISub(d).redMul(j);\n          ny = f.redMul(e.redSub(d));\n          nz = f.redMul(j);\n        }\n      } else {\n        e = c.redAdd(d);\n        h = this.curve._mulC(this.z).redSqr();\n        j = e.redSub(h).redSub(h);\n        nx = this.curve._mulC(b.redISub(e)).redMul(j);\n        ny = this.curve._mulC(e).redMul(c.redISub(d));\n        nz = e.redMul(j);\n      }\n      return this.curve.point(nx, ny, nz);\n    };\n    Point.prototype.dbl = function dbl() {\n      if (this.isInfinity())\n        return this;\n      if (this.curve.extended)\n        return this._extDbl();\n      else\n        return this._projDbl();\n    };\n    Point.prototype._extAdd = function _extAdd(p) {\n      var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));\n      var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));\n      var c = this.t.redMul(this.curve.dd).redMul(p.t);\n      var d = this.z.redMul(p.z.redAdd(p.z));\n      var e = b.redSub(a);\n      var f = d.redSub(c);\n      var g = d.redAdd(c);\n      var h = b.redAdd(a);\n      var nx = e.redMul(f);\n      var ny = g.redMul(h);\n      var nt = e.redMul(h);\n      var nz = f.redMul(g);\n      return this.curve.point(nx, ny, nz, nt);\n    };\n    Point.prototype._projAdd = function _projAdd(p) {\n      var a = this.z.redMul(p.z);\n      var b = a.redSqr();\n      var c = this.x.redMul(p.x);\n      var d = this.y.redMul(p.y);\n      var e = this.curve.d.redMul(c).redMul(d);\n      var f = b.redSub(e);\n      var g = b.redAdd(e);\n      var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);\n      var nx = a.redMul(f).redMul(tmp);\n      var ny;\n      var nz;\n      if (this.curve.twisted) {\n        ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));\n        nz = f.redMul(g);\n      } else {\n        ny = a.redMul(g).redMul(d.redSub(c));\n        nz = this.curve._mulC(f).redMul(g);\n      }\n      return this.curve.point(nx, ny, nz);\n    };\n    Point.prototype.add = function add(p) {\n      if (this.isInfinity())\n        return p;\n      if (p.isInfinity())\n        return this;\n      if (this.curve.extended)\n        return this._extAdd(p);\n      else\n        return this._projAdd(p);\n    };\n    Point.prototype.mul = function mul(k) {\n      if (this._hasDoubles(k))\n        return this.curve._fixedNafMul(this, k);\n      else\n        return this.curve._wnafMul(this, k);\n    };\n    Point.prototype.mulAdd = function mulAdd(k1, p, k2) {\n      return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);\n    };\n    Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {\n      return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);\n    };\n    Point.prototype.normalize = function normalize() {\n      if (this.zOne)\n        return this;\n      var zi = this.z.redInvm();\n      this.x = this.x.redMul(zi);\n      this.y = this.y.redMul(zi);\n      if (this.t)\n        this.t = this.t.redMul(zi);\n      this.z = this.curve.one;\n      this.zOne = true;\n      return this;\n    };\n    Point.prototype.neg = function neg() {\n      return this.curve.point(\n        this.x.redNeg(),\n        this.y,\n        this.z,\n        this.t && this.t.redNeg()\n      );\n    };\n    Point.prototype.getX = function getX() {\n      this.normalize();\n      return this.x.fromRed();\n    };\n    Point.prototype.getY = function getY() {\n      this.normalize();\n      return this.y.fromRed();\n    };\n    Point.prototype.eq = function eq(other) {\n      return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;\n    };\n    Point.prototype.eqXToP = function eqXToP(x) {\n      var rx = x.toRed(this.curve.red).redMul(this.z);\n      if (this.x.cmp(rx) === 0)\n        return true;\n      var xc = x.clone();\n      var t = this.curve.redN.redMul(this.z);\n      for (; ; ) {\n        xc.iadd(this.curve.n);\n        if (xc.cmp(this.curve.p) >= 0)\n          return false;\n        rx.redIAdd(t);\n        if (this.x.cmp(rx) === 0)\n          return true;\n      }\n    };\n    Point.prototype.toP = Point.prototype.normalize;\n    Point.prototype.mixedAdd = Point.prototype.add;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/index.js\nvar require_curve = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/index.js\"(exports2) {\n    \"use strict\";\n    var curve = exports2;\n    curve.base = require_base();\n    curve.short = require_short();\n    curve.mont = require_mont();\n    curve.edwards = require_edwards();\n  }\n});\n\n// node_modules/hash.js/lib/hash/utils.js\nvar require_utils3 = __commonJS({\n  \"node_modules/hash.js/lib/hash/utils.js\"(exports2) {\n    \"use strict\";\n    var assert = require_minimalistic_assert();\n    var inherits = require_inherits();\n    exports2.inherits = inherits;\n    function isSurrogatePair(msg, i) {\n      if ((msg.charCodeAt(i) & 64512) !== 55296) {\n        return false;\n      }\n      if (i < 0 || i + 1 >= msg.length) {\n        return false;\n      }\n      return (msg.charCodeAt(i + 1) & 64512) === 56320;\n    }\n    function toArray(msg, enc) {\n      if (Array.isArray(msg))\n        return msg.slice();\n      if (!msg)\n        return [];\n      var res = [];\n      if (typeof msg === \"string\") {\n        if (!enc) {\n          var p = 0;\n          for (var i = 0; i < msg.length; i++) {\n            var c = msg.charCodeAt(i);\n            if (c < 128) {\n              res[p++] = c;\n            } else if (c < 2048) {\n              res[p++] = c >> 6 | 192;\n              res[p++] = c & 63 | 128;\n            } else if (isSurrogatePair(msg, i)) {\n              c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);\n              res[p++] = c >> 18 | 240;\n              res[p++] = c >> 12 & 63 | 128;\n              res[p++] = c >> 6 & 63 | 128;\n              res[p++] = c & 63 | 128;\n            } else {\n              res[p++] = c >> 12 | 224;\n              res[p++] = c >> 6 & 63 | 128;\n              res[p++] = c & 63 | 128;\n            }\n          }\n        } else if (enc === \"hex\") {\n          msg = msg.replace(/[^a-z0-9]+/ig, \"\");\n          if (msg.length % 2 !== 0)\n            msg = \"0\" + msg;\n          for (i = 0; i < msg.length; i += 2)\n            res.push(parseInt(msg[i] + msg[i + 1], 16));\n        }\n      } else {\n        for (i = 0; i < msg.length; i++)\n          res[i] = msg[i] | 0;\n      }\n      return res;\n    }\n    exports2.toArray = toArray;\n    function toHex(msg) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++)\n        res += zero2(msg[i].toString(16));\n      return res;\n    }\n    exports2.toHex = toHex;\n    function htonl(w) {\n      var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;\n      return res >>> 0;\n    }\n    exports2.htonl = htonl;\n    function toHex32(msg, endian) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++) {\n        var w = msg[i];\n        if (endian === \"little\")\n          w = htonl(w);\n        res += zero8(w.toString(16));\n      }\n      return res;\n    }\n    exports2.toHex32 = toHex32;\n    function zero2(word) {\n      if (word.length === 1)\n        return \"0\" + word;\n      else\n        return word;\n    }\n    exports2.zero2 = zero2;\n    function zero8(word) {\n      if (word.length === 7)\n        return \"0\" + word;\n      else if (word.length === 6)\n        return \"00\" + word;\n      else if (word.length === 5)\n        return \"000\" + word;\n      else if (word.length === 4)\n        return \"0000\" + word;\n      else if (word.length === 3)\n        return \"00000\" + word;\n      else if (word.length === 2)\n        return \"000000\" + word;\n      else if (word.length === 1)\n        return \"0000000\" + word;\n      else\n        return word;\n    }\n    exports2.zero8 = zero8;\n    function join32(msg, start, end, endian) {\n      var len = end - start;\n      assert(len % 4 === 0);\n      var res = new Array(len / 4);\n      for (var i = 0, k = start; i < res.length; i++, k += 4) {\n        var w;\n        if (endian === \"big\")\n          w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];\n        else\n          w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];\n        res[i] = w >>> 0;\n      }\n      return res;\n    }\n    exports2.join32 = join32;\n    function split32(msg, endian) {\n      var res = new Array(msg.length * 4);\n      for (var i = 0, k = 0; i < msg.length; i++, k += 4) {\n        var m = msg[i];\n        if (endian === \"big\") {\n          res[k] = m >>> 24;\n          res[k + 1] = m >>> 16 & 255;\n          res[k + 2] = m >>> 8 & 255;\n          res[k + 3] = m & 255;\n        } else {\n          res[k + 3] = m >>> 24;\n          res[k + 2] = m >>> 16 & 255;\n          res[k + 1] = m >>> 8 & 255;\n          res[k] = m & 255;\n        }\n      }\n      return res;\n    }\n    exports2.split32 = split32;\n    function rotr32(w, b) {\n      return w >>> b | w << 32 - b;\n    }\n    exports2.rotr32 = rotr32;\n    function rotl32(w, b) {\n      return w << b | w >>> 32 - b;\n    }\n    exports2.rotl32 = rotl32;\n    function sum32(a, b) {\n      return a + b >>> 0;\n    }\n    exports2.sum32 = sum32;\n    function sum32_3(a, b, c) {\n      return a + b + c >>> 0;\n    }\n    exports2.sum32_3 = sum32_3;\n    function sum32_4(a, b, c, d) {\n      return a + b + c + d >>> 0;\n    }\n    exports2.sum32_4 = sum32_4;\n    function sum32_5(a, b, c, d, e) {\n      return a + b + c + d + e >>> 0;\n    }\n    exports2.sum32_5 = sum32_5;\n    function sum64(buf, pos, ah, al) {\n      var bh = buf[pos];\n      var bl = buf[pos + 1];\n      var lo = al + bl >>> 0;\n      var hi = (lo < al ? 1 : 0) + ah + bh;\n      buf[pos] = hi >>> 0;\n      buf[pos + 1] = lo;\n    }\n    exports2.sum64 = sum64;\n    function sum64_hi(ah, al, bh, bl) {\n      var lo = al + bl >>> 0;\n      var hi = (lo < al ? 1 : 0) + ah + bh;\n      return hi >>> 0;\n    }\n    exports2.sum64_hi = sum64_hi;\n    function sum64_lo(ah, al, bh, bl) {\n      var lo = al + bl;\n      return lo >>> 0;\n    }\n    exports2.sum64_lo = sum64_lo;\n    function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {\n      var carry = 0;\n      var lo = al;\n      lo = lo + bl >>> 0;\n      carry += lo < al ? 1 : 0;\n      lo = lo + cl >>> 0;\n      carry += lo < cl ? 1 : 0;\n      lo = lo + dl >>> 0;\n      carry += lo < dl ? 1 : 0;\n      var hi = ah + bh + ch + dh + carry;\n      return hi >>> 0;\n    }\n    exports2.sum64_4_hi = sum64_4_hi;\n    function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {\n      var lo = al + bl + cl + dl;\n      return lo >>> 0;\n    }\n    exports2.sum64_4_lo = sum64_4_lo;\n    function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n      var carry = 0;\n      var lo = al;\n      lo = lo + bl >>> 0;\n      carry += lo < al ? 1 : 0;\n      lo = lo + cl >>> 0;\n      carry += lo < cl ? 1 : 0;\n      lo = lo + dl >>> 0;\n      carry += lo < dl ? 1 : 0;\n      lo = lo + el >>> 0;\n      carry += lo < el ? 1 : 0;\n      var hi = ah + bh + ch + dh + eh + carry;\n      return hi >>> 0;\n    }\n    exports2.sum64_5_hi = sum64_5_hi;\n    function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n      var lo = al + bl + cl + dl + el;\n      return lo >>> 0;\n    }\n    exports2.sum64_5_lo = sum64_5_lo;\n    function rotr64_hi(ah, al, num) {\n      var r = al << 32 - num | ah >>> num;\n      return r >>> 0;\n    }\n    exports2.rotr64_hi = rotr64_hi;\n    function rotr64_lo(ah, al, num) {\n      var r = ah << 32 - num | al >>> num;\n      return r >>> 0;\n    }\n    exports2.rotr64_lo = rotr64_lo;\n    function shr64_hi(ah, al, num) {\n      return ah >>> num;\n    }\n    exports2.shr64_hi = shr64_hi;\n    function shr64_lo(ah, al, num) {\n      var r = ah << 32 - num | al >>> num;\n      return r >>> 0;\n    }\n    exports2.shr64_lo = shr64_lo;\n  }\n});\n\n// node_modules/hash.js/lib/hash/common.js\nvar require_common = __commonJS({\n  \"node_modules/hash.js/lib/hash/common.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var assert = require_minimalistic_assert();\n    function BlockHash() {\n      this.pending = null;\n      this.pendingTotal = 0;\n      this.blockSize = this.constructor.blockSize;\n      this.outSize = this.constructor.outSize;\n      this.hmacStrength = this.constructor.hmacStrength;\n      this.padLength = this.constructor.padLength / 8;\n      this.endian = \"big\";\n      this._delta8 = this.blockSize / 8;\n      this._delta32 = this.blockSize / 32;\n    }\n    exports2.BlockHash = BlockHash;\n    BlockHash.prototype.update = function update(msg, enc) {\n      msg = utils.toArray(msg, enc);\n      if (!this.pending)\n        this.pending = msg;\n      else\n        this.pending = this.pending.concat(msg);\n      this.pendingTotal += msg.length;\n      if (this.pending.length >= this._delta8) {\n        msg = this.pending;\n        var r = msg.length % this._delta8;\n        this.pending = msg.slice(msg.length - r, msg.length);\n        if (this.pending.length === 0)\n          this.pending = null;\n        msg = utils.join32(msg, 0, msg.length - r, this.endian);\n        for (var i = 0; i < msg.length; i += this._delta32)\n          this._update(msg, i, i + this._delta32);\n      }\n      return this;\n    };\n    BlockHash.prototype.digest = function digest(enc) {\n      this.update(this._pad());\n      assert(this.pending === null);\n      return this._digest(enc);\n    };\n    BlockHash.prototype._pad = function pad() {\n      var len = this.pendingTotal;\n      var bytes = this._delta8;\n      var k = bytes - (len + this.padLength) % bytes;\n      var res = new Array(k + this.padLength);\n      res[0] = 128;\n      for (var i = 1; i < k; i++)\n        res[i] = 0;\n      len <<= 3;\n      if (this.endian === \"big\") {\n        for (var t = 8; t < this.padLength; t++)\n          res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = len >>> 24 & 255;\n        res[i++] = len >>> 16 & 255;\n        res[i++] = len >>> 8 & 255;\n        res[i++] = len & 255;\n      } else {\n        res[i++] = len & 255;\n        res[i++] = len >>> 8 & 255;\n        res[i++] = len >>> 16 & 255;\n        res[i++] = len >>> 24 & 255;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        for (t = 8; t < this.padLength; t++)\n          res[i++] = 0;\n      }\n      return res;\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/common.js\nvar require_common2 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/common.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var rotr32 = utils.rotr32;\n    function ft_1(s, x, y, z) {\n      if (s === 0)\n        return ch32(x, y, z);\n      if (s === 1 || s === 3)\n        return p32(x, y, z);\n      if (s === 2)\n        return maj32(x, y, z);\n    }\n    exports2.ft_1 = ft_1;\n    function ch32(x, y, z) {\n      return x & y ^ ~x & z;\n    }\n    exports2.ch32 = ch32;\n    function maj32(x, y, z) {\n      return x & y ^ x & z ^ y & z;\n    }\n    exports2.maj32 = maj32;\n    function p32(x, y, z) {\n      return x ^ y ^ z;\n    }\n    exports2.p32 = p32;\n    function s0_256(x) {\n      return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);\n    }\n    exports2.s0_256 = s0_256;\n    function s1_256(x) {\n      return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);\n    }\n    exports2.s1_256 = s1_256;\n    function g0_256(x) {\n      return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;\n    }\n    exports2.g0_256 = g0_256;\n    function g1_256(x) {\n      return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;\n    }\n    exports2.g1_256 = g1_256;\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/1.js\nvar require__ = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/1.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var shaCommon = require_common2();\n    var rotl32 = utils.rotl32;\n    var sum32 = utils.sum32;\n    var sum32_5 = utils.sum32_5;\n    var ft_1 = shaCommon.ft_1;\n    var BlockHash = common.BlockHash;\n    var sha1_K = [\n      1518500249,\n      1859775393,\n      2400959708,\n      3395469782\n    ];\n    function SHA1() {\n      if (!(this instanceof SHA1))\n        return new SHA1();\n      BlockHash.call(this);\n      this.h = [\n        1732584193,\n        4023233417,\n        2562383102,\n        271733878,\n        3285377520\n      ];\n      this.W = new Array(80);\n    }\n    utils.inherits(SHA1, BlockHash);\n    module2.exports = SHA1;\n    SHA1.blockSize = 512;\n    SHA1.outSize = 160;\n    SHA1.hmacStrength = 80;\n    SHA1.padLength = 64;\n    SHA1.prototype._update = function _update(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 16; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i++)\n        W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);\n      var a = this.h[0];\n      var b = this.h[1];\n      var c = this.h[2];\n      var d = this.h[3];\n      var e = this.h[4];\n      for (i = 0; i < W.length; i++) {\n        var s = ~~(i / 20);\n        var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);\n        e = d;\n        d = c;\n        c = rotl32(b, 30);\n        b = a;\n        a = t;\n      }\n      this.h[0] = sum32(this.h[0], a);\n      this.h[1] = sum32(this.h[1], b);\n      this.h[2] = sum32(this.h[2], c);\n      this.h[3] = sum32(this.h[3], d);\n      this.h[4] = sum32(this.h[4], e);\n    };\n    SHA1.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/256.js\nvar require__2 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/256.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var shaCommon = require_common2();\n    var assert = require_minimalistic_assert();\n    var sum32 = utils.sum32;\n    var sum32_4 = utils.sum32_4;\n    var sum32_5 = utils.sum32_5;\n    var ch32 = shaCommon.ch32;\n    var maj32 = shaCommon.maj32;\n    var s0_256 = shaCommon.s0_256;\n    var s1_256 = shaCommon.s1_256;\n    var g0_256 = shaCommon.g0_256;\n    var g1_256 = shaCommon.g1_256;\n    var BlockHash = common.BlockHash;\n    var sha256_K = [\n      1116352408,\n      1899447441,\n      3049323471,\n      3921009573,\n      961987163,\n      1508970993,\n      2453635748,\n      2870763221,\n      3624381080,\n      310598401,\n      607225278,\n      1426881987,\n      1925078388,\n      2162078206,\n      2614888103,\n      3248222580,\n      3835390401,\n      4022224774,\n      264347078,\n      604807628,\n      770255983,\n      1249150122,\n      1555081692,\n      1996064986,\n      2554220882,\n      2821834349,\n      2952996808,\n      3210313671,\n      3336571891,\n      3584528711,\n      113926993,\n      338241895,\n      666307205,\n      773529912,\n      1294757372,\n      1396182291,\n      1695183700,\n      1986661051,\n      2177026350,\n      2456956037,\n      2730485921,\n      2820302411,\n      3259730800,\n      3345764771,\n      3516065817,\n      3600352804,\n      4094571909,\n      275423344,\n      430227734,\n      506948616,\n      659060556,\n      883997877,\n      958139571,\n      1322822218,\n      1537002063,\n      1747873779,\n      1955562222,\n      2024104815,\n      2227730452,\n      2361852424,\n      2428436474,\n      2756734187,\n      3204031479,\n      3329325298\n    ];\n    function SHA256() {\n      if (!(this instanceof SHA256))\n        return new SHA256();\n      BlockHash.call(this);\n      this.h = [\n        1779033703,\n        3144134277,\n        1013904242,\n        2773480762,\n        1359893119,\n        2600822924,\n        528734635,\n        1541459225\n      ];\n      this.k = sha256_K;\n      this.W = new Array(64);\n    }\n    utils.inherits(SHA256, BlockHash);\n    module2.exports = SHA256;\n    SHA256.blockSize = 512;\n    SHA256.outSize = 256;\n    SHA256.hmacStrength = 192;\n    SHA256.padLength = 64;\n    SHA256.prototype._update = function _update(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 16; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i++)\n        W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);\n      var a = this.h[0];\n      var b = this.h[1];\n      var c = this.h[2];\n      var d = this.h[3];\n      var e = this.h[4];\n      var f = this.h[5];\n      var g = this.h[6];\n      var h = this.h[7];\n      assert(this.k.length === W.length);\n      for (i = 0; i < W.length; i++) {\n        var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);\n        var T2 = sum32(s0_256(a), maj32(a, b, c));\n        h = g;\n        g = f;\n        f = e;\n        e = sum32(d, T1);\n        d = c;\n        c = b;\n        b = a;\n        a = sum32(T1, T2);\n      }\n      this.h[0] = sum32(this.h[0], a);\n      this.h[1] = sum32(this.h[1], b);\n      this.h[2] = sum32(this.h[2], c);\n      this.h[3] = sum32(this.h[3], d);\n      this.h[4] = sum32(this.h[4], e);\n      this.h[5] = sum32(this.h[5], f);\n      this.h[6] = sum32(this.h[6], g);\n      this.h[7] = sum32(this.h[7], h);\n    };\n    SHA256.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/224.js\nvar require__3 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/224.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var SHA256 = require__2();\n    function SHA224() {\n      if (!(this instanceof SHA224))\n        return new SHA224();\n      SHA256.call(this);\n      this.h = [\n        3238371032,\n        914150663,\n        812702999,\n        4144912697,\n        4290775857,\n        1750603025,\n        1694076839,\n        3204075428\n      ];\n    }\n    utils.inherits(SHA224, SHA256);\n    module2.exports = SHA224;\n    SHA224.blockSize = 512;\n    SHA224.outSize = 224;\n    SHA224.hmacStrength = 192;\n    SHA224.padLength = 64;\n    SHA224.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h.slice(0, 7), \"big\");\n      else\n        return utils.split32(this.h.slice(0, 7), \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/512.js\nvar require__4 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/512.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var assert = require_minimalistic_assert();\n    var rotr64_hi = utils.rotr64_hi;\n    var rotr64_lo = utils.rotr64_lo;\n    var shr64_hi = utils.shr64_hi;\n    var shr64_lo = utils.shr64_lo;\n    var sum64 = utils.sum64;\n    var sum64_hi = utils.sum64_hi;\n    var sum64_lo = utils.sum64_lo;\n    var sum64_4_hi = utils.sum64_4_hi;\n    var sum64_4_lo = utils.sum64_4_lo;\n    var sum64_5_hi = utils.sum64_5_hi;\n    var sum64_5_lo = utils.sum64_5_lo;\n    var BlockHash = common.BlockHash;\n    var sha512_K = [\n      1116352408,\n      3609767458,\n      1899447441,\n      602891725,\n      3049323471,\n      3964484399,\n      3921009573,\n      2173295548,\n      961987163,\n      4081628472,\n      1508970993,\n      3053834265,\n      2453635748,\n      2937671579,\n      2870763221,\n      3664609560,\n      3624381080,\n      2734883394,\n      310598401,\n      1164996542,\n      607225278,\n      1323610764,\n      1426881987,\n      3590304994,\n      1925078388,\n      4068182383,\n      2162078206,\n      991336113,\n      2614888103,\n      633803317,\n      3248222580,\n      3479774868,\n      3835390401,\n      2666613458,\n      4022224774,\n      944711139,\n      264347078,\n      2341262773,\n      604807628,\n      2007800933,\n      770255983,\n      1495990901,\n      1249150122,\n      1856431235,\n      1555081692,\n      3175218132,\n      1996064986,\n      2198950837,\n      2554220882,\n      3999719339,\n      2821834349,\n      766784016,\n      2952996808,\n      2566594879,\n      3210313671,\n      3203337956,\n      3336571891,\n      1034457026,\n      3584528711,\n      2466948901,\n      113926993,\n      3758326383,\n      338241895,\n      168717936,\n      666307205,\n      1188179964,\n      773529912,\n      1546045734,\n      1294757372,\n      1522805485,\n      1396182291,\n      2643833823,\n      1695183700,\n      2343527390,\n      1986661051,\n      1014477480,\n      2177026350,\n      1206759142,\n      2456956037,\n      344077627,\n      2730485921,\n      1290863460,\n      2820302411,\n      3158454273,\n      3259730800,\n      3505952657,\n      3345764771,\n      106217008,\n      3516065817,\n      3606008344,\n      3600352804,\n      1432725776,\n      4094571909,\n      1467031594,\n      275423344,\n      851169720,\n      430227734,\n      3100823752,\n      506948616,\n      1363258195,\n      659060556,\n      3750685593,\n      883997877,\n      3785050280,\n      958139571,\n      3318307427,\n      1322822218,\n      3812723403,\n      1537002063,\n      2003034995,\n      1747873779,\n      3602036899,\n      1955562222,\n      1575990012,\n      2024104815,\n      1125592928,\n      2227730452,\n      2716904306,\n      2361852424,\n      442776044,\n      2428436474,\n      593698344,\n      2756734187,\n      3733110249,\n      3204031479,\n      2999351573,\n      3329325298,\n      3815920427,\n      3391569614,\n      3928383900,\n      3515267271,\n      566280711,\n      3940187606,\n      3454069534,\n      4118630271,\n      4000239992,\n      116418474,\n      1914138554,\n      174292421,\n      2731055270,\n      289380356,\n      3203993006,\n      460393269,\n      320620315,\n      685471733,\n      587496836,\n      852142971,\n      1086792851,\n      1017036298,\n      365543100,\n      1126000580,\n      2618297676,\n      1288033470,\n      3409855158,\n      1501505948,\n      4234509866,\n      1607167915,\n      987167468,\n      1816402316,\n      1246189591\n    ];\n    function SHA512() {\n      if (!(this instanceof SHA512))\n        return new SHA512();\n      BlockHash.call(this);\n      this.h = [\n        1779033703,\n        4089235720,\n        3144134277,\n        2227873595,\n        1013904242,\n        4271175723,\n        2773480762,\n        1595750129,\n        1359893119,\n        2917565137,\n        2600822924,\n        725511199,\n        528734635,\n        4215389547,\n        1541459225,\n        327033209\n      ];\n      this.k = sha512_K;\n      this.W = new Array(160);\n    }\n    utils.inherits(SHA512, BlockHash);\n    module2.exports = SHA512;\n    SHA512.blockSize = 1024;\n    SHA512.outSize = 512;\n    SHA512.hmacStrength = 192;\n    SHA512.padLength = 128;\n    SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 32; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i += 2) {\n        var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);\n        var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);\n        var c1_hi = W[i - 14];\n        var c1_lo = W[i - 13];\n        var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);\n        var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);\n        var c3_hi = W[i - 32];\n        var c3_lo = W[i - 31];\n        W[i] = sum64_4_hi(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo\n        );\n        W[i + 1] = sum64_4_lo(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo\n        );\n      }\n    };\n    SHA512.prototype._update = function _update(msg, start) {\n      this._prepareBlock(msg, start);\n      var W = this.W;\n      var ah = this.h[0];\n      var al = this.h[1];\n      var bh = this.h[2];\n      var bl = this.h[3];\n      var ch = this.h[4];\n      var cl = this.h[5];\n      var dh = this.h[6];\n      var dl = this.h[7];\n      var eh = this.h[8];\n      var el = this.h[9];\n      var fh = this.h[10];\n      var fl = this.h[11];\n      var gh = this.h[12];\n      var gl = this.h[13];\n      var hh = this.h[14];\n      var hl = this.h[15];\n      assert(this.k.length === W.length);\n      for (var i = 0; i < W.length; i += 2) {\n        var c0_hi = hh;\n        var c0_lo = hl;\n        var c1_hi = s1_512_hi(eh, el);\n        var c1_lo = s1_512_lo(eh, el);\n        var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);\n        var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);\n        var c3_hi = this.k[i];\n        var c3_lo = this.k[i + 1];\n        var c4_hi = W[i];\n        var c4_lo = W[i + 1];\n        var T1_hi = sum64_5_hi(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo,\n          c4_hi,\n          c4_lo\n        );\n        var T1_lo = sum64_5_lo(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo,\n          c4_hi,\n          c4_lo\n        );\n        c0_hi = s0_512_hi(ah, al);\n        c0_lo = s0_512_lo(ah, al);\n        c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);\n        c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);\n        var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);\n        var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);\n        hh = gh;\n        hl = gl;\n        gh = fh;\n        gl = fl;\n        fh = eh;\n        fl = el;\n        eh = sum64_hi(dh, dl, T1_hi, T1_lo);\n        el = sum64_lo(dl, dl, T1_hi, T1_lo);\n        dh = ch;\n        dl = cl;\n        ch = bh;\n        cl = bl;\n        bh = ah;\n        bl = al;\n        ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);\n        al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);\n      }\n      sum64(this.h, 0, ah, al);\n      sum64(this.h, 2, bh, bl);\n      sum64(this.h, 4, ch, cl);\n      sum64(this.h, 6, dh, dl);\n      sum64(this.h, 8, eh, el);\n      sum64(this.h, 10, fh, fl);\n      sum64(this.h, 12, gh, gl);\n      sum64(this.h, 14, hh, hl);\n    };\n    SHA512.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n    function ch64_hi(xh, xl, yh, yl, zh) {\n      var r = xh & yh ^ ~xh & zh;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function ch64_lo(xh, xl, yh, yl, zh, zl) {\n      var r = xl & yl ^ ~xl & zl;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function maj64_hi(xh, xl, yh, yl, zh) {\n      var r = xh & yh ^ xh & zh ^ yh & zh;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function maj64_lo(xh, xl, yh, yl, zh, zl) {\n      var r = xl & yl ^ xl & zl ^ yl & zl;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s0_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 28);\n      var c1_hi = rotr64_hi(xl, xh, 2);\n      var c2_hi = rotr64_hi(xl, xh, 7);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s0_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 28);\n      var c1_lo = rotr64_lo(xl, xh, 2);\n      var c2_lo = rotr64_lo(xl, xh, 7);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s1_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 14);\n      var c1_hi = rotr64_hi(xh, xl, 18);\n      var c2_hi = rotr64_hi(xl, xh, 9);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s1_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 14);\n      var c1_lo = rotr64_lo(xh, xl, 18);\n      var c2_lo = rotr64_lo(xl, xh, 9);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g0_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 1);\n      var c1_hi = rotr64_hi(xh, xl, 8);\n      var c2_hi = shr64_hi(xh, xl, 7);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g0_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 1);\n      var c1_lo = rotr64_lo(xh, xl, 8);\n      var c2_lo = shr64_lo(xh, xl, 7);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g1_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 19);\n      var c1_hi = rotr64_hi(xl, xh, 29);\n      var c2_hi = shr64_hi(xh, xl, 6);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g1_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 19);\n      var c1_lo = rotr64_lo(xl, xh, 29);\n      var c2_lo = shr64_lo(xh, xl, 6);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/384.js\nvar require__5 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/384.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var SHA512 = require__4();\n    function SHA384() {\n      if (!(this instanceof SHA384))\n        return new SHA384();\n      SHA512.call(this);\n      this.h = [\n        3418070365,\n        3238371032,\n        1654270250,\n        914150663,\n        2438529370,\n        812702999,\n        355462360,\n        4144912697,\n        1731405415,\n        4290775857,\n        2394180231,\n        1750603025,\n        3675008525,\n        1694076839,\n        1203062813,\n        3204075428\n      ];\n    }\n    utils.inherits(SHA384, SHA512);\n    module2.exports = SHA384;\n    SHA384.blockSize = 1024;\n    SHA384.outSize = 384;\n    SHA384.hmacStrength = 192;\n    SHA384.padLength = 128;\n    SHA384.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h.slice(0, 12), \"big\");\n      else\n        return utils.split32(this.h.slice(0, 12), \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha.js\nvar require_sha = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha.js\"(exports2) {\n    \"use strict\";\n    exports2.sha1 = require__();\n    exports2.sha224 = require__3();\n    exports2.sha256 = require__2();\n    exports2.sha384 = require__5();\n    exports2.sha512 = require__4();\n  }\n});\n\n// node_modules/hash.js/lib/hash/ripemd.js\nvar require_ripemd = __commonJS({\n  \"node_modules/hash.js/lib/hash/ripemd.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var rotl32 = utils.rotl32;\n    var sum32 = utils.sum32;\n    var sum32_3 = utils.sum32_3;\n    var sum32_4 = utils.sum32_4;\n    var BlockHash = common.BlockHash;\n    function RIPEMD160() {\n      if (!(this instanceof RIPEMD160))\n        return new RIPEMD160();\n      BlockHash.call(this);\n      this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];\n      this.endian = \"little\";\n    }\n    utils.inherits(RIPEMD160, BlockHash);\n    exports2.ripemd160 = RIPEMD160;\n    RIPEMD160.blockSize = 512;\n    RIPEMD160.outSize = 160;\n    RIPEMD160.hmacStrength = 192;\n    RIPEMD160.padLength = 64;\n    RIPEMD160.prototype._update = function update(msg, start) {\n      var A = this.h[0];\n      var B = this.h[1];\n      var C = this.h[2];\n      var D = this.h[3];\n      var E = this.h[4];\n      var Ah = A;\n      var Bh = B;\n      var Ch = C;\n      var Dh = D;\n      var Eh = E;\n      for (var j = 0; j < 80; j++) {\n        var T = sum32(\n          rotl32(\n            sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),\n            s[j]\n          ),\n          E\n        );\n        A = E;\n        E = D;\n        D = rotl32(C, 10);\n        C = B;\n        B = T;\n        T = sum32(\n          rotl32(\n            sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),\n            sh[j]\n          ),\n          Eh\n        );\n        Ah = Eh;\n        Eh = Dh;\n        Dh = rotl32(Ch, 10);\n        Ch = Bh;\n        Bh = T;\n      }\n      T = sum32_3(this.h[1], C, Dh);\n      this.h[1] = sum32_3(this.h[2], D, Eh);\n      this.h[2] = sum32_3(this.h[3], E, Ah);\n      this.h[3] = sum32_3(this.h[4], A, Bh);\n      this.h[4] = sum32_3(this.h[0], B, Ch);\n      this.h[0] = T;\n    };\n    RIPEMD160.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"little\");\n      else\n        return utils.split32(this.h, \"little\");\n    };\n    function f(j, x, y, z) {\n      if (j <= 15)\n        return x ^ y ^ z;\n      else if (j <= 31)\n        return x & y | ~x & z;\n      else if (j <= 47)\n        return (x | ~y) ^ z;\n      else if (j <= 63)\n        return x & z | y & ~z;\n      else\n        return x ^ (y | ~z);\n    }\n    function K(j) {\n      if (j <= 15)\n        return 0;\n      else if (j <= 31)\n        return 1518500249;\n      else if (j <= 47)\n        return 1859775393;\n      else if (j <= 63)\n        return 2400959708;\n      else\n        return 2840853838;\n    }\n    function Kh(j) {\n      if (j <= 15)\n        return 1352829926;\n      else if (j <= 31)\n        return 1548603684;\n      else if (j <= 47)\n        return 1836072691;\n      else if (j <= 63)\n        return 2053994217;\n      else\n        return 0;\n    }\n    var r = [\n      0,\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14,\n      15,\n      7,\n      4,\n      13,\n      1,\n      10,\n      6,\n      15,\n      3,\n      12,\n      0,\n      9,\n      5,\n      2,\n      14,\n      11,\n      8,\n      3,\n      10,\n      14,\n      4,\n      9,\n      15,\n      8,\n      1,\n      2,\n      7,\n      0,\n      6,\n      13,\n      11,\n      5,\n      12,\n      1,\n      9,\n      11,\n      10,\n      0,\n      8,\n      12,\n      4,\n      13,\n      3,\n      7,\n      15,\n      14,\n      5,\n      6,\n      2,\n      4,\n      0,\n      5,\n      9,\n      7,\n      12,\n      2,\n      10,\n      14,\n      1,\n      3,\n      8,\n      11,\n      6,\n      15,\n      13\n    ];\n    var rh = [\n      5,\n      14,\n      7,\n      0,\n      9,\n      2,\n      11,\n      4,\n      13,\n      6,\n      15,\n      8,\n      1,\n      10,\n      3,\n      12,\n      6,\n      11,\n      3,\n      7,\n      0,\n      13,\n      5,\n      10,\n      14,\n      15,\n      8,\n      12,\n      4,\n      9,\n      1,\n      2,\n      15,\n      5,\n      1,\n      3,\n      7,\n      14,\n      6,\n      9,\n      11,\n      8,\n      12,\n      2,\n      10,\n      0,\n      4,\n      13,\n      8,\n      6,\n      4,\n      1,\n      3,\n      11,\n      15,\n      0,\n      5,\n      12,\n      2,\n      13,\n      9,\n      7,\n      10,\n      14,\n      12,\n      15,\n      10,\n      4,\n      1,\n      5,\n      8,\n      7,\n      6,\n      2,\n      13,\n      14,\n      0,\n      3,\n      9,\n      11\n    ];\n    var s = [\n      11,\n      14,\n      15,\n      12,\n      5,\n      8,\n      7,\n      9,\n      11,\n      13,\n      14,\n      15,\n      6,\n      7,\n      9,\n      8,\n      7,\n      6,\n      8,\n      13,\n      11,\n      9,\n      7,\n      15,\n      7,\n      12,\n      15,\n      9,\n      11,\n      7,\n      13,\n      12,\n      11,\n      13,\n      6,\n      7,\n      14,\n      9,\n      13,\n      15,\n      14,\n      8,\n      13,\n      6,\n      5,\n      12,\n      7,\n      5,\n      11,\n      12,\n      14,\n      15,\n      14,\n      15,\n      9,\n      8,\n      9,\n      14,\n      5,\n      6,\n      8,\n      6,\n      5,\n      12,\n      9,\n      15,\n      5,\n      11,\n      6,\n      8,\n      13,\n      12,\n      5,\n      12,\n      13,\n      14,\n      11,\n      8,\n      5,\n      6\n    ];\n    var sh = [\n      8,\n      9,\n      9,\n      11,\n      13,\n      15,\n      15,\n      5,\n      7,\n      7,\n      8,\n      11,\n      14,\n      14,\n      12,\n      6,\n      9,\n      13,\n      15,\n      7,\n      12,\n      8,\n      9,\n      11,\n      7,\n      7,\n      12,\n      7,\n      6,\n      15,\n      13,\n      11,\n      9,\n      7,\n      15,\n      11,\n      8,\n      6,\n      6,\n      14,\n      12,\n      13,\n      5,\n      14,\n      13,\n      13,\n      7,\n      5,\n      15,\n      5,\n      8,\n      11,\n      14,\n      14,\n      6,\n      14,\n      6,\n      9,\n      12,\n      9,\n      12,\n      5,\n      15,\n      8,\n      8,\n      5,\n      12,\n      9,\n      12,\n      5,\n      14,\n      6,\n      8,\n      13,\n      6,\n      5,\n      15,\n      13,\n      11,\n      11\n    ];\n  }\n});\n\n// node_modules/hash.js/lib/hash/hmac.js\nvar require_hmac = __commonJS({\n  \"node_modules/hash.js/lib/hash/hmac.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var assert = require_minimalistic_assert();\n    function Hmac(hash, key, enc) {\n      if (!(this instanceof Hmac))\n        return new Hmac(hash, key, enc);\n      this.Hash = hash;\n      this.blockSize = hash.blockSize / 8;\n      this.outSize = hash.outSize / 8;\n      this.inner = null;\n      this.outer = null;\n      this._init(utils.toArray(key, enc));\n    }\n    module2.exports = Hmac;\n    Hmac.prototype._init = function init(key) {\n      if (key.length > this.blockSize)\n        key = new this.Hash().update(key).digest();\n      assert(key.length <= this.blockSize);\n      for (var i = key.length; i < this.blockSize; i++)\n        key.push(0);\n      for (i = 0; i < key.length; i++)\n        key[i] ^= 54;\n      this.inner = new this.Hash().update(key);\n      for (i = 0; i < key.length; i++)\n        key[i] ^= 106;\n      this.outer = new this.Hash().update(key);\n    };\n    Hmac.prototype.update = function update(msg, enc) {\n      this.inner.update(msg, enc);\n      return this;\n    };\n    Hmac.prototype.digest = function digest(enc) {\n      this.outer.update(this.inner.digest());\n      return this.outer.digest(enc);\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash.js\nvar require_hash = __commonJS({\n  \"node_modules/hash.js/lib/hash.js\"(exports2) {\n    var hash = exports2;\n    hash.utils = require_utils3();\n    hash.common = require_common();\n    hash.sha = require_sha();\n    hash.ripemd = require_ripemd();\n    hash.hmac = require_hmac();\n    hash.sha1 = hash.sha.sha1;\n    hash.sha256 = hash.sha.sha256;\n    hash.sha224 = hash.sha.sha224;\n    hash.sha384 = hash.sha.sha384;\n    hash.sha512 = hash.sha.sha512;\n    hash.ripemd160 = hash.ripemd.ripemd160;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js\nvar require_secp256k1 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js\"(exports2, module2) {\n    module2.exports = {\n      doubles: {\n        step: 4,\n        points: [\n          [\n            \"e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a\",\n            \"f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821\"\n          ],\n          [\n            \"8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508\",\n            \"11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\"\n          ],\n          [\n            \"175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739\",\n            \"d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695\"\n          ],\n          [\n            \"363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640\",\n            \"4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9\"\n          ],\n          [\n            \"8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c\",\n            \"4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36\"\n          ],\n          [\n            \"723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda\",\n            \"96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f\"\n          ],\n          [\n            \"eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa\",\n            \"5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999\"\n          ],\n          [\n            \"100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0\",\n            \"cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09\"\n          ],\n          [\n            \"e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d\",\n            \"9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d\"\n          ],\n          [\n            \"feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d\",\n            \"e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088\"\n          ],\n          [\n            \"da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1\",\n            \"9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d\"\n          ],\n          [\n            \"53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0\",\n            \"5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8\"\n          ],\n          [\n            \"8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047\",\n            \"10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a\"\n          ],\n          [\n            \"385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862\",\n            \"283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453\"\n          ],\n          [\n            \"6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7\",\n            \"7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160\"\n          ],\n          [\n            \"3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd\",\n            \"56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0\"\n          ],\n          [\n            \"85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83\",\n            \"7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6\"\n          ],\n          [\n            \"948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a\",\n            \"53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589\"\n          ],\n          [\n            \"6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8\",\n            \"bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17\"\n          ],\n          [\n            \"e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d\",\n            \"4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda\"\n          ],\n          [\n            \"e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725\",\n            \"7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd\"\n          ],\n          [\n            \"213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754\",\n            \"4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2\"\n          ],\n          [\n            \"4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c\",\n            \"17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6\"\n          ],\n          [\n            \"fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6\",\n            \"6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f\"\n          ],\n          [\n            \"76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39\",\n            \"c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01\"\n          ],\n          [\n            \"c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891\",\n            \"893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3\"\n          ],\n          [\n            \"d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b\",\n            \"febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f\"\n          ],\n          [\n            \"b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03\",\n            \"2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7\"\n          ],\n          [\n            \"e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d\",\n            \"eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78\"\n          ],\n          [\n            \"a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070\",\n            \"7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1\"\n          ],\n          [\n            \"90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4\",\n            \"e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150\"\n          ],\n          [\n            \"8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da\",\n            \"662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82\"\n          ],\n          [\n            \"e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11\",\n            \"1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc\"\n          ],\n          [\n            \"8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e\",\n            \"efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b\"\n          ],\n          [\n            \"e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41\",\n            \"2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51\"\n          ],\n          [\n            \"b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef\",\n            \"67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45\"\n          ],\n          [\n            \"d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8\",\n            \"db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120\"\n          ],\n          [\n            \"324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d\",\n            \"648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84\"\n          ],\n          [\n            \"4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96\",\n            \"35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d\"\n          ],\n          [\n            \"9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd\",\n            \"ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d\"\n          ],\n          [\n            \"6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5\",\n            \"9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8\"\n          ],\n          [\n            \"a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266\",\n            \"40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8\"\n          ],\n          [\n            \"7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71\",\n            \"34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac\"\n          ],\n          [\n            \"928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac\",\n            \"c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f\"\n          ],\n          [\n            \"85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751\",\n            \"1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962\"\n          ],\n          [\n            \"ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e\",\n            \"493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907\"\n          ],\n          [\n            \"827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241\",\n            \"c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec\"\n          ],\n          [\n            \"eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3\",\n            \"be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d\"\n          ],\n          [\n            \"e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f\",\n            \"4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414\"\n          ],\n          [\n            \"1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19\",\n            \"aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd\"\n          ],\n          [\n            \"146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be\",\n            \"b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0\"\n          ],\n          [\n            \"fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9\",\n            \"6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811\"\n          ],\n          [\n            \"da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2\",\n            \"8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1\"\n          ],\n          [\n            \"a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13\",\n            \"7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c\"\n          ],\n          [\n            \"174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c\",\n            \"ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73\"\n          ],\n          [\n            \"959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba\",\n            \"2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd\"\n          ],\n          [\n            \"d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151\",\n            \"e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405\"\n          ],\n          [\n            \"64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073\",\n            \"d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589\"\n          ],\n          [\n            \"8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458\",\n            \"38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e\"\n          ],\n          [\n            \"13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b\",\n            \"69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27\"\n          ],\n          [\n            \"bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366\",\n            \"d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1\"\n          ],\n          [\n            \"8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa\",\n            \"40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482\"\n          ],\n          [\n            \"8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0\",\n            \"620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945\"\n          ],\n          [\n            \"dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787\",\n            \"7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573\"\n          ],\n          [\n            \"f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e\",\n            \"ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82\"\n          ]\n        ]\n      },\n      naf: {\n        wnd: 7,\n        points: [\n          [\n            \"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9\",\n            \"388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672\"\n          ],\n          [\n            \"2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4\",\n            \"d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6\"\n          ],\n          [\n            \"5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc\",\n            \"6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da\"\n          ],\n          [\n            \"acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe\",\n            \"cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37\"\n          ],\n          [\n            \"774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb\",\n            \"d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b\"\n          ],\n          [\n            \"f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8\",\n            \"ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81\"\n          ],\n          [\n            \"d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e\",\n            \"581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58\"\n          ],\n          [\n            \"defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34\",\n            \"4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77\"\n          ],\n          [\n            \"2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c\",\n            \"85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a\"\n          ],\n          [\n            \"352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5\",\n            \"321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c\"\n          ],\n          [\n            \"2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f\",\n            \"2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67\"\n          ],\n          [\n            \"9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714\",\n            \"73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402\"\n          ],\n          [\n            \"daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729\",\n            \"a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55\"\n          ],\n          [\n            \"c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db\",\n            \"2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482\"\n          ],\n          [\n            \"6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4\",\n            \"e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82\"\n          ],\n          [\n            \"1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5\",\n            \"b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396\"\n          ],\n          [\n            \"605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479\",\n            \"2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49\"\n          ],\n          [\n            \"62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d\",\n            \"80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf\"\n          ],\n          [\n            \"80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f\",\n            \"1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a\"\n          ],\n          [\n            \"7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb\",\n            \"d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7\"\n          ],\n          [\n            \"d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9\",\n            \"eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933\"\n          ],\n          [\n            \"49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963\",\n            \"758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a\"\n          ],\n          [\n            \"77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74\",\n            \"958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6\"\n          ],\n          [\n            \"f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530\",\n            \"e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37\"\n          ],\n          [\n            \"463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b\",\n            \"5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e\"\n          ],\n          [\n            \"f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247\",\n            \"cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6\"\n          ],\n          [\n            \"caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1\",\n            \"cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476\"\n          ],\n          [\n            \"2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120\",\n            \"4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40\"\n          ],\n          [\n            \"7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435\",\n            \"91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61\"\n          ],\n          [\n            \"754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18\",\n            \"673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683\"\n          ],\n          [\n            \"e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8\",\n            \"59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5\"\n          ],\n          [\n            \"186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb\",\n            \"3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b\"\n          ],\n          [\n            \"df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f\",\n            \"55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417\"\n          ],\n          [\n            \"5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143\",\n            \"efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868\"\n          ],\n          [\n            \"290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba\",\n            \"e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a\"\n          ],\n          [\n            \"af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45\",\n            \"f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6\"\n          ],\n          [\n            \"766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a\",\n            \"744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996\"\n          ],\n          [\n            \"59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e\",\n            \"c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e\"\n          ],\n          [\n            \"f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8\",\n            \"e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d\"\n          ],\n          [\n            \"7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c\",\n            \"30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2\"\n          ],\n          [\n            \"948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519\",\n            \"e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e\"\n          ],\n          [\n            \"7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab\",\n            \"100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437\"\n          ],\n          [\n            \"3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca\",\n            \"ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311\"\n          ],\n          [\n            \"d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf\",\n            \"8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4\"\n          ],\n          [\n            \"1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610\",\n            \"68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575\"\n          ],\n          [\n            \"733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4\",\n            \"f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d\"\n          ],\n          [\n            \"15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c\",\n            \"d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d\"\n          ],\n          [\n            \"a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940\",\n            \"edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629\"\n          ],\n          [\n            \"e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980\",\n            \"a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06\"\n          ],\n          [\n            \"311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3\",\n            \"66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374\"\n          ],\n          [\n            \"34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf\",\n            \"9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee\"\n          ],\n          [\n            \"f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63\",\n            \"4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1\"\n          ],\n          [\n            \"d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448\",\n            \"fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b\"\n          ],\n          [\n            \"32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf\",\n            \"5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661\"\n          ],\n          [\n            \"7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5\",\n            \"8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6\"\n          ],\n          [\n            \"ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6\",\n            \"8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e\"\n          ],\n          [\n            \"16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5\",\n            \"5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d\"\n          ],\n          [\n            \"eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99\",\n            \"f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc\"\n          ],\n          [\n            \"78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51\",\n            \"f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4\"\n          ],\n          [\n            \"494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5\",\n            \"42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c\"\n          ],\n          [\n            \"a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5\",\n            \"204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b\"\n          ],\n          [\n            \"c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997\",\n            \"4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913\"\n          ],\n          [\n            \"841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881\",\n            \"73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154\"\n          ],\n          [\n            \"5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5\",\n            \"39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865\"\n          ],\n          [\n            \"36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66\",\n            \"d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc\"\n          ],\n          [\n            \"336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726\",\n            \"ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224\"\n          ],\n          [\n            \"8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede\",\n            \"6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e\"\n          ],\n          [\n            \"1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94\",\n            \"60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6\"\n          ],\n          [\n            \"85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31\",\n            \"3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511\"\n          ],\n          [\n            \"29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51\",\n            \"b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b\"\n          ],\n          [\n            \"a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252\",\n            \"ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2\"\n          ],\n          [\n            \"4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5\",\n            \"cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c\"\n          ],\n          [\n            \"d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b\",\n            \"6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3\"\n          ],\n          [\n            \"ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4\",\n            \"322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d\"\n          ],\n          [\n            \"af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f\",\n            \"6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700\"\n          ],\n          [\n            \"e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889\",\n            \"2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4\"\n          ],\n          [\n            \"591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246\",\n            \"b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196\"\n          ],\n          [\n            \"11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984\",\n            \"998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4\"\n          ],\n          [\n            \"3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a\",\n            \"b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257\"\n          ],\n          [\n            \"cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030\",\n            \"bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13\"\n          ],\n          [\n            \"c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197\",\n            \"6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096\"\n          ],\n          [\n            \"c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593\",\n            \"c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38\"\n          ],\n          [\n            \"a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef\",\n            \"21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f\"\n          ],\n          [\n            \"347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38\",\n            \"60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448\"\n          ],\n          [\n            \"da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a\",\n            \"49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a\"\n          ],\n          [\n            \"c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111\",\n            \"5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4\"\n          ],\n          [\n            \"4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502\",\n            \"7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437\"\n          ],\n          [\n            \"3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea\",\n            \"be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7\"\n          ],\n          [\n            \"cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26\",\n            \"8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d\"\n          ],\n          [\n            \"b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986\",\n            \"39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a\"\n          ],\n          [\n            \"d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e\",\n            \"62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54\"\n          ],\n          [\n            \"48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4\",\n            \"25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77\"\n          ],\n          [\n            \"dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda\",\n            \"ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517\"\n          ],\n          [\n            \"6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859\",\n            \"cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10\"\n          ],\n          [\n            \"e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f\",\n            \"f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125\"\n          ],\n          [\n            \"eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c\",\n            \"6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e\"\n          ],\n          [\n            \"13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942\",\n            \"fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1\"\n          ],\n          [\n            \"ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a\",\n            \"1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2\"\n          ],\n          [\n            \"b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80\",\n            \"5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423\"\n          ],\n          [\n            \"ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d\",\n            \"438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8\"\n          ],\n          [\n            \"8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1\",\n            \"cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758\"\n          ],\n          [\n            \"52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63\",\n            \"c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375\"\n          ],\n          [\n            \"e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352\",\n            \"6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d\"\n          ],\n          [\n            \"7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193\",\n            \"ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec\"\n          ],\n          [\n            \"5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00\",\n            \"9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0\"\n          ],\n          [\n            \"32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58\",\n            \"ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c\"\n          ],\n          [\n            \"e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7\",\n            \"d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4\"\n          ],\n          [\n            \"8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8\",\n            \"c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f\"\n          ],\n          [\n            \"4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e\",\n            \"67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649\"\n          ],\n          [\n            \"3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d\",\n            \"cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826\"\n          ],\n          [\n            \"674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b\",\n            \"299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5\"\n          ],\n          [\n            \"d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f\",\n            \"f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87\"\n          ],\n          [\n            \"30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6\",\n            \"462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b\"\n          ],\n          [\n            \"be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297\",\n            \"62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc\"\n          ],\n          [\n            \"93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a\",\n            \"7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c\"\n          ],\n          [\n            \"b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c\",\n            \"ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f\"\n          ],\n          [\n            \"d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52\",\n            \"4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a\"\n          ],\n          [\n            \"d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb\",\n            \"bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46\"\n          ],\n          [\n            \"463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065\",\n            \"bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f\"\n          ],\n          [\n            \"7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917\",\n            \"603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03\"\n          ],\n          [\n            \"74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9\",\n            \"cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08\"\n          ],\n          [\n            \"30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3\",\n            \"553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8\"\n          ],\n          [\n            \"9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57\",\n            \"712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373\"\n          ],\n          [\n            \"176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66\",\n            \"ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3\"\n          ],\n          [\n            \"75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8\",\n            \"9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8\"\n          ],\n          [\n            \"809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721\",\n            \"9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1\"\n          ],\n          [\n            \"1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180\",\n            \"4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9\"\n          ]\n        ]\n      }\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curves.js\nvar require_curves = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curves.js\"(exports2) {\n    \"use strict\";\n    var curves = exports2;\n    var hash = require_hash();\n    var curve = require_curve();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function PresetCurve(options) {\n      if (options.type === \"short\")\n        this.curve = new curve.short(options);\n      else if (options.type === \"edwards\")\n        this.curve = new curve.edwards(options);\n      else\n        this.curve = new curve.mont(options);\n      this.g = this.curve.g;\n      this.n = this.curve.n;\n      this.hash = options.hash;\n      assert(this.g.validate(), \"Invalid curve\");\n      assert(this.g.mul(this.n).isInfinity(), \"Invalid curve, G*N != O\");\n    }\n    curves.PresetCurve = PresetCurve;\n    function defineCurve(name2, options) {\n      Object.defineProperty(curves, name2, {\n        configurable: true,\n        enumerable: true,\n        get: function() {\n          var curve2 = new PresetCurve(options);\n          Object.defineProperty(curves, name2, {\n            configurable: true,\n            enumerable: true,\n            value: curve2\n          });\n          return curve2;\n        }\n      });\n    }\n    defineCurve(\"p192\", {\n      type: \"short\",\n      prime: \"p192\",\n      p: \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\",\n      a: \"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc\",\n      b: \"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1\",\n      n: \"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012\",\n        \"07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811\"\n      ]\n    });\n    defineCurve(\"p224\", {\n      type: \"short\",\n      prime: \"p224\",\n      p: \"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\",\n      a: \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe\",\n      b: \"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4\",\n      n: \"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21\",\n        \"bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34\"\n      ]\n    });\n    defineCurve(\"p256\", {\n      type: \"short\",\n      prime: null,\n      p: \"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff\",\n      a: \"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc\",\n      b: \"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b\",\n      n: \"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296\",\n        \"4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5\"\n      ]\n    });\n    defineCurve(\"p384\", {\n      type: \"short\",\n      prime: null,\n      p: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff\",\n      a: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc\",\n      b: \"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef\",\n      n: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973\",\n      hash: hash.sha384,\n      gRed: false,\n      g: [\n        \"aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7\",\n        \"3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f\"\n      ]\n    });\n    defineCurve(\"p521\", {\n      type: \"short\",\n      prime: null,\n      p: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff\",\n      a: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc\",\n      b: \"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00\",\n      n: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409\",\n      hash: hash.sha512,\n      gRed: false,\n      g: [\n        \"000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66\",\n        \"00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650\"\n      ]\n    });\n    defineCurve(\"curve25519\", {\n      type: \"mont\",\n      prime: \"p25519\",\n      p: \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",\n      a: \"76d06\",\n      b: \"1\",\n      n: \"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"9\"\n      ]\n    });\n    defineCurve(\"ed25519\", {\n      type: \"edwards\",\n      prime: \"p25519\",\n      p: \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",\n      a: \"-1\",\n      c: \"1\",\n      // -121665 * (121666^(-1)) (mod P)\n      d: \"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3\",\n      n: \"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a\",\n        // 4/5\n        \"6666666666666666666666666666666666666666666666666666666666666658\"\n      ]\n    });\n    var pre;\n    try {\n      pre = require_secp256k1();\n    } catch (e) {\n      pre = void 0;\n    }\n    defineCurve(\"secp256k1\", {\n      type: \"short\",\n      prime: \"k256\",\n      p: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\",\n      a: \"0\",\n      b: \"7\",\n      n: \"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141\",\n      h: \"1\",\n      hash: hash.sha256,\n      // Precomputed endomorphism\n      beta: \"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee\",\n      lambda: \"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72\",\n      basis: [\n        {\n          a: \"3086d221a7d46bcde86c90e49284eb15\",\n          b: \"-e4437ed6010e88286f547fa90abfe4c3\"\n        },\n        {\n          a: \"114ca50f7a8e2f3f657c1108d9d44cfd8\",\n          b: \"3086d221a7d46bcde86c90e49284eb15\"\n        }\n      ],\n      gRed: false,\n      g: [\n        \"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\n        \"483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        pre\n      ]\n    });\n  }\n});\n\n// node_modules/hmac-drbg/lib/hmac-drbg.js\nvar require_hmac_drbg = __commonJS({\n  \"node_modules/hmac-drbg/lib/hmac-drbg.js\"(exports2, module2) {\n    \"use strict\";\n    var hash = require_hash();\n    var utils = require_utils();\n    var assert = require_minimalistic_assert();\n    function HmacDRBG(options) {\n      if (!(this instanceof HmacDRBG))\n        return new HmacDRBG(options);\n      this.hash = options.hash;\n      this.predResist = !!options.predResist;\n      this.outLen = this.hash.outSize;\n      this.minEntropy = options.minEntropy || this.hash.hmacStrength;\n      this._reseed = null;\n      this.reseedInterval = null;\n      this.K = null;\n      this.V = null;\n      var entropy = utils.toArray(options.entropy, options.entropyEnc || \"hex\");\n      var nonce = utils.toArray(options.nonce, options.nonceEnc || \"hex\");\n      var pers = utils.toArray(options.pers, options.persEnc || \"hex\");\n      assert(\n        entropy.length >= this.minEntropy / 8,\n        \"Not enough entropy. Minimum is: \" + this.minEntropy + \" bits\"\n      );\n      this._init(entropy, nonce, pers);\n    }\n    module2.exports = HmacDRBG;\n    HmacDRBG.prototype._init = function init(entropy, nonce, pers) {\n      var seed = entropy.concat(nonce).concat(pers);\n      this.K = new Array(this.outLen / 8);\n      this.V = new Array(this.outLen / 8);\n      for (var i = 0; i < this.V.length; i++) {\n        this.K[i] = 0;\n        this.V[i] = 1;\n      }\n      this._update(seed);\n      this._reseed = 1;\n      this.reseedInterval = 281474976710656;\n    };\n    HmacDRBG.prototype._hmac = function hmac() {\n      return new hash.hmac(this.hash, this.K);\n    };\n    HmacDRBG.prototype._update = function update(seed) {\n      var kmac = this._hmac().update(this.V).update([0]);\n      if (seed)\n        kmac = kmac.update(seed);\n      this.K = kmac.digest();\n      this.V = this._hmac().update(this.V).digest();\n      if (!seed)\n        return;\n      this.K = this._hmac().update(this.V).update([1]).update(seed).digest();\n      this.V = this._hmac().update(this.V).digest();\n    };\n    HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {\n      if (typeof entropyEnc !== \"string\") {\n        addEnc = add;\n        add = entropyEnc;\n        entropyEnc = null;\n      }\n      entropy = utils.toArray(entropy, entropyEnc);\n      add = utils.toArray(add, addEnc);\n      assert(\n        entropy.length >= this.minEntropy / 8,\n        \"Not enough entropy. Minimum is: \" + this.minEntropy + \" bits\"\n      );\n      this._update(entropy.concat(add || []));\n      this._reseed = 1;\n    };\n    HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {\n      if (this._reseed > this.reseedInterval)\n        throw new Error(\"Reseed is required\");\n      if (typeof enc !== \"string\") {\n        addEnc = add;\n        add = enc;\n        enc = null;\n      }\n      if (add) {\n        add = utils.toArray(add, addEnc || \"hex\");\n        this._update(add);\n      }\n      var temp = [];\n      while (temp.length < len) {\n        this.V = this._hmac().update(this.V).digest();\n        temp = temp.concat(this.V);\n      }\n      var res = temp.slice(0, len);\n      this._update(add);\n      this._reseed++;\n      return utils.encode(res, enc);\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/key.js\nvar require_key = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/key.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function KeyPair(ec, options) {\n      this.ec = ec;\n      this.priv = null;\n      this.pub = null;\n      if (options.priv)\n        this._importPrivate(options.priv, options.privEnc);\n      if (options.pub)\n        this._importPublic(options.pub, options.pubEnc);\n    }\n    module2.exports = KeyPair;\n    KeyPair.fromPublic = function fromPublic(ec, pub, enc) {\n      if (pub instanceof KeyPair)\n        return pub;\n      return new KeyPair(ec, {\n        pub,\n        pubEnc: enc\n      });\n    };\n    KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {\n      if (priv instanceof KeyPair)\n        return priv;\n      return new KeyPair(ec, {\n        priv,\n        privEnc: enc\n      });\n    };\n    KeyPair.prototype.validate = function validate() {\n      var pub = this.getPublic();\n      if (pub.isInfinity())\n        return { result: false, reason: \"Invalid public key\" };\n      if (!pub.validate())\n        return { result: false, reason: \"Public key is not a point\" };\n      if (!pub.mul(this.ec.curve.n).isInfinity())\n        return { result: false, reason: \"Public key * N != O\" };\n      return { result: true, reason: null };\n    };\n    KeyPair.prototype.getPublic = function getPublic(compact, enc) {\n      if (typeof compact === \"string\") {\n        enc = compact;\n        compact = null;\n      }\n      if (!this.pub)\n        this.pub = this.ec.g.mul(this.priv);\n      if (!enc)\n        return this.pub;\n      return this.pub.encode(enc, compact);\n    };\n    KeyPair.prototype.getPrivate = function getPrivate(enc) {\n      if (enc === \"hex\")\n        return this.priv.toString(16, 2);\n      else\n        return this.priv;\n    };\n    KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {\n      this.priv = new BN(key, enc || 16);\n      this.priv = this.priv.umod(this.ec.curve.n);\n    };\n    KeyPair.prototype._importPublic = function _importPublic(key, enc) {\n      if (key.x || key.y) {\n        if (this.ec.curve.type === \"mont\") {\n          assert(key.x, \"Need x coordinate\");\n        } else if (this.ec.curve.type === \"short\" || this.ec.curve.type === \"edwards\") {\n          assert(key.x && key.y, \"Need both x and y coordinate\");\n        }\n        this.pub = this.ec.curve.point(key.x, key.y);\n        return;\n      }\n      this.pub = this.ec.curve.decodePoint(key, enc);\n    };\n    KeyPair.prototype.derive = function derive(pub) {\n      if (!pub.validate()) {\n        assert(pub.validate(), \"public point not validated\");\n      }\n      return pub.mul(this.priv).getX();\n    };\n    KeyPair.prototype.sign = function sign(msg, enc, options) {\n      return this.ec.sign(msg, this, enc, options);\n    };\n    KeyPair.prototype.verify = function verify(msg, signature) {\n      return this.ec.verify(msg, signature, this);\n    };\n    KeyPair.prototype.inspect = function inspect() {\n      return \"<Key priv: \" + (this.priv && this.priv.toString(16, 2)) + \" pub: \" + (this.pub && this.pub.inspect()) + \" >\";\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/signature.js\nvar require_signature = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/signature.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function Signature(options, enc) {\n      if (options instanceof Signature)\n        return options;\n      if (this._importDER(options, enc))\n        return;\n      assert(options.r && options.s, \"Signature without r or s\");\n      this.r = new BN(options.r, 16);\n      this.s = new BN(options.s, 16);\n      if (options.recoveryParam === void 0)\n        this.recoveryParam = null;\n      else\n        this.recoveryParam = options.recoveryParam;\n    }\n    module2.exports = Signature;\n    function Position() {\n      this.place = 0;\n    }\n    function getLength(buf, p) {\n      var initial = buf[p.place++];\n      if (!(initial & 128)) {\n        return initial;\n      }\n      var octetLen = initial & 15;\n      if (octetLen === 0 || octetLen > 4) {\n        return false;\n      }\n      var val = 0;\n      for (var i = 0, off = p.place; i < octetLen; i++, off++) {\n        val <<= 8;\n        val |= buf[off];\n        val >>>= 0;\n      }\n      if (val <= 127) {\n        return false;\n      }\n      p.place = off;\n      return val;\n    }\n    function rmPadding(buf) {\n      var i = 0;\n      var len = buf.length - 1;\n      while (!buf[i] && !(buf[i + 1] & 128) && i < len) {\n        i++;\n      }\n      if (i === 0) {\n        return buf;\n      }\n      return buf.slice(i);\n    }\n    Signature.prototype._importDER = function _importDER(data, enc) {\n      data = utils.toArray(data, enc);\n      var p = new Position();\n      if (data[p.place++] !== 48) {\n        return false;\n      }\n      var len = getLength(data, p);\n      if (len === false) {\n        return false;\n      }\n      if (len + p.place !== data.length) {\n        return false;\n      }\n      if (data[p.place++] !== 2) {\n        return false;\n      }\n      var rlen = getLength(data, p);\n      if (rlen === false) {\n        return false;\n      }\n      var r = data.slice(p.place, rlen + p.place);\n      p.place += rlen;\n      if (data[p.place++] !== 2) {\n        return false;\n      }\n      var slen = getLength(data, p);\n      if (slen === false) {\n        return false;\n      }\n      if (data.length !== slen + p.place) {\n        return false;\n      }\n      var s = data.slice(p.place, slen + p.place);\n      if (r[0] === 0) {\n        if (r[1] & 128) {\n          r = r.slice(1);\n        } else {\n          return false;\n        }\n      }\n      if (s[0] === 0) {\n        if (s[1] & 128) {\n          s = s.slice(1);\n        } else {\n          return false;\n        }\n      }\n      this.r = new BN(r);\n      this.s = new BN(s);\n      this.recoveryParam = null;\n      return true;\n    };\n    function constructLength(arr, len) {\n      if (len < 128) {\n        arr.push(len);\n        return;\n      }\n      var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);\n      arr.push(octets | 128);\n      while (--octets) {\n        arr.push(len >>> (octets << 3) & 255);\n      }\n      arr.push(len);\n    }\n    Signature.prototype.toDER = function toDER(enc) {\n      var r = this.r.toArray();\n      var s = this.s.toArray();\n      if (r[0] & 128)\n        r = [0].concat(r);\n      if (s[0] & 128)\n        s = [0].concat(s);\n      r = rmPadding(r);\n      s = rmPadding(s);\n      while (!s[0] && !(s[1] & 128)) {\n        s = s.slice(1);\n      }\n      var arr = [2];\n      constructLength(arr, r.length);\n      arr = arr.concat(r);\n      arr.push(2);\n      constructLength(arr, s.length);\n      var backHalf = arr.concat(s);\n      var res = [48];\n      constructLength(res, backHalf.length);\n      res = res.concat(backHalf);\n      return utils.encode(res, enc);\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/index.js\nvar require_ec = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/index.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var HmacDRBG = require_hmac_drbg();\n    var utils = require_utils2();\n    var curves = require_curves();\n    var rand = require_brorand();\n    var assert = utils.assert;\n    var KeyPair = require_key();\n    var Signature = require_signature();\n    function EC(options) {\n      if (!(this instanceof EC))\n        return new EC(options);\n      if (typeof options === \"string\") {\n        assert(\n          Object.prototype.hasOwnProperty.call(curves, options),\n          \"Unknown curve \" + options\n        );\n        options = curves[options];\n      }\n      if (options instanceof curves.PresetCurve)\n        options = { curve: options };\n      this.curve = options.curve.curve;\n      this.n = this.curve.n;\n      this.nh = this.n.ushrn(1);\n      this.g = this.curve.g;\n      this.g = options.curve.g;\n      this.g.precompute(options.curve.n.bitLength() + 1);\n      this.hash = options.hash || options.curve.hash;\n    }\n    module2.exports = EC;\n    EC.prototype.keyPair = function keyPair(options) {\n      return new KeyPair(this, options);\n    };\n    EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {\n      return KeyPair.fromPrivate(this, priv, enc);\n    };\n    EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {\n      return KeyPair.fromPublic(this, pub, enc);\n    };\n    EC.prototype.genKeyPair = function genKeyPair(options) {\n      if (!options)\n        options = {};\n      var drbg = new HmacDRBG({\n        hash: this.hash,\n        pers: options.pers,\n        persEnc: options.persEnc || \"utf8\",\n        entropy: options.entropy || rand(this.hash.hmacStrength),\n        entropyEnc: options.entropy && options.entropyEnc || \"utf8\",\n        nonce: this.n.toArray()\n      });\n      var bytes = this.n.byteLength();\n      var ns2 = this.n.sub(new BN(2));\n      for (; ; ) {\n        var priv = new BN(drbg.generate(bytes));\n        if (priv.cmp(ns2) > 0)\n          continue;\n        priv.iaddn(1);\n        return this.keyFromPrivate(priv);\n      }\n    };\n    EC.prototype._truncateToN = function _truncateToN(msg, truncOnly) {\n      var delta = msg.byteLength() * 8 - this.n.bitLength();\n      if (delta > 0)\n        msg = msg.ushrn(delta);\n      if (!truncOnly && msg.cmp(this.n) >= 0)\n        return msg.sub(this.n);\n      else\n        return msg;\n    };\n    EC.prototype.sign = function sign(msg, key, enc, options) {\n      if (typeof enc === \"object\") {\n        options = enc;\n        enc = null;\n      }\n      if (!options)\n        options = {};\n      key = this.keyFromPrivate(key, enc);\n      msg = this._truncateToN(new BN(msg, 16));\n      var bytes = this.n.byteLength();\n      var bkey = key.getPrivate().toArray(\"be\", bytes);\n      var nonce = msg.toArray(\"be\", bytes);\n      var drbg = new HmacDRBG({\n        hash: this.hash,\n        entropy: bkey,\n        nonce,\n        pers: options.pers,\n        persEnc: options.persEnc || \"utf8\"\n      });\n      var ns1 = this.n.sub(new BN(1));\n      for (var iter = 0; ; iter++) {\n        var k = options.k ? options.k(iter) : new BN(drbg.generate(this.n.byteLength()));\n        k = this._truncateToN(k, true);\n        if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)\n          continue;\n        var kp = this.g.mul(k);\n        if (kp.isInfinity())\n          continue;\n        var kpX = kp.getX();\n        var r = kpX.umod(this.n);\n        if (r.cmpn(0) === 0)\n          continue;\n        var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));\n        s = s.umod(this.n);\n        if (s.cmpn(0) === 0)\n          continue;\n        var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);\n        if (options.canonical && s.cmp(this.nh) > 0) {\n          s = this.n.sub(s);\n          recoveryParam ^= 1;\n        }\n        return new Signature({ r, s, recoveryParam });\n      }\n    };\n    EC.prototype.verify = function verify(msg, signature, key, enc) {\n      msg = this._truncateToN(new BN(msg, 16));\n      key = this.keyFromPublic(key, enc);\n      signature = new Signature(signature, \"hex\");\n      var r = signature.r;\n      var s = signature.s;\n      if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)\n        return false;\n      if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)\n        return false;\n      var sinv = s.invm(this.n);\n      var u1 = sinv.mul(msg).umod(this.n);\n      var u2 = sinv.mul(r).umod(this.n);\n      var p;\n      if (!this.curve._maxwellTrick) {\n        p = this.g.mulAdd(u1, key.getPublic(), u2);\n        if (p.isInfinity())\n          return false;\n        return p.getX().umod(this.n).cmp(r) === 0;\n      }\n      p = this.g.jmulAdd(u1, key.getPublic(), u2);\n      if (p.isInfinity())\n        return false;\n      return p.eqXToP(r);\n    };\n    EC.prototype.recoverPubKey = function(msg, signature, j, enc) {\n      assert((3 & j) === j, \"The recovery param is more than two bits\");\n      signature = new Signature(signature, enc);\n      var n = this.n;\n      var e = new BN(msg);\n      var r = signature.r;\n      var s = signature.s;\n      var isYOdd = j & 1;\n      var isSecondKey = j >> 1;\n      if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)\n        throw new Error(\"Unable to find sencond key candinate\");\n      if (isSecondKey)\n        r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);\n      else\n        r = this.curve.pointFromX(r, isYOdd);\n      var rInv = signature.r.invm(n);\n      var s1 = n.sub(e).mul(rInv).umod(n);\n      var s2 = s.mul(rInv).umod(n);\n      return this.g.mulAdd(s1, r, s2);\n    };\n    EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {\n      signature = new Signature(signature, enc);\n      if (signature.recoveryParam !== null)\n        return signature.recoveryParam;\n      for (var i = 0; i < 4; i++) {\n        var Qprime;\n        try {\n          Qprime = this.recoverPubKey(e, signature, i);\n        } catch (e2) {\n          continue;\n        }\n        if (Qprime.eq(Q))\n          return i;\n      }\n      throw new Error(\"Unable to find valid recovery factor\");\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/key.js\nvar require_key2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/key.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var parseBytes = utils.parseBytes;\n    var cachedProperty = utils.cachedProperty;\n    function KeyPair(eddsa, params2) {\n      this.eddsa = eddsa;\n      this._secret = parseBytes(params2.secret);\n      if (eddsa.isPoint(params2.pub))\n        this._pub = params2.pub;\n      else\n        this._pubBytes = parseBytes(params2.pub);\n    }\n    KeyPair.fromPublic = function fromPublic(eddsa, pub) {\n      if (pub instanceof KeyPair)\n        return pub;\n      return new KeyPair(eddsa, { pub });\n    };\n    KeyPair.fromSecret = function fromSecret(eddsa, secret) {\n      if (secret instanceof KeyPair)\n        return secret;\n      return new KeyPair(eddsa, { secret });\n    };\n    KeyPair.prototype.secret = function secret() {\n      return this._secret;\n    };\n    cachedProperty(KeyPair, \"pubBytes\", function pubBytes() {\n      return this.eddsa.encodePoint(this.pub());\n    });\n    cachedProperty(KeyPair, \"pub\", function pub() {\n      if (this._pubBytes)\n        return this.eddsa.decodePoint(this._pubBytes);\n      return this.eddsa.g.mul(this.priv());\n    });\n    cachedProperty(KeyPair, \"privBytes\", function privBytes() {\n      var eddsa = this.eddsa;\n      var hash = this.hash();\n      var lastIx = eddsa.encodingLength - 1;\n      var a = hash.slice(0, eddsa.encodingLength);\n      a[0] &= 248;\n      a[lastIx] &= 127;\n      a[lastIx] |= 64;\n      return a;\n    });\n    cachedProperty(KeyPair, \"priv\", function priv() {\n      return this.eddsa.decodeInt(this.privBytes());\n    });\n    cachedProperty(KeyPair, \"hash\", function hash() {\n      return this.eddsa.hash().update(this.secret()).digest();\n    });\n    cachedProperty(KeyPair, \"messagePrefix\", function messagePrefix() {\n      return this.hash().slice(this.eddsa.encodingLength);\n    });\n    KeyPair.prototype.sign = function sign(message) {\n      assert(this._secret, \"KeyPair can only verify\");\n      return this.eddsa.sign(message, this);\n    };\n    KeyPair.prototype.verify = function verify(message, sig) {\n      return this.eddsa.verify(message, sig, this);\n    };\n    KeyPair.prototype.getSecret = function getSecret(enc) {\n      assert(this._secret, \"KeyPair is public only\");\n      return utils.encode(this.secret(), enc);\n    };\n    KeyPair.prototype.getPublic = function getPublic(enc) {\n      return utils.encode(this.pubBytes(), enc);\n    };\n    module2.exports = KeyPair;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/signature.js\nvar require_signature2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/signature.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var cachedProperty = utils.cachedProperty;\n    var parseBytes = utils.parseBytes;\n    function Signature(eddsa, sig) {\n      this.eddsa = eddsa;\n      if (typeof sig !== \"object\")\n        sig = parseBytes(sig);\n      if (Array.isArray(sig)) {\n        sig = {\n          R: sig.slice(0, eddsa.encodingLength),\n          S: sig.slice(eddsa.encodingLength)\n        };\n      }\n      assert(sig.R && sig.S, \"Signature without R or S\");\n      if (eddsa.isPoint(sig.R))\n        this._R = sig.R;\n      if (sig.S instanceof BN)\n        this._S = sig.S;\n      this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;\n      this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;\n    }\n    cachedProperty(Signature, \"S\", function S() {\n      return this.eddsa.decodeInt(this.Sencoded());\n    });\n    cachedProperty(Signature, \"R\", function R() {\n      return this.eddsa.decodePoint(this.Rencoded());\n    });\n    cachedProperty(Signature, \"Rencoded\", function Rencoded() {\n      return this.eddsa.encodePoint(this.R());\n    });\n    cachedProperty(Signature, \"Sencoded\", function Sencoded() {\n      return this.eddsa.encodeInt(this.S());\n    });\n    Signature.prototype.toBytes = function toBytes() {\n      return this.Rencoded().concat(this.Sencoded());\n    };\n    Signature.prototype.toHex = function toHex() {\n      return utils.encode(this.toBytes(), \"hex\").toUpperCase();\n    };\n    module2.exports = Signature;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/index.js\nvar require_eddsa = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/index.js\"(exports2, module2) {\n    \"use strict\";\n    var hash = require_hash();\n    var curves = require_curves();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var parseBytes = utils.parseBytes;\n    var KeyPair = require_key2();\n    var Signature = require_signature2();\n    function EDDSA(curve) {\n      assert(curve === \"ed25519\", \"only tested with ed25519 so far\");\n      if (!(this instanceof EDDSA))\n        return new EDDSA(curve);\n      curve = curves[curve].curve;\n      this.curve = curve;\n      this.g = curve.g;\n      this.g.precompute(curve.n.bitLength() + 1);\n      this.pointClass = curve.point().constructor;\n      this.encodingLength = Math.ceil(curve.n.bitLength() / 8);\n      this.hash = hash.sha512;\n    }\n    module2.exports = EDDSA;\n    EDDSA.prototype.sign = function sign(message, secret) {\n      message = parseBytes(message);\n      var key = this.keyFromSecret(secret);\n      var r = this.hashInt(key.messagePrefix(), message);\n      var R = this.g.mul(r);\n      var Rencoded = this.encodePoint(R);\n      var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());\n      var S = r.add(s_).umod(this.curve.n);\n      return this.makeSignature({ R, S, Rencoded });\n    };\n    EDDSA.prototype.verify = function verify(message, sig, pub) {\n      message = parseBytes(message);\n      sig = this.makeSignature(sig);\n      var key = this.keyFromPublic(pub);\n      var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);\n      var SG = this.g.mul(sig.S());\n      var RplusAh = sig.R().add(key.pub().mul(h));\n      return RplusAh.eq(SG);\n    };\n    EDDSA.prototype.hashInt = function hashInt() {\n      var hash2 = this.hash();\n      for (var i = 0; i < arguments.length; i++)\n        hash2.update(arguments[i]);\n      return utils.intFromLE(hash2.digest()).umod(this.curve.n);\n    };\n    EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {\n      return KeyPair.fromPublic(this, pub);\n    };\n    EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {\n      return KeyPair.fromSecret(this, secret);\n    };\n    EDDSA.prototype.makeSignature = function makeSignature(sig) {\n      if (sig instanceof Signature)\n        return sig;\n      return new Signature(this, sig);\n    };\n    EDDSA.prototype.encodePoint = function encodePoint(point) {\n      var enc = point.getY().toArray(\"le\", this.encodingLength);\n      enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;\n      return enc;\n    };\n    EDDSA.prototype.decodePoint = function decodePoint(bytes) {\n      bytes = utils.parseBytes(bytes);\n      var lastIx = bytes.length - 1;\n      var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);\n      var xIsOdd = (bytes[lastIx] & 128) !== 0;\n      var y = utils.intFromLE(normed);\n      return this.curve.pointFromY(y, xIsOdd);\n    };\n    EDDSA.prototype.encodeInt = function encodeInt(num) {\n      return num.toArray(\"le\", this.encodingLength);\n    };\n    EDDSA.prototype.decodeInt = function decodeInt(bytes) {\n      return utils.intFromLE(bytes);\n    };\n    EDDSA.prototype.isPoint = function isPoint(val) {\n      return val instanceof this.pointClass;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic.js\nvar require_elliptic = __commonJS({\n  \"node_modules/elliptic/lib/elliptic.js\"(exports2) {\n    \"use strict\";\n    var elliptic = exports2;\n    elliptic.version = require_package().version;\n    elliptic.utils = require_utils2();\n    elliptic.rand = require_brorand();\n    elliptic.curve = require_curve();\n    elliptic.curves = require_curves();\n    elliptic.ec = require_ec();\n    elliptic.eddsa = require_eddsa();\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/elliptic.js\nvar require_elliptic2 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/elliptic.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EC = void 0;\n    var elliptic_1 = __importDefault(require_elliptic());\n    var EC = elliptic_1.default.ec;\n    exports2.EC = EC;\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/_version.js\nvar require_version12 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"signing-key/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/index.js\nvar require_lib14 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.computePublicKey = exports2.recoverPublicKey = exports2.SigningKey = void 0;\n    var elliptic_1 = require_elliptic2();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version12();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _curve = null;\n    function getCurve() {\n      if (!_curve) {\n        _curve = new elliptic_1.EC(\"secp256k1\");\n      }\n      return _curve;\n    }\n    var SigningKey = (\n      /** @class */\n      function() {\n        function SigningKey2(privateKey) {\n          (0, properties_1.defineReadOnly)(this, \"curve\", \"secp256k1\");\n          (0, properties_1.defineReadOnly)(this, \"privateKey\", (0, bytes_1.hexlify)(privateKey));\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          (0, properties_1.defineReadOnly)(this, \"publicKey\", \"0x\" + keyPair.getPublic(false, \"hex\"));\n          (0, properties_1.defineReadOnly)(this, \"compressedPublicKey\", \"0x\" + keyPair.getPublic(true, \"hex\"));\n          (0, properties_1.defineReadOnly)(this, \"_isSigningKey\", true);\n        }\n        SigningKey2.prototype._addPoint = function(other) {\n          var p0 = getCurve().keyFromPublic((0, bytes_1.arrayify)(this.publicKey));\n          var p1 = getCurve().keyFromPublic((0, bytes_1.arrayify)(other));\n          return \"0x\" + p0.pub.add(p1.pub).encodeCompressed(\"hex\");\n        };\n        SigningKey2.prototype.signDigest = function(digest) {\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          var digestBytes = (0, bytes_1.arrayify)(digest);\n          if (digestBytes.length !== 32) {\n            logger.throwArgumentError(\"bad digest length\", \"digest\", digest);\n          }\n          var signature = keyPair.sign(digestBytes, { canonical: true });\n          return (0, bytes_1.splitSignature)({\n            recoveryParam: signature.recoveryParam,\n            r: (0, bytes_1.hexZeroPad)(\"0x\" + signature.r.toString(16), 32),\n            s: (0, bytes_1.hexZeroPad)(\"0x\" + signature.s.toString(16), 32)\n          });\n        };\n        SigningKey2.prototype.computeSharedSecret = function(otherKey) {\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          var otherKeyPair = getCurve().keyFromPublic((0, bytes_1.arrayify)(computePublicKey(otherKey)));\n          return (0, bytes_1.hexZeroPad)(\"0x\" + keyPair.derive(otherKeyPair.getPublic()).toString(16), 32);\n        };\n        SigningKey2.isSigningKey = function(value) {\n          return !!(value && value._isSigningKey);\n        };\n        return SigningKey2;\n      }()\n    );\n    exports2.SigningKey = SigningKey;\n    function recoverPublicKey(digest, signature) {\n      var sig = (0, bytes_1.splitSignature)(signature);\n      var rs = { r: (0, bytes_1.arrayify)(sig.r), s: (0, bytes_1.arrayify)(sig.s) };\n      return \"0x\" + getCurve().recoverPubKey((0, bytes_1.arrayify)(digest), rs, sig.recoveryParam).encode(\"hex\", false);\n    }\n    exports2.recoverPublicKey = recoverPublicKey;\n    function computePublicKey(key, compressed) {\n      var bytes = (0, bytes_1.arrayify)(key);\n      if (bytes.length === 32) {\n        var signingKey = new SigningKey(bytes);\n        if (compressed) {\n          return \"0x\" + getCurve().keyFromPrivate(bytes).getPublic(true, \"hex\");\n        }\n        return signingKey.publicKey;\n      } else if (bytes.length === 33) {\n        if (compressed) {\n          return (0, bytes_1.hexlify)(bytes);\n        }\n        return \"0x\" + getCurve().keyFromPublic(bytes).getPublic(false, \"hex\");\n      } else if (bytes.length === 65) {\n        if (!compressed) {\n          return (0, bytes_1.hexlify)(bytes);\n        }\n        return \"0x\" + getCurve().keyFromPublic(bytes).getPublic(true, \"hex\");\n      }\n      return logger.throwArgumentError(\"invalid public or private key\", \"key\", \"[REDACTED]\");\n    }\n    exports2.computePublicKey = computePublicKey;\n  }\n});\n\n// node_modules/@ethersproject/transactions/lib/_version.js\nvar require_version13 = __commonJS({\n  \"node_modules/@ethersproject/transactions/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"transactions/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/transactions/lib/index.js\nvar require_lib15 = __commonJS({\n  \"node_modules/@ethersproject/transactions/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result2 = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result2, mod, k);\n      }\n      __setModuleDefault(result2, mod);\n      return result2;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parse = exports2.serialize = exports2.accessListify = exports2.recoverAddress = exports2.computeAddress = exports2.TransactionTypes = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var RLP = __importStar(require_lib6());\n    var signing_key_1 = require_lib14();\n    var logger_1 = require_lib();\n    var _version_1 = require_version13();\n    var logger = new logger_1.Logger(_version_1.version);\n    var TransactionTypes;\n    (function(TransactionTypes2) {\n      TransactionTypes2[TransactionTypes2[\"legacy\"] = 0] = \"legacy\";\n      TransactionTypes2[TransactionTypes2[\"eip2930\"] = 1] = \"eip2930\";\n      TransactionTypes2[TransactionTypes2[\"eip1559\"] = 2] = \"eip1559\";\n    })(TransactionTypes = exports2.TransactionTypes || (exports2.TransactionTypes = {}));\n    function handleAddress(value) {\n      if (value === \"0x\") {\n        return null;\n      }\n      return (0, address_1.getAddress)(value);\n    }\n    function handleNumber(value) {\n      if (value === \"0x\") {\n        return constants_1.Zero;\n      }\n      return bignumber_1.BigNumber.from(value);\n    }\n    var transactionFields = [\n      { name: \"nonce\", maxLength: 32, numeric: true },\n      { name: \"gasPrice\", maxLength: 32, numeric: true },\n      { name: \"gasLimit\", maxLength: 32, numeric: true },\n      { name: \"to\", length: 20 },\n      { name: \"value\", maxLength: 32, numeric: true },\n      { name: \"data\" }\n    ];\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      type: true,\n      value: true\n    };\n    function computeAddress(key) {\n      var publicKey = (0, signing_key_1.computePublicKey)(key);\n      return (0, address_1.getAddress)((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.hexDataSlice)(publicKey, 1)), 12));\n    }\n    exports2.computeAddress = computeAddress;\n    function recoverAddress(digest, signature) {\n      return computeAddress((0, signing_key_1.recoverPublicKey)((0, bytes_1.arrayify)(digest), signature));\n    }\n    exports2.recoverAddress = recoverAddress;\n    function formatNumber(value, name2) {\n      var result2 = (0, bytes_1.stripZeros)(bignumber_1.BigNumber.from(value).toHexString());\n      if (result2.length > 32) {\n        logger.throwArgumentError(\"invalid length for \" + name2, \"transaction:\" + name2, value);\n      }\n      return result2;\n    }\n    function accessSetify(addr, storageKeys) {\n      return {\n        address: (0, address_1.getAddress)(addr),\n        storageKeys: (storageKeys || []).map(function(storageKey, index) {\n          if ((0, bytes_1.hexDataLength)(storageKey) !== 32) {\n            logger.throwArgumentError(\"invalid access list storageKey\", \"accessList[\" + addr + \":\" + index + \"]\", storageKey);\n          }\n          return storageKey.toLowerCase();\n        })\n      };\n    }\n    function accessListify(value) {\n      if (Array.isArray(value)) {\n        return value.map(function(set, index) {\n          if (Array.isArray(set)) {\n            if (set.length > 2) {\n              logger.throwArgumentError(\"access list expected to be [ address, storageKeys[] ]\", \"value[\" + index + \"]\", set);\n            }\n            return accessSetify(set[0], set[1]);\n          }\n          return accessSetify(set.address, set.storageKeys);\n        });\n      }\n      var result2 = Object.keys(value).map(function(addr) {\n        var storageKeys = value[addr].reduce(function(accum, storageKey) {\n          accum[storageKey] = true;\n          return accum;\n        }, {});\n        return accessSetify(addr, Object.keys(storageKeys).sort());\n      });\n      result2.sort(function(a, b) {\n        return a.address.localeCompare(b.address);\n      });\n      return result2;\n    }\n    exports2.accessListify = accessListify;\n    function formatAccessList(value) {\n      return accessListify(value).map(function(set) {\n        return [set.address, set.storageKeys];\n      });\n    }\n    function _serializeEip1559(transaction, signature) {\n      if (transaction.gasPrice != null) {\n        var gasPrice = bignumber_1.BigNumber.from(transaction.gasPrice);\n        var maxFeePerGas = bignumber_1.BigNumber.from(transaction.maxFeePerGas || 0);\n        if (!gasPrice.eq(maxFeePerGas)) {\n          logger.throwArgumentError(\"mismatch EIP-1559 gasPrice != maxFeePerGas\", \"tx\", {\n            gasPrice,\n            maxFeePerGas\n          });\n        }\n      }\n      var fields = [\n        formatNumber(transaction.chainId || 0, \"chainId\"),\n        formatNumber(transaction.nonce || 0, \"nonce\"),\n        formatNumber(transaction.maxPriorityFeePerGas || 0, \"maxPriorityFeePerGas\"),\n        formatNumber(transaction.maxFeePerGas || 0, \"maxFeePerGas\"),\n        formatNumber(transaction.gasLimit || 0, \"gasLimit\"),\n        transaction.to != null ? (0, address_1.getAddress)(transaction.to) : \"0x\",\n        formatNumber(transaction.value || 0, \"value\"),\n        transaction.data || \"0x\",\n        formatAccessList(transaction.accessList || [])\n      ];\n      if (signature) {\n        var sig = (0, bytes_1.splitSignature)(signature);\n        fields.push(formatNumber(sig.recoveryParam, \"recoveryParam\"));\n        fields.push((0, bytes_1.stripZeros)(sig.r));\n        fields.push((0, bytes_1.stripZeros)(sig.s));\n      }\n      return (0, bytes_1.hexConcat)([\"0x02\", RLP.encode(fields)]);\n    }\n    function _serializeEip2930(transaction, signature) {\n      var fields = [\n        formatNumber(transaction.chainId || 0, \"chainId\"),\n        formatNumber(transaction.nonce || 0, \"nonce\"),\n        formatNumber(transaction.gasPrice || 0, \"gasPrice\"),\n        formatNumber(transaction.gasLimit || 0, \"gasLimit\"),\n        transaction.to != null ? (0, address_1.getAddress)(transaction.to) : \"0x\",\n        formatNumber(transaction.value || 0, \"value\"),\n        transaction.data || \"0x\",\n        formatAccessList(transaction.accessList || [])\n      ];\n      if (signature) {\n        var sig = (0, bytes_1.splitSignature)(signature);\n        fields.push(formatNumber(sig.recoveryParam, \"recoveryParam\"));\n        fields.push((0, bytes_1.stripZeros)(sig.r));\n        fields.push((0, bytes_1.stripZeros)(sig.s));\n      }\n      return (0, bytes_1.hexConcat)([\"0x01\", RLP.encode(fields)]);\n    }\n    function _serialize(transaction, signature) {\n      (0, properties_1.checkProperties)(transaction, allowedTransactionKeys);\n      var raw = [];\n      transactionFields.forEach(function(fieldInfo) {\n        var value = transaction[fieldInfo.name] || [];\n        var options = {};\n        if (fieldInfo.numeric) {\n          options.hexPad = \"left\";\n        }\n        value = (0, bytes_1.arrayify)((0, bytes_1.hexlify)(value, options));\n        if (fieldInfo.length && value.length !== fieldInfo.length && value.length > 0) {\n          logger.throwArgumentError(\"invalid length for \" + fieldInfo.name, \"transaction:\" + fieldInfo.name, value);\n        }\n        if (fieldInfo.maxLength) {\n          value = (0, bytes_1.stripZeros)(value);\n          if (value.length > fieldInfo.maxLength) {\n            logger.throwArgumentError(\"invalid length for \" + fieldInfo.name, \"transaction:\" + fieldInfo.name, value);\n          }\n        }\n        raw.push((0, bytes_1.hexlify)(value));\n      });\n      var chainId = 0;\n      if (transaction.chainId != null) {\n        chainId = transaction.chainId;\n        if (typeof chainId !== \"number\") {\n          logger.throwArgumentError(\"invalid transaction.chainId\", \"transaction\", transaction);\n        }\n      } else if (signature && !(0, bytes_1.isBytesLike)(signature) && signature.v > 28) {\n        chainId = Math.floor((signature.v - 35) / 2);\n      }\n      if (chainId !== 0) {\n        raw.push((0, bytes_1.hexlify)(chainId));\n        raw.push(\"0x\");\n        raw.push(\"0x\");\n      }\n      if (!signature) {\n        return RLP.encode(raw);\n      }\n      var sig = (0, bytes_1.splitSignature)(signature);\n      var v = 27 + sig.recoveryParam;\n      if (chainId !== 0) {\n        raw.pop();\n        raw.pop();\n        raw.pop();\n        v += chainId * 2 + 8;\n        if (sig.v > 28 && sig.v !== v) {\n          logger.throwArgumentError(\"transaction.chainId/signature.v mismatch\", \"signature\", signature);\n        }\n      } else if (sig.v !== v) {\n        logger.throwArgumentError(\"transaction.chainId/signature.v mismatch\", \"signature\", signature);\n      }\n      raw.push((0, bytes_1.hexlify)(v));\n      raw.push((0, bytes_1.stripZeros)((0, bytes_1.arrayify)(sig.r)));\n      raw.push((0, bytes_1.stripZeros)((0, bytes_1.arrayify)(sig.s)));\n      return RLP.encode(raw);\n    }\n    function serialize(transaction, signature) {\n      if (transaction.type == null || transaction.type === 0) {\n        if (transaction.accessList != null) {\n          logger.throwArgumentError(\"untyped transactions do not support accessList; include type: 1\", \"transaction\", transaction);\n        }\n        return _serialize(transaction, signature);\n      }\n      switch (transaction.type) {\n        case 1:\n          return _serializeEip2930(transaction, signature);\n        case 2:\n          return _serializeEip1559(transaction, signature);\n        default:\n          break;\n      }\n      return logger.throwError(\"unsupported transaction type: \" + transaction.type, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n        operation: \"serializeTransaction\",\n        transactionType: transaction.type\n      });\n    }\n    exports2.serialize = serialize;\n    function _parseEipSignature(tx, fields, serialize2) {\n      try {\n        var recid = handleNumber(fields[0]).toNumber();\n        if (recid !== 0 && recid !== 1) {\n          throw new Error(\"bad recid\");\n        }\n        tx.v = recid;\n      } catch (error) {\n        logger.throwArgumentError(\"invalid v for transaction type: 1\", \"v\", fields[0]);\n      }\n      tx.r = (0, bytes_1.hexZeroPad)(fields[1], 32);\n      tx.s = (0, bytes_1.hexZeroPad)(fields[2], 32);\n      try {\n        var digest = (0, keccak256_1.keccak256)(serialize2(tx));\n        tx.from = recoverAddress(digest, { r: tx.r, s: tx.s, recoveryParam: tx.v });\n      } catch (error) {\n        console.log(error);\n      }\n    }\n    function _parseEip1559(payload) {\n      var transaction = RLP.decode(payload.slice(1));\n      if (transaction.length !== 9 && transaction.length !== 12) {\n        logger.throwArgumentError(\"invalid component count for transaction type: 2\", \"payload\", (0, bytes_1.hexlify)(payload));\n      }\n      var maxPriorityFeePerGas = handleNumber(transaction[2]);\n      var maxFeePerGas = handleNumber(transaction[3]);\n      var tx = {\n        type: 2,\n        chainId: handleNumber(transaction[0]).toNumber(),\n        nonce: handleNumber(transaction[1]).toNumber(),\n        maxPriorityFeePerGas,\n        maxFeePerGas,\n        gasPrice: null,\n        gasLimit: handleNumber(transaction[4]),\n        to: handleAddress(transaction[5]),\n        value: handleNumber(transaction[6]),\n        data: transaction[7],\n        accessList: accessListify(transaction[8])\n      };\n      if (transaction.length === 9) {\n        return tx;\n      }\n      tx.hash = (0, keccak256_1.keccak256)(payload);\n      _parseEipSignature(tx, transaction.slice(9), _serializeEip1559);\n      return tx;\n    }\n    function _parseEip2930(payload) {\n      var transaction = RLP.decode(payload.slice(1));\n      if (transaction.length !== 8 && transaction.length !== 11) {\n        logger.throwArgumentError(\"invalid component count for transaction type: 1\", \"payload\", (0, bytes_1.hexlify)(payload));\n      }\n      var tx = {\n        type: 1,\n        chainId: handleNumber(transaction[0]).toNumber(),\n        nonce: handleNumber(transaction[1]).toNumber(),\n        gasPrice: handleNumber(transaction[2]),\n        gasLimit: handleNumber(transaction[3]),\n        to: handleAddress(transaction[4]),\n        value: handleNumber(transaction[5]),\n        data: transaction[6],\n        accessList: accessListify(transaction[7])\n      };\n      if (transaction.length === 8) {\n        return tx;\n      }\n      tx.hash = (0, keccak256_1.keccak256)(payload);\n      _parseEipSignature(tx, transaction.slice(8), _serializeEip2930);\n      return tx;\n    }\n    function _parse(rawTransaction) {\n      var transaction = RLP.decode(rawTransaction);\n      if (transaction.length !== 9 && transaction.length !== 6) {\n        logger.throwArgumentError(\"invalid raw transaction\", \"rawTransaction\", rawTransaction);\n      }\n      var tx = {\n        nonce: handleNumber(transaction[0]).toNumber(),\n        gasPrice: handleNumber(transaction[1]),\n        gasLimit: handleNumber(transaction[2]),\n        to: handleAddress(transaction[3]),\n        value: handleNumber(transaction[4]),\n        data: transaction[5],\n        chainId: 0\n      };\n      if (transaction.length === 6) {\n        return tx;\n      }\n      try {\n        tx.v = bignumber_1.BigNumber.from(transaction[6]).toNumber();\n      } catch (error) {\n        console.log(error);\n        return tx;\n      }\n      tx.r = (0, bytes_1.hexZeroPad)(transaction[7], 32);\n      tx.s = (0, bytes_1.hexZeroPad)(transaction[8], 32);\n      if (bignumber_1.BigNumber.from(tx.r).isZero() && bignumber_1.BigNumber.from(tx.s).isZero()) {\n        tx.chainId = tx.v;\n        tx.v = 0;\n      } else {\n        tx.chainId = Math.floor((tx.v - 35) / 2);\n        if (tx.chainId < 0) {\n          tx.chainId = 0;\n        }\n        var recoveryParam = tx.v - 27;\n        var raw = transaction.slice(0, 6);\n        if (tx.chainId !== 0) {\n          raw.push((0, bytes_1.hexlify)(tx.chainId));\n          raw.push(\"0x\");\n          raw.push(\"0x\");\n          recoveryParam -= tx.chainId * 2 + 8;\n        }\n        var digest = (0, keccak256_1.keccak256)(RLP.encode(raw));\n        try {\n          tx.from = recoverAddress(digest, { r: (0, bytes_1.hexlify)(tx.r), s: (0, bytes_1.hexlify)(tx.s), recoveryParam });\n        } catch (error) {\n          console.log(error);\n        }\n        tx.hash = (0, keccak256_1.keccak256)(rawTransaction);\n      }\n      tx.type = null;\n      return tx;\n    }\n    function parse(rawTransaction) {\n      var payload = (0, bytes_1.arrayify)(rawTransaction);\n      if (payload[0] > 127) {\n        return _parse(payload);\n      }\n      switch (payload[0]) {\n        case 1:\n          return _parseEip2930(payload);\n        case 2:\n          return _parseEip1559(payload);\n        default:\n          break;\n      }\n      return logger.throwError(\"unsupported transaction type: \" + payload[0], logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n        operation: \"parseTransaction\",\n        transactionType: payload[0]\n      });\n    }\n    exports2.parse = parse;\n  }\n});\n\n// node_modules/@ethersproject/contracts/lib/_version.js\nvar require_version14 = __commonJS({\n  \"node_modules/@ethersproject/contracts/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"contracts/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/contracts/lib/index.js\nvar require_lib16 = __commonJS({\n  \"node_modules/@ethersproject/contracts/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __spreadArray = exports2 && exports2.__spreadArray || function(to, from, pack) {\n      if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n        }\n      }\n      return to.concat(ar || Array.prototype.slice.call(from));\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ContractFactory = exports2.Contract = exports2.BaseContract = void 0;\n    var abi_1 = require_lib11();\n    var abstract_provider_1 = require_lib12();\n    var abstract_signer_1 = require_lib13();\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version14();\n    var logger = new logger_1.Logger(_version_1.version);\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      from: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      value: true,\n      type: true,\n      accessList: true,\n      maxFeePerGas: true,\n      maxPriorityFeePerGas: true,\n      customData: true\n    };\n    function resolveName(resolver, nameOrPromise) {\n      return __awaiter(this, void 0, void 0, function() {\n        var name2, address;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              return [4, nameOrPromise];\n            case 1:\n              name2 = _a.sent();\n              if (typeof name2 !== \"string\") {\n                logger.throwArgumentError(\"invalid address or ENS name\", \"name\", name2);\n              }\n              try {\n                return [2, (0, address_1.getAddress)(name2)];\n              } catch (error) {\n              }\n              if (!resolver) {\n                logger.throwError(\"a provider or signer is needed to resolve ENS names\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                  operation: \"resolveName\"\n                });\n              }\n              return [4, resolver.resolveName(name2)];\n            case 2:\n              address = _a.sent();\n              if (address == null) {\n                logger.throwArgumentError(\"resolver or addr is not configured for ENS name\", \"name\", name2);\n              }\n              return [2, address];\n          }\n        });\n      });\n    }\n    function resolveAddresses(resolver, value, paramType) {\n      return __awaiter(this, void 0, void 0, function() {\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              if (!Array.isArray(paramType)) return [3, 2];\n              return [4, Promise.all(paramType.map(function(paramType2, index) {\n                return resolveAddresses(resolver, Array.isArray(value) ? value[index] : value[paramType2.name], paramType2);\n              }))];\n            case 1:\n              return [2, _a.sent()];\n            case 2:\n              if (!(paramType.type === \"address\")) return [3, 4];\n              return [4, resolveName(resolver, value)];\n            case 3:\n              return [2, _a.sent()];\n            case 4:\n              if (!(paramType.type === \"tuple\")) return [3, 6];\n              return [4, resolveAddresses(resolver, value, paramType.components)];\n            case 5:\n              return [2, _a.sent()];\n            case 6:\n              if (!(paramType.baseType === \"array\")) return [3, 8];\n              if (!Array.isArray(value)) {\n                return [2, Promise.reject(logger.makeError(\"invalid value for array\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                  argument: \"value\",\n                  value\n                }))];\n              }\n              return [4, Promise.all(value.map(function(v) {\n                return resolveAddresses(resolver, v, paramType.arrayChildren);\n              }))];\n            case 7:\n              return [2, _a.sent()];\n            case 8:\n              return [2, value];\n          }\n        });\n      });\n    }\n    function populateTransaction(contract, fragment, args) {\n      return __awaiter(this, void 0, void 0, function() {\n        var overrides, resolved, data, tx, ro, intrinsic, bytes, i, roValue, leftovers;\n        var _this = this;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              overrides = {};\n              if (args.length === fragment.inputs.length + 1 && typeof args[args.length - 1] === \"object\") {\n                overrides = (0, properties_1.shallowCopy)(args.pop());\n              }\n              logger.checkArgumentCount(args.length, fragment.inputs.length, \"passed to contract\");\n              if (contract.signer) {\n                if (overrides.from) {\n                  overrides.from = (0, properties_1.resolveProperties)({\n                    override: resolveName(contract.signer, overrides.from),\n                    signer: contract.signer.getAddress()\n                  }).then(function(check) {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      return __generator(this, function(_a2) {\n                        if ((0, address_1.getAddress)(check.signer) !== check.override) {\n                          logger.throwError(\"Contract with a Signer cannot override from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                            operation: \"overrides.from\"\n                          });\n                        }\n                        return [2, check.override];\n                      });\n                    });\n                  });\n                } else {\n                  overrides.from = contract.signer.getAddress();\n                }\n              } else if (overrides.from) {\n                overrides.from = resolveName(contract.provider, overrides.from);\n              }\n              return [4, (0, properties_1.resolveProperties)({\n                args: resolveAddresses(contract.signer || contract.provider, args, fragment.inputs),\n                address: contract.resolvedAddress,\n                overrides: (0, properties_1.resolveProperties)(overrides) || {}\n              })];\n            case 1:\n              resolved = _a.sent();\n              data = contract.interface.encodeFunctionData(fragment, resolved.args);\n              tx = {\n                data,\n                to: resolved.address\n              };\n              ro = resolved.overrides;\n              if (ro.nonce != null) {\n                tx.nonce = bignumber_1.BigNumber.from(ro.nonce).toNumber();\n              }\n              if (ro.gasLimit != null) {\n                tx.gasLimit = bignumber_1.BigNumber.from(ro.gasLimit);\n              }\n              if (ro.gasPrice != null) {\n                tx.gasPrice = bignumber_1.BigNumber.from(ro.gasPrice);\n              }\n              if (ro.maxFeePerGas != null) {\n                tx.maxFeePerGas = bignumber_1.BigNumber.from(ro.maxFeePerGas);\n              }\n              if (ro.maxPriorityFeePerGas != null) {\n                tx.maxPriorityFeePerGas = bignumber_1.BigNumber.from(ro.maxPriorityFeePerGas);\n              }\n              if (ro.from != null) {\n                tx.from = ro.from;\n              }\n              if (ro.type != null) {\n                tx.type = ro.type;\n              }\n              if (ro.accessList != null) {\n                tx.accessList = (0, transactions_1.accessListify)(ro.accessList);\n              }\n              if (tx.gasLimit == null && fragment.gas != null) {\n                intrinsic = 21e3;\n                bytes = (0, bytes_1.arrayify)(data);\n                for (i = 0; i < bytes.length; i++) {\n                  intrinsic += 4;\n                  if (bytes[i]) {\n                    intrinsic += 64;\n                  }\n                }\n                tx.gasLimit = bignumber_1.BigNumber.from(fragment.gas).add(intrinsic);\n              }\n              if (ro.value) {\n                roValue = bignumber_1.BigNumber.from(ro.value);\n                if (!roValue.isZero() && !fragment.payable) {\n                  logger.throwError(\"non-payable method cannot override value\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"overrides.value\",\n                    value: overrides.value\n                  });\n                }\n                tx.value = roValue;\n              }\n              if (ro.customData) {\n                tx.customData = (0, properties_1.shallowCopy)(ro.customData);\n              }\n              delete overrides.nonce;\n              delete overrides.gasLimit;\n              delete overrides.gasPrice;\n              delete overrides.from;\n              delete overrides.value;\n              delete overrides.type;\n              delete overrides.accessList;\n              delete overrides.maxFeePerGas;\n              delete overrides.maxPriorityFeePerGas;\n              delete overrides.customData;\n              leftovers = Object.keys(overrides).filter(function(key) {\n                return overrides[key] != null;\n              });\n              if (leftovers.length) {\n                logger.throwError(\"cannot override \" + leftovers.map(function(l) {\n                  return JSON.stringify(l);\n                }).join(\",\"), logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                  operation: \"overrides\",\n                  overrides: leftovers\n                });\n              }\n              return [2, tx];\n          }\n        });\n      });\n    }\n    function buildPopulate(contract, fragment) {\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return populateTransaction(contract, fragment, args);\n      };\n    }\n    function buildEstimate(contract, fragment) {\n      var signerOrProvider = contract.signer || contract.provider;\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var tx;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                if (!signerOrProvider) {\n                  logger.throwError(\"estimate require a provider or signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"estimateGas\"\n                  });\n                }\n                return [4, populateTransaction(contract, fragment, args)];\n              case 1:\n                tx = _a.sent();\n                return [4, signerOrProvider.estimateGas(tx)];\n              case 2:\n                return [2, _a.sent()];\n            }\n          });\n        });\n      };\n    }\n    function addContractWait(contract, tx) {\n      var wait = tx.wait.bind(tx);\n      tx.wait = function(confirmations) {\n        return wait(confirmations).then(function(receipt) {\n          receipt.events = receipt.logs.map(function(log) {\n            var event = (0, properties_1.deepCopy)(log);\n            var parsed = null;\n            try {\n              parsed = contract.interface.parseLog(log);\n            } catch (e) {\n            }\n            if (parsed) {\n              event.args = parsed.args;\n              event.decode = function(data, topics) {\n                return contract.interface.decodeEventLog(parsed.eventFragment, data, topics);\n              };\n              event.event = parsed.name;\n              event.eventSignature = parsed.signature;\n            }\n            event.removeListener = function() {\n              return contract.provider;\n            };\n            event.getBlock = function() {\n              return contract.provider.getBlock(receipt.blockHash);\n            };\n            event.getTransaction = function() {\n              return contract.provider.getTransaction(receipt.transactionHash);\n            };\n            event.getTransactionReceipt = function() {\n              return Promise.resolve(receipt);\n            };\n            return event;\n          });\n          return receipt;\n        });\n      };\n    }\n    function buildCall(contract, fragment, collapseSimple) {\n      var signerOrProvider = contract.signer || contract.provider;\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var blockTag, overrides, tx, result2, value;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                blockTag = void 0;\n                if (!(args.length === fragment.inputs.length + 1 && typeof args[args.length - 1] === \"object\")) return [3, 3];\n                overrides = (0, properties_1.shallowCopy)(args.pop());\n                if (!(overrides.blockTag != null)) return [3, 2];\n                return [4, overrides.blockTag];\n              case 1:\n                blockTag = _a.sent();\n                _a.label = 2;\n              case 2:\n                delete overrides.blockTag;\n                args.push(overrides);\n                _a.label = 3;\n              case 3:\n                if (!(contract.deployTransaction != null)) return [3, 5];\n                return [4, contract._deployed(blockTag)];\n              case 4:\n                _a.sent();\n                _a.label = 5;\n              case 5:\n                return [4, populateTransaction(contract, fragment, args)];\n              case 6:\n                tx = _a.sent();\n                return [4, signerOrProvider.call(tx, blockTag)];\n              case 7:\n                result2 = _a.sent();\n                try {\n                  value = contract.interface.decodeFunctionResult(fragment, result2);\n                  if (collapseSimple && fragment.outputs.length === 1) {\n                    value = value[0];\n                  }\n                  return [2, value];\n                } catch (error) {\n                  if (error.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    error.address = contract.address;\n                    error.args = args;\n                    error.transaction = tx;\n                  }\n                  throw error;\n                }\n                return [\n                  2\n                  /*return*/\n                ];\n            }\n          });\n        });\n      };\n    }\n    function buildSend(contract, fragment) {\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var txRequest, tx;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                if (!contract.signer) {\n                  logger.throwError(\"sending a transaction requires a signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"sendTransaction\"\n                  });\n                }\n                if (!(contract.deployTransaction != null)) return [3, 2];\n                return [4, contract._deployed()];\n              case 1:\n                _a.sent();\n                _a.label = 2;\n              case 2:\n                return [4, populateTransaction(contract, fragment, args)];\n              case 3:\n                txRequest = _a.sent();\n                return [4, contract.signer.sendTransaction(txRequest)];\n              case 4:\n                tx = _a.sent();\n                addContractWait(contract, tx);\n                return [2, tx];\n            }\n          });\n        });\n      };\n    }\n    function buildDefault(contract, fragment, collapseSimple) {\n      if (fragment.constant) {\n        return buildCall(contract, fragment, collapseSimple);\n      }\n      return buildSend(contract, fragment);\n    }\n    function getEventTag(filter) {\n      if (filter.address && (filter.topics == null || filter.topics.length === 0)) {\n        return \"*\";\n      }\n      return (filter.address || \"*\") + \"@\" + (filter.topics ? filter.topics.map(function(topic) {\n        if (Array.isArray(topic)) {\n          return topic.join(\"|\");\n        }\n        return topic;\n      }).join(\":\") : \"\");\n    }\n    var RunningEvent = (\n      /** @class */\n      function() {\n        function RunningEvent2(tag, filter) {\n          (0, properties_1.defineReadOnly)(this, \"tag\", tag);\n          (0, properties_1.defineReadOnly)(this, \"filter\", filter);\n          this._listeners = [];\n        }\n        RunningEvent2.prototype.addListener = function(listener, once) {\n          this._listeners.push({ listener, once });\n        };\n        RunningEvent2.prototype.removeListener = function(listener) {\n          var done = false;\n          this._listeners = this._listeners.filter(function(item) {\n            if (done || item.listener !== listener) {\n              return true;\n            }\n            done = true;\n            return false;\n          });\n        };\n        RunningEvent2.prototype.removeAllListeners = function() {\n          this._listeners = [];\n        };\n        RunningEvent2.prototype.listeners = function() {\n          return this._listeners.map(function(i) {\n            return i.listener;\n          });\n        };\n        RunningEvent2.prototype.listenerCount = function() {\n          return this._listeners.length;\n        };\n        RunningEvent2.prototype.run = function(args) {\n          var _this = this;\n          var listenerCount = this.listenerCount();\n          this._listeners = this._listeners.filter(function(item) {\n            var argsCopy = args.slice();\n            setTimeout(function() {\n              item.listener.apply(_this, argsCopy);\n            }, 0);\n            return !item.once;\n          });\n          return listenerCount;\n        };\n        RunningEvent2.prototype.prepareEvent = function(event) {\n        };\n        RunningEvent2.prototype.getEmit = function(event) {\n          return [event];\n        };\n        return RunningEvent2;\n      }()\n    );\n    var ErrorRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorRunningEvent2, _super);\n        function ErrorRunningEvent2() {\n          return _super.call(this, \"error\", null) || this;\n        }\n        return ErrorRunningEvent2;\n      }(RunningEvent)\n    );\n    var FragmentRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(FragmentRunningEvent2, _super);\n        function FragmentRunningEvent2(address, contractInterface, fragment, topics) {\n          var _this = this;\n          var filter = {\n            address\n          };\n          var topic = contractInterface.getEventTopic(fragment);\n          if (topics) {\n            if (topic !== topics[0]) {\n              logger.throwArgumentError(\"topic mismatch\", \"topics\", topics);\n            }\n            filter.topics = topics.slice();\n          } else {\n            filter.topics = [topic];\n          }\n          _this = _super.call(this, getEventTag(filter), filter) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"interface\", contractInterface);\n          (0, properties_1.defineReadOnly)(_this, \"fragment\", fragment);\n          return _this;\n        }\n        FragmentRunningEvent2.prototype.prepareEvent = function(event) {\n          var _this = this;\n          _super.prototype.prepareEvent.call(this, event);\n          event.event = this.fragment.name;\n          event.eventSignature = this.fragment.format();\n          event.decode = function(data, topics) {\n            return _this.interface.decodeEventLog(_this.fragment, data, topics);\n          };\n          try {\n            event.args = this.interface.decodeEventLog(this.fragment, event.data, event.topics);\n          } catch (error) {\n            event.args = null;\n            event.decodeError = error;\n          }\n        };\n        FragmentRunningEvent2.prototype.getEmit = function(event) {\n          var errors = (0, abi_1.checkResultErrors)(event.args);\n          if (errors.length) {\n            throw errors[0].error;\n          }\n          var args = (event.args || []).slice();\n          args.push(event);\n          return args;\n        };\n        return FragmentRunningEvent2;\n      }(RunningEvent)\n    );\n    var WildcardRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(WildcardRunningEvent2, _super);\n        function WildcardRunningEvent2(address, contractInterface) {\n          var _this = _super.call(this, \"*\", { address }) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"interface\", contractInterface);\n          return _this;\n        }\n        WildcardRunningEvent2.prototype.prepareEvent = function(event) {\n          var _this = this;\n          _super.prototype.prepareEvent.call(this, event);\n          try {\n            var parsed_1 = this.interface.parseLog(event);\n            event.event = parsed_1.name;\n            event.eventSignature = parsed_1.signature;\n            event.decode = function(data, topics) {\n              return _this.interface.decodeEventLog(parsed_1.eventFragment, data, topics);\n            };\n            event.args = parsed_1.args;\n          } catch (error) {\n          }\n        };\n        return WildcardRunningEvent2;\n      }(RunningEvent)\n    );\n    var BaseContract = (\n      /** @class */\n      function() {\n        function BaseContract2(addressOrName, contractInterface, signerOrProvider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Contract);\n          (0, properties_1.defineReadOnly)(this, \"interface\", (0, properties_1.getStatic)(_newTarget, \"getInterface\")(contractInterface));\n          if (signerOrProvider == null) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", null);\n            (0, properties_1.defineReadOnly)(this, \"signer\", null);\n          } else if (abstract_signer_1.Signer.isSigner(signerOrProvider)) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", signerOrProvider.provider || null);\n            (0, properties_1.defineReadOnly)(this, \"signer\", signerOrProvider);\n          } else if (abstract_provider_1.Provider.isProvider(signerOrProvider)) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", signerOrProvider);\n            (0, properties_1.defineReadOnly)(this, \"signer\", null);\n          } else {\n            logger.throwArgumentError(\"invalid signer or provider\", \"signerOrProvider\", signerOrProvider);\n          }\n          (0, properties_1.defineReadOnly)(this, \"callStatic\", {});\n          (0, properties_1.defineReadOnly)(this, \"estimateGas\", {});\n          (0, properties_1.defineReadOnly)(this, \"functions\", {});\n          (0, properties_1.defineReadOnly)(this, \"populateTransaction\", {});\n          (0, properties_1.defineReadOnly)(this, \"filters\", {});\n          {\n            var uniqueFilters_1 = {};\n            Object.keys(this.interface.events).forEach(function(eventSignature) {\n              var event = _this.interface.events[eventSignature];\n              (0, properties_1.defineReadOnly)(_this.filters, eventSignature, function() {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                  args[_i] = arguments[_i];\n                }\n                return {\n                  address: _this.address,\n                  topics: _this.interface.encodeFilterTopics(event, args)\n                };\n              });\n              if (!uniqueFilters_1[event.name]) {\n                uniqueFilters_1[event.name] = [];\n              }\n              uniqueFilters_1[event.name].push(eventSignature);\n            });\n            Object.keys(uniqueFilters_1).forEach(function(name2) {\n              var filters = uniqueFilters_1[name2];\n              if (filters.length === 1) {\n                (0, properties_1.defineReadOnly)(_this.filters, name2, _this.filters[filters[0]]);\n              } else {\n                logger.warn(\"Duplicate definition of \" + name2 + \" (\" + filters.join(\", \") + \")\");\n              }\n            });\n          }\n          (0, properties_1.defineReadOnly)(this, \"_runningEvents\", {});\n          (0, properties_1.defineReadOnly)(this, \"_wrappedEmits\", {});\n          if (addressOrName == null) {\n            logger.throwArgumentError(\"invalid contract address or ENS name\", \"addressOrName\", addressOrName);\n          }\n          (0, properties_1.defineReadOnly)(this, \"address\", addressOrName);\n          if (this.provider) {\n            (0, properties_1.defineReadOnly)(this, \"resolvedAddress\", resolveName(this.provider, addressOrName));\n          } else {\n            try {\n              (0, properties_1.defineReadOnly)(this, \"resolvedAddress\", Promise.resolve((0, address_1.getAddress)(addressOrName)));\n            } catch (error) {\n              logger.throwError(\"provider is required to use ENS name as contract address\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"new Contract\"\n              });\n            }\n          }\n          var uniqueNames = {};\n          var uniqueSignatures = {};\n          Object.keys(this.interface.functions).forEach(function(signature) {\n            var fragment = _this.interface.functions[signature];\n            if (uniqueSignatures[signature]) {\n              logger.warn(\"Duplicate ABI entry for \" + JSON.stringify(signature));\n              return;\n            }\n            uniqueSignatures[signature] = true;\n            {\n              var name_1 = fragment.name;\n              if (!uniqueNames[\"%\" + name_1]) {\n                uniqueNames[\"%\" + name_1] = [];\n              }\n              uniqueNames[\"%\" + name_1].push(signature);\n            }\n            if (_this[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this, signature, buildDefault(_this, fragment, true));\n            }\n            if (_this.functions[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.functions, signature, buildDefault(_this, fragment, false));\n            }\n            if (_this.callStatic[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.callStatic, signature, buildCall(_this, fragment, true));\n            }\n            if (_this.populateTransaction[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.populateTransaction, signature, buildPopulate(_this, fragment));\n            }\n            if (_this.estimateGas[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.estimateGas, signature, buildEstimate(_this, fragment));\n            }\n          });\n          Object.keys(uniqueNames).forEach(function(name2) {\n            var signatures = uniqueNames[name2];\n            if (signatures.length > 1) {\n              return;\n            }\n            name2 = name2.substring(1);\n            var signature = signatures[0];\n            try {\n              if (_this[name2] == null) {\n                (0, properties_1.defineReadOnly)(_this, name2, _this[signature]);\n              }\n            } catch (e) {\n            }\n            if (_this.functions[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.functions, name2, _this.functions[signature]);\n            }\n            if (_this.callStatic[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.callStatic, name2, _this.callStatic[signature]);\n            }\n            if (_this.populateTransaction[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.populateTransaction, name2, _this.populateTransaction[signature]);\n            }\n            if (_this.estimateGas[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.estimateGas, name2, _this.estimateGas[signature]);\n            }\n          });\n        }\n        BaseContract2.getContractAddress = function(transaction) {\n          return (0, address_1.getContractAddress)(transaction);\n        };\n        BaseContract2.getInterface = function(contractInterface) {\n          if (abi_1.Interface.isInterface(contractInterface)) {\n            return contractInterface;\n          }\n          return new abi_1.Interface(contractInterface);\n        };\n        BaseContract2.prototype.deployed = function() {\n          return this._deployed();\n        };\n        BaseContract2.prototype._deployed = function(blockTag) {\n          var _this = this;\n          if (!this._deployedPromise) {\n            if (this.deployTransaction) {\n              this._deployedPromise = this.deployTransaction.wait().then(function() {\n                return _this;\n              });\n            } else {\n              this._deployedPromise = this.provider.getCode(this.address, blockTag).then(function(code) {\n                if (code === \"0x\") {\n                  logger.throwError(\"contract not deployed\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    contractAddress: _this.address,\n                    operation: \"getDeployed\"\n                  });\n                }\n                return _this;\n              });\n            }\n          }\n          return this._deployedPromise;\n        };\n        BaseContract2.prototype.fallback = function(overrides) {\n          var _this = this;\n          if (!this.signer) {\n            logger.throwError(\"sending a transactions require a signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"sendTransaction(fallback)\" });\n          }\n          var tx = (0, properties_1.shallowCopy)(overrides || {});\n          [\"from\", \"to\"].forEach(function(key) {\n            if (tx[key] == null) {\n              return;\n            }\n            logger.throwError(\"cannot override \" + key, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: key });\n          });\n          tx.to = this.resolvedAddress;\n          return this.deployed().then(function() {\n            return _this.signer.sendTransaction(tx);\n          });\n        };\n        BaseContract2.prototype.connect = function(signerOrProvider) {\n          if (typeof signerOrProvider === \"string\") {\n            signerOrProvider = new abstract_signer_1.VoidSigner(signerOrProvider, this.provider);\n          }\n          var contract = new this.constructor(this.address, this.interface, signerOrProvider);\n          if (this.deployTransaction) {\n            (0, properties_1.defineReadOnly)(contract, \"deployTransaction\", this.deployTransaction);\n          }\n          return contract;\n        };\n        BaseContract2.prototype.attach = function(addressOrName) {\n          return new this.constructor(addressOrName, this.interface, this.signer || this.provider);\n        };\n        BaseContract2.isIndexed = function(value) {\n          return abi_1.Indexed.isIndexed(value);\n        };\n        BaseContract2.prototype._normalizeRunningEvent = function(runningEvent) {\n          if (this._runningEvents[runningEvent.tag]) {\n            return this._runningEvents[runningEvent.tag];\n          }\n          return runningEvent;\n        };\n        BaseContract2.prototype._getRunningEvent = function(eventName) {\n          if (typeof eventName === \"string\") {\n            if (eventName === \"error\") {\n              return this._normalizeRunningEvent(new ErrorRunningEvent());\n            }\n            if (eventName === \"event\") {\n              return this._normalizeRunningEvent(new RunningEvent(\"event\", null));\n            }\n            if (eventName === \"*\") {\n              return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface));\n            }\n            var fragment = this.interface.getEvent(eventName);\n            return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment));\n          }\n          if (eventName.topics && eventName.topics.length > 0) {\n            try {\n              var topic = eventName.topics[0];\n              if (typeof topic !== \"string\") {\n                throw new Error(\"invalid topic\");\n              }\n              var fragment = this.interface.getEvent(topic);\n              return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment, eventName.topics));\n            } catch (error) {\n            }\n            var filter = {\n              address: this.address,\n              topics: eventName.topics\n            };\n            return this._normalizeRunningEvent(new RunningEvent(getEventTag(filter), filter));\n          }\n          return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface));\n        };\n        BaseContract2.prototype._checkRunningEvents = function(runningEvent) {\n          if (runningEvent.listenerCount() === 0) {\n            delete this._runningEvents[runningEvent.tag];\n            var emit = this._wrappedEmits[runningEvent.tag];\n            if (emit && runningEvent.filter) {\n              this.provider.off(runningEvent.filter, emit);\n              delete this._wrappedEmits[runningEvent.tag];\n            }\n          }\n        };\n        BaseContract2.prototype._wrapEvent = function(runningEvent, log, listener) {\n          var _this = this;\n          var event = (0, properties_1.deepCopy)(log);\n          event.removeListener = function() {\n            if (!listener) {\n              return;\n            }\n            runningEvent.removeListener(listener);\n            _this._checkRunningEvents(runningEvent);\n          };\n          event.getBlock = function() {\n            return _this.provider.getBlock(log.blockHash);\n          };\n          event.getTransaction = function() {\n            return _this.provider.getTransaction(log.transactionHash);\n          };\n          event.getTransactionReceipt = function() {\n            return _this.provider.getTransactionReceipt(log.transactionHash);\n          };\n          runningEvent.prepareEvent(event);\n          return event;\n        };\n        BaseContract2.prototype._addEventListener = function(runningEvent, listener, once) {\n          var _this = this;\n          if (!this.provider) {\n            logger.throwError(\"events require a provider or a signer with a provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"once\" });\n          }\n          runningEvent.addListener(listener, once);\n          this._runningEvents[runningEvent.tag] = runningEvent;\n          if (!this._wrappedEmits[runningEvent.tag]) {\n            var wrappedEmit = function(log) {\n              var event = _this._wrapEvent(runningEvent, log, listener);\n              if (event.decodeError == null) {\n                try {\n                  var args = runningEvent.getEmit(event);\n                  _this.emit.apply(_this, __spreadArray([runningEvent.filter], args, false));\n                } catch (error) {\n                  event.decodeError = error.error;\n                }\n              }\n              if (runningEvent.filter != null) {\n                _this.emit(\"event\", event);\n              }\n              if (event.decodeError != null) {\n                _this.emit(\"error\", event.decodeError, event);\n              }\n            };\n            this._wrappedEmits[runningEvent.tag] = wrappedEmit;\n            if (runningEvent.filter != null) {\n              this.provider.on(runningEvent.filter, wrappedEmit);\n            }\n          }\n        };\n        BaseContract2.prototype.queryFilter = function(event, fromBlockOrBlockhash, toBlock) {\n          var _this = this;\n          var runningEvent = this._getRunningEvent(event);\n          var filter = (0, properties_1.shallowCopy)(runningEvent.filter);\n          if (typeof fromBlockOrBlockhash === \"string\" && (0, bytes_1.isHexString)(fromBlockOrBlockhash, 32)) {\n            if (toBlock != null) {\n              logger.throwArgumentError(\"cannot specify toBlock with blockhash\", \"toBlock\", toBlock);\n            }\n            filter.blockHash = fromBlockOrBlockhash;\n          } else {\n            filter.fromBlock = fromBlockOrBlockhash != null ? fromBlockOrBlockhash : 0;\n            filter.toBlock = toBlock != null ? toBlock : \"latest\";\n          }\n          return this.provider.getLogs(filter).then(function(logs) {\n            return logs.map(function(log) {\n              return _this._wrapEvent(runningEvent, log, null);\n            });\n          });\n        };\n        BaseContract2.prototype.on = function(event, listener) {\n          this._addEventListener(this._getRunningEvent(event), listener, false);\n          return this;\n        };\n        BaseContract2.prototype.once = function(event, listener) {\n          this._addEventListener(this._getRunningEvent(event), listener, true);\n          return this;\n        };\n        BaseContract2.prototype.emit = function(eventName) {\n          var args = [];\n          for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n          }\n          if (!this.provider) {\n            return false;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          var result2 = runningEvent.run(args) > 0;\n          this._checkRunningEvents(runningEvent);\n          return result2;\n        };\n        BaseContract2.prototype.listenerCount = function(eventName) {\n          var _this = this;\n          if (!this.provider) {\n            return 0;\n          }\n          if (eventName == null) {\n            return Object.keys(this._runningEvents).reduce(function(accum, key) {\n              return accum + _this._runningEvents[key].listenerCount();\n            }, 0);\n          }\n          return this._getRunningEvent(eventName).listenerCount();\n        };\n        BaseContract2.prototype.listeners = function(eventName) {\n          if (!this.provider) {\n            return [];\n          }\n          if (eventName == null) {\n            var result_1 = [];\n            for (var tag in this._runningEvents) {\n              this._runningEvents[tag].listeners().forEach(function(listener) {\n                result_1.push(listener);\n              });\n            }\n            return result_1;\n          }\n          return this._getRunningEvent(eventName).listeners();\n        };\n        BaseContract2.prototype.removeAllListeners = function(eventName) {\n          if (!this.provider) {\n            return this;\n          }\n          if (eventName == null) {\n            for (var tag in this._runningEvents) {\n              var runningEvent_1 = this._runningEvents[tag];\n              runningEvent_1.removeAllListeners();\n              this._checkRunningEvents(runningEvent_1);\n            }\n            return this;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          runningEvent.removeAllListeners();\n          this._checkRunningEvents(runningEvent);\n          return this;\n        };\n        BaseContract2.prototype.off = function(eventName, listener) {\n          if (!this.provider) {\n            return this;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          runningEvent.removeListener(listener);\n          this._checkRunningEvents(runningEvent);\n          return this;\n        };\n        BaseContract2.prototype.removeListener = function(eventName, listener) {\n          return this.off(eventName, listener);\n        };\n        return BaseContract2;\n      }()\n    );\n    exports2.BaseContract = BaseContract;\n    var Contract = (\n      /** @class */\n      function(_super) {\n        __extends(Contract2, _super);\n        function Contract2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return Contract2;\n      }(BaseContract)\n    );\n    exports2.Contract = Contract;\n    var ContractFactory = (\n      /** @class */\n      function() {\n        function ContractFactory2(contractInterface, bytecode, signer) {\n          var _newTarget = this.constructor;\n          var bytecodeHex = null;\n          if (typeof bytecode === \"string\") {\n            bytecodeHex = bytecode;\n          } else if ((0, bytes_1.isBytes)(bytecode)) {\n            bytecodeHex = (0, bytes_1.hexlify)(bytecode);\n          } else if (bytecode && typeof bytecode.object === \"string\") {\n            bytecodeHex = bytecode.object;\n          } else {\n            bytecodeHex = \"!\";\n          }\n          if (bytecodeHex.substring(0, 2) !== \"0x\") {\n            bytecodeHex = \"0x\" + bytecodeHex;\n          }\n          if (!(0, bytes_1.isHexString)(bytecodeHex) || bytecodeHex.length % 2) {\n            logger.throwArgumentError(\"invalid bytecode\", \"bytecode\", bytecode);\n          }\n          if (signer && !abstract_signer_1.Signer.isSigner(signer)) {\n            logger.throwArgumentError(\"invalid signer\", \"signer\", signer);\n          }\n          (0, properties_1.defineReadOnly)(this, \"bytecode\", bytecodeHex);\n          (0, properties_1.defineReadOnly)(this, \"interface\", (0, properties_1.getStatic)(_newTarget, \"getInterface\")(contractInterface));\n          (0, properties_1.defineReadOnly)(this, \"signer\", signer || null);\n        }\n        ContractFactory2.prototype.getDeployTransaction = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          var tx = {};\n          if (args.length === this.interface.deploy.inputs.length + 1 && typeof args[args.length - 1] === \"object\") {\n            tx = (0, properties_1.shallowCopy)(args.pop());\n            for (var key in tx) {\n              if (!allowedTransactionKeys[key]) {\n                throw new Error(\"unknown transaction override \" + key);\n              }\n            }\n          }\n          [\"data\", \"from\", \"to\"].forEach(function(key2) {\n            if (tx[key2] == null) {\n              return;\n            }\n            logger.throwError(\"cannot override \" + key2, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: key2 });\n          });\n          if (tx.value) {\n            var value = bignumber_1.BigNumber.from(tx.value);\n            if (!value.isZero() && !this.interface.deploy.payable) {\n              logger.throwError(\"non-payable constructor cannot override value\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"overrides.value\",\n                value: tx.value\n              });\n            }\n          }\n          logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, \" in Contract constructor\");\n          tx.data = (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.bytecode,\n            this.interface.encodeDeploy(args)\n          ]));\n          return tx;\n        };\n        ContractFactory2.prototype.deploy = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          return __awaiter(this, void 0, void 0, function() {\n            var overrides, params2, unsignedTx, tx, address, contract;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  overrides = {};\n                  if (args.length === this.interface.deploy.inputs.length + 1) {\n                    overrides = args.pop();\n                  }\n                  logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, \" in Contract constructor\");\n                  return [4, resolveAddresses(this.signer, args, this.interface.deploy.inputs)];\n                case 1:\n                  params2 = _a.sent();\n                  params2.push(overrides);\n                  unsignedTx = this.getDeployTransaction.apply(this, params2);\n                  return [4, this.signer.sendTransaction(unsignedTx)];\n                case 2:\n                  tx = _a.sent();\n                  address = (0, properties_1.getStatic)(this.constructor, \"getContractAddress\")(tx);\n                  contract = (0, properties_1.getStatic)(this.constructor, \"getContract\")(address, this.interface, this.signer);\n                  addContractWait(contract, tx);\n                  (0, properties_1.defineReadOnly)(contract, \"deployTransaction\", tx);\n                  return [2, contract];\n              }\n            });\n          });\n        };\n        ContractFactory2.prototype.attach = function(address) {\n          return this.constructor.getContract(address, this.interface, this.signer);\n        };\n        ContractFactory2.prototype.connect = function(signer) {\n          return new this.constructor(this.interface, this.bytecode, signer);\n        };\n        ContractFactory2.fromSolidity = function(compilerOutput, signer) {\n          if (compilerOutput == null) {\n            logger.throwError(\"missing compiler output\", logger_1.Logger.errors.MISSING_ARGUMENT, { argument: \"compilerOutput\" });\n          }\n          if (typeof compilerOutput === \"string\") {\n            compilerOutput = JSON.parse(compilerOutput);\n          }\n          var abi = compilerOutput.abi;\n          var bytecode = null;\n          if (compilerOutput.bytecode) {\n            bytecode = compilerOutput.bytecode;\n          } else if (compilerOutput.evm && compilerOutput.evm.bytecode) {\n            bytecode = compilerOutput.evm.bytecode;\n          }\n          return new this(abi, bytecode, signer);\n        };\n        ContractFactory2.getInterface = function(contractInterface) {\n          return Contract.getInterface(contractInterface);\n        };\n        ContractFactory2.getContractAddress = function(tx) {\n          return (0, address_1.getContractAddress)(tx);\n        };\n        ContractFactory2.getContract = function(address, contractInterface, signer) {\n          return new Contract(address, contractInterface, signer);\n        };\n        return ContractFactory2;\n      }()\n    );\n    exports2.ContractFactory = ContractFactory;\n  }\n});\n\n// node_modules/@ethersproject/basex/lib/index.js\nvar require_lib17 = __commonJS({\n  \"node_modules/@ethersproject/basex/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Base58 = exports2.Base32 = exports2.BaseX = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var BaseX = (\n      /** @class */\n      function() {\n        function BaseX2(alphabet) {\n          (0, properties_1.defineReadOnly)(this, \"alphabet\", alphabet);\n          (0, properties_1.defineReadOnly)(this, \"base\", alphabet.length);\n          (0, properties_1.defineReadOnly)(this, \"_alphabetMap\", {});\n          (0, properties_1.defineReadOnly)(this, \"_leader\", alphabet.charAt(0));\n          for (var i = 0; i < alphabet.length; i++) {\n            this._alphabetMap[alphabet.charAt(i)] = i;\n          }\n        }\n        BaseX2.prototype.encode = function(value) {\n          var source = (0, bytes_1.arrayify)(value);\n          if (source.length === 0) {\n            return \"\";\n          }\n          var digits = [0];\n          for (var i = 0; i < source.length; ++i) {\n            var carry = source[i];\n            for (var j = 0; j < digits.length; ++j) {\n              carry += digits[j] << 8;\n              digits[j] = carry % this.base;\n              carry = carry / this.base | 0;\n            }\n            while (carry > 0) {\n              digits.push(carry % this.base);\n              carry = carry / this.base | 0;\n            }\n          }\n          var string = \"\";\n          for (var k = 0; source[k] === 0 && k < source.length - 1; ++k) {\n            string += this._leader;\n          }\n          for (var q = digits.length - 1; q >= 0; --q) {\n            string += this.alphabet[digits[q]];\n          }\n          return string;\n        };\n        BaseX2.prototype.decode = function(value) {\n          if (typeof value !== \"string\") {\n            throw new TypeError(\"Expected String\");\n          }\n          var bytes = [];\n          if (value.length === 0) {\n            return new Uint8Array(bytes);\n          }\n          bytes.push(0);\n          for (var i = 0; i < value.length; i++) {\n            var byte = this._alphabetMap[value[i]];\n            if (byte === void 0) {\n              throw new Error(\"Non-base\" + this.base + \" character\");\n            }\n            var carry = byte;\n            for (var j = 0; j < bytes.length; ++j) {\n              carry += bytes[j] * this.base;\n              bytes[j] = carry & 255;\n              carry >>= 8;\n            }\n            while (carry > 0) {\n              bytes.push(carry & 255);\n              carry >>= 8;\n            }\n          }\n          for (var k = 0; value[k] === this._leader && k < value.length - 1; ++k) {\n            bytes.push(0);\n          }\n          return (0, bytes_1.arrayify)(new Uint8Array(bytes.reverse()));\n        };\n        return BaseX2;\n      }()\n    );\n    exports2.BaseX = BaseX;\n    var Base32 = new BaseX(\"abcdefghijklmnopqrstuvwxyz234567\");\n    exports2.Base32 = Base32;\n    var Base58 = new BaseX(\"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\");\n    exports2.Base58 = Base58;\n  }\n});\n\n// node_modules/@ethersproject/pbkdf2/lib/pbkdf2.js\nvar require_pbkdf2 = __commonJS({\n  \"node_modules/@ethersproject/pbkdf2/lib/pbkdf2.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.pbkdf2 = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    function bufferify(value) {\n      return Buffer.from((0, bytes_1.arrayify)(value));\n    }\n    function pbkdf2(password, salt, iterations, keylen, hashAlgorithm) {\n      return (0, bytes_1.hexlify)((0, crypto_1.pbkdf2Sync)(bufferify(password), bufferify(salt), iterations, keylen, hashAlgorithm));\n    }\n    exports2.pbkdf2 = pbkdf2;\n  }\n});\n\n// node_modules/@ethersproject/pbkdf2/lib/index.js\nvar require_lib18 = __commonJS({\n  \"node_modules/@ethersproject/pbkdf2/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.pbkdf2 = void 0;\n    var pbkdf2_1 = require_pbkdf2();\n    Object.defineProperty(exports2, \"pbkdf2\", { enumerable: true, get: function() {\n      return pbkdf2_1.pbkdf2;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/types.js\nvar require_types = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/types.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.SupportedAlgorithm = void 0;\n    var SupportedAlgorithm;\n    (function(SupportedAlgorithm2) {\n      SupportedAlgorithm2[\"sha256\"] = \"sha256\";\n      SupportedAlgorithm2[\"sha512\"] = \"sha512\";\n    })(SupportedAlgorithm = exports2.SupportedAlgorithm || (exports2.SupportedAlgorithm = {}));\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/_version.js\nvar require_version15 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"sha2/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/sha2.js\nvar require_sha2 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/sha2.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.computeHmac = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    var types_1 = require_types();\n    var logger_1 = require_lib();\n    var _version_1 = require_version15();\n    var logger = new logger_1.Logger(_version_1.version);\n    function ripemd160(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"ripemd160\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.ripemd160 = ripemd160;\n    function sha256(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"sha256\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.sha256 = sha256;\n    function sha512(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"sha512\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.sha512 = sha512;\n    function computeHmac(algorithm, key, data) {\n      if (!types_1.SupportedAlgorithm[algorithm]) {\n        logger.throwError(\"unsupported algorithm - \" + algorithm, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          operation: \"computeHmac\",\n          algorithm\n        });\n      }\n      return \"0x\" + (0, crypto_1.createHmac)(algorithm, Buffer.from((0, bytes_1.arrayify)(key))).update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.computeHmac = computeHmac;\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/index.js\nvar require_lib19 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.SupportedAlgorithm = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = exports2.computeHmac = void 0;\n    var sha2_1 = require_sha2();\n    Object.defineProperty(exports2, \"computeHmac\", { enumerable: true, get: function() {\n      return sha2_1.computeHmac;\n    } });\n    Object.defineProperty(exports2, \"ripemd160\", { enumerable: true, get: function() {\n      return sha2_1.ripemd160;\n    } });\n    Object.defineProperty(exports2, \"sha256\", { enumerable: true, get: function() {\n      return sha2_1.sha256;\n    } });\n    Object.defineProperty(exports2, \"sha512\", { enumerable: true, get: function() {\n      return sha2_1.sha512;\n    } });\n    var types_1 = require_types();\n    Object.defineProperty(exports2, \"SupportedAlgorithm\", { enumerable: true, get: function() {\n      return types_1.SupportedAlgorithm;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/_version.js\nvar require_version16 = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"wordlists/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/wordlist.js\nvar require_wordlist = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/wordlist.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.logger = void 0;\n    var exportWordlist = false;\n    var hash_1 = require_lib10();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version16();\n    exports2.logger = new logger_1.Logger(_version_1.version);\n    var Wordlist = (\n      /** @class */\n      function() {\n        function Wordlist2(locale) {\n          var _newTarget = this.constructor;\n          exports2.logger.checkAbstract(_newTarget, Wordlist2);\n          (0, properties_1.defineReadOnly)(this, \"locale\", locale);\n        }\n        Wordlist2.prototype.split = function(mnemonic) {\n          return mnemonic.toLowerCase().split(/ +/g);\n        };\n        Wordlist2.prototype.join = function(words) {\n          return words.join(\" \");\n        };\n        Wordlist2.check = function(wordlist) {\n          var words = [];\n          for (var i = 0; i < 2048; i++) {\n            var word = wordlist.getWord(i);\n            if (i !== wordlist.getWordIndex(word)) {\n              return \"0x\";\n            }\n            words.push(word);\n          }\n          return (0, hash_1.id)(words.join(\"\\n\") + \"\\n\");\n        };\n        Wordlist2.register = function(lang, name2) {\n          if (!name2) {\n            name2 = lang.locale;\n          }\n          if (exportWordlist) {\n            try {\n              var anyGlobal = window;\n              if (anyGlobal._ethers && anyGlobal._ethers.wordlists) {\n                if (!anyGlobal._ethers.wordlists[name2]) {\n                  (0, properties_1.defineReadOnly)(anyGlobal._ethers.wordlists, name2, lang);\n                }\n              }\n            } catch (error) {\n            }\n          }\n        };\n        return Wordlist2;\n      }()\n    );\n    exports2.Wordlist = Wordlist;\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-cz.js\nvar require_lang_cz = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-cz.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langCz = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbdikaceAbecedaAdresaAgreseAkceAktovkaAlejAlkoholAmputaceAnanasAndulkaAnekdotaAnketaAntikaAnulovatArchaAroganceAsfaltAsistentAspiraceAstmaAstronomAtlasAtletikaAtolAutobusAzylBabkaBachorBacilBaculkaBadatelBagetaBagrBahnoBakterieBaladaBaletkaBalkonBalonekBalvanBalzaBambusBankomatBarbarBaretBarmanBarokoBarvaBaterkaBatohBavlnaBazalkaBazilikaBazukaBednaBeranBesedaBestieBetonBezinkaBezmocBeztakBicyklBidloBiftekBikinyBilanceBiografBiologBitvaBizonBlahobytBlatouchBlechaBleduleBleskBlikatBliznaBlokovatBlouditBludBobekBobrBodlinaBodnoutBohatostBojkotBojovatBokorysBolestBorecBoroviceBotaBoubelBouchatBoudaBouleBouratBoxerBradavkaBramboraBrankaBratrBreptaBriketaBrkoBrlohBronzBroskevBrunetkaBrusinkaBrzdaBrzyBublinaBubnovatBuchtaBuditelBudkaBudovaBufetBujarostBukviceBuldokBulvaBundaBunkrBurzaButikBuvolBuzolaBydletBylinaBytovkaBzukotCapartCarevnaCedrCeduleCejchCejnCelaCelerCelkemCelniceCeninaCennostCenovkaCentrumCenzorCestopisCetkaChalupaChapadloCharitaChataChechtatChemieChichotChirurgChladChlebaChlubitChmelChmuraChobotChocholChodbaCholeraChomoutChopitChorobaChovChrapotChrlitChrtChrupChtivostChudinaChutnatChvatChvilkaChvostChybaChystatChytitCibuleCigaretaCihelnaCihlaCinkotCirkusCisternaCitaceCitrusCizinecCizostClonaCokolivCouvatCtitelCtnostCudnostCuketaCukrCupotCvaknoutCvalCvikCvrkotCyklistaDalekoDarebaDatelDatumDceraDebataDechovkaDecibelDeficitDeflaceDeklDekretDemokratDepreseDerbyDeskaDetektivDikobrazDiktovatDiodaDiplomDiskDisplejDivadloDivochDlahaDlouhoDluhopisDnesDobroDobytekDocentDochutitDodnesDohledDohodaDohraDojemDojniceDokladDokolaDoktorDokumentDolarDolevaDolinaDomaDominantDomluvitDomovDonutitDopadDopisDoplnitDoposudDoprovodDopustitDorazitDorostDortDosahDoslovDostatekDosudDosytaDotazDotekDotknoutDoufatDoutnatDovozceDozaduDoznatDozorceDrahotaDrakDramatikDravecDrazeDrdolDrobnostDrogerieDrozdDrsnostDrtitDrzostDubenDuchovnoDudekDuhaDuhovkaDusitDusnoDutostDvojiceDvorecDynamitEkologEkonomieElektronElipsaEmailEmiseEmoceEmpatieEpizodaEpochaEpopejEposEsejEsenceEskortaEskymoEtiketaEuforieEvoluceExekuceExkurzeExpediceExplozeExportExtraktFackaFajfkaFakultaFanatikFantazieFarmacieFavoritFazoleFederaceFejetonFenkaFialkaFigurantFilozofFiltrFinanceFintaFixaceFjordFlanelFlirtFlotilaFondFosforFotbalFotkaFotonFrakceFreskaFrontaFukarFunkceFyzikaGalejeGarantGenetikaGeologGilotinaGlazuraGlejtGolemGolfistaGotikaGrafGramofonGranuleGrepGrilGrogGroteskaGumaHadiceHadrHalaHalenkaHanbaHanopisHarfaHarpunaHavranHebkostHejkalHejnoHejtmanHektarHelmaHematomHerecHernaHesloHezkyHistorikHladovkaHlasivkyHlavaHledatHlenHlodavecHlohHloupostHltatHlubinaHluchotaHmatHmotaHmyzHnisHnojivoHnoutHoblinaHobojHochHodinyHodlatHodnotaHodovatHojnostHokejHolinkaHolkaHolubHomoleHonitbaHonoraceHoralHordaHorizontHorkoHorlivecHormonHorninaHoroskopHorstvoHospodaHostinaHotovostHoubaHoufHoupatHouskaHovorHradbaHraniceHravostHrazdaHrbolekHrdinaHrdloHrdostHrnekHrobkaHromadaHrotHroudaHrozenHrstkaHrubostHryzatHubenostHubnoutHudbaHukotHumrHusitaHustotaHvozdHybnostHydrantHygienaHymnaHysterikIdylkaIhnedIkonaIluzeImunitaInfekceInflaceInkasoInovaceInspekceInternetInvalidaInvestorInzerceIronieJablkoJachtaJahodaJakmileJakostJalovecJantarJarmarkJaroJasanJasnoJatkaJavorJazykJedinecJedleJednatelJehlanJekotJelenJelitoJemnostJenomJepiceJeseterJevitJezdecJezeroJinakJindyJinochJiskraJistotaJitrniceJizvaJmenovatJogurtJurtaKabaretKabelKabinetKachnaKadetKadidloKahanKajakKajutaKakaoKaktusKalamitaKalhotyKalibrKalnostKameraKamkolivKamnaKanibalKanoeKantorKapalinaKapelaKapitolaKapkaKapleKapotaKaprKapustaKapybaraKaramelKarotkaKartonKasaKatalogKatedraKauceKauzaKavalecKazajkaKazetaKazivostKdekolivKdesiKedlubenKempKeramikaKinoKlacekKladivoKlamKlapotKlasikaKlaunKlecKlenbaKlepatKlesnoutKlidKlimaKlisnaKloboukKlokanKlopaKloubKlubovnaKlusatKluzkostKmenKmitatKmotrKnihaKnotKoaliceKoberecKobkaKoblihaKobylaKocourKohoutKojenecKokosKoktejlKolapsKoledaKolizeKoloKomandoKometaKomikKomnataKomoraKompasKomunitaKonatKonceptKondiceKonecKonfeseKongresKoninaKonkursKontaktKonzervaKopanecKopieKopnoutKoprovkaKorbelKorektorKormidloKoroptevKorpusKorunaKorytoKorzetKosatecKostkaKotelKotletaKotoulKoukatKoupelnaKousekKouzloKovbojKozaKozorohKrabiceKrachKrajinaKralovatKrasopisKravataKreditKrejcarKresbaKrevetaKriketKritikKrizeKrkavecKrmelecKrmivoKrocanKrokKronikaKropitKroupaKrovkaKrtekKruhadloKrupiceKrutostKrvinkaKrychleKryptaKrystalKrytKudlankaKufrKujnostKuklaKulajdaKulichKulkaKulometKulturaKunaKupodivuKurtKurzorKutilKvalitaKvasinkaKvestorKynologKyselinaKytaraKyticeKytkaKytovecKyvadloLabradorLachtanLadnostLaikLakomecLamelaLampaLanovkaLasiceLasoLasturaLatinkaLavinaLebkaLeckdyLedenLedniceLedovkaLedvinaLegendaLegieLegraceLehceLehkostLehnoutLektvarLenochodLentilkaLepenkaLepidloLetadloLetecLetmoLetokruhLevhartLevitaceLevobokLibraLichotkaLidojedLidskostLihovinaLijavecLilekLimetkaLinieLinkaLinoleumListopadLitinaLitovatLobistaLodivodLogikaLogopedLokalitaLoketLomcovatLopataLopuchLordLososLotrLoudalLouhLoukaLouskatLovecLstivostLucernaLuciferLumpLuskLustraceLviceLyraLyrikaLysinaMadamMadloMagistrMahagonMajetekMajitelMajoritaMakakMakoviceMakrelaMalbaMalinaMalovatMalviceMaminkaMandleMankoMarnostMasakrMaskotMasopustMaticeMatrikaMaturitaMazanecMazivoMazlitMazurkaMdlobaMechanikMeditaceMedovinaMelasaMelounMentolkaMetlaMetodaMetrMezeraMigraceMihnoutMihuleMikinaMikrofonMilenecMilimetrMilostMimikaMincovnaMinibarMinometMinulostMiskaMistrMixovatMladostMlhaMlhovinaMlokMlsatMluvitMnichMnohemMobilMocnostModelkaModlitbaMohylaMokroMolekulaMomentkaMonarchaMonoklMonstrumMontovatMonzunMosazMoskytMostMotivaceMotorkaMotykaMouchaMoudrostMozaikaMozekMozolMramorMravenecMrkevMrtvolaMrzetMrzutostMstitelMudrcMuflonMulatMumieMuniceMusetMutaceMuzeumMuzikantMyslivecMzdaNabouratNachytatNadaceNadbytekNadhozNadobroNadpisNahlasNahnatNahodileNahraditNaivitaNajednouNajistoNajmoutNaklonitNakonecNakrmitNalevoNamazatNamluvitNanometrNaokoNaopakNaostroNapadatNapevnoNaplnitNapnoutNaposledNaprostoNaroditNarubyNarychloNasaditNasekatNaslepoNastatNatolikNavenekNavrchNavzdoryNazvatNebeNechatNeckyNedalekoNedbatNeduhNegaceNehetNehodaNejenNejprveNeklidNelibostNemilostNemocNeochotaNeonkaNepokojNerostNervNesmyslNesouladNetvorNeuronNevinaNezvykleNicotaNijakNikamNikdyNiklNikterakNitroNoclehNohaviceNominaceNoraNorekNositelNosnostNouzeNovinyNovotaNozdraNudaNudleNugetNutitNutnostNutrieNymfaObalObarvitObavaObdivObecObehnatObejmoutObezitaObhajobaObilniceObjasnitObjektObklopitOblastOblekOblibaOblohaObludaObnosObohatitObojekOboutObrazecObrnaObrubaObrysObsahObsluhaObstaratObuvObvazObvinitObvodObvykleObyvatelObzorOcasOcelOcenitOchladitOchotaOchranaOcitnoutOdbojOdbytOdchodOdcizitOdebratOdeslatOdevzdatOdezvaOdhadceOdhoditOdjetOdjinudOdkazOdkoupitOdlivOdlukaOdmlkaOdolnostOdpadOdpisOdploutOdporOdpustitOdpykatOdrazkaOdsouditOdstupOdsunOdtokOdtudOdvahaOdvetaOdvolatOdvracetOdznakOfinaOfsajdOhlasOhniskoOhradaOhrozitOhryzekOkapOkeniceOklikaOknoOkouzlitOkovyOkrasaOkresOkrsekOkruhOkupantOkurkaOkusitOlejninaOlizovatOmakOmeletaOmezitOmladinaOmlouvatOmluvaOmylOnehdyOpakovatOpasekOperaceOpiceOpilostOpisovatOporaOpoziceOpravduOprotiOrbitalOrchestrOrgieOrliceOrlojOrtelOsadaOschnoutOsikaOsivoOslavaOslepitOslnitOslovitOsnovaOsobaOsolitOspalecOstenOstrahaOstudaOstychOsvojitOteplitOtiskOtopOtrhatOtrlostOtrokOtrubyOtvorOvanoutOvarOvesOvlivnitOvoceOxidOzdobaPachatelPacientPadouchPahorekPaktPalandaPalecPalivoPalubaPamfletPamlsekPanenkaPanikaPannaPanovatPanstvoPantoflePaprikaParketaParodiePartaParukaParybaPasekaPasivitaPastelkaPatentPatronaPavoukPaznehtPazourekPeckaPedagogPejsekPekloPelotonPenaltaPendrekPenzePeriskopPeroPestrostPetardaPeticePetrolejPevninaPexesoPianistaPihaPijavicePiklePiknikPilinaPilnostPilulkaPinzetaPipetaPisatelPistolePitevnaPivnicePivovarPlacentaPlakatPlamenPlanetaPlastikaPlatitPlavidloPlazPlechPlemenoPlentaPlesPletivoPlevelPlivatPlnitPlnoPlochaPlodinaPlombaPloutPlukPlynPobavitPobytPochodPocitPoctivecPodatPodcenitPodepsatPodhledPodivitPodkladPodmanitPodnikPodobaPodporaPodrazPodstataPodvodPodzimPoeziePohankaPohnutkaPohovorPohromaPohybPointaPojistkaPojmoutPokazitPoklesPokojPokrokPokutaPokynPolednePolibekPolknoutPolohaPolynomPomaluPominoutPomlkaPomocPomstaPomysletPonechatPonorkaPonurostPopadatPopelPopisekPoplachPoprositPopsatPopudPoradcePorcePorodPoruchaPoryvPosaditPosedPosilaPoskokPoslanecPosouditPospoluPostavaPosudekPosypPotahPotkanPotleskPotomekPotravaPotupaPotvoraPoukazPoutoPouzdroPovahaPovidlaPovlakPovozPovrchPovstatPovykPovzdechPozdravPozemekPoznatekPozorPozvatPracovatPrahoryPraktikaPralesPraotecPraporekPrasePravdaPrincipPrknoProbuditProcentoProdejProfeseProhraProjektProlomitPromilePronikatPropadProrokProsbaProtonProutekProvazPrskavkaPrstenPrudkostPrutPrvekPrvohoryPsanecPsovodPstruhPtactvoPubertaPuchPudlPukavecPuklinaPukrlePultPumpaPuncPupenPusaPusinkaPustinaPutovatPutykaPyramidaPyskPytelRacekRachotRadiaceRadniceRadonRaftRagbyRaketaRakovinaRamenoRampouchRandeRarachRaritaRasovnaRastrRatolestRazanceRazidloReagovatReakceReceptRedaktorReferentReflexRejnokReklamaRekordRekrutRektorReputaceRevizeRevmaRevolverRezervaRiskovatRizikoRobotikaRodokmenRohovkaRokleRokokoRomanetoRopovodRopuchaRorejsRosolRostlinaRotmistrRotopedRotundaRoubenkaRouchoRoupRouraRovinaRovniceRozborRozchodRozdatRozeznatRozhodceRozinkaRozjezdRozkazRozlohaRozmarRozpadRozruchRozsahRoztokRozumRozvodRubrikaRuchadloRukaviceRukopisRybaRybolovRychlostRydloRypadloRytinaRyzostSadistaSahatSakoSamecSamizdatSamotaSanitkaSardinkaSasankaSatelitSazbaSazeniceSborSchovatSebrankaSeceseSedadloSedimentSedloSehnatSejmoutSekeraSektaSekundaSekvojeSemenoSenoServisSesaditSeshoraSeskokSeslatSestraSesuvSesypatSetbaSetinaSetkatSetnoutSetrvatSeverSeznamShodaShrnoutSifonSilniceSirkaSirotekSirupSituaceSkafandrSkaliskoSkanzenSkautSkeptikSkicaSkladbaSkleniceSkloSkluzSkobaSkokanSkoroSkriptaSkrzSkupinaSkvostSkvrnaSlabikaSladidloSlaninaSlastSlavnostSledovatSlepecSlevaSlezinaSlibSlinaSlizniceSlonSloupekSlovoSluchSluhaSlunceSlupkaSlzaSmaragdSmetanaSmilstvoSmlouvaSmogSmradSmrkSmrtkaSmutekSmyslSnadSnahaSnobSobotaSochaSodovkaSokolSopkaSotvaSoubojSoucitSoudceSouhlasSouladSoumrakSoupravaSousedSoutokSouvisetSpalovnaSpasitelSpisSplavSpodekSpojenecSpoluSponzorSpornostSpoustaSprchaSpustitSrandaSrazSrdceSrnaSrnecSrovnatSrpenSrstSrubStaniceStarostaStatikaStavbaStehnoStezkaStodolaStolekStopaStornoStoupatStrachStresStrhnoutStromStrunaStudnaStupniceStvolStykSubjektSubtropySucharSudostSuknoSundatSunoutSurikataSurovinaSvahSvalstvoSvetrSvatbaSvazekSvisleSvitekSvobodaSvodidloSvorkaSvrabSykavkaSykotSynekSynovecSypatSypkostSyrovostSyselSytostTabletkaTabuleTahounTajemnoTajfunTajgaTajitTajnostTaktikaTamhleTamponTancovatTanecTankerTapetaTaveninaTazatelTechnikaTehdyTekutinaTelefonTemnotaTendenceTenistaTenorTeplotaTepnaTeprveTerapieTermoskaTextilTichoTiskopisTitulekTkadlecTkaninaTlapkaTleskatTlukotTlupaTmelToaletaTopinkaTopolTorzoTouhaToulecTradiceTraktorTrampTrasaTraverzaTrefitTrestTrezorTrhavinaTrhlinaTrochuTrojiceTroskaTroubaTrpceTrpitelTrpkostTrubecTruchlitTruhliceTrusTrvatTudyTuhnoutTuhostTundraTuristaTurnajTuzemskoTvarohTvorbaTvrdostTvrzTygrTykevUbohostUbozeUbratUbrousekUbrusUbytovnaUchoUctivostUdivitUhraditUjednatUjistitUjmoutUkazatelUklidnitUklonitUkotvitUkrojitUliceUlitaUlovitUmyvadloUnavitUniformaUniknoutUpadnoutUplatnitUplynoutUpoutatUpravitUranUrazitUsednoutUsilovatUsmrtitUsnadnitUsnoutUsouditUstlatUstrnoutUtahovatUtkatUtlumitUtonoutUtopenecUtrousitUvalitUvolnitUvozovkaUzdravitUzelUzeninaUzlinaUznatVagonValchaValounVanaVandalVanilkaVaranVarhanyVarovatVcelkuVchodVdovaVedroVegetaceVejceVelbloudVeletrhVelitelVelmocVelrybaVenkovVerandaVerzeVeselkaVeskrzeVesniceVespoduVestaVeterinaVeverkaVibraceVichrVideohraVidinaVidleVilaViniceVisetVitalitaVizeVizitkaVjezdVkladVkusVlajkaVlakVlasecVlevoVlhkostVlivVlnovkaVloupatVnucovatVnukVodaVodivostVodoznakVodstvoVojenskyVojnaVojskoVolantVolbaVolitVolnoVoskovkaVozidloVozovnaVpravoVrabecVracetVrahVrataVrbaVrcholekVrhatVrstvaVrtuleVsaditVstoupitVstupVtipVybavitVybratVychovatVydatVydraVyfotitVyhledatVyhnoutVyhoditVyhraditVyhubitVyjasnitVyjetVyjmoutVyklopitVykonatVylekatVymazatVymezitVymizetVymysletVynechatVynikatVynutitVypadatVyplatitVypravitVypustitVyrazitVyrovnatVyrvatVyslovitVysokoVystavitVysunoutVysypatVytasitVytesatVytratitVyvinoutVyvolatVyvrhelVyzdobitVyznatVzaduVzbuditVzchopitVzdorVzduchVzdychatVzestupVzhledemVzkazVzlykatVznikVzorekVzpouraVztahVztekXylofonZabratZabydletZachovatZadarmoZadusitZafoukatZahltitZahoditZahradaZahynoutZajatecZajetZajistitZaklepatZakoupitZalepitZamezitZamotatZamysletZanechatZanikatZaplatitZapojitZapsatZarazitZastavitZasunoutZatajitZatemnitZatknoutZaujmoutZavalitZaveletZavinitZavolatZavrtatZazvonitZbavitZbrusuZbudovatZbytekZdalekaZdarmaZdatnostZdivoZdobitZdrojZdvihZdymadloZeleninaZemanZeminaZeptatZezaduZezdolaZhatitZhltnoutZhlubokaZhotovitZhrubaZimaZimniceZjemnitZklamatZkoumatZkratkaZkumavkaZlatoZlehkaZlobaZlomZlostZlozvykZmapovatZmarZmatekZmijeZmizetZmocnitZmodratZmrzlinaZmutovatZnakZnalostZnamenatZnovuZobrazitZotavitZoubekZoufaleZploditZpomalitZpravaZprostitZprudkaZprvuZradaZranitZrcadloZrnitostZrnoZrovnaZrychlitZrzavostZtichaZtratitZubovinaZubrZvednoutZvenkuZveselaZvonZvratZvukovodZvyk\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x25f44555f4af25b51a711136e1c7d6e50ce9f8917d39d6b1f076b2bb4d2fac1a\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for en (English) FAILED\");\n      }\n    }\n    var LangCz = (\n      /** @class */\n      function(_super) {\n        __extends(LangCz2, _super);\n        function LangCz2() {\n          return _super.call(this, \"cz\") || this;\n        }\n        LangCz2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangCz2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangCz2;\n      }(wordlist_1.Wordlist)\n    );\n    var langCz = new LangCz();\n    exports2.langCz = langCz;\n    wordlist_1.Wordlist.register(langCz);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-en.js\nvar require_lang_en = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-en.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langEn = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbandonAbilityAbleAboutAboveAbsentAbsorbAbstractAbsurdAbuseAccessAccidentAccountAccuseAchieveAcidAcousticAcquireAcrossActActionActorActressActualAdaptAddAddictAddressAdjustAdmitAdultAdvanceAdviceAerobicAffairAffordAfraidAgainAgeAgentAgreeAheadAimAirAirportAisleAlarmAlbumAlcoholAlertAlienAllAlleyAllowAlmostAloneAlphaAlreadyAlsoAlterAlwaysAmateurAmazingAmongAmountAmusedAnalystAnchorAncientAngerAngleAngryAnimalAnkleAnnounceAnnualAnotherAnswerAntennaAntiqueAnxietyAnyApartApologyAppearAppleApproveAprilArchArcticAreaArenaArgueArmArmedArmorArmyAroundArrangeArrestArriveArrowArtArtefactArtistArtworkAskAspectAssaultAssetAssistAssumeAsthmaAthleteAtomAttackAttendAttitudeAttractAuctionAuditAugustAuntAuthorAutoAutumnAverageAvocadoAvoidAwakeAwareAwayAwesomeAwfulAwkwardAxisBabyBachelorBaconBadgeBagBalanceBalconyBallBambooBananaBannerBarBarelyBargainBarrelBaseBasicBasketBattleBeachBeanBeautyBecauseBecomeBeefBeforeBeginBehaveBehindBelieveBelowBeltBenchBenefitBestBetrayBetterBetweenBeyondBicycleBidBikeBindBiologyBirdBirthBitterBlackBladeBlameBlanketBlastBleakBlessBlindBloodBlossomBlouseBlueBlurBlushBoardBoatBodyBoilBombBoneBonusBookBoostBorderBoringBorrowBossBottomBounceBoxBoyBracketBrainBrandBrassBraveBreadBreezeBrickBridgeBriefBrightBringBriskBroccoliBrokenBronzeBroomBrotherBrownBrushBubbleBuddyBudgetBuffaloBuildBulbBulkBulletBundleBunkerBurdenBurgerBurstBusBusinessBusyButterBuyerBuzzCabbageCabinCableCactusCageCakeCallCalmCameraCampCanCanalCancelCandyCannonCanoeCanvasCanyonCapableCapitalCaptainCarCarbonCardCargoCarpetCarryCartCaseCashCasinoCastleCasualCatCatalogCatchCategoryCattleCaughtCauseCautionCaveCeilingCeleryCementCensusCenturyCerealCertainChairChalkChampionChangeChaosChapterChargeChaseChatCheapCheckCheeseChefCherryChestChickenChiefChildChimneyChoiceChooseChronicChuckleChunkChurnCigarCinnamonCircleCitizenCityCivilClaimClapClarifyClawClayCleanClerkCleverClickClientCliffClimbClinicClipClockClogCloseClothCloudClownClubClumpClusterClutchCoachCoastCoconutCodeCoffeeCoilCoinCollectColorColumnCombineComeComfortComicCommonCompanyConcertConductConfirmCongressConnectConsiderControlConvinceCookCoolCopperCopyCoralCoreCornCorrectCostCottonCouchCountryCoupleCourseCousinCoverCoyoteCrackCradleCraftCramCraneCrashCraterCrawlCrazyCreamCreditCreekCrewCricketCrimeCrispCriticCropCrossCrouchCrowdCrucialCruelCruiseCrumbleCrunchCrushCryCrystalCubeCultureCupCupboardCuriousCurrentCurtainCurveCushionCustomCuteCycleDadDamageDampDanceDangerDaringDashDaughterDawnDayDealDebateDebrisDecadeDecemberDecideDeclineDecorateDecreaseDeerDefenseDefineDefyDegreeDelayDeliverDemandDemiseDenialDentistDenyDepartDependDepositDepthDeputyDeriveDescribeDesertDesignDeskDespairDestroyDetailDetectDevelopDeviceDevoteDiagramDialDiamondDiaryDiceDieselDietDifferDigitalDignityDilemmaDinnerDinosaurDirectDirtDisagreeDiscoverDiseaseDishDismissDisorderDisplayDistanceDivertDivideDivorceDizzyDoctorDocumentDogDollDolphinDomainDonateDonkeyDonorDoorDoseDoubleDoveDraftDragonDramaDrasticDrawDreamDressDriftDrillDrinkDripDriveDropDrumDryDuckDumbDuneDuringDustDutchDutyDwarfDynamicEagerEagleEarlyEarnEarthEasilyEastEasyEchoEcologyEconomyEdgeEditEducateEffortEggEightEitherElbowElderElectricElegantElementElephantElevatorEliteElseEmbarkEmbodyEmbraceEmergeEmotionEmployEmpowerEmptyEnableEnactEndEndlessEndorseEnemyEnergyEnforceEngageEngineEnhanceEnjoyEnlistEnoughEnrichEnrollEnsureEnterEntireEntryEnvelopeEpisodeEqualEquipEraEraseErodeErosionErrorEruptEscapeEssayEssenceEstateEternalEthicsEvidenceEvilEvokeEvolveExactExampleExcessExchangeExciteExcludeExcuseExecuteExerciseExhaustExhibitExileExistExitExoticExpandExpectExpireExplainExposeExpressExtendExtraEyeEyebrowFabricFaceFacultyFadeFaintFaithFallFalseFameFamilyFamousFanFancyFantasyFarmFashionFatFatalFatherFatigueFaultFavoriteFeatureFebruaryFederalFeeFeedFeelFemaleFenceFestivalFetchFeverFewFiberFictionFieldFigureFileFilmFilterFinalFindFineFingerFinishFireFirmFirstFiscalFishFitFitnessFixFlagFlameFlashFlatFlavorFleeFlightFlipFloatFlockFloorFlowerFluidFlushFlyFoamFocusFogFoilFoldFollowFoodFootForceForestForgetForkFortuneForumForwardFossilFosterFoundFoxFragileFrameFrequentFreshFriendFringeFrogFrontFrostFrownFrozenFruitFuelFunFunnyFurnaceFuryFutureGadgetGainGalaxyGalleryGameGapGarageGarbageGardenGarlicGarmentGasGaspGateGatherGaugeGazeGeneralGeniusGenreGentleGenuineGestureGhostGiantGiftGiggleGingerGiraffeGirlGiveGladGlanceGlareGlassGlideGlimpseGlobeGloomGloryGloveGlowGlueGoatGoddessGoldGoodGooseGorillaGospelGossipGovernGownGrabGraceGrainGrantGrapeGrassGravityGreatGreenGridGriefGritGroceryGroupGrowGruntGuardGuessGuideGuiltGuitarGunGymHabitHairHalfHammerHamsterHandHappyHarborHardHarshHarvestHatHaveHawkHazardHeadHealthHeartHeavyHedgehogHeightHelloHelmetHelpHenHeroHiddenHighHillHintHipHireHistoryHobbyHockeyHoldHoleHolidayHollowHomeHoneyHoodHopeHornHorrorHorseHospitalHostHotelHourHoverHubHugeHumanHumbleHumorHundredHungryHuntHurdleHurryHurtHusbandHybridIceIconIdeaIdentifyIdleIgnoreIllIllegalIllnessImageImitateImmenseImmuneImpactImposeImproveImpulseInchIncludeIncomeIncreaseIndexIndicateIndoorIndustryInfantInflictInformInhaleInheritInitialInjectInjuryInmateInnerInnocentInputInquiryInsaneInsectInsideInspireInstallIntactInterestIntoInvestInviteInvolveIronIslandIsolateIssueItemIvoryJacketJaguarJarJazzJealousJeansJellyJewelJobJoinJokeJourneyJoyJudgeJuiceJumpJungleJuniorJunkJustKangarooKeenKeepKetchupKeyKickKidKidneyKindKingdomKissKitKitchenKiteKittenKiwiKneeKnifeKnockKnowLabLabelLaborLadderLadyLakeLampLanguageLaptopLargeLaterLatinLaughLaundryLavaLawLawnLawsuitLayerLazyLeaderLeafLearnLeaveLectureLeftLegLegalLegendLeisureLemonLendLengthLensLeopardLessonLetterLevelLiarLibertyLibraryLicenseLifeLiftLightLikeLimbLimitLinkLionLiquidListLittleLiveLizardLoadLoanLobsterLocalLockLogicLonelyLongLoopLotteryLoudLoungeLoveLoyalLuckyLuggageLumberLunarLunchLuxuryLyricsMachineMadMagicMagnetMaidMailMainMajorMakeMammalManManageMandateMangoMansionManualMapleMarbleMarchMarginMarineMarketMarriageMaskMassMasterMatchMaterialMathMatrixMatterMaximumMazeMeadowMeanMeasureMeatMechanicMedalMediaMelodyMeltMemberMemoryMentionMenuMercyMergeMeritMerryMeshMessageMetalMethodMiddleMidnightMilkMillionMimicMindMinimumMinorMinuteMiracleMirrorMiseryMissMistakeMixMixedMixtureMobileModelModifyMomMomentMonitorMonkeyMonsterMonthMoonMoralMoreMorningMosquitoMotherMotionMotorMountainMouseMoveMovieMuchMuffinMuleMultiplyMuscleMuseumMushroomMusicMustMutualMyselfMysteryMythNaiveNameNapkinNarrowNastyNationNatureNearNeckNeedNegativeNeglectNeitherNephewNerveNestNetNetworkNeutralNeverNewsNextNiceNightNobleNoiseNomineeNoodleNormalNorthNoseNotableNoteNothingNoticeNovelNowNuclearNumberNurseNutOakObeyObjectObligeObscureObserveObtainObviousOccurOceanOctoberOdorOffOfferOfficeOftenOilOkayOldOliveOlympicOmitOnceOneOnionOnlineOnlyOpenOperaOpinionOpposeOptionOrangeOrbitOrchardOrderOrdinaryOrganOrientOriginalOrphanOstrichOtherOutdoorOuterOutputOutsideOvalOvenOverOwnOwnerOxygenOysterOzonePactPaddlePagePairPalacePalmPandaPanelPanicPantherPaperParadeParentParkParrotPartyPassPatchPathPatientPatrolPatternPausePavePaymentPeacePeanutPearPeasantPelicanPenPenaltyPencilPeoplePepperPerfectPermitPersonPetPhonePhotoPhrasePhysicalPianoPicnicPicturePiecePigPigeonPillPilotPinkPioneerPipePistolPitchPizzaPlacePlanetPlasticPlatePlayPleasePledgePluckPlugPlungePoemPoetPointPolarPolePolicePondPonyPoolPopularPortionPositionPossiblePostPotatoPotteryPovertyPowderPowerPracticePraisePredictPreferPreparePresentPrettyPreventPricePridePrimaryPrintPriorityPrisonPrivatePrizeProblemProcessProduceProfitProgramProjectPromoteProofPropertyProsperProtectProudProvidePublicPuddingPullPulpPulsePumpkinPunchPupilPuppyPurchasePurityPurposePursePushPutPuzzlePyramidQualityQuantumQuarterQuestionQuickQuitQuizQuoteRabbitRaccoonRaceRackRadarRadioRailRainRaiseRallyRampRanchRandomRangeRapidRareRateRatherRavenRawRazorReadyRealReasonRebelRebuildRecallReceiveRecipeRecordRecycleReduceReflectReformRefuseRegionRegretRegularRejectRelaxReleaseReliefRelyRemainRememberRemindRemoveRenderRenewRentReopenRepairRepeatReplaceReportRequireRescueResembleResistResourceResponseResultRetireRetreatReturnReunionRevealReviewRewardRhythmRibRibbonRiceRichRideRidgeRifleRightRigidRingRiotRippleRiskRitualRivalRiverRoadRoastRobotRobustRocketRomanceRoofRookieRoomRoseRotateRoughRoundRouteRoyalRubberRudeRugRuleRunRunwayRuralSadSaddleSadnessSafeSailSaladSalmonSalonSaltSaluteSameSampleSandSatisfySatoshiSauceSausageSaveSayScaleScanScareScatterSceneSchemeSchoolScienceScissorsScorpionScoutScrapScreenScriptScrubSeaSearchSeasonSeatSecondSecretSectionSecuritySeedSeekSegmentSelectSellSeminarSeniorSenseSentenceSeriesServiceSessionSettleSetupSevenShadowShaftShallowShareShedShellSheriffShieldShiftShineShipShiverShockShoeShootShopShortShoulderShoveShrimpShrugShuffleShySiblingSickSideSiegeSightSignSilentSilkSillySilverSimilarSimpleSinceSingSirenSisterSituateSixSizeSkateSketchSkiSkillSkinSkirtSkullSlabSlamSleepSlenderSliceSlideSlightSlimSloganSlotSlowSlushSmallSmartSmileSmokeSmoothSnackSnakeSnapSniffSnowSoapSoccerSocialSockSodaSoftSolarSoldierSolidSolutionSolveSomeoneSongSoonSorrySortSoulSoundSoupSourceSouthSpaceSpareSpatialSpawnSpeakSpecialSpeedSpellSpendSphereSpiceSpiderSpikeSpinSpiritSplitSpoilSponsorSpoonSportSpotSpraySpreadSpringSpySquareSqueezeSquirrelStableStadiumStaffStageStairsStampStandStartStateStaySteakSteelStemStepStereoStickStillStingStockStomachStoneStoolStoryStoveStrategyStreetStrikeStrongStruggleStudentStuffStumbleStyleSubjectSubmitSubwaySuccessSuchSuddenSufferSugarSuggestSuitSummerSunSunnySunsetSuperSupplySupremeSureSurfaceSurgeSurpriseSurroundSurveySuspectSustainSwallowSwampSwapSwarmSwearSweetSwiftSwimSwingSwitchSwordSymbolSymptomSyrupSystemTableTackleTagTailTalentTalkTankTapeTargetTaskTasteTattooTaxiTeachTeamTellTenTenantTennisTentTermTestTextThankThatThemeThenTheoryThereTheyThingThisThoughtThreeThriveThrowThumbThunderTicketTideTigerTiltTimberTimeTinyTipTiredTissueTitleToastTobaccoTodayToddlerToeTogetherToiletTokenTomatoTomorrowToneTongueTonightToolToothTopTopicToppleTorchTornadoTortoiseTossTotalTouristTowardTowerTownToyTrackTradeTrafficTragicTrainTransferTrapTrashTravelTrayTreatTreeTrendTrialTribeTrickTriggerTrimTripTrophyTroubleTruckTrueTrulyTrumpetTrustTruthTryTubeTuitionTumbleTunaTunnelTurkeyTurnTurtleTwelveTwentyTwiceTwinTwistTwoTypeTypicalUglyUmbrellaUnableUnawareUncleUncoverUnderUndoUnfairUnfoldUnhappyUniformUniqueUnitUniverseUnknownUnlockUntilUnusualUnveilUpdateUpgradeUpholdUponUpperUpsetUrbanUrgeUsageUseUsedUsefulUselessUsualUtilityVacantVacuumVagueValidValleyValveVanVanishVaporVariousVastVaultVehicleVelvetVendorVentureVenueVerbVerifyVersionVeryVesselVeteranViableVibrantViciousVictoryVideoViewVillageVintageViolinVirtualVirusVisaVisitVisualVitalVividVocalVoiceVoidVolcanoVolumeVoteVoyageWageWagonWaitWalkWallWalnutWantWarfareWarmWarriorWashWaspWasteWaterWaveWayWealthWeaponWearWeaselWeatherWebWeddingWeekendWeirdWelcomeWestWetWhaleWhatWheatWheelWhenWhereWhipWhisperWideWidthWifeWildWillWinWindowWineWingWinkWinnerWinterWireWisdomWiseWishWitnessWolfWomanWonderWoodWoolWordWorkWorldWorryWorthWrapWreckWrestleWristWriteWrongYardYearYellowYouYoungYouthZebraZeroZoneZoo\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x3c8acc1e7b08d8e76f9fda015ef48dc8c710a73cb7e0f77b2c18a9b5a7adde60\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for en (English) FAILED\");\n      }\n    }\n    var LangEn = (\n      /** @class */\n      function(_super) {\n        __extends(LangEn2, _super);\n        function LangEn2() {\n          return _super.call(this, \"en\") || this;\n        }\n        LangEn2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangEn2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangEn2;\n      }(wordlist_1.Wordlist)\n    );\n    var langEn = new LangEn();\n    exports2.langEn = langEn;\n    wordlist_1.Wordlist.register(langEn);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-es.js\nvar require_lang_es = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-es.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langEs = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var words = \"A/bacoAbdomenAbejaAbiertoAbogadoAbonoAbortoAbrazoAbrirAbueloAbusoAcabarAcademiaAccesoAccio/nAceiteAcelgaAcentoAceptarA/cidoAclararAcne/AcogerAcosoActivoActoActrizActuarAcudirAcuerdoAcusarAdictoAdmitirAdoptarAdornoAduanaAdultoAe/reoAfectarAficio/nAfinarAfirmarA/gilAgitarAgoni/aAgostoAgotarAgregarAgrioAguaAgudoA/guilaAgujaAhogoAhorroAireAislarAjedrezAjenoAjusteAlacra/nAlambreAlarmaAlbaA/lbumAlcaldeAldeaAlegreAlejarAlertaAletaAlfilerAlgaAlgodo/nAliadoAlientoAlivioAlmaAlmejaAlmi/barAltarAltezaAltivoAltoAlturaAlumnoAlzarAmableAmanteAmapolaAmargoAmasarA/mbarA/mbitoAmenoAmigoAmistadAmorAmparoAmplioAnchoAncianoAnclaAndarAnde/nAnemiaA/nguloAnilloA/nimoAni/sAnotarAntenaAntiguoAntojoAnualAnularAnuncioA~adirA~ejoA~oApagarAparatoApetitoApioAplicarApodoAporteApoyoAprenderAprobarApuestaApuroAradoAra~aArarA/rbitroA/rbolArbustoArchivoArcoArderArdillaArduoA/reaA/ridoAriesArmoni/aArne/sAromaArpaArpo/nArregloArrozArrugaArteArtistaAsaAsadoAsaltoAscensoAsegurarAseoAsesorAsientoAsiloAsistirAsnoAsombroA/speroAstillaAstroAstutoAsumirAsuntoAtajoAtaqueAtarAtentoAteoA/ticoAtletaA/tomoAtraerAtrozAtu/nAudazAudioAugeAulaAumentoAusenteAutorAvalAvanceAvaroAveAvellanaAvenaAvestruzAvio/nAvisoAyerAyudaAyunoAzafra/nAzarAzoteAzu/carAzufreAzulBabaBaborBacheBahi/aBaileBajarBalanzaBalco/nBaldeBambu/BancoBandaBa~oBarbaBarcoBarnizBarroBa/sculaBasto/nBasuraBatallaBateri/aBatirBatutaBau/lBazarBebe/BebidaBelloBesarBesoBestiaBichoBienBingoBlancoBloqueBlusaBoaBobinaBoboBocaBocinaBodaBodegaBoinaBolaBoleroBolsaBombaBondadBonitoBonoBonsa/iBordeBorrarBosqueBoteBoti/nBo/vedaBozalBravoBrazoBrechaBreveBrilloBrincoBrisaBrocaBromaBronceBroteBrujaBruscoBrutoBuceoBucleBuenoBueyBufandaBufo/nBu/hoBuitreBultoBurbujaBurlaBurroBuscarButacaBuzo/nCaballoCabezaCabinaCabraCacaoCada/verCadenaCaerCafe/Cai/daCaima/nCajaCajo/nCalCalamarCalcioCaldoCalidadCalleCalmaCalorCalvoCamaCambioCamelloCaminoCampoCa/ncerCandilCanelaCanguroCanicaCantoCa~aCa~o/nCaobaCaosCapazCapita/nCapoteCaptarCapuchaCaraCarbo/nCa/rcelCaretaCargaCari~oCarneCarpetaCarroCartaCasaCascoCaseroCaspaCastorCatorceCatreCaudalCausaCazoCebollaCederCedroCeldaCe/lebreCelosoCe/lulaCementoCenizaCentroCercaCerdoCerezaCeroCerrarCertezaCe/spedCetroChacalChalecoChampu/ChanclaChapaCharlaChicoChisteChivoChoqueChozaChuletaChuparCiclo/nCiegoCieloCienCiertoCifraCigarroCimaCincoCineCintaCipre/sCircoCiruelaCisneCitaCiudadClamorClanClaroClaseClaveClienteClimaCli/nicaCobreCoccio/nCochinoCocinaCocoCo/digoCodoCofreCogerCoheteCoji/nCojoColaColchaColegioColgarColinaCollarColmoColumnaCombateComerComidaCo/modoCompraCondeConejoCongaConocerConsejoContarCopaCopiaCorazo/nCorbataCorchoCordo/nCoronaCorrerCoserCosmosCostaCra/neoCra/terCrearCrecerCrei/doCremaCri/aCrimenCriptaCrisisCromoCro/nicaCroquetaCrudoCruzCuadroCuartoCuatroCuboCubrirCucharaCuelloCuentoCuerdaCuestaCuevaCuidarCulebraCulpaCultoCumbreCumplirCunaCunetaCuotaCupo/nCu/pulaCurarCuriosoCursoCurvaCutisDamaDanzaDarDardoDa/tilDeberDe/bilDe/cadaDecirDedoDefensaDefinirDejarDelfi/nDelgadoDelitoDemoraDensoDentalDeporteDerechoDerrotaDesayunoDeseoDesfileDesnudoDestinoDesvi/oDetalleDetenerDeudaDi/aDiabloDiademaDiamanteDianaDiarioDibujoDictarDienteDietaDiezDifi/cilDignoDilemaDiluirDineroDirectoDirigirDiscoDise~oDisfrazDivaDivinoDobleDoceDolorDomingoDonDonarDoradoDormirDorsoDosDosisDrago/nDrogaDuchaDudaDueloDue~oDulceDu/oDuqueDurarDurezaDuroE/banoEbrioEcharEcoEcuadorEdadEdicio/nEdificioEditorEducarEfectoEficazEjeEjemploElefanteElegirElementoElevarElipseE/liteElixirElogioEludirEmbudoEmitirEmocio/nEmpateEmpe~oEmpleoEmpresaEnanoEncargoEnchufeEnci/aEnemigoEneroEnfadoEnfermoEnga~oEnigmaEnlaceEnormeEnredoEnsayoEnse~arEnteroEntrarEnvaseEnvi/oE/pocaEquipoErizoEscalaEscenaEscolarEscribirEscudoEsenciaEsferaEsfuerzoEspadaEspejoEspi/aEsposaEspumaEsqui/EstarEsteEstiloEstufaEtapaEternoE/ticaEtniaEvadirEvaluarEventoEvitarExactoExamenExcesoExcusaExentoExigirExilioExistirE/xitoExpertoExplicarExponerExtremoFa/bricaFa/bulaFachadaFa/cilFactorFaenaFajaFaldaFalloFalsoFaltarFamaFamiliaFamosoFarao/nFarmaciaFarolFarsaFaseFatigaFaunaFavorFaxFebreroFechaFelizFeoFeriaFerozFe/rtilFervorFesti/nFiableFianzaFiarFibraFiccio/nFichaFideoFiebreFielFieraFiestaFiguraFijarFijoFilaFileteFilialFiltroFinFincaFingirFinitoFirmaFlacoFlautaFlechaFlorFlotaFluirFlujoFlu/orFobiaFocaFogataFogo/nFolioFolletoFondoFormaForroFortunaForzarFosaFotoFracasoFra/gilFranjaFraseFraudeFrei/rFrenoFresaFri/oFritoFrutaFuegoFuenteFuerzaFugaFumarFuncio/nFundaFurgo/nFuriaFusilFu/tbolFuturoGacelaGafasGaitaGajoGalaGaleri/aGalloGambaGanarGanchoGangaGansoGarajeGarzaGasolinaGastarGatoGavila/nGemeloGemirGenGe/neroGenioGenteGeranioGerenteGermenGestoGiganteGimnasioGirarGiroGlaciarGloboGloriaGolGolfoGolosoGolpeGomaGordoGorilaGorraGotaGoteoGozarGradaGra/ficoGranoGrasaGratisGraveGrietaGrilloGripeGrisGritoGrosorGru/aGruesoGrumoGrupoGuanteGuapoGuardiaGuerraGui/aGui~oGuionGuisoGuitarraGusanoGustarHaberHa/bilHablarHacerHachaHadaHallarHamacaHarinaHazHaza~aHebillaHebraHechoHeladoHelioHembraHerirHermanoHe/roeHervirHieloHierroHi/gadoHigieneHijoHimnoHistoriaHocicoHogarHogueraHojaHombreHongoHonorHonraHoraHormigaHornoHostilHoyoHuecoHuelgaHuertaHuesoHuevoHuidaHuirHumanoHu/medoHumildeHumoHundirHuraca/nHurtoIconoIdealIdiomaI/doloIglesiaIglu/IgualIlegalIlusio/nImagenIma/nImitarImparImperioImponerImpulsoIncapazI/ndiceInerteInfielInformeIngenioInicioInmensoInmuneInnatoInsectoInstanteIntere/sI/ntimoIntuirInu/tilInviernoIraIrisIroni/aIslaIsloteJabali/Jabo/nJamo/nJarabeJardi/nJarraJaulaJazmi/nJefeJeringaJineteJornadaJorobaJovenJoyaJuergaJuevesJuezJugadorJugoJugueteJuicioJuncoJunglaJunioJuntarJu/piterJurarJustoJuvenilJuzgarKiloKoalaLabioLacioLacraLadoLadro/nLagartoLa/grimaLagunaLaicoLamerLa/minaLa/mparaLanaLanchaLangostaLanzaLa/pizLargoLarvaLa/stimaLataLa/texLatirLaurelLavarLazoLealLeccio/nLecheLectorLeerLegio/nLegumbreLejanoLenguaLentoLe~aLeo/nLeopardoLesio/nLetalLetraLeveLeyendaLibertadLibroLicorLi/derLidiarLienzoLigaLigeroLimaLi/miteLimo/nLimpioLinceLindoLi/neaLingoteLinoLinternaLi/quidoLisoListaLiteraLitioLitroLlagaLlamaLlantoLlaveLlegarLlenarLlevarLlorarLloverLluviaLoboLocio/nLocoLocuraLo/gicaLogroLombrizLomoLonjaLoteLuchaLucirLugarLujoLunaLunesLupaLustroLutoLuzMacetaMachoMaderaMadreMaduroMaestroMafiaMagiaMagoMai/zMaldadMaletaMallaMaloMama/MamboMamutMancoMandoManejarMangaManiqui/ManjarManoMansoMantaMa~anaMapaMa/quinaMarMarcoMareaMarfilMargenMaridoMa/rmolMarro/nMartesMarzoMasaMa/scaraMasivoMatarMateriaMatizMatrizMa/ximoMayorMazorcaMechaMedallaMedioMe/dulaMejillaMejorMelenaMelo/nMemoriaMenorMensajeMenteMenu/MercadoMerengueMe/ritoMesMeso/nMetaMeterMe/todoMetroMezclaMiedoMielMiembroMigaMilMilagroMilitarMillo/nMimoMinaMineroMi/nimoMinutoMiopeMirarMisaMiseriaMisilMismoMitadMitoMochilaMocio/nModaModeloMohoMojarMoldeMolerMolinoMomentoMomiaMonarcaMonedaMonjaMontoMo~oMoradaMorderMorenoMorirMorroMorsaMortalMoscaMostrarMotivoMoverMo/vilMozoMuchoMudarMuebleMuelaMuerteMuestraMugreMujerMulaMuletaMultaMundoMu~ecaMuralMuroMu/sculoMuseoMusgoMu/sicaMusloNa/carNacio/nNadarNaipeNaranjaNarizNarrarNasalNatalNativoNaturalNa/useaNavalNaveNavidadNecioNe/ctarNegarNegocioNegroNeo/nNervioNetoNeutroNevarNeveraNichoNidoNieblaNietoNi~ezNi~oNi/tidoNivelNoblezaNocheNo/minaNoriaNormaNorteNotaNoticiaNovatoNovelaNovioNubeNucaNu/cleoNudilloNudoNueraNueveNuezNuloNu/meroNutriaOasisObesoObispoObjetoObraObreroObservarObtenerObvioOcaOcasoOce/anoOchentaOchoOcioOcreOctavoOctubreOcultoOcuparOcurrirOdiarOdioOdiseaOesteOfensaOfertaOficioOfrecerOgroOi/doOi/rOjoOlaOleadaOlfatoOlivoOllaOlmoOlorOlvidoOmbligoOndaOnzaOpacoOpcio/nO/peraOpinarOponerOptarO/pticaOpuestoOracio/nOradorOralO/rbitaOrcaOrdenOrejaO/rganoOrgi/aOrgulloOrienteOrigenOrillaOroOrquestaOrugaOsadi/aOscuroOseznoOsoOstraOto~oOtroOvejaO/vuloO/xidoOxi/genoOyenteOzonoPactoPadrePaellaPa/ginaPagoPai/sPa/jaroPalabraPalcoPaletaPa/lidoPalmaPalomaPalparPanPanalPa/nicoPanteraPa~ueloPapa/PapelPapillaPaquetePararParcelaParedParirParoPa/rpadoParquePa/rrafoPartePasarPaseoPasio/nPasoPastaPataPatioPatriaPausaPautaPavoPayasoPeato/nPecadoPeceraPechoPedalPedirPegarPeinePelarPelda~oPeleaPeligroPellejoPeloPelucaPenaPensarPe~o/nPeo/nPeorPepinoPeque~oPeraPerchaPerderPerezaPerfilPericoPerlaPermisoPerroPersonaPesaPescaPe/simoPesta~aPe/taloPetro/leoPezPezu~aPicarPicho/nPiePiedraPiernaPiezaPijamaPilarPilotoPimientaPinoPintorPinzaPi~aPiojoPipaPirataPisarPiscinaPisoPistaPito/nPizcaPlacaPlanPlataPlayaPlazaPleitoPlenoPlomoPlumaPluralPobrePocoPoderPodioPoemaPoesi/aPoetaPolenPolici/aPolloPolvoPomadaPomeloPomoPompaPonerPorcio/nPortalPosadaPoseerPosiblePostePotenciaPotroPozoPradoPrecozPreguntaPremioPrensaPresoPrevioPrimoPri/ncipePrisio/nPrivarProaProbarProcesoProductoProezaProfesorProgramaProlePromesaProntoPropioPro/ximoPruebaPu/blicoPucheroPudorPuebloPuertaPuestoPulgaPulirPulmo/nPulpoPulsoPumaPuntoPu~alPu~oPupaPupilaPure/QuedarQuejaQuemarQuererQuesoQuietoQui/micaQuinceQuitarRa/banoRabiaRaboRacio/nRadicalRai/zRamaRampaRanchoRangoRapazRa/pidoRaptoRasgoRaspaRatoRayoRazaRazo/nReaccio/nRealidadReba~oReboteRecaerRecetaRechazoRecogerRecreoRectoRecursoRedRedondoReducirReflejoReformaRefra/nRefugioRegaloRegirReglaRegresoRehe/nReinoRei/rRejaRelatoRelevoRelieveRellenoRelojRemarRemedioRemoRencorRendirRentaRepartoRepetirReposoReptilResRescateResinaRespetoRestoResumenRetiroRetornoRetratoReunirReve/sRevistaReyRezarRicoRiegoRiendaRiesgoRifaRi/gidoRigorRinco/nRi~o/nRi/oRiquezaRisaRitmoRitoRizoRobleRoceRociarRodarRodeoRodillaRoerRojizoRojoRomeroRomperRonRoncoRondaRopaRoperoRosaRoscaRostroRotarRubi/RuborRudoRuedaRugirRuidoRuinaRuletaRuloRumboRumorRupturaRutaRutinaSa/badoSaberSabioSableSacarSagazSagradoSalaSaldoSaleroSalirSalmo/nSalo/nSalsaSaltoSaludSalvarSambaSancio/nSandi/aSanearSangreSanidadSanoSantoSapoSaqueSardinaSarte/nSastreSata/nSaunaSaxofo/nSeccio/nSecoSecretoSectaSedSeguirSeisSelloSelvaSemanaSemillaSendaSensorSe~alSe~orSepararSepiaSequi/aSerSerieSermo/nServirSesentaSesio/nSetaSetentaSeveroSexoSextoSidraSiestaSieteSigloSignoSi/labaSilbarSilencioSillaSi/mboloSimioSirenaSistemaSitioSituarSobreSocioSodioSolSolapaSoldadoSoledadSo/lidoSoltarSolucio/nSombraSondeoSonidoSonoroSonrisaSopaSoplarSoporteSordoSorpresaSorteoSoste/nSo/tanoSuaveSubirSucesoSudorSuegraSueloSue~oSuerteSufrirSujetoSulta/nSumarSuperarSuplirSuponerSupremoSurSurcoSure~oSurgirSustoSutilTabacoTabiqueTablaTabu/TacoTactoTajoTalarTalcoTalentoTallaTalo/nTama~oTamborTangoTanqueTapaTapeteTapiaTapo/nTaquillaTardeTareaTarifaTarjetaTarotTarroTartaTatuajeTauroTazaTazo/nTeatroTechoTeclaTe/cnicaTejadoTejerTejidoTelaTele/fonoTemaTemorTemploTenazTenderTenerTenisTensoTeori/aTerapiaTercoTe/rminoTernuraTerrorTesisTesoroTestigoTeteraTextoTezTibioTiburo/nTiempoTiendaTierraTiesoTigreTijeraTildeTimbreTi/midoTimoTintaTi/oTi/picoTipoTiraTiro/nTita/nTi/tereTi/tuloTizaToallaTobilloTocarTocinoTodoTogaToldoTomarTonoTontoToparTopeToqueTo/raxToreroTormentaTorneoToroTorpedoTorreTorsoTortugaTosToscoToserTo/xicoTrabajoTractorTraerTra/ficoTragoTrajeTramoTranceTratoTraumaTrazarTre/bolTreguaTreintaTrenTreparTresTribuTrigoTripaTristeTriunfoTrofeoTrompaTroncoTropaTroteTrozoTrucoTruenoTrufaTuberi/aTuboTuertoTumbaTumorTu/nelTu/nicaTurbinaTurismoTurnoTutorUbicarU/lceraUmbralUnidadUnirUniversoUnoUntarU~aUrbanoUrbeUrgenteUrnaUsarUsuarioU/tilUtopi/aUvaVacaVaci/oVacunaVagarVagoVainaVajillaValeVa/lidoValleValorVa/lvulaVampiroVaraVariarVaro/nVasoVecinoVectorVehi/culoVeinteVejezVelaVeleroVelozVenaVencerVendaVenenoVengarVenirVentaVenusVerVeranoVerboVerdeVeredaVerjaVersoVerterVi/aViajeVibrarVicioVi/ctimaVidaVi/deoVidrioViejoViernesVigorVilVillaVinagreVinoVi~edoVioli/nViralVirgoVirtudVisorVi/speraVistaVitaminaViudoVivazViveroVivirVivoVolca/nVolumenVolverVorazVotarVotoVozVueloVulgarYacerYateYeguaYemaYernoYesoYodoYogaYogurZafiroZanjaZapatoZarzaZonaZorroZumoZurdo\";\n    var lookup = {};\n    var wordlist = null;\n    function dropDiacritic(word) {\n      wordlist_1.logger.checkNormalize();\n      return (0, strings_1.toUtf8String)(Array.prototype.filter.call((0, strings_1.toUtf8Bytes)(word.normalize(\"NFD\").toLowerCase()), function(c) {\n        return c >= 65 && c <= 90 || c >= 97 && c <= 123;\n      }));\n    }\n    function expand(word) {\n      var output = [];\n      Array.prototype.forEach.call((0, strings_1.toUtf8Bytes)(word), function(c) {\n        if (c === 47) {\n          output.push(204);\n          output.push(129);\n        } else if (c === 126) {\n          output.push(110);\n          output.push(204);\n          output.push(131);\n        } else {\n          output.push(c);\n        }\n      });\n      return (0, strings_1.toUtf8String)(output);\n    }\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \").map(function(w) {\n        return expand(w);\n      });\n      wordlist.forEach(function(word, index) {\n        lookup[dropDiacritic(word)] = index;\n      });\n      if (wordlist_1.Wordlist.check(lang) !== \"0xf74fb7092aeacdfbf8959557de22098da512207fb9f109cb526994938cf40300\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for es (Spanish) FAILED\");\n      }\n    }\n    var LangEs = (\n      /** @class */\n      function(_super) {\n        __extends(LangEs2, _super);\n        function LangEs2() {\n          return _super.call(this, \"es\") || this;\n        }\n        LangEs2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangEs2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return lookup[dropDiacritic(word)];\n        };\n        return LangEs2;\n      }(wordlist_1.Wordlist)\n    );\n    var langEs = new LangEs();\n    exports2.langEs = langEs;\n    wordlist_1.Wordlist.register(langEs);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-fr.js\nvar require_lang_fr = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-fr.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langFr = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var words = \"AbaisserAbandonAbdiquerAbeilleAbolirAborderAboutirAboyerAbrasifAbreuverAbriterAbrogerAbruptAbsenceAbsoluAbsurdeAbusifAbyssalAcade/mieAcajouAcarienAccablerAccepterAcclamerAccoladeAccrocheAccuserAcerbeAchatAcheterAcidulerAcierAcompteAcque/rirAcronymeActeurActifActuelAdepteAde/quatAdhe/sifAdjectifAdjugerAdmettreAdmirerAdopterAdorerAdoucirAdresseAdroitAdulteAdverbeAe/rerAe/ronefAffaireAffecterAfficheAffreuxAffublerAgacerAgencerAgileAgiterAgraferAgre/ableAgrumeAiderAiguilleAilierAimableAisanceAjouterAjusterAlarmerAlchimieAlerteAlge-breAlgueAlie/nerAlimentAlle/gerAlliageAllouerAllumerAlourdirAlpagaAltesseAlve/oleAmateurAmbiguAmbreAme/nagerAmertumeAmidonAmiralAmorcerAmourAmovibleAmphibieAmpleurAmusantAnalyseAnaphoreAnarchieAnatomieAncienAne/antirAngleAngoisseAnguleuxAnimalAnnexerAnnonceAnnuelAnodinAnomalieAnonymeAnormalAntenneAntidoteAnxieuxApaiserApe/ritifAplanirApologieAppareilAppelerApporterAppuyerAquariumAqueducArbitreArbusteArdeurArdoiseArgentArlequinArmatureArmementArmoireArmureArpenterArracherArriverArroserArsenicArte/rielArticleAspectAsphalteAspirerAssautAsservirAssietteAssocierAssurerAsticotAstreAstuceAtelierAtomeAtriumAtroceAttaqueAttentifAttirerAttraperAubaineAubergeAudaceAudibleAugurerAuroreAutomneAutrucheAvalerAvancerAvariceAvenirAverseAveugleAviateurAvideAvionAviserAvoineAvouerAvrilAxialAxiomeBadgeBafouerBagageBaguetteBaignadeBalancerBalconBaleineBalisageBambinBancaireBandageBanlieueBannie-reBanquierBarbierBarilBaronBarqueBarrageBassinBastionBatailleBateauBatterieBaudrierBavarderBeletteBe/lierBeloteBe/ne/ficeBerceauBergerBerlineBermudaBesaceBesogneBe/tailBeurreBiberonBicycleBiduleBijouBilanBilingueBillardBinaireBiologieBiopsieBiotypeBiscuitBisonBistouriBitumeBizarreBlafardBlagueBlanchirBlessantBlinderBlondBloquerBlousonBobardBobineBoireBoiserBolideBonbonBondirBonheurBonifierBonusBordureBorneBotteBoucleBoueuxBougieBoulonBouquinBourseBoussoleBoutiqueBoxeurBrancheBrasierBraveBrebisBre-cheBreuvageBricolerBrigadeBrillantBriocheBriqueBrochureBroderBronzerBrousseBroyeurBrumeBrusqueBrutalBruyantBuffleBuissonBulletinBureauBurinBustierButinerButoirBuvableBuvetteCabanonCabineCachetteCadeauCadreCafe/ineCaillouCaissonCalculerCalepinCalibreCalmerCalomnieCalvaireCamaradeCame/raCamionCampagneCanalCanetonCanonCantineCanularCapableCaporalCapriceCapsuleCapterCapucheCarabineCarboneCaresserCaribouCarnageCarotteCarreauCartonCascadeCasierCasqueCassureCauserCautionCavalierCaverneCaviarCe/dilleCeintureCe/lesteCelluleCendrierCensurerCentralCercleCe/re/bralCeriseCernerCerveauCesserChagrinChaiseChaleurChambreChanceChapitreCharbonChasseurChatonChaussonChavirerChemiseChenilleChe/quierChercherChevalChienChiffreChignonChime-reChiotChlorureChocolatChoisirChoseChouetteChromeChuteCigareCigogneCimenterCine/maCintrerCirculerCirerCirqueCiterneCitoyenCitronCivilClaironClameurClaquerClasseClavierClientClignerClimatClivageClocheClonageCloporteCobaltCobraCocasseCocotierCoderCodifierCoffreCognerCohe/sionCoifferCoincerCole-reColibriCollineColmaterColonelCombatCome/dieCommandeCompactConcertConduireConfierCongelerConnoterConsonneContactConvexeCopainCopieCorailCorbeauCordageCornicheCorpusCorrectCorte-geCosmiqueCostumeCotonCoudeCoupureCourageCouteauCouvrirCoyoteCrabeCrainteCravateCrayonCre/atureCre/diterCre/meuxCreuserCrevetteCriblerCrierCristalCrite-reCroireCroquerCrotaleCrucialCruelCrypterCubiqueCueillirCuille-reCuisineCuivreCulminerCultiverCumulerCupideCuratifCurseurCyanureCycleCylindreCyniqueDaignerDamierDangerDanseurDauphinDe/battreDe/biterDe/borderDe/briderDe/butantDe/calerDe/cembreDe/chirerDe/ciderDe/clarerDe/corerDe/crireDe/cuplerDe/daleDe/ductifDe/esseDe/fensifDe/filerDe/frayerDe/gagerDe/givrerDe/glutirDe/graferDe/jeunerDe/liceDe/logerDemanderDemeurerDe/molirDe/nicherDe/nouerDentelleDe/nuderDe/partDe/penserDe/phaserDe/placerDe/poserDe/rangerDe/roberDe/sastreDescenteDe/sertDe/signerDe/sobe/irDessinerDestrierDe/tacherDe/testerDe/tourerDe/tresseDevancerDevenirDevinerDevoirDiableDialogueDiamantDicterDiffe/rerDige/rerDigitalDigneDiluerDimancheDiminuerDioxydeDirectifDirigerDiscuterDisposerDissiperDistanceDivertirDiviserDocileDocteurDogmeDoigtDomaineDomicileDompterDonateurDonjonDonnerDopamineDortoirDorureDosageDoseurDossierDotationDouanierDoubleDouceurDouterDoyenDragonDraperDresserDribblerDroitureDuperieDuplexeDurableDurcirDynastieE/blouirE/carterE/charpeE/chelleE/clairerE/clipseE/cloreE/cluseE/coleE/conomieE/corceE/couterE/craserE/cre/merE/crivainE/crouE/cumeE/cureuilE/difierE/duquerEffacerEffectifEffigieEffortEffrayerEffusionE/galiserE/garerE/jecterE/laborerE/largirE/lectronE/le/gantE/le/phantE/le-veE/ligibleE/litismeE/logeE/luciderE/luderEmballerEmbellirEmbryonE/meraudeE/missionEmmenerE/motionE/mouvoirEmpereurEmployerEmporterEmpriseE/mulsionEncadrerEnche-reEnclaveEncocheEndiguerEndosserEndroitEnduireE/nergieEnfanceEnfermerEnfouirEngagerEnginEngloberE/nigmeEnjamberEnjeuEnleverEnnemiEnnuyeuxEnrichirEnrobageEnseigneEntasserEntendreEntierEntourerEntraverE/nume/rerEnvahirEnviableEnvoyerEnzymeE/olienE/paissirE/pargneE/patantE/pauleE/picerieE/pide/mieE/pierE/pilogueE/pineE/pisodeE/pitapheE/poqueE/preuveE/prouverE/puisantE/querreE/quipeE/rigerE/rosionErreurE/ruptionEscalierEspadonEspe-ceEspie-gleEspoirEspritEsquiverEssayerEssenceEssieuEssorerEstimeEstomacEstradeE/tage-reE/talerE/tancheE/tatiqueE/teindreE/tendoirE/ternelE/thanolE/thiqueEthnieE/tirerE/tofferE/toileE/tonnantE/tourdirE/trangeE/troitE/tudeEuphorieE/valuerE/vasionE/ventailE/videnceE/viterE/volutifE/voquerExactExage/rerExaucerExcellerExcitantExclusifExcuseExe/cuterExempleExercerExhalerExhorterExigenceExilerExisterExotiqueExpe/dierExplorerExposerExprimerExquisExtensifExtraireExulterFableFabuleuxFacetteFacileFactureFaiblirFalaiseFameuxFamilleFarceurFarfeluFarineFaroucheFascinerFatalFatigueFauconFautifFaveurFavoriFe/brileFe/conderFe/de/rerFe/linFemmeFe/murFendoirFe/odalFermerFe/roceFerveurFestivalFeuilleFeutreFe/vrierFiascoFicelerFictifFide-leFigureFilatureFiletageFilie-reFilleulFilmerFilouFiltrerFinancerFinirFioleFirmeFissureFixerFlairerFlammeFlasqueFlatteurFle/auFle-cheFleurFlexionFloconFloreFluctuerFluideFluvialFolieFonderieFongibleFontaineForcerForgeronFormulerFortuneFossileFoudreFouge-reFouillerFoulureFourmiFragileFraiseFranchirFrapperFrayeurFre/gateFreinerFrelonFre/mirFre/ne/sieFre-reFriableFrictionFrissonFrivoleFroidFromageFrontalFrotterFruitFugitifFuiteFureurFurieuxFurtifFusionFuturGagnerGalaxieGalerieGambaderGarantirGardienGarnirGarrigueGazelleGazonGe/antGe/latineGe/luleGendarmeGe/ne/ralGe/nieGenouGentilGe/ologieGe/ome-treGe/raniumGermeGestuelGeyserGibierGiclerGirafeGivreGlaceGlaiveGlisserGlobeGloireGlorieuxGolfeurGommeGonflerGorgeGorilleGoudronGouffreGoulotGoupilleGourmandGoutteGraduelGraffitiGraineGrandGrappinGratuitGravirGrenatGriffureGrillerGrimperGrognerGronderGrotteGroupeGrugerGrutierGruye-reGue/pardGuerrierGuideGuimauveGuitareGustatifGymnasteGyrostatHabitudeHachoirHalteHameauHangarHannetonHaricotHarmonieHarponHasardHe/liumHe/matomeHerbeHe/rissonHermineHe/ronHe/siterHeureuxHibernerHibouHilarantHistoireHiverHomardHommageHomoge-neHonneurHonorerHonteuxHordeHorizonHorlogeHormoneHorribleHouleuxHousseHublotHuileuxHumainHumbleHumideHumourHurlerHydromelHygie-neHymneHypnoseIdylleIgnorerIguaneIlliciteIllusionImageImbiberImiterImmenseImmobileImmuableImpactImpe/rialImplorerImposerImprimerImputerIncarnerIncendieIncidentInclinerIncoloreIndexerIndiceInductifIne/ditIneptieInexactInfiniInfligerInformerInfusionInge/rerInhalerInhiberInjecterInjureInnocentInoculerInonderInscrireInsecteInsigneInsoliteInspirerInstinctInsulterIntactIntenseIntimeIntrigueIntuitifInutileInvasionInventerInviterInvoquerIroniqueIrradierIrre/elIrriterIsolerIvoireIvresseJaguarJaillirJambeJanvierJardinJaugerJauneJavelotJetableJetonJeudiJeunesseJoindreJoncherJonglerJoueurJouissifJournalJovialJoyauJoyeuxJubilerJugementJuniorJuponJuristeJusticeJuteuxJuve/nileKayakKimonoKiosqueLabelLabialLabourerLace/rerLactoseLaguneLaineLaisserLaitierLambeauLamelleLampeLanceurLangageLanterneLapinLargeurLarmeLaurierLavaboLavoirLectureLe/galLe/gerLe/gumeLessiveLettreLevierLexiqueLe/zardLiasseLibe/rerLibreLicenceLicorneLie-geLie-vreLigatureLigoterLigueLimerLimiteLimonadeLimpideLine/aireLingotLionceauLiquideLisie-reListerLithiumLitigeLittoralLivreurLogiqueLointainLoisirLombricLoterieLouerLourdLoutreLouveLoyalLubieLucideLucratifLueurLugubreLuisantLumie-reLunaireLundiLuronLutterLuxueuxMachineMagasinMagentaMagiqueMaigreMaillonMaintienMairieMaisonMajorerMalaxerMale/ficeMalheurMaliceMalletteMammouthMandaterManiableManquantManteauManuelMarathonMarbreMarchandMardiMaritimeMarqueurMarronMartelerMascotteMassifMate/rielMatie-reMatraqueMaudireMaussadeMauveMaximalMe/chantMe/connuMe/dailleMe/decinMe/diterMe/duseMeilleurMe/langeMe/lodieMembreMe/moireMenacerMenerMenhirMensongeMentorMercrediMe/riteMerleMessagerMesureMe/talMe/te/oreMe/thodeMe/tierMeubleMiaulerMicrobeMietteMignonMigrerMilieuMillionMimiqueMinceMine/ralMinimalMinorerMinuteMiracleMiroiterMissileMixteMobileModerneMoelleuxMondialMoniteurMonnaieMonotoneMonstreMontagneMonumentMoqueurMorceauMorsureMortierMoteurMotifMoucheMoufleMoulinMoussonMoutonMouvantMultipleMunitionMurailleMure-neMurmureMuscleMuse/umMusicienMutationMuterMutuelMyriadeMyrtilleMyste-reMythiqueNageurNappeNarquoisNarrerNatationNationNatureNaufrageNautiqueNavireNe/buleuxNectarNe/fasteNe/gationNe/gligerNe/gocierNeigeNerveuxNettoyerNeuroneNeutronNeveuNicheNickelNitrateNiveauNobleNocifNocturneNoirceurNoisetteNomadeNombreuxNommerNormatifNotableNotifierNotoireNourrirNouveauNovateurNovembreNoviceNuageNuancerNuireNuisibleNume/roNuptialNuqueNutritifObe/irObjectifObligerObscurObserverObstacleObtenirObturerOccasionOccuperOce/anOctobreOctroyerOctuplerOculaireOdeurOdorantOffenserOfficierOffrirOgiveOiseauOisillonOlfactifOlivierOmbrageOmettreOnctueuxOndulerOne/reuxOniriqueOpaleOpaqueOpe/rerOpinionOpportunOpprimerOpterOptiqueOrageuxOrangeOrbiteOrdonnerOreilleOrganeOrgueilOrificeOrnementOrqueOrtieOscillerOsmoseOssatureOtarieOuraganOursonOutilOutragerOuvrageOvationOxydeOxyge-neOzonePaisiblePalacePalmare-sPalourdePalperPanachePandaPangolinPaniquerPanneauPanoramaPantalonPapayePapierPapoterPapyrusParadoxeParcelleParesseParfumerParlerParoleParrainParsemerPartagerParureParvenirPassionPaste-quePaternelPatiencePatronPavillonPavoiserPayerPaysagePeignePeintrePelagePe/licanPellePelousePeluchePendulePe/ne/trerPe/niblePensifPe/nuriePe/pitePe/plumPerdrixPerforerPe/riodePermuterPerplexePersilPertePeserPe/talePetitPe/trirPeuplePharaonPhobiePhoquePhotonPhrasePhysiquePianoPicturalPie-cePierrePieuvrePilotePinceauPipettePiquerPiroguePiscinePistonPivoterPixelPizzaPlacardPlafondPlaisirPlanerPlaquePlastronPlateauPleurerPlexusPliagePlombPlongerPluiePlumagePochettePoe/siePoe-tePointePoirierPoissonPoivrePolairePolicierPollenPolygonePommadePompierPonctuelPonde/rerPoneyPortiquePositionPosse/derPosturePotagerPoteauPotionPoucePoulainPoumonPourprePoussinPouvoirPrairiePratiquePre/cieuxPre/direPre/fixePre/ludePre/nomPre/sencePre/textePre/voirPrimitifPrincePrisonPriverProble-meProce/derProdigeProfondProgre-sProieProjeterProloguePromenerPropreProspe-reProte/gerProuesseProverbePrudencePruneauPsychosePublicPuceronPuiserPulpePulsarPunaisePunitifPupitrePurifierPuzzlePyramideQuasarQuerelleQuestionQuie/tudeQuitterQuotientRacineRaconterRadieuxRagondinRaideurRaisinRalentirRallongeRamasserRapideRasageRatisserRavagerRavinRayonnerRe/actifRe/agirRe/aliserRe/animerRecevoirRe/citerRe/clamerRe/colterRecruterReculerRecyclerRe/digerRedouterRefaireRe/flexeRe/formerRefrainRefugeRe/galienRe/gionRe/glageRe/gulierRe/ite/rerRejeterRejouerRelatifReleverReliefRemarqueReme-deRemiseRemonterRemplirRemuerRenardRenfortReniflerRenoncerRentrerRenvoiReplierReporterRepriseReptileRequinRe/serveRe/sineuxRe/soudreRespectResterRe/sultatRe/tablirRetenirRe/ticuleRetomberRetracerRe/unionRe/ussirRevancheRevivreRe/volteRe/vulsifRichesseRideauRieurRigideRigolerRincerRiposterRisibleRisqueRituelRivalRivie-reRocheuxRomanceRompreRonceRondinRoseauRosierRotatifRotorRotuleRougeRouilleRouleauRoutineRoyaumeRubanRubisRucheRuelleRugueuxRuinerRuisseauRuserRustiqueRythmeSablerSaboterSabreSacocheSafariSagesseSaisirSaladeSaliveSalonSaluerSamediSanctionSanglierSarcasmeSardineSaturerSaugrenuSaumonSauterSauvageSavantSavonnerScalpelScandaleSce/le/ratSce/narioSceptreSche/maScienceScinderScoreScrutinSculpterSe/anceSe/cableSe/cherSecouerSe/cre/terSe/datifSe/duireSeigneurSe/jourSe/lectifSemaineSemblerSemenceSe/minalSe/nateurSensibleSentenceSe/parerSe/quenceSereinSergentSe/rieuxSerrureSe/rumServiceSe/sameSe/virSevrageSextupleSide/ralSie-cleSie/gerSifflerSigleSignalSilenceSiliciumSimpleSince-reSinistreSiphonSiropSismiqueSituerSkierSocialSocleSodiumSoigneuxSoldatSoleilSolitudeSolubleSombreSommeilSomnolerSondeSongeurSonnetteSonoreSorcierSortirSosieSottiseSoucieuxSoudureSouffleSouleverSoupapeSourceSoutirerSouvenirSpacieuxSpatialSpe/cialSphe-reSpiralStableStationSternumStimulusStipulerStrictStudieuxStupeurStylisteSublimeSubstratSubtilSubvenirSucce-sSucreSuffixeSugge/rerSuiveurSulfateSuperbeSupplierSurfaceSuricateSurmenerSurpriseSursautSurvieSuspectSyllabeSymboleSyme/trieSynapseSyntaxeSyste-meTabacTablierTactileTaillerTalentTalismanTalonnerTambourTamiserTangibleTapisTaquinerTarderTarifTartineTasseTatamiTatouageTaupeTaureauTaxerTe/moinTemporelTenailleTendreTeneurTenirTensionTerminerTerneTerribleTe/tineTexteThe-meThe/orieThe/rapieThoraxTibiaTie-deTimideTirelireTiroirTissuTitaneTitreTituberTobogganTole/rantTomateToniqueTonneauToponymeTorcheTordreTornadeTorpilleTorrentTorseTortueTotemToucherTournageTousserToxineTractionTraficTragiqueTrahirTrainTrancherTravailTre-fleTremperTre/sorTreuilTriageTribunalTricoterTrilogieTriompheTriplerTriturerTrivialTromboneTroncTropicalTroupeauTuileTulipeTumulteTunnelTurbineTuteurTutoyerTuyauTympanTyphonTypiqueTyranUbuesqueUltimeUltrasonUnanimeUnifierUnionUniqueUnitaireUniversUraniumUrbainUrticantUsageUsineUsuelUsureUtileUtopieVacarmeVaccinVagabondVagueVaillantVaincreVaisseauValableValiseVallonValveVampireVanilleVapeurVarierVaseuxVassalVasteVecteurVedetteVe/ge/talVe/hiculeVeinardVe/loceVendrediVe/ne/rerVengerVenimeuxVentouseVerdureVe/rinVernirVerrouVerserVertuVestonVe/te/ranVe/tusteVexantVexerViaducViandeVictoireVidangeVide/oVignetteVigueurVilainVillageVinaigreViolonVipe-reVirementVirtuoseVirusVisageViseurVisionVisqueuxVisuelVitalVitesseViticoleVitrineVivaceVivipareVocationVoguerVoileVoisinVoitureVolailleVolcanVoltigerVolumeVoraceVortexVoterVouloirVoyageVoyelleWagonXe/nonYachtZe-breZe/nithZesteZoologie\";\n    var wordlist = null;\n    var lookup = {};\n    function dropDiacritic(word) {\n      wordlist_1.logger.checkNormalize();\n      return (0, strings_1.toUtf8String)(Array.prototype.filter.call((0, strings_1.toUtf8Bytes)(word.normalize(\"NFD\").toLowerCase()), function(c) {\n        return c >= 65 && c <= 90 || c >= 97 && c <= 123;\n      }));\n    }\n    function expand(word) {\n      var output = [];\n      Array.prototype.forEach.call((0, strings_1.toUtf8Bytes)(word), function(c) {\n        if (c === 47) {\n          output.push(204);\n          output.push(129);\n        } else if (c === 45) {\n          output.push(204);\n          output.push(128);\n        } else {\n          output.push(c);\n        }\n      });\n      return (0, strings_1.toUtf8String)(output);\n    }\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \").map(function(w) {\n        return expand(w);\n      });\n      wordlist.forEach(function(word, index) {\n        lookup[dropDiacritic(word)] = index;\n      });\n      if (wordlist_1.Wordlist.check(lang) !== \"0x51deb7ae009149dc61a6bd18a918eb7ac78d2775726c68e598b92d002519b045\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for fr (French) FAILED\");\n      }\n    }\n    var LangFr = (\n      /** @class */\n      function(_super) {\n        __extends(LangFr2, _super);\n        function LangFr2() {\n          return _super.call(this, \"fr\") || this;\n        }\n        LangFr2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangFr2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return lookup[dropDiacritic(word)];\n        };\n        return LangFr2;\n      }(wordlist_1.Wordlist)\n    );\n    var langFr = new LangFr();\n    exports2.langFr = langFr;\n    wordlist_1.Wordlist.register(langFr);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-ja.js\nvar require_lang_ja = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-ja.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langJa = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = [\n      // 4-kana words\n      \"AQRASRAGBAGUAIRAHBAghAURAdBAdcAnoAMEAFBAFCBKFBQRBSFBCXBCDBCHBGFBEQBpBBpQBIkBHNBeOBgFBVCBhBBhNBmOBmRBiHBiFBUFBZDBvFBsXBkFBlcBjYBwDBMBBTBBTRBWBBWXXaQXaRXQWXSRXCFXYBXpHXOQXHRXhRXuRXmXXbRXlXXwDXTRXrCXWQXWGaBWaKcaYgasFadQalmaMBacAKaRKKBKKXKKjKQRKDRKCYKCRKIDKeVKHcKlXKjHKrYNAHNBWNaRNKcNIBNIONmXNsXNdXNnBNMBNRBNrXNWDNWMNFOQABQAHQBrQXBQXFQaRQKXQKDQKOQKFQNBQNDQQgQCXQCDQGBQGDQGdQYXQpBQpQQpHQLXQHuQgBQhBQhCQuFQmXQiDQUFQZDQsFQdRQkHQbRQlOQlmQPDQjDQwXQMBQMDQcFQTBQTHQrDDXQDNFDGBDGQDGRDpFDhFDmXDZXDbRDMYDRdDTRDrXSAhSBCSBrSGQSEQSHBSVRShYShkSyQSuFSiBSdcSoESocSlmSMBSFBSFKSFNSFdSFcCByCaRCKcCSBCSRCCrCGbCEHCYXCpBCpQCIBCIHCeNCgBCgFCVECVcCmkCmwCZXCZFCdRClOClmClFCjDCjdCnXCwBCwXCcRCFQCFjGXhGNhGDEGDMGCDGCHGIFGgBGVXGVEGVRGmXGsXGdYGoSGbRGnXGwXGwDGWRGFNGFLGFOGFdGFkEABEBDEBFEXOEaBEKSENBENDEYXEIgEIkEgBEgQEgHEhFEudEuFEiBEiHEiFEZDEvBEsXEsFEdXEdREkFEbBEbRElFEPCEfkEFNYAEYAhYBNYQdYDXYSRYCEYYoYgQYgRYuRYmCYZTYdBYbEYlXYjQYRbYWRpKXpQopQnpSFpCXpIBpISphNpdBpdRpbRpcZpFBpFNpFDpFopFrLADLBuLXQLXcLaFLCXLEhLpBLpFLHXLeVLhILdHLdRLoDLbRLrXIABIBQIBCIBsIBoIBMIBRIXaIaRIKYIKRINBINuICDIGBIIDIIkIgRIxFIyQIiHIdRIbYIbRIlHIwRIMYIcRIRVITRIFBIFNIFQOABOAFOBQOaFONBONMOQFOSFOCDOGBOEQOpBOLXOIBOIFOgQOgFOyQOycOmXOsXOdIOkHOMEOMkOWWHBNHXNHXWHNXHDuHDRHSuHSRHHoHhkHmRHdRHkQHlcHlRHwBHWcgAEgAggAkgBNgBQgBEgXOgYcgLXgHjgyQgiBgsFgdagMYgWSgFQgFEVBTVXEVKBVKNVKDVKYVKRVNBVNYVDBVDxVSBVSRVCjVGNVLXVIFVhBVhcVsXVdRVbRVlRhBYhKYhDYhGShxWhmNhdahdkhbRhjohMXhTRxAXxXSxKBxNBxEQxeNxeQxhXxsFxdbxlHxjcxFBxFNxFQxFOxFoyNYyYoybcyMYuBQuBRuBruDMuCouHBudQukkuoBulVuMXuFEmCYmCRmpRmeDmiMmjdmTFmFQiADiBOiaRiKRiNBiNRiSFiGkiGFiERipRiLFiIFihYibHijBijEiMXiWBiFBiFCUBQUXFUaRUNDUNcUNRUNFUDBUSHUCDUGBUGFUEqULNULoUIRUeEUeYUgBUhFUuRUiFUsXUdFUkHUbBUjSUjYUwXUMDUcHURdUTBUrBUrXUrQZAFZXZZaRZKFZNBZQFZCXZGBZYdZpBZLDZIFZHXZHNZeQZVRZVFZmXZiBZvFZdFZkFZbHZbFZwXZcCZcRZRBvBQvBGvBLvBWvCovMYsAFsBDsaRsKFsNFsDrsSHsSFsCXsCRsEBsEHsEfspBsLBsLDsIgsIRseGsbRsFBsFQsFSdNBdSRdCVdGHdYDdHcdVbdySduDdsXdlRdwXdWYdWcdWRkBMkXOkaRkNIkNFkSFkCFkYBkpRkeNkgBkhVkmXksFklVkMBkWDkFNoBNoaQoaFoNBoNXoNaoNEoSRoEroYXoYCoYbopRopFomXojkowXorFbBEbEIbdBbjYlaRlDElMXlFDjKjjSRjGBjYBjYkjpRjLXjIBjOFjeVjbRjwBnXQnSHnpFnLXnINnMBnTRwXBwXNwXYwNFwQFwSBwGFwLXwLDweNwgBwuHwjDwnXMBXMpFMIBMeNMTHcaQcNBcDHcSFcCXcpBcLXcLDcgFcuFcnXcwXccDcTQcrFTQErXNrCHrpFrgFrbFrTHrFcWNYWNbWEHWMXWTR\",\n      // 5-kana words\n      \"ABGHABIJAEAVAYJQALZJAIaRAHNXAHdcAHbRAZJMAZJRAZTRAdVJAklmAbcNAjdRAMnRAMWYAWpRAWgRAFgBAFhBAFdcBNJBBNJDBQKBBQhcBQlmBDEJBYJkBYJTBpNBBpJFBIJBBIJDBIcABOKXBOEJBOVJBOiJBOZJBepBBeLXBeIFBegBBgGJBVJXBuocBiJRBUJQBlXVBlITBwNFBMYVBcqXBTlmBWNFBWiJBWnRBFGHBFwXXKGJXNJBXNZJXDTTXSHSXSVRXSlHXCJDXGQJXEhXXYQJXYbRXOfXXeNcXVJFXhQJXhEJXdTRXjdXXMhBXcQTXRGBXTEBXTnQXFCXXFOFXFgFaBaFaBNJaBCJaBpBaBwXaNJKaNJDaQIBaDpRaEPDaHMFamDJalEJaMZJaFaFaFNBaFQJaFLDaFVHKBCYKBEBKBHDKXaFKXGdKXEJKXpHKXIBKXZDKXwXKKwLKNacKNYJKNJoKNWcKDGdKDTRKChXKGaRKGhBKGbRKEBTKEaRKEPTKLMDKLWRKOHDKVJcKdBcKlIBKlOPKFSBKFEPKFpFNBNJNJBQNBGHNBEPNBHXNBgFNBVXNBZDNBsXNBwXNNaRNNJDNNJENNJkNDCJNDVDNGJRNJiDNZJNNsCJNJFNNFSBNFCXNFEPNFLXNFIFQJBFQCaRQJEQQLJDQLJFQIaRQOqXQHaFQHHQQVJXQVJDQhNJQmEIQZJFQsJXQJrFQWbRDJABDBYJDXNFDXCXDXLXDXZDDXsJDQqXDSJFDJCXDEPkDEqXDYmQDpSJDOCkDOGQDHEIDVJDDuDuDWEBDJFgSBNDSBSFSBGHSBIBSBTQSKVYSJQNSJQiSJCXSEqXSJYVSIiJSOMYSHAHSHaQSeCFSepQSegBSHdHSHrFShSJSJuHSJUFSkNRSrSrSWEBSFaHSJFQSFCXSFGDSFYXSFODSFgBSFVXSFhBSFxFSFkFSFbBSFMFCADdCJXBCXaFCXKFCXNFCXCXCXGBCXEJCXYBCXLDCXIBCXOPCXHXCXgBCXhBCXiBCXlDCXcHCJNBCJNFCDCJCDGBCDVXCDhBCDiDCDJdCCmNCpJFCIaRCOqXCHCHCHZJCViJCuCuCmddCJiFCdNBCdHhClEJCnUJCreSCWlgCWTRCFBFCFNBCFYBCFVFCFhFCFdSCFTBCFWDGBNBGBQFGJBCGBEqGBpBGBgQGNBEGNJYGNkOGNJRGDUFGJpQGHaBGJeNGJeEGVBlGVKjGiJDGvJHGsVJGkEBGMIJGWjNGFBFGFCXGFGBGFYXGFpBGFMFEASJEAWpEJNFECJVEIXSEIQJEOqXEOcFEeNcEHEJEHlFEJgFEhlmEmDJEmZJEiMBEUqXEoSREPBFEPXFEPKFEPSFEPEFEPpFEPLXEPIBEJPdEPcFEPTBEJnXEqlHEMpREFCXEFODEFcFYASJYJAFYBaBYBVXYXpFYDhBYCJBYJGFYYbRYeNcYJeVYiIJYZJcYvJgYvJRYJsXYsJFYMYMYreVpBNHpBEJpBwXpQxFpYEJpeNDpJeDpeSFpeCHpHUJpHbBpHcHpmUJpiiJpUJrpsJuplITpFaBpFQqpFGBpFEfpFYBpFpBpFLJpFIDpFgBpFVXpFyQpFuFpFlFpFjDpFnXpFwXpJFMpFTBLXCJLXEFLXhFLXUJLXbFLalmLNJBLSJQLCLCLGJBLLDJLHaFLeNFLeSHLeCXLepFLhaRLZsJLsJDLsJrLocaLlLlLMdbLFNBLFSBLFEHLFkFIBBFIBXFIBaQIBKXIBSFIBpHIBLXIBgBIBhBIBuHIBmXIBiFIBZXIBvFIBbFIBjQIBwXIBWFIKTRIQUJIDGFICjQIYSRIINXIJeCIVaRImEkIZJFIvJRIsJXIdCJIJoRIbBQIjYBIcqXITFVIreVIFKFIFSFIFCJIFGFIFLDIFIBIJFOIFgBIFVXIJFhIFxFIFmXIFdHIFbBIJFrIJFWOBGBOQfXOOKjOUqXOfXBOqXEOcqXORVJOFIBOFlDHBIOHXiFHNTRHCJXHIaRHHJDHHEJHVbRHZJYHbIBHRsJHRkDHWlmgBKFgBSBgBCDgBGHgBpBgBIBgBVJgBuBgBvFgKDTgQVXgDUJgGSJgOqXgmUMgZIJgTUJgWIEgFBFgFNBgFDJgFSFgFGBgFYXgJFOgFgQgFVXgFhBgFbHgJFWVJABVQKcVDgFVOfXVeDFVhaRVmGdViJYVMaRVFNHhBNDhBCXhBEqhBpFhBLXhNJBhSJRheVXhhKEhxlmhZIJhdBQhkIJhbMNhMUJhMZJxNJgxQUJxDEkxDdFxSJRxplmxeSBxeCXxeGFxeYXxepQxegBxWVcxFEQxFLXxFIBxFgBxFxDxFZtxFdcxFbBxFwXyDJXyDlcuASJuDJpuDIBuCpJuGSJuIJFueEFuZIJusJXudWEuoIBuWGJuFBcuFKEuFNFuFQFuFDJuFGJuFVJuFUtuFdHuFTBmBYJmNJYmQhkmLJDmLJomIdXmiJYmvJRmsJRmklmmMBymMuCmclmmcnQiJABiJBNiJBDiBSFiBCJiBEFiBYBiBpFiBLXiBTHiJNciDEfiCZJiECJiJEqiOkHiHKFieNDiHJQieQcieDHieSFieCXieGFieEFieIHiegFihUJixNoioNXiFaBiFKFiFNDiFEPiFYXitFOitFHiFgBiFVEiFmXiFitiFbBiFMFiFrFUCXQUIoQUIJcUHQJUeCEUHwXUUJDUUqXUdWcUcqXUrnQUFNDUFSHUFCFUFEfUFLXUtFOZBXOZXSBZXpFZXVXZEQJZEJkZpDJZOqXZeNHZeCDZUqXZFBQZFEHZFLXvBAFvBKFvBCXvBEPvBpHvBIDvBgFvBuHvQNJvFNFvFGBvFIBvJFcsXCDsXLXsXsXsXlFsXcHsQqXsJQFsEqXseIFsFEHsFjDdBxOdNpRdNJRdEJbdpJRdhZJdnSJdrjNdFNJdFQHdFhNkNJDkYaRkHNRkHSRkVbRkuMRkjSJkcqDoSJFoEiJoYZJoOfXohEBoMGQocqXbBAFbBXFbBaFbBNDbBGBbBLXbBTBbBWDbGJYbIJHbFQqbFpQlDgQlOrFlVJRjGEBjZJRnXvJnXbBnEfHnOPDngJRnxfXnUJWwXEJwNpJwDpBwEfXwrEBMDCJMDGHMDIJMLJDcQGDcQpHcqXccqNFcqCXcFCJRBSBRBGBRBEJRBpQTBNFTBQJTBpBTBVXTFABTFSBTFCFTFGBTFMDrXCJrXLDrDNJrEfHrFQJrFitWNjdWNTR\",\n      // 6-kana words\n      \"AKLJMANOPFASNJIAEJWXAYJNRAIIbRAIcdaAeEfDAgidRAdjNYAMYEJAMIbRAFNJBAFpJFBBIJYBDZJFBSiJhBGdEBBEJfXBEJqXBEJWRBpaUJBLXrXBIYJMBOcfXBeEfFBestXBjNJRBcDJOBFEqXXNvJRXDMBhXCJNYXOAWpXONJWXHDEBXeIaRXhYJDXZJSJXMDJOXcASJXFVJXaBQqXaBZJFasXdQaFSJQaFEfXaFpJHaFOqXKBNSRKXvJBKQJhXKEJQJKEJGFKINJBKIJjNKgJNSKVElmKVhEBKiJGFKlBgJKjnUJKwsJYKMFIJKFNJDKFIJFKFOfXNJBSFNJBCXNBpJFNJBvQNJBMBNJLJXNJOqXNJeCXNJeGFNdsJCNbTKFNwXUJQNFEPQDiJcQDMSJQSFpBQGMQJQJeOcQyCJEQUJEBQJFBrQFEJqDXDJFDJXpBDJXIMDGiJhDIJGRDJeYcDHrDJDVXgFDkAWpDkIgRDjDEqDMvJRDJFNFDJFIBSKclmSJQOFSJQVHSJQjDSJGJBSJGJFSECJoSHEJqSJHTBSJVJDSViJYSZJNBSJsJDSFSJFSFEfXSJFLXCBUJVCJXSBCJXpBCXVJXCJXsXCJXdFCJNJHCLIJgCHiJFCVNJMChCJhCUHEJCsJTRCJdYcCoQJCCFEfXCFIJgCFUJxCFstFGJBaQGJBIDGQJqXGYJNRGJHKFGeQqDGHEJFGJeLXGHIiJGHdBlGUJEBGkIJTGFQPDGJFEqEAGegEJIJBEJVJXEhQJTEiJNcEJZJFEJoEqEjDEqEPDsXEPGJBEPOqXEPeQFEfDiDEJfEFEfepQEfMiJEqXNBEqDIDEqeSFEqVJXEMvJRYXNJDYXEJHYKVJcYYJEBYJeEcYJUqXYFpJFYFstXpAZJMpBSJFpNBNFpeQPDpHLJDpHIJFpHgJFpeitFpHZJFpJFADpFSJFpJFCJpFOqXpFitBpJFZJLXIJFLIJgRLVNJWLVHJMLwNpJLFGJBLFLJDLFOqXLJFUJIBDJXIBGJBIJBYQIJBIBIBOqXIBcqDIEGJFILNJTIIJEBIOiJhIJeNBIJeIBIhiJIIWoTRIJFAHIJFpBIJFuHIFUtFIJFTHOSBYJOEcqXOHEJqOvBpFOkVJrObBVJOncqDOcNJkHhNJRHuHJuHdMhBgBUqXgBsJXgONJBgHNJDgHHJQgJeitgHsJXgJyNagyDJBgZJDrgsVJQgkEJNgkjSJgJFAHgFCJDgFZtMVJXNFVXQfXVJXDJVXoQJVQVJQVDEfXVDvJHVEqNFVeQfXVHpJFVHxfXVVJSRVVmaRVlIJOhCXVJhHjYkhxCJVhWVUJhWiJcxBNJIxeEqDxfXBFxcFEPxFSJFxFYJXyBDQJydaUJyFOPDuYCJYuLvJRuHLJXuZJLDuFOPDuFZJHuFcqXmKHJdmCQJcmOsVJiJAGFitLCFieOfXiestXiZJMEikNJQirXzFiFQqXiFIJFiFZJFiFvtFUHpJFUteIcUteOcUVCJkUhdHcUbEJEUJqXQUMNJhURjYkUFitFZDGJHZJIxDZJVJXZJFDJZJFpQvBNJBvBSJFvJxBrseQqDsVFVJdFLJDkEJNBkmNJYkFLJDoQJOPoGsJRoEAHBoEJfFbBQqDbBZJHbFVJXlFIJBjYIrXjeitcjjCEBjWMNBwXQfXwXOaFwDsJXwCJTRwrCZJMDNJQcDDJFcqDOPRYiJFTBsJXTQIJBTFEfXTFLJDrXEJFrEJXMrFZJFWEJdEWYTlm\",\n      // 7-kana words\n      \"ABCDEFACNJTRAMBDJdAcNJVXBLNJEBXSIdWRXErNJkXYDJMBXZJCJaXMNJaYKKVJKcKDEJqXKDcNJhKVJrNYKbgJVXKFVJSBNBYBwDNJeQfXNJeEqXNhGJWENJFiJRQlIJbEQJfXxDQqXcfXQFNDEJQFwXUJDYcnUJDJIBgQDIUJTRDJFEqDSJQSJFSJQIJFSOPeZtSJFZJHCJXQfXCTDEqFGJBSJFGJBOfXGJBcqXGJHNJDGJRLiJEJfXEqEJFEJPEFpBEJYJBZJFYBwXUJYiJMEBYJZJyTYTONJXpQMFXFpeGIDdpJFstXpJFcPDLBVSJRLHQJqXLJFZJFIJBNJDIJBUqXIBkFDJIJEJPTIYJGWRIJeQPDIJeEfHIJFsJXOqGDSFHXEJqXgJCsJCgGQJqXgdQYJEgFMFNBgJFcqDVJwXUJVJFZJchIgJCCxOEJqXxOwXUJyDJBVRuscisciJBiJBieUtqXiJFDJkiFsJXQUGEZJcUJFsJXZtXIrXZDZJDrZJFNJDZJFstXvJFQqXvJFCJEsJXQJqkhkNGBbDJdTRbYJMEBlDwXUJMEFiJFcfXNJDRcNJWMTBLJXC\",\n      // 8-kana words\n      \"BraFUtHBFSJFdbNBLJXVJQoYJNEBSJBEJfHSJHwXUJCJdAZJMGjaFVJXEJPNJBlEJfFiJFpFbFEJqIJBVJCrIBdHiJhOPFChvJVJZJNJWxGFNIFLueIBQJqUHEJfUFstOZJDrlXEASJRlXVJXSFwVJNJWD\",\n      // 9-kana words\n      \"QJEJNNJDQJEJIBSFQJEJxegBQJEJfHEPSJBmXEJFSJCDEJqXLXNJFQqXIcQsFNJFIFEJqXUJgFsJXIJBUJEJfHNFvJxEqXNJnXUJFQqD\",\n      // 10-kana words\n      \"IJBEJqXZJ\"\n    ];\n    var mapping = \"~~AzB~X~a~KN~Q~D~S~C~G~E~Y~p~L~I~O~eH~g~V~hxyumi~~U~~Z~~v~~s~~dkoblPjfnqwMcRTr~W~~~F~~~~~Jt\";\n    var wordlist = null;\n    function hex(word) {\n      return (0, bytes_1.hexlify)((0, strings_1.toUtf8Bytes)(word));\n    }\n    var KiYoKu = \"0xe3818de38284e3818f\";\n    var KyoKu = \"0xe3818de38283e3818f\";\n    function loadWords(lang) {\n      if (wordlist !== null) {\n        return;\n      }\n      wordlist = [];\n      var transform = {};\n      transform[(0, strings_1.toUtf8String)([227, 130, 154])] = false;\n      transform[(0, strings_1.toUtf8String)([227, 130, 153])] = false;\n      transform[(0, strings_1.toUtf8String)([227, 130, 133])] = (0, strings_1.toUtf8String)([227, 130, 134]);\n      transform[(0, strings_1.toUtf8String)([227, 129, 163])] = (0, strings_1.toUtf8String)([227, 129, 164]);\n      transform[(0, strings_1.toUtf8String)([227, 130, 131])] = (0, strings_1.toUtf8String)([227, 130, 132]);\n      transform[(0, strings_1.toUtf8String)([227, 130, 135])] = (0, strings_1.toUtf8String)([227, 130, 136]);\n      function normalize(word2) {\n        var result2 = \"\";\n        for (var i2 = 0; i2 < word2.length; i2++) {\n          var kana = word2[i2];\n          var target = transform[kana];\n          if (target === false) {\n            continue;\n          }\n          if (target) {\n            kana = target;\n          }\n          result2 += kana;\n        }\n        return result2;\n      }\n      function sortJapanese(a, b) {\n        a = normalize(a);\n        b = normalize(b);\n        if (a < b) {\n          return -1;\n        }\n        if (a > b) {\n          return 1;\n        }\n        return 0;\n      }\n      for (var length_1 = 3; length_1 <= 9; length_1++) {\n        var d = data[length_1 - 3];\n        for (var offset = 0; offset < d.length; offset += length_1) {\n          var word = [];\n          for (var i = 0; i < length_1; i++) {\n            var k = mapping.indexOf(d[offset + i]);\n            word.push(227);\n            word.push(k & 64 ? 130 : 129);\n            word.push((k & 63) + 128);\n          }\n          wordlist.push((0, strings_1.toUtf8String)(word));\n        }\n      }\n      wordlist.sort(sortJapanese);\n      if (hex(wordlist[442]) === KiYoKu && hex(wordlist[443]) === KyoKu) {\n        var tmp = wordlist[442];\n        wordlist[442] = wordlist[443];\n        wordlist[443] = tmp;\n      }\n      if (wordlist_1.Wordlist.check(lang) !== \"0xcb36b09e6baa935787fd762ce65e80b0c6a8dabdfbc3a7f86ac0e2c4fd111600\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for ja (Japanese) FAILED\");\n      }\n    }\n    var LangJa = (\n      /** @class */\n      function(_super) {\n        __extends(LangJa2, _super);\n        function LangJa2() {\n          return _super.call(this, \"ja\") || this;\n        }\n        LangJa2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangJa2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        LangJa2.prototype.split = function(mnemonic) {\n          wordlist_1.logger.checkNormalize();\n          return mnemonic.split(/(?:\\u3000| )+/g);\n        };\n        LangJa2.prototype.join = function(words) {\n          return words.join(\"\\u3000\");\n        };\n        return LangJa2;\n      }(wordlist_1.Wordlist)\n    );\n    var langJa = new LangJa();\n    exports2.langJa = langJa;\n    wordlist_1.Wordlist.register(langJa);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-ko.js\nvar require_lang_ko = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-ko.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langKo = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = [\n      \"OYAa\",\n      \"ATAZoATBl3ATCTrATCl8ATDloATGg3ATHT8ATJT8ATJl3ATLlvATLn4ATMT8ATMX8ATMboATMgoAToLbAToMTATrHgATvHnAT3AnAT3JbAT3MTAT8DbAT8JTAT8LmAT8MYAT8MbAT#LnAUHT8AUHZvAUJXrAUJX8AULnrAXJnvAXLUoAXLgvAXMn6AXRg3AXrMbAX3JTAX3QbAYLn3AZLgvAZrSUAZvAcAZ8AaAZ8AbAZ8AnAZ8HnAZ8LgAZ8MYAZ8MgAZ8OnAaAboAaDTrAaFTrAaJTrAaJboAaLVoAaMXvAaOl8AaSeoAbAUoAbAg8AbAl4AbGnrAbMT8AbMXrAbMn4AbQb8AbSV8AbvRlAb8AUAb8AnAb8HgAb8JTAb8NTAb8RbAcGboAcLnvAcMT8AcMX8AcSToAcrAaAcrFnAc8AbAc8MgAfGgrAfHboAfJnvAfLV8AfLkoAfMT8AfMnoAfQb8AfScrAfSgrAgAZ8AgFl3AgGX8AgHZvAgHgrAgJXoAgJX8AgJboAgLZoAgLn4AgOX8AgoATAgoAnAgoCUAgoJgAgoLXAgoMYAgoSeAgrDUAgrJTAhrFnAhrLjAhrQgAjAgoAjJnrAkMX8AkOnoAlCTvAlCV8AlClvAlFg4AlFl6AlFn3AloSnAlrAXAlrAfAlrFUAlrFbAlrGgAlrOXAlvKnAlvMTAl3AbAl3MnAnATrAnAcrAnCZ3AnCl8AnDg8AnFboAnFl3AnHX4AnHbrAnHgrAnIl3AnJgvAnLXoAnLX4AnLbrAnLgrAnLhrAnMXoAnMgrAnOn3AnSbrAnSeoAnvLnAn3OnCTGgvCTSlvCTvAUCTvKnCTvNTCT3CZCT3GUCT3MTCT8HnCUCZrCULf8CULnvCU3HnCU3JUCY6NUCbDb8CbFZoCbLnrCboOTCboScCbrFnCbvLnCb8AgCb8HgCb$LnCkLfoClBn3CloDUDTHT8DTLl3DTSU8DTrAaDTrLXDTrLjDTrOYDTrOgDTvFXDTvFnDT3HUDT3LfDUCT9DUDT4DUFVoDUFV8DUFkoDUGgrDUJnrDULl8DUMT8DUMXrDUMX4DUMg8DUOUoDUOgvDUOg8DUSToDUSZ8DbDXoDbDgoDbGT8DbJn3DbLg3DbLn4DbMXrDbMg8DbOToDboJXGTClvGTDT8GTFZrGTLVoGTLlvGTLl3GTMg8GTOTvGTSlrGToCUGTrDgGTrJYGTrScGTtLnGTvAnGTvQgGUCZrGUDTvGUFZoGUHXrGULnvGUMT8GUoMgGXoLnGXrMXGXrMnGXvFnGYLnvGZOnvGZvOnGZ8LaGZ8LmGbAl3GbDYvGbDlrGbHX3GbJl4GbLV8GbLn3GbMn4GboJTGboRfGbvFUGb3GUGb4JnGgDX3GgFl$GgJlrGgLX6GgLZoGgLf8GgOXoGgrAgGgrJXGgrMYGgrScGgvATGgvOYGnAgoGnJgvGnLZoGnLg3GnLnrGnQn8GnSbrGnrMgHTClvHTDToHTFT3HTQT8HToJTHToJgHTrDUHTrMnHTvFYHTvRfHT8MnHT8SUHUAZ8HUBb4HUDTvHUoMYHXFl6HXJX6HXQlrHXrAUHXrMnHXrSbHXvFYHXvKXHX3LjHX3MeHYvQlHZrScHZvDbHbAcrHbFT3HbFl3HbJT8HbLTrHbMT8HbMXrHbMbrHbQb8HbSX3HboDbHboJTHbrFUHbrHgHbrJTHb8JTHb8MnHb8QgHgAlrHgDT3HgGgrHgHgrHgJTrHgJT8HgLX@HgLnrHgMT8HgMX8HgMboHgOnrHgQToHgRg3HgoHgHgrCbHgrFnHgrLVHgvAcHgvAfHnAloHnCTrHnCnvHnGTrHnGZ8HnGnvHnJT8HnLf8HnLkvHnMg8HnRTrITvFUITvFnJTAXrJTCV8JTFT3JTFT8JTFn4JTGgvJTHT8JTJT8JTJXvJTJl3JTJnvJTLX4JTLf8JTLhvJTMT8JTMXrJTMnrJTObrJTQT8JTSlvJT8DUJT8FkJT8MTJT8OXJT8OgJT8QUJT8RfJUHZoJXFT4JXFlrJXGZ8JXGnrJXLV8JXLgvJXMXoJXMX3JXNboJXPlvJXoJTJXoLkJXrAXJXrHUJXrJgJXvJTJXvOnJX4KnJYAl3JYJT8JYLhvJYQToJYrQXJY6NUJbAl3JbCZrJbDloJbGT8JbGgrJbJXvJbJboJbLf8JbLhrJbLl3JbMnvJbRg8JbSZ8JboDbJbrCZJbrSUJb3KnJb8LnJfRn8JgAXrJgCZrJgDTrJgGZrJgGZ8JgHToJgJT8JgJXoJgJgvJgLX4JgLZ3JgLZ8JgLn4JgMgrJgMn4JgOgvJgPX6JgRnvJgSToJgoCZJgoJbJgoMYJgrJXJgrJgJgrLjJg6MTJlCn3JlGgvJlJl8Jl4AnJl8FnJl8HgJnAToJnATrJnAbvJnDUoJnGnrJnJXrJnJXvJnLhvJnLnrJnLnvJnMToJnMT8JnMXvJnMX3JnMg8JnMlrJnMn4JnOX8JnST4JnSX3JnoAgJnoAnJnoJTJnoObJnrAbJnrAkJnrHnJnrJTJnrJYJnrOYJnrScJnvCUJnvFaJnvJgJnvJnJnvOYJnvQUJnvRUJn3FnJn3JTKnFl3KnLT6LTDlvLTMnoLTOn3LTRl3LTSb4LTSlrLToAnLToJgLTrAULTrAcLTrCULTrHgLTrMgLT3JnLULnrLUMX8LUoJgLVATrLVDTrLVLb8LVoJgLV8MgLV8RTLXDg3LXFlrLXrCnLXrLXLX3GTLX4GgLX4OYLZAXrLZAcrLZAgrLZAhrLZDXyLZDlrLZFbrLZFl3LZJX6LZJX8LZLc8LZLnrLZSU8LZoJTLZoJnLZrAgLZrAnLZrJYLZrLULZrMgLZrSkLZvAnLZvGULZvJeLZvOTLZ3FZLZ4JXLZ8STLZ8ScLaAT3LaAl3LaHT8LaJTrLaJT8LaJXrLaJgvLaJl4LaLVoLaMXrLaMXvLaMX8LbClvLbFToLbHlrLbJn4LbLZ3LbLhvLbMXrLbMnoLbvSULcLnrLc8HnLc8MTLdrMnLeAgoLeOgvLeOn3LfAl3LfLnvLfMl3LfOX8Lf8AnLf8JXLf8LXLgJTrLgJXrLgJl8LgMX8LgRZrLhCToLhrAbLhrFULhrJXLhvJYLjHTrLjHX4LjJX8LjLhrLjSX3LjSZ4LkFX4LkGZ8LkGgvLkJTrLkMXoLkSToLkSU8LkSZ8LkoOYLl3FfLl3MgLmAZrLmCbrLmGgrLmHboLmJnoLmJn3LmLfoLmLhrLmSToLnAX6LnAb6LnCZ3LnCb3LnDTvLnDb8LnFl3LnGnrLnHZvLnHgvLnITvLnJT8LnJX8LnJlvLnLf8LnLg6LnLhvLnLnoLnMXrLnMg8LnQlvLnSbrLnrAgLnrAnLnrDbLnrFkLnrJdLnrMULnrOYLnrSTLnvAnLnvDULnvHgLnvOYLnvOnLn3GgLn4DULn4JTLn4JnMTAZoMTAloMTDb8MTFT8MTJnoMTJnrMTLZrMTLhrMTLkvMTMX8MTRTrMToATMTrDnMTrOnMT3JnMT4MnMT8FUMT8FaMT8FlMT8GTMT8GbMT8GnMT8HnMT8JTMT8JbMT8OTMUCl8MUJTrMUJU8MUMX8MURTrMUSToMXAX6MXAb6MXCZoMXFXrMXHXrMXLgvMXOgoMXrAUMXrAnMXrHgMXrJYMXrJnMXrMTMXrMgMXrOYMXrSZMXrSgMXvDUMXvOTMX3JgMX3OTMX4JnMX8DbMX8FnMX8HbMX8HgMX8HnMX8LbMX8MnMX8OnMYAb8MYGboMYHTvMYHX4MYLTrMYLnvMYMToMYOgvMYRg3MYSTrMbAToMbAXrMbAl3MbAn8MbGZ8MbJT8MbJXrMbMXvMbMX8MbMnoMbrMUMb8AfMb8FbMb8FkMcJXoMeLnrMgFl3MgGTvMgGXoMgGgrMgGnrMgHT8MgHZrMgJnoMgLnrMgLnvMgMT8MgQUoMgrHnMgvAnMg8HgMg8JYMg8LfMloJnMl8ATMl8AXMl8JYMnAToMnAT4MnAZ8MnAl3MnAl4MnCl8MnHT8MnHg8MnJnoMnLZoMnLhrMnMXoMnMX3MnMnrMnOgvMnrFbMnrFfMnrFnMnrNTMnvJXNTMl8OTCT3OTFV8OTFn3OTHZvOTJXrOTOl3OT3ATOT3JUOT3LZOT3LeOT3MbOT8ATOT8AbOT8AgOT8MbOUCXvOUMX3OXHXvOXLl3OXrMUOXvDbOX6NUOX8JbOYFZoOYLbrOYLkoOYMg8OYSX3ObHTrObHT4ObJgrObLhrObMX3ObOX8Ob8FnOeAlrOeJT8OeJXrOeJnrOeLToOeMb8OgJXoOgLXoOgMnrOgOXrOgOloOgoAgOgoJbOgoMYOgoSTOg8AbOjLX4OjMnoOjSV8OnLVoOnrAgOn3DUPXQlrPXvFXPbvFTPdAT3PlFn3PnvFbQTLn4QToAgQToMTQULV8QURg8QUoJnQXCXvQbFbrQb8AaQb8AcQb8FbQb8MYQb8ScQeAlrQeLhrQjAn3QlFXoQloJgQloSnRTLnvRTrGURTrJTRUJZrRUoJlRUrQnRZrLmRZrMnRZrSnRZ8ATRZ8JbRZ8ScRbMT8RbST3RfGZrRfMX8RfMgrRfSZrRnAbrRnGT8RnvJgRnvLfRnvMTRn8AaSTClvSTJgrSTOXrSTRg3STRnvSToAcSToAfSToAnSToHnSToLjSToMTSTrAaSTrEUST3BYST8AgST8LmSUAZvSUAgrSUDT4SUDT8SUGgvSUJXoSUJXvSULTrSU8JTSU8LjSV8AnSV8JgSXFToSXLf8SYvAnSZrDUSZrMUSZrMnSZ8HgSZ8JTSZ8JgSZ8MYSZ8QUSaQUoSbCT3SbHToSbQYvSbSl4SboJnSbvFbSb8HbSb8JgSb8OTScGZrScHgrScJTvScMT8ScSToScoHbScrMTScvAnSeAZrSeAcrSeHboSeJUoSeLhrSeMT8SeMXrSe6JgSgHTrSkJnoSkLnvSk8CUSlFl3SlrSnSl8GnSmAboSmGT8SmJU8\",\n      \"ATLnDlATrAZoATrJX4ATrMT8ATrMX4ATrRTrATvDl8ATvJUoATvMl8AT3AToAT3MX8AT8CT3AT8DT8AT8HZrAT8HgoAUAgFnAUCTFnAXoMX8AXrAT8AXrGgvAXrJXvAXrOgoAXvLl3AZvAgoAZvFbrAZvJXoAZvJl8AZvJn3AZvMX8AZvSbrAZ8FZoAZ8LZ8AZ8MU8AZ8OTvAZ8SV8AZ8SX3AbAgFZAboJnoAbvGboAb8ATrAb8AZoAb8AgrAb8Al4Ab8Db8Ab8JnoAb8LX4Ab8LZrAb8LhrAb8MT8Ab8OUoAb8Qb8Ab8ST8AcrAUoAcrAc8AcrCZ3AcrFT3AcrFZrAcrJl4AcrJn3AcrMX3AcrOTvAc8AZ8Ac8MT8AfAcJXAgoFn4AgoGgvAgoGnrAgoLc8AgoMXoAgrLnrAkrSZ8AlFXCTAloHboAlrHbrAlrLhrAlrLkoAl3CZrAl3LUoAl3LZrAnrAl4AnrMT8An3HT4BT3IToBX4MnvBb!Ln$CTGXMnCToLZ4CTrHT8CT3JTrCT3RZrCT#GTvCU6GgvCU8Db8CU8GZrCU8HT8CboLl3CbrGgrCbrMU8Cb8DT3Cb8GnrCb8LX4Cb8MT8Cb8ObrCgrGgvCgrKX4Cl8FZoDTrAbvDTrDboDTrGT6DTrJgrDTrMX3DTrRZrDTrRg8DTvAVvDTvFZoDT3DT8DT3Ln3DT4HZrDT4MT8DT8AlrDT8MT8DUAkGbDUDbJnDYLnQlDbDUOYDbMTAnDbMXSnDboAT3DboFn4DboLnvDj6JTrGTCgFTGTGgFnGTJTMnGTLnPlGToJT8GTrCT3GTrLVoGTrLnvGTrMX3GTrMboGTvKl3GZClFnGZrDT3GZ8DTrGZ8FZ8GZ8MXvGZ8On8GZ8ST3GbCnQXGbMbFnGboFboGboJg3GboMXoGb3JTvGb3JboGb3Mn6Gb3Qb8GgDXLjGgMnAUGgrDloGgrHX4GgrSToGgvAXrGgvAZvGgvFbrGgvLl3GgvMnvGnDnLXGnrATrGnrMboGnuLl3HTATMnHTAgCnHTCTCTHTrGTvHTrHTvHTrJX8HTrLl8HTrMT8HTrMgoHTrOTrHTuOn3HTvAZrHTvDTvHTvGboHTvJU8HTvLl3HTvMXrHTvQb4HT4GT6HT4JT8HT4Jb#HT8Al3HT8GZrHT8GgrHT8HX4HT8Jb8HT8JnoHT8LTrHT8LgvHT8SToHT8SV8HUoJUoHUoJX8HUoLnrHXrLZoHXvAl3HX3LnrHX4FkvHX4LhrHX4MXoHX4OnoHZrAZ8HZrDb8HZrGZ8HZrJnrHZvGZ8HZvLnvHZ8JnvHZ8LhrHbCXJlHbMTAnHboJl4HbpLl3HbrJX8HbrLnrHbrMnvHbvRYrHgoSTrHgrFV8HgrGZ8HgrJXoHgrRnvHgvBb!HgvGTrHgvHX4HgvHn!HgvLTrHgvSU8HnDnLbHnFbJbHnvDn8Hn6GgvHn!BTvJTCTLnJTQgFnJTrAnvJTrLX4JTrOUoJTvFn3JTvLnrJTvNToJT3AgoJT3Jn4JT3LhvJT3ObrJT8AcrJT8Al3JT8JT8JT8JnoJT8LX4JT8LnrJT8MX3JT8Rg3JT8Sc8JUoBTvJU8AToJU8GZ8JU8GgvJU8JTrJU8JXrJU8JnrJU8LnvJU8ScvJXHnJlJXrGgvJXrJU8JXrLhrJXrMT8JXrMXrJXrQUoJXvCTvJXvGZ8JXvGgrJXvQT8JX8Ab8JX8DT8JX8GZ8JX8HZvJX8LnrJX8MT8JX8MXoJX8MnvJX8ST3JYGnCTJbAkGbJbCTAnJbLTAcJboDT3JboLb6JbrAnvJbrCn3JbrDl8JbrGboJbrIZoJbrJnvJbrMnvJbrQb4Jb8RZrJeAbAnJgJnFbJgScAnJgrATrJgvHZ8JgvMn4JlJlFbJlLiQXJlLjOnJlRbOlJlvNXoJlvRl3Jl4AcrJl8AUoJl8MnrJnFnMlJnHgGbJnoDT8JnoFV8JnoGgvJnoIT8JnoQToJnoRg3JnrCZ3JnrGgrJnrHTvJnrLf8JnrOX8JnvAT3JnvFZoJnvGT8JnvJl4JnvMT8JnvMX8JnvOXrJnvPX6JnvSX3JnvSZrJn3MT8Jn3MX8Jn3RTrLTATKnLTJnLTLTMXKnLTRTQlLToGb8LTrAZ8LTrCZ8LTrDb8LTrHT8LT3PX6LT4FZoLT$CTvLT$GgrLUvHX3LVoATrLVoAgoLVoJboLVoMX3LVoRg3LV8CZ3LV8FZoLV8GTvLXrDXoLXrFbrLXvAgvLXvFlrLXvLl3LXvRn6LX4Mb8LX8GT8LYCXMnLYrMnrLZoSTvLZrAZvLZrAloLZrFToLZrJXvLZrJboLZrJl4LZrLnrLZrMT8LZrOgvLZrRnvLZrST4LZvMX8LZvSlvLZ8AgoLZ8CT3LZ8JT8LZ8LV8LZ8LZoLZ8Lg8LZ8SV8LZ8SbrLZ$HT8LZ$Mn4La6CTvLbFbMnLbRYFTLbSnFZLboJT8LbrAT9LbrGb3LbrQb8LcrJX8LcrMXrLerHTvLerJbrLerNboLgrDb8LgrGZ8LgrHTrLgrMXrLgrSU8LgvJTrLgvLl3Lg6Ll3LhrLnrLhrMT8LhvAl4LiLnQXLkoAgrLkoJT8LkoJn4LlrSU8Ll3FZoLl3HTrLl3JX8Ll3JnoLl3LToLmLeFbLnDUFbLnLVAnLnrATrLnrAZoLnrAb8LnrAlrLnrGgvLnrJU8LnrLZrLnrLhrLnrMb8LnrOXrLnrSZ8LnvAb4LnvDTrLnvDl8LnvHTrLnvHbrLnvJT8LnvJU8LnvJbrLnvLhvLnvMX8LnvMb8LnvNnoLnvSU8Ln3Al3Ln4FZoLn4GT6Ln4JgvLn4LhrLn4MT8Ln4SToMToCZrMToJX8MToLX4MToLf8MToRg3MTrEloMTvGb6MT3BTrMT3Lb6MT8AcrMT8AgrMT8GZrMT8JnoMT8LnrMT8MX3MUOUAnMXAbFnMXoAloMXoJX8MXoLf8MXoLl8MXrAb8MXrDTvMXrGT8MXrGgrMXrHTrMXrLf8MXrMU8MXrOXvMXrQb8MXvGT8MXvHTrMXvLVoMX3AX3MX3Jn3MX3LhrMX3MX3MX4AlrMX4OboMX8GTvMX8GZrMX8GgrMX8JT8MX8JX8MX8LhrMX8MT8MYDUFbMYMgDbMbGnFfMbvLX4MbvLl3Mb8Mb8Mb8ST4MgGXCnMg8ATrMg8AgoMg8CZrMg8DTrMg8DboMg8HTrMg8JgrMg8LT8MloJXoMl8AhrMl8JT8MnLgAUMnoJXrMnoLX4MnoLhrMnoMT8MnrAl4MnrDb8MnrOTvMnrOgvMnrQb8MnrSU8MnvGgrMnvHZ8Mn3MToMn4DTrMn4LTrMn4Mg8NnBXAnOTFTFnOToAToOTrGgvOTrJX8OT3JXoOT6MTrOT8GgrOT8HTpOT8MToOUoHT8OUoJT8OUoLn3OXrAgoOXrDg8OXrMT8OXvSToOX6CTvOX8CZrOX8OgrOb6HgvOb8AToOb8MT8OcvLZ8OgvAlrOgvHTvOgvJTrOgvJnrOgvLZrOgvLn4OgvMT8OgvRTrOg8AZoOg8DbvOnrOXoOnvJn4OnvLhvOnvRTrOn3GgoOn3JnvOn6JbvOn8OTrPTGYFTPbBnFnPbGnDnPgDYQTPlrAnvPlrETvPlrLnvPlrMXvPlvFX4QTMTAnQTrJU8QYCnJlQYJlQlQbGTQbQb8JnrQb8LZoQb8LnvQb8MT8Qb8Ml8Qb8ST4QloAl4QloHZvQloJX8QloMn8QnJZOlRTrAZvRTrDTrRTvJn4RTvLhvRT4Jb8RZrAZrRZ8AkrRZ8JU8RZ8LV8RZ8LnvRbJlQXRg3GboRg3MnvRg8AZ8Rg8JboRg8Jl4RnLTCbRnvFl3RnvQb8SToAl4SToCZrSToFZoSToHXrSToJU8SToJgvSToJl4SToLhrSToMX3STrAlvSTrCT9STrCgrSTrGgrSTrHXrSTrHboSTrJnoSTrNboSTvLnrST4AZoST8Ab8ST8JT8SUoJn3SU6HZ#SU6JTvSU8Db8SU8HboSU8LgrSV8JT8SZrAcrSZrAl3SZrJT8SZrJnvSZrMT8SZvLUoSZ4FZoSZ8JnoSZ8RZrScoLnrScoMT8ScoMX8ScrAT4ScrAZ8ScrLZ8ScrLkvScvDb8ScvLf8ScvNToSgrFZrShvKnrSloHUoSloLnrSlrMXoSl8HgrSmrJUoSn3BX6\",\n      \"ATFlOn3ATLgrDYAT4MTAnAT8LTMnAYJnRTrAbGgJnrAbLV8LnAbvNTAnAeFbLg3AgOYMXoAlQbFboAnDboAfAnJgoJTBToDgAnBUJbAl3BboDUAnCTDlvLnCTFTrSnCYoQTLnDTwAbAnDUDTrSnDUHgHgrDX8LXFnDbJXAcrETvLTLnGTFTQbrGTMnGToGT3DUFbGUJlPX3GbQg8LnGboJbFnGb3GgAYGgAg8ScGgMbAXrGgvAbAnGnJTLnvGnvATFgHTDT6ATHTrDlJnHYLnMn8HZrSbJTHZ8LTFnHbFTJUoHgSeMT8HgrLjAnHgvAbAnHlFUrDlHnDgvAnHnHTFT3HnQTGnrJTAaMXvJTGbCn3JTOgrAnJXvAXMnJbMg8SnJbMnRg3Jb8LTMnJnAl3OnJnGYrQlJnJlQY3LTDlCn3LTJjLg3LTLgvFXLTMg3GTLV8HUOgLXFZLg3LXNXrMnLX8QXFnLX9AlMYLYLXPXrLZAbJU8LZDUJU8LZMXrSnLZ$AgFnLaPXrDULbFYrMnLbMn8LXLboJgJgLeFbLg3LgLZrSnLgOYAgoLhrRnJlLkCTrSnLkOnLhrLnFX%AYLnFZoJXLnHTvJbLnLloAbMTATLf8MTHgJn3MTMXrAXMT3MTFnMUITvFnMXFX%AYMXMXvFbMXrFTDbMYAcMX3MbLf8SnMb8JbFnMgMXrMTMgvAXFnMgvGgCmMnAloSnMnFnJTrOXvMXSnOX8HTMnObJT8ScObLZFl3ObMXCZoPTLgrQXPUFnoQXPU3RXJlPX3RkQXPbrJXQlPlrJbFnQUAhrDbQXGnCXvQYLnHlvQbLfLnvRTOgvJbRXJYrQlRYLnrQlRbLnrQlRlFT8JlRlFnrQXSTClCn3STHTrAnSTLZQlrSTMnGTrSToHgGbSTrGTDnSTvGXCnST3HgFbSU3HXAXSbAnJn3SbFT8LnScLfLnv\",\n      \"AT3JgJX8AT8FZoSnAT8JgFV8AT8LhrDbAZ8JT8DbAb8GgLhrAb8SkLnvAe8MT8SnAlMYJXLVAl3GYDTvAl3LfLnvBUDTvLl3CTOn3HTrCT3DUGgrCU8MT8AbCbFTrJUoCgrDb8MTDTLV8JX8DTLnLXQlDT8LZrSnDUQb8FZ8DUST4JnvDb8ScOUoDj6GbJl4GTLfCYMlGToAXvFnGboAXvLnGgAcrJn3GgvFnSToGnLf8JnvGn#HTDToHTLnFXJlHTvATFToHTvHTDToHTvMTAgoHT3STClvHT4AlFl6HT8HTDToHUoDgJTrHUoScMX3HbRZrMXoHboJg8LTHgDb8JTrHgMToLf8HgvLnLnoHnHn3HT4Hn6MgvAnJTJU8ScvJT3AaQT8JT8HTrAnJXrRg8AnJbAloMXoJbrATFToJbvMnoSnJgDb6GgvJgDb8MXoJgSX3JU8JguATFToJlPYLnQlJlQkDnLbJlQlFYJlJl8Lf8OTJnCTFnLbJnLTHXMnJnLXGXCnJnoFfRg3JnrMYRg3Jn3HgFl3KT8Dg8LnLTRlFnPTLTvPbLbvLVoSbrCZLXMY6HT3LXNU7DlrLXNXDTATLX8DX8LnLZDb8JU8LZMnoLhrLZSToJU8LZrLaLnrLZvJn3SnLZ8LhrSnLaJnoMT8LbFlrHTvLbrFTLnrLbvATLlvLb6OTFn3LcLnJZOlLeAT6Mn4LeJT3ObrLg6LXFlrLhrJg8LnLhvDlPX4LhvLfLnvLj6JTFT3LnFbrMXoLnQluCTvLnrQXCY6LnvLfLnvLnvMgLnvLnvSeLf8MTMbrJn3MT3JgST3MT8AnATrMT8LULnrMUMToCZrMUScvLf8MXoDT8SnMX6ATFToMX8AXMT8MX8FkMT8MX8HTrDUMX8ScoSnMYJT6CTvMgAcrMXoMg8SToAfMlvAXLg3MnFl3AnvOT3AnFl3OUoATHT8OU3RnLXrOXrOXrSnObPbvFn6Og8HgrSnOg8OX8DbPTvAgoJgPU3RYLnrPXrDnJZrPb8CTGgvPlrLTDlvPlvFUJnoQUvFXrQlQeMnoAl3QlrQlrSnRTFTrJUoSTDlLiLXSTFg6HT3STJgoMn4STrFTJTrSTrLZFl3ST4FnMXoSUrDlHUoScvHTvSnSfLkvMXo\",\n      \"AUoAcrMXoAZ8HboAg8AbOg6ATFgAg8AloMXoAl3AT8JTrAl8MX8MXoCT3SToJU8Cl8Db8MXoDT8HgrATrDboOT8MXoGTOTrATMnGT8LhrAZ8GnvFnGnQXHToGgvAcrHTvAXvLl3HbrAZoMXoHgBlFXLg3HgMnFXrSnHgrSb8JUoHn6HT8LgvITvATrJUoJUoLZrRnvJU8HT8Jb8JXvFX8QT8JXvLToJTrJYrQnGnQXJgrJnoATrJnoJU8ScvJnvMnvMXoLTCTLgrJXLTJlRTvQlLbRnJlQYvLbrMb8LnvLbvFn3RnoLdCVSTGZrLeSTvGXCnLg3MnoLn3MToLlrETvMT8SToAl3MbrDU6GTvMb8LX4LhrPlrLXGXCnSToLf8Rg3STrDb8LTrSTvLTHXMnSb3RYLnMnSgOg6ATFg\",\n      \"HUDlGnrQXrJTrHgLnrAcJYMb8DULc8LTvFgGnCk3Mg8JbAnLX4QYvFYHnMXrRUoJnGnvFnRlvFTJlQnoSTrBXHXrLYSUJgLfoMT8Se8DTrHbDb\",\n      \"AbDl8SToJU8An3RbAb8ST8DUSTrGnrAgoLbFU6Db8LTrMg8AaHT8Jb8ObDl8SToJU8Pb3RlvFYoJl\"\n    ];\n    var codes = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*\";\n    function getHangul(code) {\n      if (code >= 40) {\n        code = code + 168 - 40;\n      } else if (code >= 19) {\n        code = code + 97 - 19;\n      }\n      return (0, strings_1.toUtf8String)([225, (code >> 6) + 132, (code & 63) + 128]);\n    }\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = [];\n      data.forEach(function(data2, length) {\n        length += 4;\n        for (var i = 0; i < data2.length; i += length) {\n          var word = \"\";\n          for (var j = 0; j < length; j++) {\n            word += getHangul(codes.indexOf(data2[i + j]));\n          }\n          wordlist.push(word);\n        }\n      });\n      wordlist.sort();\n      if (wordlist_1.Wordlist.check(lang) !== \"0xf9eddeace9c5d3da9c93cf7d3cd38f6a13ed3affb933259ae865714e8a3ae71a\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for ko (Korean) FAILED\");\n      }\n    }\n    var LangKo = (\n      /** @class */\n      function(_super) {\n        __extends(LangKo2, _super);\n        function LangKo2() {\n          return _super.call(this, \"ko\") || this;\n        }\n        LangKo2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangKo2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangKo2;\n      }(wordlist_1.Wordlist)\n    );\n    var langKo = new LangKo();\n    exports2.langKo = langKo;\n    wordlist_1.Wordlist.register(langKo);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-it.js\nvar require_lang_it = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-it.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langIt = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbacoAbbaglioAbbinatoAbeteAbissoAbolireAbrasivoAbrogatoAccadereAccennoAccusatoAcetoneAchilleAcidoAcquaAcreAcrilicoAcrobataAcutoAdagioAddebitoAddomeAdeguatoAderireAdipeAdottareAdulareAffabileAffettoAffissoAffrantoAforismaAfosoAfricanoAgaveAgenteAgevoleAggancioAgireAgitareAgonismoAgricoloAgrumetoAguzzoAlabardaAlatoAlbatroAlberatoAlboAlbumeAlceAlcolicoAlettoneAlfaAlgebraAlianteAlibiAlimentoAllagatoAllegroAllievoAllodolaAllusivoAlmenoAlogenoAlpacaAlpestreAltalenaAlternoAlticcioAltroveAlunnoAlveoloAlzareAmalgamaAmanitaAmarenaAmbitoAmbratoAmebaAmericaAmetistaAmicoAmmassoAmmendaAmmirareAmmonitoAmoreAmpioAmpliareAmuletoAnacardoAnagrafeAnalistaAnarchiaAnatraAncaAncellaAncoraAndareAndreaAnelloAngeloAngolareAngustoAnimaAnnegareAnnidatoAnnoAnnuncioAnonimoAnticipoAnziApaticoAperturaApodeApparireAppetitoAppoggioApprodoAppuntoAprileArabicaArachideAragostaAraldicaArancioAraturaArazzoArbitroArchivioArditoArenileArgentoArgineArgutoAriaArmoniaArneseArredatoArringaArrostoArsenicoArsoArteficeArzilloAsciuttoAscoltoAsepsiAsetticoAsfaltoAsinoAsolaAspiratoAsproAssaggioAsseAssolutoAssurdoAstaAstenutoAsticeAstrattoAtavicoAteismoAtomicoAtonoAttesaAttivareAttornoAttritoAttualeAusilioAustriaAutistaAutonomoAutunnoAvanzatoAvereAvvenireAvvisoAvvolgereAzioneAzotoAzzimoAzzurroBabeleBaccanoBacinoBacoBadessaBadilataBagnatoBaitaBalconeBaldoBalenaBallataBalzanoBambinoBandireBaraondaBarbaroBarcaBaritonoBarlumeBaroccoBasilicoBassoBatostaBattutoBauleBavaBavosaBeccoBeffaBelgioBelvaBendaBenevoleBenignoBenzinaBereBerlinaBetaBibitaBiciBidoneBifidoBigaBilanciaBimboBinocoloBiologoBipedeBipolareBirbanteBirraBiscottoBisestoBisnonnoBisonteBisturiBizzarroBlandoBlattaBollitoBonificoBordoBoscoBotanicoBottinoBozzoloBraccioBradipoBramaBrancaBravuraBretellaBrevettoBrezzaBrigliaBrillanteBrindareBroccoloBrodoBronzinaBrulloBrunoBubboneBucaBudinoBuffoneBuioBulboBuonoBurloneBurrascaBussolaBustaCadettoCaducoCalamaroCalcoloCalesseCalibroCalmoCaloriaCambusaCamerataCamiciaCamminoCamolaCampaleCanapaCandelaCaneCaninoCanottoCantinaCapaceCapelloCapitoloCapogiroCapperoCapraCapsulaCarapaceCarcassaCardoCarismaCarovanaCarrettoCartolinaCasaccioCascataCasermaCasoCassoneCastelloCasualeCatastaCatenaCatrameCautoCavilloCedibileCedrataCefaloCelebreCellulareCenaCenoneCentesimoCeramicaCercareCertoCerumeCervelloCesoiaCespoCetoChelaChiaroChiccaChiedereChimeraChinaChirurgoChitarraCiaoCiclismoCifrareCignoCilindroCiottoloCircaCirrosiCitricoCittadinoCiuffoCivettaCivileClassicoClinicaCloroCoccoCodardoCodiceCoerenteCognomeCollareColmatoColoreColposoColtivatoColzaComaCometaCommandoComodoComputerComuneConcisoCondurreConfermaCongelareConiugeConnessoConoscereConsumoContinuoConvegnoCopertoCopioneCoppiaCopricapoCorazzaCordataCoricatoCorniceCorollaCorpoCorredoCorsiaCorteseCosmicoCostanteCotturaCovatoCratereCravattaCreatoCredereCremosoCrescitaCretaCricetoCrinaleCrisiCriticoCroceCronacaCrostataCrucialeCruscaCucireCuculoCuginoCullatoCupolaCuratoreCursoreCurvoCuscinoCustodeDadoDainoDalmataDamerinoDanielaDannosoDanzareDatatoDavantiDavveroDebuttoDecennioDecisoDeclinoDecolloDecretoDedicatoDefinitoDeformeDegnoDelegareDelfinoDelirioDeltaDemenzaDenotatoDentroDepositoDerapataDerivareDerogaDescrittoDesertoDesiderioDesumereDetersivoDevotoDiametroDicembreDiedroDifesoDiffusoDigerireDigitaleDiluvioDinamicoDinnanziDipintoDiplomaDipoloDiradareDireDirottoDirupoDisagioDiscretoDisfareDisgeloDispostoDistanzaDisumanoDitoDivanoDiveltoDividereDivoratoDobloneDocenteDoganaleDogmaDolceDomatoDomenicaDominareDondoloDonoDormireDoteDottoreDovutoDozzinaDragoDruidoDubbioDubitareDucaleDunaDuomoDupliceDuraturoEbanoEccessoEccoEclissiEconomiaEderaEdicolaEdileEditoriaEducareEgemoniaEgliEgoismoEgregioElaboratoElargireEleganteElencatoElettoElevareElficoElicaElmoElsaElusoEmanatoEmblemaEmessoEmiroEmotivoEmozioneEmpiricoEmuloEndemicoEnduroEnergiaEnfasiEnotecaEntrareEnzimaEpatiteEpilogoEpisodioEpocaleEppureEquatoreErarioErbaErbosoEredeEremitaErigereErmeticoEroeErosivoErranteEsagonoEsameEsanimeEsaudireEscaEsempioEsercitoEsibitoEsigenteEsistereEsitoEsofagoEsortatoEsosoEspansoEspressoEssenzaEssoEstesoEstimareEstoniaEstrosoEsultareEtilicoEtnicoEtruscoEttoEuclideoEuropaEvasoEvidenzaEvitatoEvolutoEvvivaFabbricaFaccendaFachiroFalcoFamigliaFanaleFanfaraFangoFantasmaFareFarfallaFarinosoFarmacoFasciaFastosoFasulloFaticareFatoFavolosoFebbreFecolaFedeFegatoFelpaFeltroFemminaFendereFenomenoFermentoFerroFertileFessuraFestivoFettaFeudoFiabaFiduciaFifaFiguratoFiloFinanzaFinestraFinireFioreFiscaleFisicoFiumeFlaconeFlamencoFleboFlemmaFloridoFluenteFluoroFobicoFocacciaFocosoFoderatoFoglioFolataFolcloreFolgoreFondenteFoneticoFoniaFontanaForbitoForchettaForestaFormicaFornaioForoFortezzaForzareFosfatoFossoFracassoFranaFrassinoFratelloFreccettaFrenataFrescoFrigoFrollinoFrondeFrugaleFruttaFucilataFucsiaFuggenteFulmineFulvoFumanteFumettoFumosoFuneFunzioneFuocoFurboFurgoneFuroreFusoFutileGabbianoGaffeGalateoGallinaGaloppoGamberoGammaGaranziaGarboGarofanoGarzoneGasdottoGasolioGastricoGattoGaudioGazeboGazzellaGecoGelatinaGelsoGemelloGemmatoGeneGenitoreGennaioGenotipoGergoGhepardoGhiaccioGhisaGialloGildaGineproGiocareGioielloGiornoGioveGiratoGironeGittataGiudizioGiuratoGiustoGlobuloGlutineGnomoGobbaGolfGomitoGommoneGonfioGonnaGovernoGracileGradoGraficoGrammoGrandeGrattareGravosoGraziaGrecaGreggeGrifoneGrigioGrinzaGrottaGruppoGuadagnoGuaioGuantoGuardareGufoGuidareIbernatoIconaIdenticoIdillioIdoloIdraIdricoIdrogenoIgieneIgnaroIgnoratoIlareIllesoIllogicoIlludereImballoImbevutoImboccoImbutoImmaneImmersoImmolatoImpaccoImpetoImpiegoImportoImprontaInalareInarcareInattivoIncantoIncendioInchinoIncisivoInclusoIncontroIncrocioIncuboIndagineIndiaIndoleIneditoInfattiInfilareInflittoIngaggioIngegnoIngleseIngordoIngrossoInnescoInodoreInoltrareInondatoInsanoInsettoInsiemeInsonniaInsulinaIntasatoInteroIntonacoIntuitoInumidireInvalidoInveceInvitoIperboleIpnoticoIpotesiIppicaIrideIrlandaIronicoIrrigatoIrrorareIsolatoIsotopoIstericoIstitutoIstriceItaliaIterareLabbroLabirintoLaccaLaceratoLacrimaLacunaLaddoveLagoLampoLancettaLanternaLardosoLargaLaringeLastraLatenzaLatinoLattugaLavagnaLavoroLegaleLeggeroLemboLentezzaLenzaLeoneLepreLesivoLessatoLestoLetteraleLevaLevigatoLiberoLidoLievitoLillaLimaturaLimitareLimpidoLineareLinguaLiquidoLiraLiricaLiscaLiteLitigioLivreaLocandaLodeLogicaLombareLondraLongevoLoquaceLorenzoLotoLotteriaLuceLucidatoLumacaLuminosoLungoLupoLuppoloLusingaLussoLuttoMacabroMacchinaMaceroMacinatoMadamaMagicoMagliaMagneteMagroMaiolicaMalafedeMalgradoMalintesoMalsanoMaltoMalumoreManaManciaMandorlaMangiareManifestoMannaroManovraMansardaMantideManubrioMappaMaratonaMarcireMarettaMarmoMarsupioMascheraMassaiaMastinoMaterassoMatricolaMattoneMaturoMazurcaMeandroMeccanicoMecenateMedesimoMeditareMegaMelassaMelisMelodiaMeningeMenoMensolaMercurioMerendaMerloMeschinoMeseMessereMestoloMetalloMetodoMettereMiagolareMicaMicelioMicheleMicroboMidolloMieleMiglioreMilanoMiliteMimosaMineraleMiniMinoreMirinoMirtilloMiscelaMissivaMistoMisurareMitezzaMitigareMitraMittenteMnemonicoModelloModificaModuloMoganoMogioMoleMolossoMonasteroMoncoMondinaMonetarioMonileMonotonoMonsoneMontatoMonvisoMoraMordereMorsicatoMostroMotivatoMotosegaMottoMovenzaMovimentoMozzoMuccaMucosaMuffaMughettoMugnaioMulattoMulinelloMultiploMummiaMuntoMuovereMuraleMusaMuscoloMusicaMutevoleMutoNababboNaftaNanometroNarcisoNariceNarratoNascereNastrareNaturaleNauticaNaviglioNebulosaNecrosiNegativoNegozioNemmenoNeofitaNerettoNervoNessunoNettunoNeutraleNeveNevroticoNicchiaNinfaNitidoNobileNocivoNodoNomeNominaNordicoNormaleNorvegeseNostranoNotareNotiziaNotturnoNovellaNucleoNullaNumeroNuovoNutrireNuvolaNuzialeOasiObbedireObbligoObeliscoOblioOboloObsoletoOccasioneOcchioOccidenteOccorrereOccultareOcraOculatoOdiernoOdorareOffertaOffrireOffuscatoOggettoOggiOgnunoOlandeseOlfattoOliatoOlivaOlogrammaOltreOmaggioOmbelicoOmbraOmegaOmissioneOndosoOnereOniceOnnivoroOnorevoleOntaOperatoOpinioneOppostoOracoloOrafoOrdineOrecchinoOreficeOrfanoOrganicoOrigineOrizzonteOrmaOrmeggioOrnativoOrologioOrrendoOrribileOrtensiaOrticaOrzataOrzoOsareOscurareOsmosiOspedaleOspiteOssaOssidareOstacoloOsteOtiteOtreOttagonoOttimoOttobreOvaleOvestOvinoOviparoOvocitoOvunqueOvviareOzioPacchettoPacePacificoPadellaPadronePaesePagaPaginaPalazzinaPalesarePallidoPaloPaludePandoroPannelloPaoloPaonazzoPapricaParabolaParcellaParerePargoloPariParlatoParolaPartireParvenzaParzialePassivoPasticcaPataccaPatologiaPattumePavonePeccatoPedalarePedonalePeggioPelosoPenarePendicePenisolaPennutoPenombraPensarePentolaPepePepitaPerbenePercorsoPerdonatoPerforarePergamenaPeriodoPermessoPernoPerplessoPersuasoPertugioPervasoPesatorePesistaPesoPestiferoPetaloPettinePetulantePezzoPiacerePiantaPiattinoPiccinoPicozzaPiegaPietraPifferoPigiamaPigolioPigroPilaPiliferoPillolaPilotaPimpantePinetaPinnaPinoloPioggiaPiomboPiramidePireticoPiritePirolisiPitonePizzicoPlaceboPlanarePlasmaPlatanoPlenarioPochezzaPoderosoPodismoPoesiaPoggiarePolentaPoligonoPollicePolmonitePolpettaPolsoPoltronaPolverePomicePomodoroPontePopolosoPorfidoPorosoPorporaPorrePortataPosaPositivoPossessoPostulatoPotassioPoterePranzoPrassiPraticaPreclusoPredicaPrefissoPregiatoPrelievoPremerePrenotarePreparatoPresenzaPretestoPrevalsoPrimaPrincipePrivatoProblemaProcuraProdurreProfumoProgettoProlungaPromessaPronomePropostaProrogaProtesoProvaPrudentePrugnaPruritoPsichePubblicoPudicaPugilatoPugnoPulcePulitoPulsantePuntarePupazzoPupillaPuroQuadroQualcosaQuasiQuerelaQuotaRaccoltoRaddoppioRadicaleRadunatoRafficaRagazzoRagioneRagnoRamarroRamingoRamoRandagioRantolareRapatoRapinaRappresoRasaturaRaschiatoRasenteRassegnaRastrelloRataRavvedutoRealeRecepireRecintoReclutaReconditoRecuperoRedditoRedimereRegalatoRegistroRegolaRegressoRelazioneRemareRemotoRennaReplicaReprimereReputareResaResidenteResponsoRestauroReteRetinaRetoricaRettificaRevocatoRiassuntoRibadireRibelleRibrezzoRicaricaRiccoRicevereRiciclatoRicordoRicredutoRidicoloRidurreRifasareRiflessoRiformaRifugioRigareRigettatoRighelloRilassatoRilevatoRimanereRimbalzoRimedioRimorchioRinascitaRincaroRinforzoRinnovoRinomatoRinsavitoRintoccoRinunciaRinvenireRiparatoRipetutoRipienoRiportareRipresaRipulireRisataRischioRiservaRisibileRisoRispettoRistoroRisultatoRisvoltoRitardoRitegnoRitmicoRitrovoRiunioneRivaRiversoRivincitaRivoltoRizomaRobaRoboticoRobustoRocciaRocoRodaggioRodereRoditoreRogitoRollioRomanticoRompereRonzioRosolareRospoRotanteRotondoRotulaRovescioRubizzoRubricaRugaRullinoRumineRumorosoRuoloRupeRussareRusticoSabatoSabbiareSabotatoSagomaSalassoSaldaturaSalgemmaSalivareSalmoneSaloneSaltareSalutoSalvoSapereSapidoSaporitoSaracenoSarcasmoSartoSassosoSatelliteSatiraSatolloSaturnoSavanaSavioSaziatoSbadiglioSbalzoSbancatoSbarraSbattereSbavareSbendareSbirciareSbloccatoSbocciatoSbrinareSbruffoneSbuffareScabrosoScadenzaScalaScambiareScandaloScapolaScarsoScatenareScavatoSceltoScenicoScettroSchedaSchienaSciarpaScienzaScindereScippoSciroppoScivoloSclerareScodellaScolpitoScompartoSconfortoScoprireScortaScossoneScozzeseScribaScrollareScrutinioScuderiaScultoreScuolaScuroScusareSdebitareSdoganareSeccaturaSecondoSedanoSeggiolaSegnalatoSegregatoSeguitoSelciatoSelettivoSellaSelvaggioSemaforoSembrareSemeSeminatoSempreSensoSentireSepoltoSequenzaSerataSerbatoSerenoSerioSerpenteSerraglioServireSestinaSetolaSettimanaSfaceloSfaldareSfamatoSfarzosoSfaticatoSferaSfidaSfilatoSfingeSfocatoSfoderareSfogoSfoltireSforzatoSfrattoSfruttatoSfuggitoSfumareSfusoSgabelloSgarbatoSgonfiareSgorbioSgrassatoSguardoSibiloSiccomeSierraSiglaSignoreSilenzioSillabaSimboloSimpaticoSimulatoSinfoniaSingoloSinistroSinoSintesiSinusoideSiparioSismaSistoleSituatoSlittaSlogaturaSlovenoSmarritoSmemoratoSmentitoSmeraldoSmilzoSmontareSmottatoSmussatoSnellireSnervatoSnodoSobbalzoSobrioSoccorsoSocialeSodaleSoffittoSognoSoldatoSolenneSolidoSollazzoSoloSolubileSolventeSomaticoSommaSondaSonettoSonniferoSopireSoppesoSopraSorgereSorpassoSorrisoSorsoSorteggioSorvolatoSospiroSostaSottileSpadaSpallaSpargereSpatolaSpaventoSpazzolaSpecieSpedireSpegnereSpelaturaSperanzaSpessoreSpettraleSpezzatoSpiaSpigolosoSpillatoSpinosoSpiraleSplendidoSportivoSposoSprangaSprecareSpronatoSpruzzoSpuntinoSquilloSradicareSrotolatoStabileStaccoStaffaStagnareStampatoStantioStarnutoStaseraStatutoSteloSteppaSterzoStilettoStimaStirpeStivaleStizzosoStonatoStoricoStrappoStregatoStriduloStrozzareStruttoStuccareStufoStupendoSubentroSuccosoSudoreSuggeritoSugoSultanoSuonareSuperboSupportoSurgelatoSurrogatoSussurroSuturaSvagareSvedeseSveglioSvelareSvenutoSveziaSviluppoSvistaSvizzeraSvoltaSvuotareTabaccoTabulatoTacciareTaciturnoTaleTalismanoTamponeTanninoTaraTardivoTargatoTariffaTarpareTartarugaTastoTatticoTavernaTavolataTazzaTecaTecnicoTelefonoTemerarioTempoTemutoTendoneTeneroTensioneTentacoloTeoremaTermeTerrazzoTerzettoTesiTesseratoTestatoTetroTettoiaTifareTigellaTimbroTintoTipicoTipografoTiraggioTiroTitanioTitoloTitubanteTizioTizzoneToccareTollerareToltoTombolaTomoTonfoTonsillaTopazioTopologiaToppaTorbaTornareTorroneTortoraToscanoTossireTostaturaTotanoTraboccoTracheaTrafilaTragediaTralcioTramontoTransitoTrapanoTrarreTraslocoTrattatoTraveTrecciaTremolioTrespoloTributoTrichecoTrifoglioTrilloTrinceaTrioTristezzaTrituratoTrivellaTrombaTronoTroppoTrottolaTrovareTruccatoTubaturaTuffatoTulipanoTumultoTunisiaTurbareTurchinoTutaTutelaUbicatoUccelloUccisoreUdireUditivoUffaUfficioUgualeUlisseUltimatoUmanoUmileUmorismoUncinettoUngereUnghereseUnicornoUnificatoUnisonoUnitarioUnteUovoUpupaUraganoUrgenzaUrloUsanzaUsatoUscitoUsignoloUsuraioUtensileUtilizzoUtopiaVacanteVaccinatoVagabondoVagliatoValangaValgoValicoVallettaValorosoValutareValvolaVampataVangareVanitosoVanoVantaggioVanveraVaporeVaranoVarcatoVarianteVascaVedettaVedovaVedutoVegetaleVeicoloVelcroVelinaVellutoVeloceVenatoVendemmiaVentoVeraceVerbaleVergognaVerificaVeroVerrucaVerticaleVescicaVessilloVestaleVeteranoVetrinaVetustoViandanteVibranteVicendaVichingoVicinanzaVidimareVigiliaVignetoVigoreVileVillanoViminiVincitoreViolaViperaVirgolaVirologoVirulentoViscosoVisioneVispoVissutoVisuraVitaVitelloVittimaVivandaVividoViziareVoceVogaVolatileVolereVolpeVoragineVulcanoZampognaZannaZappatoZatteraZavorraZefiroZelanteZeloZenzeroZerbinoZibettoZincoZirconeZittoZollaZoticoZuccheroZufoloZuluZuppa\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x5c1362d88fd4cf614a96f3234941d29f7d37c08c5292fde03bf62c2db6ff7620\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for it (Italian) FAILED\");\n      }\n    }\n    var LangIt = (\n      /** @class */\n      function(_super) {\n        __extends(LangIt2, _super);\n        function LangIt2() {\n          return _super.call(this, \"it\") || this;\n        }\n        LangIt2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangIt2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangIt2;\n      }(wordlist_1.Wordlist)\n    );\n    var langIt = new LangIt();\n    exports2.langIt = langIt;\n    wordlist_1.Wordlist.register(langIt);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-zh.js\nvar require_lang_zh = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-zh.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langZhTw = exports2.langZhCn = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = \"}aE#4A=Yv&co#4N#6G=cJ&SM#66|/Z#4t&kn~46#4K~4q%b9=IR#7l,mB#7W_X2*dl}Uo~7s}Uf&Iw#9c&cw~6O&H6&wx&IG%v5=IQ~8a&Pv#47$PR&50%Ko&QM&3l#5f,D9#4L|/H&tQ;v0~6n]nN<di,AM=W5%QO&ka&ua,hM^tm=zV=JA=wR&+X]7P&NB#4J#5L|/b[dA}tJ<Do&6m&u2[U1&Kb.HM&mC=w0&MW<rY,Hq#6M}QG,13&wP}Jp]Ow%ue&Kg<HP<D9~4k~9T&I2_c6$9T#9/[C5~7O~4a=cs&O7=KK=An&l9$6U$8A&uD&QI|/Y&bg}Ux&F2#6b}E2&JN&kW&kp=U/&bb=Xl<Cj}k+~5J#6L&5z&9i}b4&Fo,ho(X0_g3~4O$Fz&QE<HN=Ww]6/%GF-Vw=tj&/D&PN#9g=YO}cL&Of&PI~5I&Ip=vU=IW#9G;0o-wU}ss&QR<BT&R9=tk$PY_dh&Pq-yh]7T,nj.Xu=EP&76=cI&Fs*Xg}z7$Gb&+I=DF,AF=cA}rL#7j=Dz&3y<Aa$52=PQ}b0(iY$Fa}oL&xV#6U=ec=WZ,xh%RY<dp#9N&Fl&44=WH*A7=sh&TB&8P=07;u+&PK}uh}J5#72)V/=xC,AB$k0&f6;1E|+5=1B,3v]6n&wR%b+&xx]7f=Ol}fl;+D^wG]7E;nB;uh^Ir&l5=JL,nS=cf=g5;u6|/Q$Gc=MH%Hg#5d%M6^86=U+$Gz,l/,ir^5y&Ba&/F-IY&FI&be%IZ#77&PW_Nu$kE(Yf&NX]7Z,Jy&FJ(Xo&Nz#/d=y7&MX<Ag}Z+;nE]Dt(iG#4D=13&Pj~4c%v8&Zo%OL&/X#4W<HR&ie~6J_1O(Y2=y5=Ad*cv_eB#6k&PX:BU#7A;uk&Ft&Fx_dD=U2;vB=U5=4F}+O&GN.HH:9s=b0%NV(jO&IH=JT}Z9=VZ<Af,Kx^4m&uJ%c6,6r;9m#+L}cf%Kh&F3~4H=vP}bu,Hz|++,1w]nv}k6;uu$jw*Kl*WX&uM[x7&Fr[m7$NO&QN]hu=JN}nR^8g#/h(ps|KC;vd}xz=V0}p6&FD$G1#7K<bG_4p~8g&cf;u4=tl}+k%5/}fz;uw<cA=u1}gU}VM=LJ=eX&+L&Pr#4U}p2:nC,2K]7H:jF&9x}uX#9O=MB<fz~8X~5m&4D&kN&u5%E/(h7(ZF&VG<de(qM|/e-Wt=3x(a+,/R]f/&ND$Ro&nU}0g=KA%kH&NK$Ke<dS}cB&IX~5g$TN]6m=Uv,Is&Py=Ef%Kz#+/%bi&+A<F4$OG&4C&FL#9V<Zk=2I_eE&6c]nw&kq$HG}y+&A8$P3}OH=XP]70%IS(AJ_gH%GZ&tY&AZ=vb~6y&/r=VI=Wv<Zi=fl=xf&eL}c8}OL=MJ=g8$F7=YT}9u=0+^xC}JH&nL^N0~4T]K2,Cy%OC#6s;vG(AC^xe^cG&MF}Br#9P;wD-7h$O/&xA}Fn^PC]6i]7G&8V$Qs;vl(TB~73~4l<mW&6V=2y&uY&+3)aP}XF;LP&kx$wU=t7;uy<FN&lz)7E=Oo*Y+;wI}9q}le;J6&Ri&4t&Qr#8B=cb&vG=J5|Ql(h5<Yy~4+}QD,Lx=wn%K/&RK=dO&Pw,Q9=co%4u;9u}g0@6a^4I%b0=zo|/c&tX=dQ=OS#+b=yz_AB&wB&Pm=W9$HP_gR=62=AO=ti=hI,oA&jr&dH=tm&b6$P2(x8=zi;nG~7F;05]0n[Ix&3m}rg=Xp=cd&uz]7t;97=cN;vV<jf&FF&F1=6Q&Ik*Kk&P4,2z=fQ]7D&3u,H0=d/}Uw<ZN<7R}Kv;0f$H7,MD]7n$F0#88~9Z%da=by;+T#/u=VF&fO&kr^kf<AB]sU,I5$Ng&Pz;0i&QD&vM=Yl:BM;nJ_xJ]U7&Kf&30,3f|Z9*dC)je_jA&Q4&Kp$NH(Yz#6S&Id%Ib=KX,AD=KV%dP}tW&Pk^+E_Ni=cq,3R}VZ(Si=b+}rv;0j}rZ]uA,/w(Sx&Jv$w9&4d&wE,NJ$Gy=J/]Ls#7k<ZQ<Y/&uj]Ov$PM;v3,2F&+u:up=On&3e,Jv;90=J+&Qm]6q}bK#+d~8Y(h2]hA;99&AS=I/}qB&dQ}yJ-VM}Vl&ui,iB&G3|Dc]7d=eQ%dX%JC_1L~4d^NP;vJ&/1)ZI#7N]9X[bQ&PL=0L(UZ,Lm&kc&IR}n7(iR<AQ<dg=33=vN}ft}au]7I,Ba=x9=dR~6R&Tq=Xi,3d$Nr&Bc}DI&ku&vf]Dn,/F&iD,Ll&Nw=0y&I7=Ls=/A&tU=Qe}Ua&uk&+F=g4=gh=Vj#+1&Qn}Uy*44#5F,Pc&Rz*Xn=oh=5W;0n_Nf(iE<Y7=vr=Zu]oz#5Z%mI=kN=Bv_Jp(T2;vt_Ml<FS&uI=L/&6P]64$M7}86<bo%QX(SI%IY&VK=Al&Ux;vv;ut*E/%uh<ZE|O3,M2(yc]yu=Wk&tp:Ex}hr,Cl&WE)+Z=8U}I2_4Q,hA_si=iw=OM=tM=yZ%Ia=U7;wT}b+;uo=Za}yS!5x}HD}fb#5O_dA;Nv%uB(yB;01(Sf}Fk;v7}Pt#8v<mZ#7L,/r&Pl~4w&f5=Ph$Fw_LF&8m,bL=yJ&BH}p/*Jn}tU~5Q;wB(h6]Df]8p^+B;E4&Wc=d+;Ea&bw$8C&FN,DM=Yf}mP~5w=fT#6V=mC=Fi=AV}jB&AN}lW}aH#/D)dZ;hl;vE}/7,CJ;31&w8,hj%u9_Js=jJ&4M~8k=TN&eC}nL&uc-wi&lX}dj=Mv=e2#6u=cr$uq$6G]8W}Jb:nm=Yg<b3(UA;vX&6n&xF=KT,jC,De&R8&oY=Zv&oB]7/=Z2&Oa}bf,hh(4h^tZ&72&Nx;D2&xL~5h~40)ZG)h+=OJ&RA]Bv$yB=Oq=df,AQ%Jn}OJ;11,3z&Tl&tj;v+^Hv,Dh(id=s+]7N&N3)9Q~8f,S4=uW=w4&uX,LX&3d]CJ&yp&8x<b2_do&lP=y/<cy_dG=Oi=7R(VH(lt_1T,Iq_AA;12^6T%k6#8K[B1{oO<AU[Bt;1b$9S&Ps<8T=St{bY,jB(Zp&63&Uv$9V,PM]6v&Af}zW[bW_oq}sm}nB&Kq&gC&ff_eq_2m&5F&TI}rf}Gf;Zr_z9;ER&jk}iz_sn<BN~+n&vo=Vi%97|ZR=Wc,WE&6t]6z%85(ly#84=KY)6m_5/=aX,N3}Tm&he&6K]tR_B2-I3;u/&hU&lH<AP=iB&IA=XL;/5&Nh=wv<BH#79=vS=zl<AA=0X_RG}Bw&9p$NW,AX&kP_Lp&/Z(Tc]Mu}hs#6I}5B&cI<bq&H9#6m=K9}vH(Y1(Y0#4B&w6,/9&gG<bE,/O=zb}I4_l8<B/;wL%Qo<HO[Mq=XX}0v&BP&F4(mG}0i}nm,EC=9u{I3,xG&/9=JY*DK&hR)BX=EI=cx=b/{6k}yX%A+&wa}Xb=la;wi^lL;0t}jo&Qb=xg=XB}iO<qo{bR=NV&8f=a0&Jy;0v=uK)HK;vN#6h&jB(h/%ud&NI%wY.X7=Pt}Cu-uL&Gs_hl%mH,tm]78=Lb^Q0#7Y=1u<Bt&+Q=Co_RH,w3;1e}ux<aU;ui}U3&Q5%bt]63&UQ|0l&uL}O7&3o,AV&dm|Nj(Xt*5+(Uu&Hh(p7(UF=VR=Bp^Jl&Hd[ix)9/=Iq]C8<67]66}mB%6f}bb}JI]8T$HA}db=YM&pa=2J}tS&Y0=PS&y4=cX$6E,hX,XP&nR;04,FQ&l0&Vm_Dv#5Y~8Z=Bi%MA]6x=JO:+p,Az&9q,Hj~6/}SD=K1:EJ}nA;Qo#/E]9R,Ie&6X%W3]61&v4=xX_MC=0q;06(Xq=fs}IG}Dv=0l}o7$iZ;9v&LH&DP-7a&OY,SZ,Kz,Cv&dh=fx|Nh,F/~7q=XF&w+;9n&Gw;0h}Z7<7O&JK(S7&LS<AD<ac=wo<Dt&zw%4B=4v#8P;9o~6p*vV=Tm,Or&I6=1q}nY=P0=gq&Bl&Uu,Ch%yb}UY=zh}dh}rl(T4_xk(YA#8R*xH,IN}Jn]7V}C4&Ty}j3]7p=cL=3h&wW%Qv<Z3=f0&RI&+S(ic_zq}oN&/Y=z1;Td=LW=0e=OI(Vc,+b^ju(UL;0r:Za%8v=Rp=zw&58&73&wK}qX]6y&8E)a2}WR=wP^ur&nQ<cH}Re=Aq&wk}Q0&+q=PP,Gc|/d^k5,Fw]8Y}Pg]p3=ju=ed}r5_yf&Cs]7z$/G<Cm&Jp&54_1G_gP_Ll}JZ;0u]k8_7k(Sg]65{9i=LN&Sx&WK,iW&fD&Lk{9a}Em-9c#8N&io=sy]8d&nT&IK(lx#7/$lW(Td<s8~49,3o<7Y=MW(T+_Jr&Wd,iL}Ct=xh&5V;v4&8n%Kx=iF&l2_0B{B+,If(J0,Lv;u8=Kx-vB=HC&vS=Z6&fU&vE^xK;3D=4h=MR#45:Jw;0d}iw=LU}I5=I0]gB*im,K9}GU,1k_4U&Tt=Vs(iX&lU(TF#7y,ZO}oA&m5#5P}PN}Uz=hM<B1&FB<aG,e6~7T<tP(UQ_ZT=wu&F8)aQ]iN,1r_Lo&/g:CD}84{J1_Ki&Na&3n$jz&FE=dc;uv;va}in}ll=fv(h1&3h}fp=Cy}BM(+E~8m}lo%v7=hC(T6$cj=BQ=Bw(DR,2j=Ks,NS|F+;00=fU=70}Mb(YU;+G&m7&hr=Sk%Co]t+(X5_Jw}0r}gC(AS-IP&QK<Z2#8Q$WC]WX}T2&pG_Ka,HC=R4&/N;Z+;ch(C7,D4$3p_Mk&B2$8D=n9%Ky#5z(CT&QJ#7B]DC]gW}nf~5M;Iw#80}Tc_1F#4Z-aC}Hl=ph=fz,/3=aW}JM}nn;DG;vm}wn,4P}T3;wx&RG$u+}zK=0b;+J_Ek{re<aZ=AS}yY#5D]7q,Cp}xN=VP*2C}GZ}aG~+m_Cs=OY#6r]6g<GS}LC(UB=3A=Bo}Jy<c4}Is;1P<AG}Op<Z1}ld}nS=1Z,yM&95&98=CJ(4t:2L$Hk=Zo}Vc;+I}np&N1}9y=iv}CO*7p=jL)px]tb^zh&GS&Vl%v/;vR=14=zJ&49|/f]hF}WG;03=8P}o/&Gg&rp;DB,Kv}Ji&Pb;aA^ll(4j%yt}+K$Ht#4y&hY]7Y<F1,eN}bG(Uh%6Z]t5%G7;+F_RE;it}tL=LS&Da=Xx(S+(4f=8G=yI}cJ}WP=37=jS}pX}hd)fp<A8=Jt~+o$HJ=M6}iX=g9}CS=dv=Cj(mP%Kd,xq|+9&LD(4/=Xm&QP=Lc}LX&fL;+K=Op(lu=Qs.qC:+e&L+=Jj#8w;SL]7S(b+#4I=c1&nG_Lf&uH;+R)ZV<bV%B/,TE&0H&Jq&Ah%OF&Ss(p2,Wv&I3=Wl}Vq;1L&lJ#9b_1H=8r=b8=JH(SZ=hD=J2#7U,/U#/X~6P,FU<eL=jx,mG=hG=CE&PU=Se(qX&LY=X6=y4&tk&QQ&tf=4g&xI}W+&mZ=Dc#7w}Lg;DA;wQ_Kb(cJ=hR%yX&Yb,hw{bX_4X;EP;1W_2M}Uc=b5(YF,CM&Tp^OJ{DD]6s=vF=Yo~8q}XH}Fu%P5(SJ=Qt;MO]s8<F3&B3&8T(Ul-BS*dw&dR<87}/8]62$PZ]Lx<Au}9Q]7c=ja=KR,Go,Us&v6(qk}pG&G2=ev^GM%w4&H4]7F&dv]J6}Ew:9w=sj-ZL}Ym$+h(Ut(Um~4n=Xs(U7%eE=Qc_JR<CA#6t<Fv|/I,IS,EG<F2(Xy$/n<Fa(h9}+9_2o&N4#7X<Zq|+f_Dp=dt&na,Ca=NJ)jY=8C=YG=s6&Q+<DO}D3=xB&R1(lw;Qn<bF(Cu|/B}HV=SS&n7,10&u0]Dm%A6^4Q=WR(TD=Xo<GH,Rj(l8)bP&n/=LM&CF,F5&ml=PJ;0k=LG=tq,Rh,D6@4i=1p&+9=YC%er_Mh;nI;0q=Fw]80=xq=FM$Gv;v6&nc;wK%H2&Kj;vs,AA=YP,66}bI(qR~5U=6q~4b$Ni=K5.X3$So&Iu(p+]8G=Cf=RY(TS_O3(iH&57=fE=Dg_Do#9z#7H;FK{qd_2k%JR}en&gh_z8;Rx}9p<cN_Ne,DO;LN_7o~/p=NF=5Y}gN<ce<C1,QE]Wv=3u<BC}GK]yq}DY&u/_hj=II(pz&rC,jV&+Z}ut=NQ;Cg-SR_ZS,+o=u/;Oy_RK_QF(Fx&xP}Wr&TA,Uh&g1=yr{ax[VF$Pg(YB;Ox=Vy;+W(Sp}XV%dd&33(l/]l4#4Y}OE=6c=bw(A7&9t%wd&N/&mo,JH&Qe)fm=Ao}fu=tH\";\n    var deltaData = \"FAZDC6BALcLZCA+GBARCW8wNCcDDZ8LVFBOqqDUiou+M42TFAyERXFb7EjhP+vmBFpFrUpfDV2F7eB+eCltCHJFWLFCED+pWTojEIHFXc3aFn4F68zqjEuKidS1QBVPDEhE7NA4mhMF7oThD49ot3FgtzHFCK0acW1x8DH1EmLoIlrWFBLE+y5+NA3Cx65wJHTaEZVaK1mWAmPGxgYCdxwOjTDIt/faOEhTl1vqNsKtJCOhJWuio2g07KLZEQsFBUpNtwEByBgxFslFheFbiEPvi61msDvApxCzB6rBCzox7joYA5UdDc+Cb4FSgIabpXFAj3bjkmFAxCZE+mD/SFf/0ELecYCt3nLoxC6WEZf2tKDB4oZvrEmqFkKk7BwILA7gtYBpsTq//D4jD0F0wEB9pyQ1BD5Ba0oYHDI+sbDFhvrHXdDHfgFEIJLi5r8qercNFBgFLC4bo5ERJtamWBDFy73KCEb6M8VpmEt330ygCTK58EIIFkYgF84gtGA9Uyh3m68iVrFbWFbcbqiCYHZ9J1jeRPbL8yswhMiDbhEhdNoSwFbZrLT740ABEqgCkO8J1BLd1VhKKR4sD1yUo0z+FF59Mvg71CFbyEhbHSFBKEIKyoQNgQppq9T0KAqePu0ZFGrXOHdKJqkoTFhYvpDNyuuznrN84thJbsCoO6Cu6Xlvntvy0QYuAExQEYtTUBf3CoCqwgGFZ4u1HJFzDVwEy3cjcpV4QvsPaBC3rCGyCF23o4K3pp2gberGgFEJEHo4nHICtyKH2ZqyxhN05KBBJIQlKh/Oujv/DH32VrlqFdIFC7Fz9Ct4kaqFME0UETLprnN9kfy+kFmtQBB0+5CFu0N9Ij8l/VvJDh2oq3hT6EzjTHKFN7ZjZwoTsAZ4Exsko6Fpa6WC+sduz8jyrLpegTv2h1EBeYpLpm2czQW0KoCcS0bCVXCmuWJDBjN1nQNLdF58SFJ0h7i3pC3oEOKy/FjBklL70XvBEEIWp2yZ04xObzAWDDJG7f+DbqBEA7LyiR95j7MDVdDViz2RE5vWlBMv5e4+VfhP3aXNPhvLSynb9O2x4uFBV+3jqu6d5pCG28/sETByvmu/+IJ0L3wb4rj9DNOLBF6XPIODr4L19U9RRofAG6Nxydi8Bki8BhGJbBAJKzbJxkZSlF9Q2Cu8oKqggB9hBArwLLqEBWEtFowy8XK8bEyw9snT+BeyFk1ZCSrdmgfEwFePTgCjELBEnIbjaDDPJm36rG9pztcEzT8dGk23SBhXBB1H4z+OWze0ooFzz8pDBYFvp9j9tvFByf9y4EFdVnz026CGR5qMr7fxMHN8UUdlyJAzlTBDRC28k+L4FB8078ljyD91tUj1ocnTs8vdEf7znbzm+GIjEZnoZE5rnLL700Xc7yHfz05nWxy03vBB9YGHYOWxgMQGBCR24CVYNE1hpfKxN0zKnfJDmmMgMmBWqNbjfSyFCBWSCGCgR8yFXiHyEj+VtD1FB3FpC1zI0kFbzifiKTLm9yq5zFmur+q8FHqjoOBWsBPiDbnCC2ErunV6cJ6TygXFYHYp7MKN9RUlSIS8/xBAGYLzeqUnBF4QbsTuUkUqGs6CaiDWKWjQK9EJkjpkTmNCPYXL\";\n    var wordlist = {\n      zh_cn: null,\n      zh_tw: null\n    };\n    var Checks = {\n      zh_cn: \"0x17bcc4d8547e5a7135e365d1ab443aaae95e76d8230c2782c67305d4f21497a1\",\n      zh_tw: \"0x51e720e90c7b87bec1d70eb6e74a21a449bd3ec9c020b01d3a40ed991b60ce5d\"\n    };\n    var codes = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var style = \"~!@#$%^&*_-=[]{}|;:,.()<>?\";\n    function loadWords(lang) {\n      if (wordlist[lang.locale] !== null) {\n        return;\n      }\n      wordlist[lang.locale] = [];\n      var deltaOffset = 0;\n      for (var i = 0; i < 2048; i++) {\n        var s = style.indexOf(data[i * 3]);\n        var bytes = [\n          228 + (s >> 2),\n          128 + codes.indexOf(data[i * 3 + 1]),\n          128 + codes.indexOf(data[i * 3 + 2])\n        ];\n        if (lang.locale === \"zh_tw\") {\n          var common = s % 4;\n          for (var i_1 = common; i_1 < 3; i_1++) {\n            bytes[i_1] = codes.indexOf(deltaData[deltaOffset++]) + (i_1 == 0 ? 228 : 128);\n          }\n        }\n        wordlist[lang.locale].push((0, strings_1.toUtf8String)(bytes));\n      }\n      if (wordlist_1.Wordlist.check(lang) !== Checks[lang.locale]) {\n        wordlist[lang.locale] = null;\n        throw new Error(\"BIP39 Wordlist for \" + lang.locale + \" (Chinese) FAILED\");\n      }\n    }\n    var LangZh = (\n      /** @class */\n      function(_super) {\n        __extends(LangZh2, _super);\n        function LangZh2(country) {\n          return _super.call(this, \"zh_\" + country) || this;\n        }\n        LangZh2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[this.locale][index];\n        };\n        LangZh2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist[this.locale].indexOf(word);\n        };\n        LangZh2.prototype.split = function(mnemonic) {\n          mnemonic = mnemonic.replace(/(?:\\u3000| )+/g, \"\");\n          return mnemonic.split(\"\");\n        };\n        return LangZh2;\n      }(wordlist_1.Wordlist)\n    );\n    var langZhCn = new LangZh(\"cn\");\n    exports2.langZhCn = langZhCn;\n    wordlist_1.Wordlist.register(langZhCn);\n    wordlist_1.Wordlist.register(langZhCn, \"zh\");\n    var langZhTw = new LangZh(\"tw\");\n    exports2.langZhTw = langZhTw;\n    wordlist_1.Wordlist.register(langZhTw);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/wordlists.js\nvar require_wordlists = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/wordlists.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.wordlists = void 0;\n    var lang_cz_1 = require_lang_cz();\n    var lang_en_1 = require_lang_en();\n    var lang_es_1 = require_lang_es();\n    var lang_fr_1 = require_lang_fr();\n    var lang_ja_1 = require_lang_ja();\n    var lang_ko_1 = require_lang_ko();\n    var lang_it_1 = require_lang_it();\n    var lang_zh_1 = require_lang_zh();\n    exports2.wordlists = {\n      cz: lang_cz_1.langCz,\n      en: lang_en_1.langEn,\n      es: lang_es_1.langEs,\n      fr: lang_fr_1.langFr,\n      it: lang_it_1.langIt,\n      ja: lang_ja_1.langJa,\n      ko: lang_ko_1.langKo,\n      zh: lang_zh_1.langZhCn,\n      zh_cn: lang_zh_1.langZhCn,\n      zh_tw: lang_zh_1.langZhTw\n    };\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/index.js\nvar require_lib20 = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.wordlists = exports2.Wordlist = exports2.logger = void 0;\n    var wordlist_1 = require_wordlist();\n    Object.defineProperty(exports2, \"logger\", { enumerable: true, get: function() {\n      return wordlist_1.logger;\n    } });\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return wordlist_1.Wordlist;\n    } });\n    var wordlists_1 = require_wordlists();\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return wordlists_1.wordlists;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/hdnode/lib/_version.js\nvar require_version17 = __commonJS({\n  \"node_modules/@ethersproject/hdnode/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"hdnode/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/hdnode/lib/index.js\nvar require_lib21 = __commonJS({\n  \"node_modules/@ethersproject/hdnode/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getAccountPath = exports2.isValidMnemonic = exports2.entropyToMnemonic = exports2.mnemonicToEntropy = exports2.mnemonicToSeed = exports2.HDNode = exports2.defaultPath = void 0;\n    var basex_1 = require_lib17();\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var strings_1 = require_lib9();\n    var pbkdf2_1 = require_lib18();\n    var properties_1 = require_lib4();\n    var signing_key_1 = require_lib14();\n    var sha2_1 = require_lib19();\n    var transactions_1 = require_lib15();\n    var wordlists_1 = require_lib20();\n    var logger_1 = require_lib();\n    var _version_1 = require_version17();\n    var logger = new logger_1.Logger(_version_1.version);\n    var N = bignumber_1.BigNumber.from(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\");\n    var MasterSecret = (0, strings_1.toUtf8Bytes)(\"Bitcoin seed\");\n    var HardenedBit = 2147483648;\n    function getUpperMask(bits) {\n      return (1 << bits) - 1 << 8 - bits;\n    }\n    function getLowerMask(bits) {\n      return (1 << bits) - 1;\n    }\n    function bytes32(value) {\n      return (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(value), 32);\n    }\n    function base58check(data) {\n      return basex_1.Base58.encode((0, bytes_1.concat)([data, (0, bytes_1.hexDataSlice)((0, sha2_1.sha256)((0, sha2_1.sha256)(data)), 0, 4)]));\n    }\n    function getWordlist(wordlist) {\n      if (wordlist == null) {\n        return wordlists_1.wordlists[\"en\"];\n      }\n      if (typeof wordlist === \"string\") {\n        var words = wordlists_1.wordlists[wordlist];\n        if (words == null) {\n          logger.throwArgumentError(\"unknown locale\", \"wordlist\", wordlist);\n        }\n        return words;\n      }\n      return wordlist;\n    }\n    var _constructorGuard = {};\n    exports2.defaultPath = \"m/44'/60'/0'/0/0\";\n    var HDNode = (\n      /** @class */\n      function() {\n        function HDNode2(constructorGuard, privateKey, publicKey, parentFingerprint, chainCode, index, depth, mnemonicOrPath) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, HDNode2);\n          if (constructorGuard !== _constructorGuard) {\n            throw new Error(\"HDNode constructor cannot be called directly\");\n          }\n          if (privateKey) {\n            var signingKey = new signing_key_1.SigningKey(privateKey);\n            (0, properties_1.defineReadOnly)(this, \"privateKey\", signingKey.privateKey);\n            (0, properties_1.defineReadOnly)(this, \"publicKey\", signingKey.compressedPublicKey);\n          } else {\n            (0, properties_1.defineReadOnly)(this, \"privateKey\", null);\n            (0, properties_1.defineReadOnly)(this, \"publicKey\", (0, bytes_1.hexlify)(publicKey));\n          }\n          (0, properties_1.defineReadOnly)(this, \"parentFingerprint\", parentFingerprint);\n          (0, properties_1.defineReadOnly)(this, \"fingerprint\", (0, bytes_1.hexDataSlice)((0, sha2_1.ripemd160)((0, sha2_1.sha256)(this.publicKey)), 0, 4));\n          (0, properties_1.defineReadOnly)(this, \"address\", (0, transactions_1.computeAddress)(this.publicKey));\n          (0, properties_1.defineReadOnly)(this, \"chainCode\", chainCode);\n          (0, properties_1.defineReadOnly)(this, \"index\", index);\n          (0, properties_1.defineReadOnly)(this, \"depth\", depth);\n          if (mnemonicOrPath == null) {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", null);\n            (0, properties_1.defineReadOnly)(this, \"path\", null);\n          } else if (typeof mnemonicOrPath === \"string\") {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", null);\n            (0, properties_1.defineReadOnly)(this, \"path\", mnemonicOrPath);\n          } else {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", mnemonicOrPath);\n            (0, properties_1.defineReadOnly)(this, \"path\", mnemonicOrPath.path);\n          }\n        }\n        Object.defineProperty(HDNode2.prototype, \"extendedKey\", {\n          get: function() {\n            if (this.depth >= 256) {\n              throw new Error(\"Depth too large!\");\n            }\n            return base58check((0, bytes_1.concat)([\n              this.privateKey != null ? \"0x0488ADE4\" : \"0x0488B21E\",\n              (0, bytes_1.hexlify)(this.depth),\n              this.parentFingerprint,\n              (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(this.index), 4),\n              this.chainCode,\n              this.privateKey != null ? (0, bytes_1.concat)([\"0x00\", this.privateKey]) : this.publicKey\n            ]));\n          },\n          enumerable: false,\n          configurable: true\n        });\n        HDNode2.prototype.neuter = function() {\n          return new HDNode2(_constructorGuard, null, this.publicKey, this.parentFingerprint, this.chainCode, this.index, this.depth, this.path);\n        };\n        HDNode2.prototype._derive = function(index) {\n          if (index > 4294967295) {\n            throw new Error(\"invalid index - \" + String(index));\n          }\n          var path = this.path;\n          if (path) {\n            path += \"/\" + (index & ~HardenedBit);\n          }\n          var data = new Uint8Array(37);\n          if (index & HardenedBit) {\n            if (!this.privateKey) {\n              throw new Error(\"cannot derive child of neutered node\");\n            }\n            data.set((0, bytes_1.arrayify)(this.privateKey), 1);\n            if (path) {\n              path += \"'\";\n            }\n          } else {\n            data.set((0, bytes_1.arrayify)(this.publicKey));\n          }\n          for (var i = 24; i >= 0; i -= 8) {\n            data[33 + (i >> 3)] = index >> 24 - i & 255;\n          }\n          var I = (0, bytes_1.arrayify)((0, sha2_1.computeHmac)(sha2_1.SupportedAlgorithm.sha512, this.chainCode, data));\n          var IL = I.slice(0, 32);\n          var IR = I.slice(32);\n          var ki = null;\n          var Ki = null;\n          if (this.privateKey) {\n            ki = bytes32(bignumber_1.BigNumber.from(IL).add(this.privateKey).mod(N));\n          } else {\n            var ek = new signing_key_1.SigningKey((0, bytes_1.hexlify)(IL));\n            Ki = ek._addPoint(this.publicKey);\n          }\n          var mnemonicOrPath = path;\n          var srcMnemonic = this.mnemonic;\n          if (srcMnemonic) {\n            mnemonicOrPath = Object.freeze({\n              phrase: srcMnemonic.phrase,\n              path,\n              locale: srcMnemonic.locale || \"en\"\n            });\n          }\n          return new HDNode2(_constructorGuard, ki, Ki, this.fingerprint, bytes32(IR), index, this.depth + 1, mnemonicOrPath);\n        };\n        HDNode2.prototype.derivePath = function(path) {\n          var components = path.split(\"/\");\n          if (components.length === 0 || components[0] === \"m\" && this.depth !== 0) {\n            throw new Error(\"invalid path - \" + path);\n          }\n          if (components[0] === \"m\") {\n            components.shift();\n          }\n          var result2 = this;\n          for (var i = 0; i < components.length; i++) {\n            var component = components[i];\n            if (component.match(/^[0-9]+'$/)) {\n              var index = parseInt(component.substring(0, component.length - 1));\n              if (index >= HardenedBit) {\n                throw new Error(\"invalid path index - \" + component);\n              }\n              result2 = result2._derive(HardenedBit + index);\n            } else if (component.match(/^[0-9]+$/)) {\n              var index = parseInt(component);\n              if (index >= HardenedBit) {\n                throw new Error(\"invalid path index - \" + component);\n              }\n              result2 = result2._derive(index);\n            } else {\n              throw new Error(\"invalid path component - \" + component);\n            }\n          }\n          return result2;\n        };\n        HDNode2._fromSeed = function(seed, mnemonic) {\n          var seedArray = (0, bytes_1.arrayify)(seed);\n          if (seedArray.length < 16 || seedArray.length > 64) {\n            throw new Error(\"invalid seed\");\n          }\n          var I = (0, bytes_1.arrayify)((0, sha2_1.computeHmac)(sha2_1.SupportedAlgorithm.sha512, MasterSecret, seedArray));\n          return new HDNode2(_constructorGuard, bytes32(I.slice(0, 32)), null, \"0x00000000\", bytes32(I.slice(32)), 0, 0, mnemonic);\n        };\n        HDNode2.fromMnemonic = function(mnemonic, password, wordlist) {\n          wordlist = getWordlist(wordlist);\n          mnemonic = entropyToMnemonic(mnemonicToEntropy(mnemonic, wordlist), wordlist);\n          return HDNode2._fromSeed(mnemonicToSeed(mnemonic, password), {\n            phrase: mnemonic,\n            path: \"m\",\n            locale: wordlist.locale\n          });\n        };\n        HDNode2.fromSeed = function(seed) {\n          return HDNode2._fromSeed(seed, null);\n        };\n        HDNode2.fromExtendedKey = function(extendedKey) {\n          var bytes = basex_1.Base58.decode(extendedKey);\n          if (bytes.length !== 82 || base58check(bytes.slice(0, 78)) !== extendedKey) {\n            logger.throwArgumentError(\"invalid extended key\", \"extendedKey\", \"[REDACTED]\");\n          }\n          var depth = bytes[4];\n          var parentFingerprint = (0, bytes_1.hexlify)(bytes.slice(5, 9));\n          var index = parseInt((0, bytes_1.hexlify)(bytes.slice(9, 13)).substring(2), 16);\n          var chainCode = (0, bytes_1.hexlify)(bytes.slice(13, 45));\n          var key = bytes.slice(45, 78);\n          switch ((0, bytes_1.hexlify)(bytes.slice(0, 4))) {\n            case \"0x0488b21e\":\n            case \"0x043587cf\":\n              return new HDNode2(_constructorGuard, null, (0, bytes_1.hexlify)(key), parentFingerprint, chainCode, index, depth, null);\n            case \"0x0488ade4\":\n            case \"0x04358394 \":\n              if (key[0] !== 0) {\n                break;\n              }\n              return new HDNode2(_constructorGuard, (0, bytes_1.hexlify)(key.slice(1)), null, parentFingerprint, chainCode, index, depth, null);\n          }\n          return logger.throwArgumentError(\"invalid extended key\", \"extendedKey\", \"[REDACTED]\");\n        };\n        return HDNode2;\n      }()\n    );\n    exports2.HDNode = HDNode;\n    function mnemonicToSeed(mnemonic, password) {\n      if (!password) {\n        password = \"\";\n      }\n      var salt = (0, strings_1.toUtf8Bytes)(\"mnemonic\" + password, strings_1.UnicodeNormalizationForm.NFKD);\n      return (0, pbkdf2_1.pbkdf2)((0, strings_1.toUtf8Bytes)(mnemonic, strings_1.UnicodeNormalizationForm.NFKD), salt, 2048, 64, \"sha512\");\n    }\n    exports2.mnemonicToSeed = mnemonicToSeed;\n    function mnemonicToEntropy(mnemonic, wordlist) {\n      wordlist = getWordlist(wordlist);\n      logger.checkNormalize();\n      var words = wordlist.split(mnemonic);\n      if (words.length % 3 !== 0) {\n        throw new Error(\"invalid mnemonic\");\n      }\n      var entropy = (0, bytes_1.arrayify)(new Uint8Array(Math.ceil(11 * words.length / 8)));\n      var offset = 0;\n      for (var i = 0; i < words.length; i++) {\n        var index = wordlist.getWordIndex(words[i].normalize(\"NFKD\"));\n        if (index === -1) {\n          throw new Error(\"invalid mnemonic\");\n        }\n        for (var bit = 0; bit < 11; bit++) {\n          if (index & 1 << 10 - bit) {\n            entropy[offset >> 3] |= 1 << 7 - offset % 8;\n          }\n          offset++;\n        }\n      }\n      var entropyBits = 32 * words.length / 3;\n      var checksumBits = words.length / 3;\n      var checksumMask = getUpperMask(checksumBits);\n      var checksum = (0, bytes_1.arrayify)((0, sha2_1.sha256)(entropy.slice(0, entropyBits / 8)))[0] & checksumMask;\n      if (checksum !== (entropy[entropy.length - 1] & checksumMask)) {\n        throw new Error(\"invalid checksum\");\n      }\n      return (0, bytes_1.hexlify)(entropy.slice(0, entropyBits / 8));\n    }\n    exports2.mnemonicToEntropy = mnemonicToEntropy;\n    function entropyToMnemonic(entropy, wordlist) {\n      wordlist = getWordlist(wordlist);\n      entropy = (0, bytes_1.arrayify)(entropy);\n      if (entropy.length % 4 !== 0 || entropy.length < 16 || entropy.length > 32) {\n        throw new Error(\"invalid entropy\");\n      }\n      var indices = [0];\n      var remainingBits = 11;\n      for (var i = 0; i < entropy.length; i++) {\n        if (remainingBits > 8) {\n          indices[indices.length - 1] <<= 8;\n          indices[indices.length - 1] |= entropy[i];\n          remainingBits -= 8;\n        } else {\n          indices[indices.length - 1] <<= remainingBits;\n          indices[indices.length - 1] |= entropy[i] >> 8 - remainingBits;\n          indices.push(entropy[i] & getLowerMask(8 - remainingBits));\n          remainingBits += 3;\n        }\n      }\n      var checksumBits = entropy.length / 4;\n      var checksum = (0, bytes_1.arrayify)((0, sha2_1.sha256)(entropy))[0] & getUpperMask(checksumBits);\n      indices[indices.length - 1] <<= checksumBits;\n      indices[indices.length - 1] |= checksum >> 8 - checksumBits;\n      return wordlist.join(indices.map(function(index) {\n        return wordlist.getWord(index);\n      }));\n    }\n    exports2.entropyToMnemonic = entropyToMnemonic;\n    function isValidMnemonic(mnemonic, wordlist) {\n      try {\n        mnemonicToEntropy(mnemonic, wordlist);\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isValidMnemonic = isValidMnemonic;\n    function getAccountPath(index) {\n      if (typeof index !== \"number\" || index < 0 || index >= HardenedBit || index % 1) {\n        logger.throwArgumentError(\"invalid account index\", \"index\", index);\n      }\n      return \"m/44'/60'/\" + index + \"'/0/0\";\n    }\n    exports2.getAccountPath = getAccountPath;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/random.js\nvar require_random = __commonJS({\n  \"node_modules/@ethersproject/random/lib/random.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.randomBytes = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    function randomBytes(length) {\n      return (0, bytes_1.arrayify)((0, crypto_1.randomBytes)(length));\n    }\n    exports2.randomBytes = randomBytes;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/shuffle.js\nvar require_shuffle = __commonJS({\n  \"node_modules/@ethersproject/random/lib/shuffle.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.shuffled = void 0;\n    function shuffled(array) {\n      array = array.slice();\n      for (var i = array.length - 1; i > 0; i--) {\n        var j = Math.floor(Math.random() * (i + 1));\n        var tmp = array[i];\n        array[i] = array[j];\n        array[j] = tmp;\n      }\n      return array;\n    }\n    exports2.shuffled = shuffled;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/index.js\nvar require_lib22 = __commonJS({\n  \"node_modules/@ethersproject/random/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.shuffled = exports2.randomBytes = void 0;\n    var random_1 = require_random();\n    Object.defineProperty(exports2, \"randomBytes\", { enumerable: true, get: function() {\n      return random_1.randomBytes;\n    } });\n    var shuffle_1 = require_shuffle();\n    Object.defineProperty(exports2, \"shuffled\", { enumerable: true, get: function() {\n      return shuffle_1.shuffled;\n    } });\n  }\n});\n\n// node_modules/aes-js/index.js\nvar require_aes_js = __commonJS({\n  \"node_modules/aes-js/index.js\"(exports2, module2) {\n    \"use strict\";\n    (function(root) {\n      function checkInt(value) {\n        return parseInt(value) === value;\n      }\n      function checkInts(arrayish) {\n        if (!checkInt(arrayish.length)) {\n          return false;\n        }\n        for (var i = 0; i < arrayish.length; i++) {\n          if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {\n            return false;\n          }\n        }\n        return true;\n      }\n      function coerceArray(arg, copy) {\n        if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === \"Uint8Array\") {\n          if (copy) {\n            if (arg.slice) {\n              arg = arg.slice();\n            } else {\n              arg = Array.prototype.slice.call(arg);\n            }\n          }\n          return arg;\n        }\n        if (Array.isArray(arg)) {\n          if (!checkInts(arg)) {\n            throw new Error(\"Array contains invalid value: \" + arg);\n          }\n          return new Uint8Array(arg);\n        }\n        if (checkInt(arg.length) && checkInts(arg)) {\n          return new Uint8Array(arg);\n        }\n        throw new Error(\"unsupported array-like object\");\n      }\n      function createArray(length) {\n        return new Uint8Array(length);\n      }\n      function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {\n        if (sourceStart != null || sourceEnd != null) {\n          if (sourceArray.slice) {\n            sourceArray = sourceArray.slice(sourceStart, sourceEnd);\n          } else {\n            sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);\n          }\n        }\n        targetArray.set(sourceArray, targetStart);\n      }\n      var convertUtf8 = /* @__PURE__ */ function() {\n        function toBytes(text) {\n          var result2 = [], i = 0;\n          text = encodeURI(text);\n          while (i < text.length) {\n            var c = text.charCodeAt(i++);\n            if (c === 37) {\n              result2.push(parseInt(text.substr(i, 2), 16));\n              i += 2;\n            } else {\n              result2.push(c);\n            }\n          }\n          return coerceArray(result2);\n        }\n        function fromBytes(bytes) {\n          var result2 = [], i = 0;\n          while (i < bytes.length) {\n            var c = bytes[i];\n            if (c < 128) {\n              result2.push(String.fromCharCode(c));\n              i++;\n            } else if (c > 191 && c < 224) {\n              result2.push(String.fromCharCode((c & 31) << 6 | bytes[i + 1] & 63));\n              i += 2;\n            } else {\n              result2.push(String.fromCharCode((c & 15) << 12 | (bytes[i + 1] & 63) << 6 | bytes[i + 2] & 63));\n              i += 3;\n            }\n          }\n          return result2.join(\"\");\n        }\n        return {\n          toBytes,\n          fromBytes\n        };\n      }();\n      var convertHex = /* @__PURE__ */ function() {\n        function toBytes(text) {\n          var result2 = [];\n          for (var i = 0; i < text.length; i += 2) {\n            result2.push(parseInt(text.substr(i, 2), 16));\n          }\n          return result2;\n        }\n        var Hex = \"0123456789abcdef\";\n        function fromBytes(bytes) {\n          var result2 = [];\n          for (var i = 0; i < bytes.length; i++) {\n            var v = bytes[i];\n            result2.push(Hex[(v & 240) >> 4] + Hex[v & 15]);\n          }\n          return result2.join(\"\");\n        }\n        return {\n          toBytes,\n          fromBytes\n        };\n      }();\n      var numberOfRounds = { 16: 10, 24: 12, 32: 14 };\n      var rcon = [1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145];\n      var S = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22];\n      var Si = [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125];\n      var T1 = [3328402341, 4168907908, 4000806809, 4135287693, 4294111757, 3597364157, 3731845041, 2445657428, 1613770832, 33620227, 3462883241, 1445669757, 3892248089, 3050821474, 1303096294, 3967186586, 2412431941, 528646813, 2311702848, 4202528135, 4026202645, 2992200171, 2387036105, 4226871307, 1101901292, 3017069671, 1604494077, 1169141738, 597466303, 1403299063, 3832705686, 2613100635, 1974974402, 3791519004, 1033081774, 1277568618, 1815492186, 2118074177, 4126668546, 2211236943, 1748251740, 1369810420, 3521504564, 4193382664, 3799085459, 2883115123, 1647391059, 706024767, 134480908, 2512897874, 1176707941, 2646852446, 806885416, 932615841, 168101135, 798661301, 235341577, 605164086, 461406363, 3756188221, 3454790438, 1311188841, 2142417613, 3933566367, 302582043, 495158174, 1479289972, 874125870, 907746093, 3698224818, 3025820398, 1537253627, 2756858614, 1983593293, 3084310113, 2108928974, 1378429307, 3722699582, 1580150641, 327451799, 2790478837, 3117535592, 0, 3253595436, 1075847264, 3825007647, 2041688520, 3059440621, 3563743934, 2378943302, 1740553945, 1916352843, 2487896798, 2555137236, 2958579944, 2244988746, 3151024235, 3320835882, 1336584933, 3992714006, 2252555205, 2588757463, 1714631509, 293963156, 2319795663, 3925473552, 67240454, 4269768577, 2689618160, 2017213508, 631218106, 1269344483, 2723238387, 1571005438, 2151694528, 93294474, 1066570413, 563977660, 1882732616, 4059428100, 1673313503, 2008463041, 2950355573, 1109467491, 537923632, 3858759450, 4260623118, 3218264685, 2177748300, 403442708, 638784309, 3287084079, 3193921505, 899127202, 2286175436, 773265209, 2479146071, 1437050866, 4236148354, 2050833735, 3362022572, 3126681063, 840505643, 3866325909, 3227541664, 427917720, 2655997905, 2749160575, 1143087718, 1412049534, 999329963, 193497219, 2353415882, 3354324521, 1807268051, 672404540, 2816401017, 3160301282, 369822493, 2916866934, 3688947771, 1681011286, 1949973070, 336202270, 2454276571, 201721354, 1210328172, 3093060836, 2680341085, 3184776046, 1135389935, 3294782118, 965841320, 831886756, 3554993207, 4068047243, 3588745010, 2345191491, 1849112409, 3664604599, 26054028, 2983581028, 2622377682, 1235855840, 3630984372, 2891339514, 4092916743, 3488279077, 3395642799, 4101667470, 1202630377, 268961816, 1874508501, 4034427016, 1243948399, 1546530418, 941366308, 1470539505, 1941222599, 2546386513, 3421038627, 2715671932, 3899946140, 1042226977, 2521517021, 1639824860, 227249030, 260737669, 3765465232, 2084453954, 1907733956, 3429263018, 2420656344, 100860677, 4160157185, 470683154, 3261161891, 1781871967, 2924959737, 1773779408, 394692241, 2579611992, 974986535, 664706745, 3655459128, 3958962195, 731420851, 571543859, 3530123707, 2849626480, 126783113, 865375399, 765172662, 1008606754, 361203602, 3387549984, 2278477385, 2857719295, 1344809080, 2782912378, 59542671, 1503764984, 160008576, 437062935, 1707065306, 3622233649, 2218934982, 3496503480, 2185314755, 697932208, 1512910199, 504303377, 2075177163, 2824099068, 1841019862, 739644986];\n      var T2 = [2781242211, 2230877308, 2582542199, 2381740923, 234877682, 3184946027, 2984144751, 1418839493, 1348481072, 50462977, 2848876391, 2102799147, 434634494, 1656084439, 3863849899, 2599188086, 1167051466, 2636087938, 1082771913, 2281340285, 368048890, 3954334041, 3381544775, 201060592, 3963727277, 1739838676, 4250903202, 3930435503, 3206782108, 4149453988, 2531553906, 1536934080, 3262494647, 484572669, 2923271059, 1783375398, 1517041206, 1098792767, 49674231, 1334037708, 1550332980, 4098991525, 886171109, 150598129, 2481090929, 1940642008, 1398944049, 1059722517, 201851908, 1385547719, 1699095331, 1587397571, 674240536, 2704774806, 252314885, 3039795866, 151914247, 908333586, 2602270848, 1038082786, 651029483, 1766729511, 3447698098, 2682942837, 454166793, 2652734339, 1951935532, 775166490, 758520603, 3000790638, 4004797018, 4217086112, 4137964114, 1299594043, 1639438038, 3464344499, 2068982057, 1054729187, 1901997871, 2534638724, 4121318227, 1757008337, 0, 750906861, 1614815264, 535035132, 3363418545, 3988151131, 3201591914, 1183697867, 3647454910, 1265776953, 3734260298, 3566750796, 3903871064, 1250283471, 1807470800, 717615087, 3847203498, 384695291, 3313910595, 3617213773, 1432761139, 2484176261, 3481945413, 283769337, 100925954, 2180939647, 4037038160, 1148730428, 3123027871, 3813386408, 4087501137, 4267549603, 3229630528, 2315620239, 2906624658, 3156319645, 1215313976, 82966005, 3747855548, 3245848246, 1974459098, 1665278241, 807407632, 451280895, 251524083, 1841287890, 1283575245, 337120268, 891687699, 801369324, 3787349855, 2721421207, 3431482436, 959321879, 1469301956, 4065699751, 2197585534, 1199193405, 2898814052, 3887750493, 724703513, 2514908019, 2696962144, 2551808385, 3516813135, 2141445340, 1715741218, 2119445034, 2872807568, 2198571144, 3398190662, 700968686, 3547052216, 1009259540, 2041044702, 3803995742, 487983883, 1991105499, 1004265696, 1449407026, 1316239930, 504629770, 3683797321, 168560134, 1816667172, 3837287516, 1570751170, 1857934291, 4014189740, 2797888098, 2822345105, 2754712981, 936633572, 2347923833, 852879335, 1133234376, 1500395319, 3084545389, 2348912013, 1689376213, 3533459022, 3762923945, 3034082412, 4205598294, 133428468, 634383082, 2949277029, 2398386810, 3913789102, 403703816, 3580869306, 2297460856, 1867130149, 1918643758, 607656988, 4049053350, 3346248884, 1368901318, 600565992, 2090982877, 2632479860, 557719327, 3717614411, 3697393085, 2249034635, 2232388234, 2430627952, 1115438654, 3295786421, 2865522278, 3633334344, 84280067, 33027830, 303828494, 2747425121, 1600795957, 4188952407, 3496589753, 2434238086, 1486471617, 658119965, 3106381470, 953803233, 334231800, 3005978776, 857870609, 3151128937, 1890179545, 2298973838, 2805175444, 3056442267, 574365214, 2450884487, 550103529, 1233637070, 4289353045, 2018519080, 2057691103, 2399374476, 4166623649, 2148108681, 387583245, 3664101311, 836232934, 3330556482, 3100665960, 3280093505, 2955516313, 2002398509, 287182607, 3413881008, 4238890068, 3597515707, 975967766];\n      var T3 = [1671808611, 2089089148, 2006576759, 2072901243, 4061003762, 1807603307, 1873927791, 3310653893, 810573872, 16974337, 1739181671, 729634347, 4263110654, 3613570519, 2883997099, 1989864566, 3393556426, 2191335298, 3376449993, 2106063485, 4195741690, 1508618841, 1204391495, 4027317232, 2917941677, 3563566036, 2734514082, 2951366063, 2629772188, 2767672228, 1922491506, 3227229120, 3082974647, 4246528509, 2477669779, 644500518, 911895606, 1061256767, 4144166391, 3427763148, 878471220, 2784252325, 3845444069, 4043897329, 1905517169, 3631459288, 827548209, 356461077, 67897348, 3344078279, 593839651, 3277757891, 405286936, 2527147926, 84871685, 2595565466, 118033927, 305538066, 2157648768, 3795705826, 3945188843, 661212711, 2999812018, 1973414517, 152769033, 2208177539, 745822252, 439235610, 455947803, 1857215598, 1525593178, 2700827552, 1391895634, 994932283, 3596728278, 3016654259, 695947817, 3812548067, 795958831, 2224493444, 1408607827, 3513301457, 0, 3979133421, 543178784, 4229948412, 2982705585, 1542305371, 1790891114, 3410398667, 3201918910, 961245753, 1256100938, 1289001036, 1491644504, 3477767631, 3496721360, 4012557807, 2867154858, 4212583931, 1137018435, 1305975373, 861234739, 2241073541, 1171229253, 4178635257, 33948674, 2139225727, 1357946960, 1011120188, 2679776671, 2833468328, 1374921297, 2751356323, 1086357568, 2408187279, 2460827538, 2646352285, 944271416, 4110742005, 3168756668, 3066132406, 3665145818, 560153121, 271589392, 4279952895, 4077846003, 3530407890, 3444343245, 202643468, 322250259, 3962553324, 1608629855, 2543990167, 1154254916, 389623319, 3294073796, 2817676711, 2122513534, 1028094525, 1689045092, 1575467613, 422261273, 1939203699, 1621147744, 2174228865, 1339137615, 3699352540, 577127458, 712922154, 2427141008, 2290289544, 1187679302, 3995715566, 3100863416, 339486740, 3732514782, 1591917662, 186455563, 3681988059, 3762019296, 844522546, 978220090, 169743370, 1239126601, 101321734, 611076132, 1558493276, 3260915650, 3547250131, 2901361580, 1655096418, 2443721105, 2510565781, 3828863972, 2039214713, 3878868455, 3359869896, 928607799, 1840765549, 2374762893, 3580146133, 1322425422, 2850048425, 1823791212, 1459268694, 4094161908, 3928346602, 1706019429, 2056189050, 2934523822, 135794696, 3134549946, 2022240376, 628050469, 779246638, 472135708, 2800834470, 3032970164, 3327236038, 3894660072, 3715932637, 1956440180, 522272287, 1272813131, 3185336765, 2340818315, 2323976074, 1888542832, 1044544574, 3049550261, 1722469478, 1222152264, 50660867, 4127324150, 236067854, 1638122081, 895445557, 1475980887, 3117443513, 2257655686, 3243809217, 489110045, 2662934430, 3778599393, 4162055160, 2561878936, 288563729, 1773916777, 3648039385, 2391345038, 2493985684, 2612407707, 505560094, 2274497927, 3911240169, 3460925390, 1442818645, 678973480, 3749357023, 2358182796, 2717407649, 2306869641, 219617805, 3218761151, 3862026214, 1120306242, 1756942440, 1103331905, 2578459033, 762796589, 252780047, 2966125488, 1425844308, 3151392187, 372911126];\n      var T4 = [1667474886, 2088535288, 2004326894, 2071694838, 4075949567, 1802223062, 1869591006, 3318043793, 808472672, 16843522, 1734846926, 724270422, 4278065639, 3621216949, 2880169549, 1987484396, 3402253711, 2189597983, 3385409673, 2105378810, 4210693615, 1499065266, 1195886990, 4042263547, 2913856577, 3570689971, 2728590687, 2947541573, 2627518243, 2762274643, 1920112356, 3233831835, 3082273397, 4261223649, 2475929149, 640051788, 909531756, 1061110142, 4160160501, 3435941763, 875846760, 2779116625, 3857003729, 4059105529, 1903268834, 3638064043, 825316194, 353713962, 67374088, 3351728789, 589522246, 3284360861, 404236336, 2526454071, 84217610, 2593830191, 117901582, 303183396, 2155911963, 3806477791, 3958056653, 656894286, 2998062463, 1970642922, 151591698, 2206440989, 741110872, 437923380, 454765878, 1852748508, 1515908788, 2694904667, 1381168804, 993742198, 3604373943, 3014905469, 690584402, 3823320797, 791638366, 2223281939, 1398011302, 3520161977, 0, 3991743681, 538992704, 4244381667, 2981218425, 1532751286, 1785380564, 3419096717, 3200178535, 960056178, 1246420628, 1280103576, 1482221744, 3486468741, 3503319995, 4025428677, 2863326543, 4227536621, 1128514950, 1296947098, 859002214, 2240123921, 1162203018, 4193849577, 33687044, 2139062782, 1347481760, 1010582648, 2678045221, 2829640523, 1364325282, 2745433693, 1077985408, 2408548869, 2459086143, 2644360225, 943212656, 4126475505, 3166494563, 3065430391, 3671750063, 555836226, 269496352, 4294908645, 4092792573, 3537006015, 3452783745, 202118168, 320025894, 3974901699, 1600119230, 2543297077, 1145359496, 387397934, 3301201811, 2812801621, 2122220284, 1027426170, 1684319432, 1566435258, 421079858, 1936954854, 1616945344, 2172753945, 1330631070, 3705438115, 572679748, 707427924, 2425400123, 2290647819, 1179044492, 4008585671, 3099120491, 336870440, 3739122087, 1583276732, 185277718, 3688593069, 3772791771, 842159716, 976899700, 168435220, 1229577106, 101059084, 606366792, 1549591736, 3267517855, 3553849021, 2897014595, 1650632388, 2442242105, 2509612081, 3840161747, 2038008818, 3890688725, 3368567691, 926374254, 1835907034, 2374863873, 3587531953, 1313788572, 2846482505, 1819063512, 1448540844, 4109633523, 3941213647, 1701162954, 2054852340, 2930698567, 134748176, 3132806511, 2021165296, 623210314, 774795868, 471606328, 2795958615, 3031746419, 3334885783, 3907527627, 3722280097, 1953799400, 522133822, 1263263126, 3183336545, 2341176845, 2324333839, 1886425312, 1044267644, 3048588401, 1718004428, 1212733584, 50529542, 4143317495, 235803164, 1633788866, 892690282, 1465383342, 3115962473, 2256965911, 3250673817, 488449850, 2661202215, 3789633753, 4177007595, 2560144171, 286339874, 1768537042, 3654906025, 2391705863, 2492770099, 2610673197, 505291324, 2273808917, 3924369609, 3469625735, 1431699370, 673740880, 3755965093, 2358021891, 2711746649, 2307489801, 218961690, 3217021541, 3873845719, 1111672452, 1751693520, 1094828930, 2576986153, 757954394, 252645662, 2964376443, 1414855848, 3149649517, 370555436];\n      var T5 = [1374988112, 2118214995, 437757123, 975658646, 1001089995, 530400753, 2902087851, 1273168787, 540080725, 2910219766, 2295101073, 4110568485, 1340463100, 3307916247, 641025152, 3043140495, 3736164937, 632953703, 1172967064, 1576976609, 3274667266, 2169303058, 2370213795, 1809054150, 59727847, 361929877, 3211623147, 2505202138, 3569255213, 1484005843, 1239443753, 2395588676, 1975683434, 4102977912, 2572697195, 666464733, 3202437046, 4035489047, 3374361702, 2110667444, 1675577880, 3843699074, 2538681184, 1649639237, 2976151520, 3144396420, 4269907996, 4178062228, 1883793496, 2403728665, 2497604743, 1383856311, 2876494627, 1917518562, 3810496343, 1716890410, 3001755655, 800440835, 2261089178, 3543599269, 807962610, 599762354, 33778362, 3977675356, 2328828971, 2809771154, 4077384432, 1315562145, 1708848333, 101039829, 3509871135, 3299278474, 875451293, 2733856160, 92987698, 2767645557, 193195065, 1080094634, 1584504582, 3178106961, 1042385657, 2531067453, 3711829422, 1306967366, 2438237621, 1908694277, 67556463, 1615861247, 429456164, 3602770327, 2302690252, 1742315127, 2968011453, 126454664, 3877198648, 2043211483, 2709260871, 2084704233, 4169408201, 0, 159417987, 841739592, 504459436, 1817866830, 4245618683, 260388950, 1034867998, 908933415, 168810852, 1750902305, 2606453969, 607530554, 202008497, 2472011535, 3035535058, 463180190, 2160117071, 1641816226, 1517767529, 470948374, 3801332234, 3231722213, 1008918595, 303765277, 235474187, 4069246893, 766945465, 337553864, 1475418501, 2943682380, 4003061179, 2743034109, 4144047775, 1551037884, 1147550661, 1543208500, 2336434550, 3408119516, 3069049960, 3102011747, 3610369226, 1113818384, 328671808, 2227573024, 2236228733, 3535486456, 2935566865, 3341394285, 496906059, 3702665459, 226906860, 2009195472, 733156972, 2842737049, 294930682, 1206477858, 2835123396, 2700099354, 1451044056, 573804783, 2269728455, 3644379585, 2362090238, 2564033334, 2801107407, 2776292904, 3669462566, 1068351396, 742039012, 1350078989, 1784663195, 1417561698, 4136440770, 2430122216, 775550814, 2193862645, 2673705150, 1775276924, 1876241833, 3475313331, 3366754619, 270040487, 3902563182, 3678124923, 3441850377, 1851332852, 3969562369, 2203032232, 3868552805, 2868897406, 566021896, 4011190502, 3135740889, 1248802510, 3936291284, 699432150, 832877231, 708780849, 3332740144, 899835584, 1951317047, 4236429990, 3767586992, 866637845, 4043610186, 1106041591, 2144161806, 395441711, 1984812685, 1139781709, 3433712980, 3835036895, 2664543715, 1282050075, 3240894392, 1181045119, 2640243204, 25965917, 4203181171, 4211818798, 3009879386, 2463879762, 3910161971, 1842759443, 2597806476, 933301370, 1509430414, 3943906441, 3467192302, 3076639029, 3776767469, 2051518780, 2631065433, 1441952575, 404016761, 1942435775, 1408749034, 1610459739, 3745345300, 2017778566, 3400528769, 3110650942, 941896748, 3265478751, 371049330, 3168937228, 675039627, 4279080257, 967311729, 135050206, 3635733660, 1683407248, 2076935265, 3576870512, 1215061108, 3501741890];\n      var T6 = [1347548327, 1400783205, 3273267108, 2520393566, 3409685355, 4045380933, 2880240216, 2471224067, 1428173050, 4138563181, 2441661558, 636813900, 4233094615, 3620022987, 2149987652, 2411029155, 1239331162, 1730525723, 2554718734, 3781033664, 46346101, 310463728, 2743944855, 3328955385, 3875770207, 2501218972, 3955191162, 3667219033, 768917123, 3545789473, 692707433, 1150208456, 1786102409, 2029293177, 1805211710, 3710368113, 3065962831, 401639597, 1724457132, 3028143674, 409198410, 2196052529, 1620529459, 1164071807, 3769721975, 2226875310, 486441376, 2499348523, 1483753576, 428819965, 2274680428, 3075636216, 598438867, 3799141122, 1474502543, 711349675, 129166120, 53458370, 2592523643, 2782082824, 4063242375, 2988687269, 3120694122, 1559041666, 730517276, 2460449204, 4042459122, 2706270690, 3446004468, 3573941694, 533804130, 2328143614, 2637442643, 2695033685, 839224033, 1973745387, 957055980, 2856345839, 106852767, 1371368976, 4181598602, 1033297158, 2933734917, 1179510461, 3046200461, 91341917, 1862534868, 4284502037, 605657339, 2547432937, 3431546947, 2003294622, 3182487618, 2282195339, 954669403, 3682191598, 1201765386, 3917234703, 3388507166, 0, 2198438022, 1211247597, 2887651696, 1315723890, 4227665663, 1443857720, 507358933, 657861945, 1678381017, 560487590, 3516619604, 975451694, 2970356327, 261314535, 3535072918, 2652609425, 1333838021, 2724322336, 1767536459, 370938394, 182621114, 3854606378, 1128014560, 487725847, 185469197, 2918353863, 3106780840, 3356761769, 2237133081, 1286567175, 3152976349, 4255350624, 2683765030, 3160175349, 3309594171, 878443390, 1988838185, 3704300486, 1756818940, 1673061617, 3403100636, 272786309, 1075025698, 545572369, 2105887268, 4174560061, 296679730, 1841768865, 1260232239, 4091327024, 3960309330, 3497509347, 1814803222, 2578018489, 4195456072, 575138148, 3299409036, 446754879, 3629546796, 4011996048, 3347532110, 3252238545, 4270639778, 915985419, 3483825537, 681933534, 651868046, 2755636671, 3828103837, 223377554, 2607439820, 1649704518, 3270937875, 3901806776, 1580087799, 4118987695, 3198115200, 2087309459, 2842678573, 3016697106, 1003007129, 2802849917, 1860738147, 2077965243, 164439672, 4100872472, 32283319, 2827177882, 1709610350, 2125135846, 136428751, 3874428392, 3652904859, 3460984630, 3572145929, 3593056380, 2939266226, 824852259, 818324884, 3224740454, 930369212, 2801566410, 2967507152, 355706840, 1257309336, 4148292826, 243256656, 790073846, 2373340630, 1296297904, 1422699085, 3756299780, 3818836405, 457992840, 3099667487, 2135319889, 77422314, 1560382517, 1945798516, 788204353, 1521706781, 1385356242, 870912086, 325965383, 2358957921, 2050466060, 2388260884, 2313884476, 4006521127, 901210569, 3990953189, 1014646705, 1503449823, 1062597235, 2031621326, 3212035895, 3931371469, 1533017514, 350174575, 2256028891, 2177544179, 1052338372, 741876788, 1606591296, 1914052035, 213705253, 2334669897, 1107234197, 1899603969, 3725069491, 2631447780, 2422494913, 1635502980, 1893020342, 1950903388, 1120974935];\n      var T7 = [2807058932, 1699970625, 2764249623, 1586903591, 1808481195, 1173430173, 1487645946, 59984867, 4199882800, 1844882806, 1989249228, 1277555970, 3623636965, 3419915562, 1149249077, 2744104290, 1514790577, 459744698, 244860394, 3235995134, 1963115311, 4027744588, 2544078150, 4190530515, 1608975247, 2627016082, 2062270317, 1507497298, 2200818878, 567498868, 1764313568, 3359936201, 2305455554, 2037970062, 1047239e3, 1910319033, 1337376481, 2904027272, 2892417312, 984907214, 1243112415, 830661914, 861968209, 2135253587, 2011214180, 2927934315, 2686254721, 731183368, 1750626376, 4246310725, 1820824798, 4172763771, 3542330227, 48394827, 2404901663, 2871682645, 671593195, 3254988725, 2073724613, 145085239, 2280796200, 2779915199, 1790575107, 2187128086, 472615631, 3029510009, 4075877127, 3802222185, 4107101658, 3201631749, 1646252340, 4270507174, 1402811438, 1436590835, 3778151818, 3950355702, 3963161475, 4020912224, 2667994737, 273792366, 2331590177, 104699613, 95345982, 3175501286, 2377486676, 1560637892, 3564045318, 369057872, 4213447064, 3919042237, 1137477952, 2658625497, 1119727848, 2340947849, 1530455833, 4007360968, 172466556, 266959938, 516552836, 0, 2256734592, 3980931627, 1890328081, 1917742170, 4294704398, 945164165, 3575528878, 958871085, 3647212047, 2787207260, 1423022939, 775562294, 1739656202, 3876557655, 2530391278, 2443058075, 3310321856, 547512796, 1265195639, 437656594, 3121275539, 719700128, 3762502690, 387781147, 218828297, 3350065803, 2830708150, 2848461854, 428169201, 122466165, 3720081049, 1627235199, 648017665, 4122762354, 1002783846, 2117360635, 695634755, 3336358691, 4234721005, 4049844452, 3704280881, 2232435299, 574624663, 287343814, 612205898, 1039717051, 840019705, 2708326185, 793451934, 821288114, 1391201670, 3822090177, 376187827, 3113855344, 1224348052, 1679968233, 2361698556, 1058709744, 752375421, 2431590963, 1321699145, 3519142200, 2734591178, 188127444, 2177869557, 3727205754, 2384911031, 3215212461, 2648976442, 2450346104, 3432737375, 1180849278, 331544205, 3102249176, 4150144569, 2952102595, 2159976285, 2474404304, 766078933, 313773861, 2570832044, 2108100632, 1668212892, 3145456443, 2013908262, 418672217, 3070356634, 2594734927, 1852171925, 3867060991, 3473416636, 3907448597, 2614737639, 919489135, 164948639, 2094410160, 2997825956, 590424639, 2486224549, 1723872674, 3157750862, 3399941250, 3501252752, 3625268135, 2555048196, 3673637356, 1343127501, 4130281361, 3599595085, 2957853679, 1297403050, 81781910, 3051593425, 2283490410, 532201772, 1367295589, 3926170974, 895287692, 1953757831, 1093597963, 492483431, 3528626907, 1446242576, 1192455638, 1636604631, 209336225, 344873464, 1015671571, 669961897, 3375740769, 3857572124, 2973530695, 3747192018, 1933530610, 3464042516, 935293895, 3454686199, 2858115069, 1863638845, 3683022916, 4085369519, 3292445032, 875313188, 1080017571, 3279033885, 621591778, 1233856572, 2504130317, 24197544, 3017672716, 3835484340, 3247465558, 2220981195, 3060847922, 1551124588, 1463996600];\n      var T8 = [4104605777, 1097159550, 396673818, 660510266, 2875968315, 2638606623, 4200115116, 3808662347, 821712160, 1986918061, 3430322568, 38544885, 3856137295, 718002117, 893681702, 1654886325, 2975484382, 3122358053, 3926825029, 4274053469, 796197571, 1290801793, 1184342925, 3556361835, 2405426947, 2459735317, 1836772287, 1381620373, 3196267988, 1948373848, 3764988233, 3385345166, 3263785589, 2390325492, 1480485785, 3111247143, 3780097726, 2293045232, 548169417, 3459953789, 3746175075, 439452389, 1362321559, 1400849762, 1685577905, 1806599355, 2174754046, 137073913, 1214797936, 1174215055, 3731654548, 2079897426, 1943217067, 1258480242, 529487843, 1437280870, 3945269170, 3049390895, 3313212038, 923313619, 679998e3, 3215307299, 57326082, 377642221, 3474729866, 2041877159, 133361907, 1776460110, 3673476453, 96392454, 878845905, 2801699524, 777231668, 4082475170, 2330014213, 4142626212, 2213296395, 1626319424, 1906247262, 1846563261, 562755902, 3708173718, 1040559837, 3871163981, 1418573201, 3294430577, 114585348, 1343618912, 2566595609, 3186202582, 1078185097, 3651041127, 3896688048, 2307622919, 425408743, 3371096953, 2081048481, 1108339068, 2216610296, 0, 2156299017, 736970802, 292596766, 1517440620, 251657213, 2235061775, 2933202493, 758720310, 265905162, 1554391400, 1532285339, 908999204, 174567692, 1474760595, 4002861748, 2610011675, 3234156416, 3693126241, 2001430874, 303699484, 2478443234, 2687165888, 585122620, 454499602, 151849742, 2345119218, 3064510765, 514443284, 4044981591, 1963412655, 2581445614, 2137062819, 19308535, 1928707164, 1715193156, 4219352155, 1126790795, 600235211, 3992742070, 3841024952, 836553431, 1669664834, 2535604243, 3323011204, 1243905413, 3141400786, 4180808110, 698445255, 2653899549, 2989552604, 2253581325, 3252932727, 3004591147, 1891211689, 2487810577, 3915653703, 4237083816, 4030667424, 2100090966, 865136418, 1229899655, 953270745, 3399679628, 3557504664, 4118925222, 2061379749, 3079546586, 2915017791, 983426092, 2022837584, 1607244650, 2118541908, 2366882550, 3635996816, 972512814, 3283088770, 1568718495, 3499326569, 3576539503, 621982671, 2895723464, 410887952, 2623762152, 1002142683, 645401037, 1494807662, 2595684844, 1335535747, 2507040230, 4293295786, 3167684641, 367585007, 3885750714, 1865862730, 2668221674, 2960971305, 2763173681, 1059270954, 2777952454, 2724642869, 1320957812, 2194319100, 2429595872, 2815956275, 77089521, 3973773121, 3444575871, 2448830231, 1305906550, 4021308739, 2857194700, 2516901860, 3518358430, 1787304780, 740276417, 1699839814, 1592394909, 2352307457, 2272556026, 188821243, 1729977011, 3687994002, 274084841, 3594982253, 3613494426, 2701949495, 4162096729, 322734571, 2837966542, 1640576439, 484830689, 1202797690, 3537852828, 4067639125, 349075736, 3342319475, 4157467219, 4255800159, 1030690015, 1155237496, 2951971274, 1757691577, 607398968, 2738905026, 499347990, 3794078908, 1011452712, 227885567, 2818666809, 213114376, 3034881240, 1455525988, 3414450555, 850817237, 1817998408, 3092726480];\n      var U1 = [0, 235474187, 470948374, 303765277, 941896748, 908933415, 607530554, 708780849, 1883793496, 2118214995, 1817866830, 1649639237, 1215061108, 1181045119, 1417561698, 1517767529, 3767586992, 4003061179, 4236429990, 4069246893, 3635733660, 3602770327, 3299278474, 3400528769, 2430122216, 2664543715, 2362090238, 2193862645, 2835123396, 2801107407, 3035535058, 3135740889, 3678124923, 3576870512, 3341394285, 3374361702, 3810496343, 3977675356, 4279080257, 4043610186, 2876494627, 2776292904, 3076639029, 3110650942, 2472011535, 2640243204, 2403728665, 2169303058, 1001089995, 899835584, 666464733, 699432150, 59727847, 226906860, 530400753, 294930682, 1273168787, 1172967064, 1475418501, 1509430414, 1942435775, 2110667444, 1876241833, 1641816226, 2910219766, 2743034109, 2976151520, 3211623147, 2505202138, 2606453969, 2302690252, 2269728455, 3711829422, 3543599269, 3240894392, 3475313331, 3843699074, 3943906441, 4178062228, 4144047775, 1306967366, 1139781709, 1374988112, 1610459739, 1975683434, 2076935265, 1775276924, 1742315127, 1034867998, 866637845, 566021896, 800440835, 92987698, 193195065, 429456164, 395441711, 1984812685, 2017778566, 1784663195, 1683407248, 1315562145, 1080094634, 1383856311, 1551037884, 101039829, 135050206, 437757123, 337553864, 1042385657, 807962610, 573804783, 742039012, 2531067453, 2564033334, 2328828971, 2227573024, 2935566865, 2700099354, 3001755655, 3168937228, 3868552805, 3902563182, 4203181171, 4102977912, 3736164937, 3501741890, 3265478751, 3433712980, 1106041591, 1340463100, 1576976609, 1408749034, 2043211483, 2009195472, 1708848333, 1809054150, 832877231, 1068351396, 766945465, 599762354, 159417987, 126454664, 361929877, 463180190, 2709260871, 2943682380, 3178106961, 3009879386, 2572697195, 2538681184, 2236228733, 2336434550, 3509871135, 3745345300, 3441850377, 3274667266, 3910161971, 3877198648, 4110568485, 4211818798, 2597806476, 2497604743, 2261089178, 2295101073, 2733856160, 2902087851, 3202437046, 2968011453, 3936291284, 3835036895, 4136440770, 4169408201, 3535486456, 3702665459, 3467192302, 3231722213, 2051518780, 1951317047, 1716890410, 1750902305, 1113818384, 1282050075, 1584504582, 1350078989, 168810852, 67556463, 371049330, 404016761, 841739592, 1008918595, 775550814, 540080725, 3969562369, 3801332234, 4035489047, 4269907996, 3569255213, 3669462566, 3366754619, 3332740144, 2631065433, 2463879762, 2160117071, 2395588676, 2767645557, 2868897406, 3102011747, 3069049960, 202008497, 33778362, 270040487, 504459436, 875451293, 975658646, 675039627, 641025152, 2084704233, 1917518562, 1615861247, 1851332852, 1147550661, 1248802510, 1484005843, 1451044056, 933301370, 967311729, 733156972, 632953703, 260388950, 25965917, 328671808, 496906059, 1206477858, 1239443753, 1543208500, 1441952575, 2144161806, 1908694277, 1675577880, 1842759443, 3610369226, 3644379585, 3408119516, 3307916247, 4011190502, 3776767469, 4077384432, 4245618683, 2809771154, 2842737049, 3144396420, 3043140495, 2673705150, 2438237621, 2203032232, 2370213795];\n      var U2 = [0, 185469197, 370938394, 487725847, 741876788, 657861945, 975451694, 824852259, 1483753576, 1400783205, 1315723890, 1164071807, 1950903388, 2135319889, 1649704518, 1767536459, 2967507152, 3152976349, 2801566410, 2918353863, 2631447780, 2547432937, 2328143614, 2177544179, 3901806776, 3818836405, 4270639778, 4118987695, 3299409036, 3483825537, 3535072918, 3652904859, 2077965243, 1893020342, 1841768865, 1724457132, 1474502543, 1559041666, 1107234197, 1257309336, 598438867, 681933534, 901210569, 1052338372, 261314535, 77422314, 428819965, 310463728, 3409685355, 3224740454, 3710368113, 3593056380, 3875770207, 3960309330, 4045380933, 4195456072, 2471224067, 2554718734, 2237133081, 2388260884, 3212035895, 3028143674, 2842678573, 2724322336, 4138563181, 4255350624, 3769721975, 3955191162, 3667219033, 3516619604, 3431546947, 3347532110, 2933734917, 2782082824, 3099667487, 3016697106, 2196052529, 2313884476, 2499348523, 2683765030, 1179510461, 1296297904, 1347548327, 1533017514, 1786102409, 1635502980, 2087309459, 2003294622, 507358933, 355706840, 136428751, 53458370, 839224033, 957055980, 605657339, 790073846, 2373340630, 2256028891, 2607439820, 2422494913, 2706270690, 2856345839, 3075636216, 3160175349, 3573941694, 3725069491, 3273267108, 3356761769, 4181598602, 4063242375, 4011996048, 3828103837, 1033297158, 915985419, 730517276, 545572369, 296679730, 446754879, 129166120, 213705253, 1709610350, 1860738147, 1945798516, 2029293177, 1239331162, 1120974935, 1606591296, 1422699085, 4148292826, 4233094615, 3781033664, 3931371469, 3682191598, 3497509347, 3446004468, 3328955385, 2939266226, 2755636671, 3106780840, 2988687269, 2198438022, 2282195339, 2501218972, 2652609425, 1201765386, 1286567175, 1371368976, 1521706781, 1805211710, 1620529459, 2105887268, 1988838185, 533804130, 350174575, 164439672, 46346101, 870912086, 954669403, 636813900, 788204353, 2358957921, 2274680428, 2592523643, 2441661558, 2695033685, 2880240216, 3065962831, 3182487618, 3572145929, 3756299780, 3270937875, 3388507166, 4174560061, 4091327024, 4006521127, 3854606378, 1014646705, 930369212, 711349675, 560487590, 272786309, 457992840, 106852767, 223377554, 1678381017, 1862534868, 1914052035, 2031621326, 1211247597, 1128014560, 1580087799, 1428173050, 32283319, 182621114, 401639597, 486441376, 768917123, 651868046, 1003007129, 818324884, 1503449823, 1385356242, 1333838021, 1150208456, 1973745387, 2125135846, 1673061617, 1756818940, 2970356327, 3120694122, 2802849917, 2887651696, 2637442643, 2520393566, 2334669897, 2149987652, 3917234703, 3799141122, 4284502037, 4100872472, 3309594171, 3460984630, 3545789473, 3629546796, 2050466060, 1899603969, 1814803222, 1730525723, 1443857720, 1560382517, 1075025698, 1260232239, 575138148, 692707433, 878443390, 1062597235, 243256656, 91341917, 409198410, 325965383, 3403100636, 3252238545, 3704300486, 3620022987, 3874428392, 3990953189, 4042459122, 4227665663, 2460449204, 2578018489, 2226875310, 2411029155, 3198115200, 3046200461, 2827177882, 2743944855];\n      var U3 = [0, 218828297, 437656594, 387781147, 875313188, 958871085, 775562294, 590424639, 1750626376, 1699970625, 1917742170, 2135253587, 1551124588, 1367295589, 1180849278, 1265195639, 3501252752, 3720081049, 3399941250, 3350065803, 3835484340, 3919042237, 4270507174, 4085369519, 3102249176, 3051593425, 2734591178, 2952102595, 2361698556, 2177869557, 2530391278, 2614737639, 3145456443, 3060847922, 2708326185, 2892417312, 2404901663, 2187128086, 2504130317, 2555048196, 3542330227, 3727205754, 3375740769, 3292445032, 3876557655, 3926170974, 4246310725, 4027744588, 1808481195, 1723872674, 1910319033, 2094410160, 1608975247, 1391201670, 1173430173, 1224348052, 59984867, 244860394, 428169201, 344873464, 935293895, 984907214, 766078933, 547512796, 1844882806, 1627235199, 2011214180, 2062270317, 1507497298, 1423022939, 1137477952, 1321699145, 95345982, 145085239, 532201772, 313773861, 830661914, 1015671571, 731183368, 648017665, 3175501286, 2957853679, 2807058932, 2858115069, 2305455554, 2220981195, 2474404304, 2658625497, 3575528878, 3625268135, 3473416636, 3254988725, 3778151818, 3963161475, 4213447064, 4130281361, 3599595085, 3683022916, 3432737375, 3247465558, 3802222185, 4020912224, 4172763771, 4122762354, 3201631749, 3017672716, 2764249623, 2848461854, 2331590177, 2280796200, 2431590963, 2648976442, 104699613, 188127444, 472615631, 287343814, 840019705, 1058709744, 671593195, 621591778, 1852171925, 1668212892, 1953757831, 2037970062, 1514790577, 1463996600, 1080017571, 1297403050, 3673637356, 3623636965, 3235995134, 3454686199, 4007360968, 3822090177, 4107101658, 4190530515, 2997825956, 3215212461, 2830708150, 2779915199, 2256734592, 2340947849, 2627016082, 2443058075, 172466556, 122466165, 273792366, 492483431, 1047239e3, 861968209, 612205898, 695634755, 1646252340, 1863638845, 2013908262, 1963115311, 1446242576, 1530455833, 1277555970, 1093597963, 1636604631, 1820824798, 2073724613, 1989249228, 1436590835, 1487645946, 1337376481, 1119727848, 164948639, 81781910, 331544205, 516552836, 1039717051, 821288114, 669961897, 719700128, 2973530695, 3157750862, 2871682645, 2787207260, 2232435299, 2283490410, 2667994737, 2450346104, 3647212047, 3564045318, 3279033885, 3464042516, 3980931627, 3762502690, 4150144569, 4199882800, 3070356634, 3121275539, 2904027272, 2686254721, 2200818878, 2384911031, 2570832044, 2486224549, 3747192018, 3528626907, 3310321856, 3359936201, 3950355702, 3867060991, 4049844452, 4234721005, 1739656202, 1790575107, 2108100632, 1890328081, 1402811438, 1586903591, 1233856572, 1149249077, 266959938, 48394827, 369057872, 418672217, 1002783846, 919489135, 567498868, 752375421, 209336225, 24197544, 376187827, 459744698, 945164165, 895287692, 574624663, 793451934, 1679968233, 1764313568, 2117360635, 1933530610, 1343127501, 1560637892, 1243112415, 1192455638, 3704280881, 3519142200, 3336358691, 3419915562, 3907448597, 3857572124, 4075877127, 4294704398, 3029510009, 3113855344, 2927934315, 2744104290, 2159976285, 2377486676, 2594734927, 2544078150];\n      var U4 = [0, 151849742, 303699484, 454499602, 607398968, 758720310, 908999204, 1059270954, 1214797936, 1097159550, 1517440620, 1400849762, 1817998408, 1699839814, 2118541908, 2001430874, 2429595872, 2581445614, 2194319100, 2345119218, 3034881240, 3186202582, 2801699524, 2951971274, 3635996816, 3518358430, 3399679628, 3283088770, 4237083816, 4118925222, 4002861748, 3885750714, 1002142683, 850817237, 698445255, 548169417, 529487843, 377642221, 227885567, 77089521, 1943217067, 2061379749, 1640576439, 1757691577, 1474760595, 1592394909, 1174215055, 1290801793, 2875968315, 2724642869, 3111247143, 2960971305, 2405426947, 2253581325, 2638606623, 2487810577, 3808662347, 3926825029, 4044981591, 4162096729, 3342319475, 3459953789, 3576539503, 3693126241, 1986918061, 2137062819, 1685577905, 1836772287, 1381620373, 1532285339, 1078185097, 1229899655, 1040559837, 923313619, 740276417, 621982671, 439452389, 322734571, 137073913, 19308535, 3871163981, 4021308739, 4104605777, 4255800159, 3263785589, 3414450555, 3499326569, 3651041127, 2933202493, 2815956275, 3167684641, 3049390895, 2330014213, 2213296395, 2566595609, 2448830231, 1305906550, 1155237496, 1607244650, 1455525988, 1776460110, 1626319424, 2079897426, 1928707164, 96392454, 213114376, 396673818, 514443284, 562755902, 679998e3, 865136418, 983426092, 3708173718, 3557504664, 3474729866, 3323011204, 4180808110, 4030667424, 3945269170, 3794078908, 2507040230, 2623762152, 2272556026, 2390325492, 2975484382, 3092726480, 2738905026, 2857194700, 3973773121, 3856137295, 4274053469, 4157467219, 3371096953, 3252932727, 3673476453, 3556361835, 2763173681, 2915017791, 3064510765, 3215307299, 2156299017, 2307622919, 2459735317, 2610011675, 2081048481, 1963412655, 1846563261, 1729977011, 1480485785, 1362321559, 1243905413, 1126790795, 878845905, 1030690015, 645401037, 796197571, 274084841, 425408743, 38544885, 188821243, 3613494426, 3731654548, 3313212038, 3430322568, 4082475170, 4200115116, 3780097726, 3896688048, 2668221674, 2516901860, 2366882550, 2216610296, 3141400786, 2989552604, 2837966542, 2687165888, 1202797690, 1320957812, 1437280870, 1554391400, 1669664834, 1787304780, 1906247262, 2022837584, 265905162, 114585348, 499347990, 349075736, 736970802, 585122620, 972512814, 821712160, 2595684844, 2478443234, 2293045232, 2174754046, 3196267988, 3079546586, 2895723464, 2777952454, 3537852828, 3687994002, 3234156416, 3385345166, 4142626212, 4293295786, 3841024952, 3992742070, 174567692, 57326082, 410887952, 292596766, 777231668, 660510266, 1011452712, 893681702, 1108339068, 1258480242, 1343618912, 1494807662, 1715193156, 1865862730, 1948373848, 2100090966, 2701949495, 2818666809, 3004591147, 3122358053, 2235061775, 2352307457, 2535604243, 2653899549, 3915653703, 3764988233, 4219352155, 4067639125, 3444575871, 3294430577, 3746175075, 3594982253, 836553431, 953270745, 600235211, 718002117, 367585007, 484830689, 133361907, 251657213, 2041877159, 1891211689, 1806599355, 1654886325, 1568718495, 1418573201, 1335535747, 1184342925];\n      function convertToInt32(bytes) {\n        var result2 = [];\n        for (var i = 0; i < bytes.length; i += 4) {\n          result2.push(\n            bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]\n          );\n        }\n        return result2;\n      }\n      var AES = function(key) {\n        if (!(this instanceof AES)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        Object.defineProperty(this, \"key\", {\n          value: coerceArray(key, true)\n        });\n        this._prepare();\n      };\n      AES.prototype._prepare = function() {\n        var rounds = numberOfRounds[this.key.length];\n        if (rounds == null) {\n          throw new Error(\"invalid key size (must be 16, 24 or 32 bytes)\");\n        }\n        this._Ke = [];\n        this._Kd = [];\n        for (var i = 0; i <= rounds; i++) {\n          this._Ke.push([0, 0, 0, 0]);\n          this._Kd.push([0, 0, 0, 0]);\n        }\n        var roundKeyCount = (rounds + 1) * 4;\n        var KC = this.key.length / 4;\n        var tk = convertToInt32(this.key);\n        var index;\n        for (var i = 0; i < KC; i++) {\n          index = i >> 2;\n          this._Ke[index][i % 4] = tk[i];\n          this._Kd[rounds - index][i % 4] = tk[i];\n        }\n        var rconpointer = 0;\n        var t = KC, tt;\n        while (t < roundKeyCount) {\n          tt = tk[KC - 1];\n          tk[0] ^= S[tt >> 16 & 255] << 24 ^ S[tt >> 8 & 255] << 16 ^ S[tt & 255] << 8 ^ S[tt >> 24 & 255] ^ rcon[rconpointer] << 24;\n          rconpointer += 1;\n          if (KC != 8) {\n            for (var i = 1; i < KC; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n          } else {\n            for (var i = 1; i < KC / 2; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n            tt = tk[KC / 2 - 1];\n            tk[KC / 2] ^= S[tt & 255] ^ S[tt >> 8 & 255] << 8 ^ S[tt >> 16 & 255] << 16 ^ S[tt >> 24 & 255] << 24;\n            for (var i = KC / 2 + 1; i < KC; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n          }\n          var i = 0, r, c;\n          while (i < KC && t < roundKeyCount) {\n            r = t >> 2;\n            c = t % 4;\n            this._Ke[r][c] = tk[i];\n            this._Kd[rounds - r][c] = tk[i++];\n            t++;\n          }\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var c = 0; c < 4; c++) {\n            tt = this._Kd[r][c];\n            this._Kd[r][c] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255];\n          }\n        }\n      };\n      AES.prototype.encrypt = function(plaintext) {\n        if (plaintext.length != 16) {\n          throw new Error(\"invalid plaintext size (must be 16 bytes)\");\n        }\n        var rounds = this._Ke.length - 1;\n        var a = [0, 0, 0, 0];\n        var t = convertToInt32(plaintext);\n        for (var i = 0; i < 4; i++) {\n          t[i] ^= this._Ke[0][i];\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var i = 0; i < 4; i++) {\n            a[i] = T1[t[i] >> 24 & 255] ^ T2[t[(i + 1) % 4] >> 16 & 255] ^ T3[t[(i + 2) % 4] >> 8 & 255] ^ T4[t[(i + 3) % 4] & 255] ^ this._Ke[r][i];\n          }\n          t = a.slice();\n        }\n        var result2 = createArray(16), tt;\n        for (var i = 0; i < 4; i++) {\n          tt = this._Ke[rounds][i];\n          result2[4 * i] = (S[t[i] >> 24 & 255] ^ tt >> 24) & 255;\n          result2[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 255] ^ tt >> 16) & 255;\n          result2[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;\n          result2[4 * i + 3] = (S[t[(i + 3) % 4] & 255] ^ tt) & 255;\n        }\n        return result2;\n      };\n      AES.prototype.decrypt = function(ciphertext) {\n        if (ciphertext.length != 16) {\n          throw new Error(\"invalid ciphertext size (must be 16 bytes)\");\n        }\n        var rounds = this._Kd.length - 1;\n        var a = [0, 0, 0, 0];\n        var t = convertToInt32(ciphertext);\n        for (var i = 0; i < 4; i++) {\n          t[i] ^= this._Kd[0][i];\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var i = 0; i < 4; i++) {\n            a[i] = T5[t[i] >> 24 & 255] ^ T6[t[(i + 3) % 4] >> 16 & 255] ^ T7[t[(i + 2) % 4] >> 8 & 255] ^ T8[t[(i + 1) % 4] & 255] ^ this._Kd[r][i];\n          }\n          t = a.slice();\n        }\n        var result2 = createArray(16), tt;\n        for (var i = 0; i < 4; i++) {\n          tt = this._Kd[rounds][i];\n          result2[4 * i] = (Si[t[i] >> 24 & 255] ^ tt >> 24) & 255;\n          result2[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 255] ^ tt >> 16) & 255;\n          result2[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;\n          result2[4 * i + 3] = (Si[t[(i + 1) % 4] & 255] ^ tt) & 255;\n        }\n        return result2;\n      };\n      var ModeOfOperationECB = function(key) {\n        if (!(this instanceof ModeOfOperationECB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Electronic Code Block\";\n        this.name = \"ecb\";\n        this._aes = new AES(key);\n      };\n      ModeOfOperationECB.prototype.encrypt = function(plaintext) {\n        plaintext = coerceArray(plaintext);\n        if (plaintext.length % 16 !== 0) {\n          throw new Error(\"invalid plaintext size (must be multiple of 16 bytes)\");\n        }\n        var ciphertext = createArray(plaintext.length);\n        var block = createArray(16);\n        for (var i = 0; i < plaintext.length; i += 16) {\n          copyArray(plaintext, block, 0, i, i + 16);\n          block = this._aes.encrypt(block);\n          copyArray(block, ciphertext, i);\n        }\n        return ciphertext;\n      };\n      ModeOfOperationECB.prototype.decrypt = function(ciphertext) {\n        ciphertext = coerceArray(ciphertext);\n        if (ciphertext.length % 16 !== 0) {\n          throw new Error(\"invalid ciphertext size (must be multiple of 16 bytes)\");\n        }\n        var plaintext = createArray(ciphertext.length);\n        var block = createArray(16);\n        for (var i = 0; i < ciphertext.length; i += 16) {\n          copyArray(ciphertext, block, 0, i, i + 16);\n          block = this._aes.decrypt(block);\n          copyArray(block, plaintext, i);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationCBC = function(key, iv) {\n        if (!(this instanceof ModeOfOperationCBC)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Cipher Block Chaining\";\n        this.name = \"cbc\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 bytes)\");\n        }\n        this._lastCipherblock = coerceArray(iv, true);\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCBC.prototype.encrypt = function(plaintext) {\n        plaintext = coerceArray(plaintext);\n        if (plaintext.length % 16 !== 0) {\n          throw new Error(\"invalid plaintext size (must be multiple of 16 bytes)\");\n        }\n        var ciphertext = createArray(plaintext.length);\n        var block = createArray(16);\n        for (var i = 0; i < plaintext.length; i += 16) {\n          copyArray(plaintext, block, 0, i, i + 16);\n          for (var j = 0; j < 16; j++) {\n            block[j] ^= this._lastCipherblock[j];\n          }\n          this._lastCipherblock = this._aes.encrypt(block);\n          copyArray(this._lastCipherblock, ciphertext, i);\n        }\n        return ciphertext;\n      };\n      ModeOfOperationCBC.prototype.decrypt = function(ciphertext) {\n        ciphertext = coerceArray(ciphertext);\n        if (ciphertext.length % 16 !== 0) {\n          throw new Error(\"invalid ciphertext size (must be multiple of 16 bytes)\");\n        }\n        var plaintext = createArray(ciphertext.length);\n        var block = createArray(16);\n        for (var i = 0; i < ciphertext.length; i += 16) {\n          copyArray(ciphertext, block, 0, i, i + 16);\n          block = this._aes.decrypt(block);\n          for (var j = 0; j < 16; j++) {\n            plaintext[i + j] = block[j] ^ this._lastCipherblock[j];\n          }\n          copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationCFB = function(key, iv, segmentSize) {\n        if (!(this instanceof ModeOfOperationCFB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Cipher Feedback\";\n        this.name = \"cfb\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 size)\");\n        }\n        if (!segmentSize) {\n          segmentSize = 1;\n        }\n        this.segmentSize = segmentSize;\n        this._shiftRegister = coerceArray(iv, true);\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCFB.prototype.encrypt = function(plaintext) {\n        if (plaintext.length % this.segmentSize != 0) {\n          throw new Error(\"invalid plaintext size (must be segmentSize bytes)\");\n        }\n        var encrypted = coerceArray(plaintext, true);\n        var xorSegment;\n        for (var i = 0; i < encrypted.length; i += this.segmentSize) {\n          xorSegment = this._aes.encrypt(this._shiftRegister);\n          for (var j = 0; j < this.segmentSize; j++) {\n            encrypted[i + j] ^= xorSegment[j];\n          }\n          copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n          copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n        }\n        return encrypted;\n      };\n      ModeOfOperationCFB.prototype.decrypt = function(ciphertext) {\n        if (ciphertext.length % this.segmentSize != 0) {\n          throw new Error(\"invalid ciphertext size (must be segmentSize bytes)\");\n        }\n        var plaintext = coerceArray(ciphertext, true);\n        var xorSegment;\n        for (var i = 0; i < plaintext.length; i += this.segmentSize) {\n          xorSegment = this._aes.encrypt(this._shiftRegister);\n          for (var j = 0; j < this.segmentSize; j++) {\n            plaintext[i + j] ^= xorSegment[j];\n          }\n          copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n          copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationOFB = function(key, iv) {\n        if (!(this instanceof ModeOfOperationOFB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Output Feedback\";\n        this.name = \"ofb\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 bytes)\");\n        }\n        this._lastPrecipher = coerceArray(iv, true);\n        this._lastPrecipherIndex = 16;\n        this._aes = new AES(key);\n      };\n      ModeOfOperationOFB.prototype.encrypt = function(plaintext) {\n        var encrypted = coerceArray(plaintext, true);\n        for (var i = 0; i < encrypted.length; i++) {\n          if (this._lastPrecipherIndex === 16) {\n            this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);\n            this._lastPrecipherIndex = 0;\n          }\n          encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];\n        }\n        return encrypted;\n      };\n      ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;\n      var Counter = function(initialValue) {\n        if (!(this instanceof Counter)) {\n          throw Error(\"Counter must be instanitated with `new`\");\n        }\n        if (initialValue !== 0 && !initialValue) {\n          initialValue = 1;\n        }\n        if (typeof initialValue === \"number\") {\n          this._counter = createArray(16);\n          this.setValue(initialValue);\n        } else {\n          this.setBytes(initialValue);\n        }\n      };\n      Counter.prototype.setValue = function(value) {\n        if (typeof value !== \"number\" || parseInt(value) != value) {\n          throw new Error(\"invalid counter value (must be an integer)\");\n        }\n        for (var index = 15; index >= 0; --index) {\n          this._counter[index] = value % 256;\n          value = value >> 8;\n        }\n      };\n      Counter.prototype.setBytes = function(bytes) {\n        bytes = coerceArray(bytes, true);\n        if (bytes.length != 16) {\n          throw new Error(\"invalid counter bytes size (must be 16 bytes)\");\n        }\n        this._counter = bytes;\n      };\n      Counter.prototype.increment = function() {\n        for (var i = 15; i >= 0; i--) {\n          if (this._counter[i] === 255) {\n            this._counter[i] = 0;\n          } else {\n            this._counter[i]++;\n            break;\n          }\n        }\n      };\n      var ModeOfOperationCTR = function(key, counter) {\n        if (!(this instanceof ModeOfOperationCTR)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Counter\";\n        this.name = \"ctr\";\n        if (!(counter instanceof Counter)) {\n          counter = new Counter(counter);\n        }\n        this._counter = counter;\n        this._remainingCounter = null;\n        this._remainingCounterIndex = 16;\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCTR.prototype.encrypt = function(plaintext) {\n        var encrypted = coerceArray(plaintext, true);\n        for (var i = 0; i < encrypted.length; i++) {\n          if (this._remainingCounterIndex === 16) {\n            this._remainingCounter = this._aes.encrypt(this._counter._counter);\n            this._remainingCounterIndex = 0;\n            this._counter.increment();\n          }\n          encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\n        }\n        return encrypted;\n      };\n      ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;\n      function pkcs7pad(data) {\n        data = coerceArray(data, true);\n        var padder = 16 - data.length % 16;\n        var result2 = createArray(data.length + padder);\n        copyArray(data, result2);\n        for (var i = data.length; i < result2.length; i++) {\n          result2[i] = padder;\n        }\n        return result2;\n      }\n      function pkcs7strip(data) {\n        data = coerceArray(data, true);\n        if (data.length < 16) {\n          throw new Error(\"PKCS#7 invalid length\");\n        }\n        var padder = data[data.length - 1];\n        if (padder > 16) {\n          throw new Error(\"PKCS#7 padding byte out of range\");\n        }\n        var length = data.length - padder;\n        for (var i = 0; i < padder; i++) {\n          if (data[length + i] !== padder) {\n            throw new Error(\"PKCS#7 invalid padding byte\");\n          }\n        }\n        var result2 = createArray(length);\n        copyArray(data, result2, 0, 0, length);\n        return result2;\n      }\n      var aesjs = {\n        AES,\n        Counter,\n        ModeOfOperation: {\n          ecb: ModeOfOperationECB,\n          cbc: ModeOfOperationCBC,\n          cfb: ModeOfOperationCFB,\n          ofb: ModeOfOperationOFB,\n          ctr: ModeOfOperationCTR\n        },\n        utils: {\n          hex: convertHex,\n          utf8: convertUtf8\n        },\n        padding: {\n          pkcs7: {\n            pad: pkcs7pad,\n            strip: pkcs7strip\n          }\n        },\n        _arrayTest: {\n          coerceArray,\n          createArray,\n          copyArray\n        }\n      };\n      if (typeof exports2 !== \"undefined\") {\n        module2.exports = aesjs;\n      } else if (typeof define === \"function\" && define.amd) {\n        define(aesjs);\n      } else {\n        if (root.aesjs) {\n          aesjs._aesjs = root.aesjs;\n        }\n        root.aesjs = aesjs;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/_version.js\nvar require_version18 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"json-wallets/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/utils.js\nvar require_utils4 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/utils.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.uuidV4 = exports2.searchPath = exports2.getPassword = exports2.zpad = exports2.looseArrayify = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    function looseArrayify(hexString) {\n      if (typeof hexString === \"string\" && hexString.substring(0, 2) !== \"0x\") {\n        hexString = \"0x\" + hexString;\n      }\n      return (0, bytes_1.arrayify)(hexString);\n    }\n    exports2.looseArrayify = looseArrayify;\n    function zpad(value, length) {\n      value = String(value);\n      while (value.length < length) {\n        value = \"0\" + value;\n      }\n      return value;\n    }\n    exports2.zpad = zpad;\n    function getPassword(password) {\n      if (typeof password === \"string\") {\n        return (0, strings_1.toUtf8Bytes)(password, strings_1.UnicodeNormalizationForm.NFKC);\n      }\n      return (0, bytes_1.arrayify)(password);\n    }\n    exports2.getPassword = getPassword;\n    function searchPath(object, path) {\n      var currentChild = object;\n      var comps = path.toLowerCase().split(\"/\");\n      for (var i = 0; i < comps.length; i++) {\n        var matchingChild = null;\n        for (var key in currentChild) {\n          if (key.toLowerCase() === comps[i]) {\n            matchingChild = currentChild[key];\n            break;\n          }\n        }\n        if (matchingChild === null) {\n          return null;\n        }\n        currentChild = matchingChild;\n      }\n      return currentChild;\n    }\n    exports2.searchPath = searchPath;\n    function uuidV4(randomBytes) {\n      var bytes = (0, bytes_1.arrayify)(randomBytes);\n      bytes[6] = bytes[6] & 15 | 64;\n      bytes[8] = bytes[8] & 63 | 128;\n      var value = (0, bytes_1.hexlify)(bytes);\n      return [\n        value.substring(2, 10),\n        value.substring(10, 14),\n        value.substring(14, 18),\n        value.substring(18, 22),\n        value.substring(22, 34)\n      ].join(\"-\");\n    }\n    exports2.uuidV4 = uuidV4;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/crowdsale.js\nvar require_crowdsale = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/crowdsale.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decrypt = exports2.CrowdsaleAccount = void 0;\n    var aes_js_1 = __importDefault(require_aes_js());\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var pbkdf2_1 = require_lib18();\n    var strings_1 = require_lib9();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version18();\n    var logger = new logger_1.Logger(_version_1.version);\n    var utils_1 = require_utils4();\n    var CrowdsaleAccount = (\n      /** @class */\n      function(_super) {\n        __extends(CrowdsaleAccount2, _super);\n        function CrowdsaleAccount2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        CrowdsaleAccount2.prototype.isCrowdsaleAccount = function(value) {\n          return !!(value && value._isCrowdsaleAccount);\n        };\n        return CrowdsaleAccount2;\n      }(properties_1.Description)\n    );\n    exports2.CrowdsaleAccount = CrowdsaleAccount;\n    function decrypt(json, password) {\n      var data = JSON.parse(json);\n      password = (0, utils_1.getPassword)(password);\n      var ethaddr = (0, address_1.getAddress)((0, utils_1.searchPath)(data, \"ethaddr\"));\n      var encseed = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"encseed\"));\n      if (!encseed || encseed.length % 16 !== 0) {\n        logger.throwArgumentError(\"invalid encseed\", \"json\", json);\n      }\n      var key = (0, bytes_1.arrayify)((0, pbkdf2_1.pbkdf2)(password, password, 2e3, 32, \"sha256\")).slice(0, 16);\n      var iv = encseed.slice(0, 16);\n      var encryptedSeed = encseed.slice(16);\n      var aesCbc = new aes_js_1.default.ModeOfOperation.cbc(key, iv);\n      var seed = aes_js_1.default.padding.pkcs7.strip((0, bytes_1.arrayify)(aesCbc.decrypt(encryptedSeed)));\n      var seedHex = \"\";\n      for (var i = 0; i < seed.length; i++) {\n        seedHex += String.fromCharCode(seed[i]);\n      }\n      var seedHexBytes = (0, strings_1.toUtf8Bytes)(seedHex);\n      var privateKey = (0, keccak256_1.keccak256)(seedHexBytes);\n      return new CrowdsaleAccount({\n        _isCrowdsaleAccount: true,\n        address: ethaddr,\n        privateKey\n      });\n    }\n    exports2.decrypt = decrypt;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/inspect.js\nvar require_inspect = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/inspect.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getJsonWalletAddress = exports2.isKeystoreWallet = exports2.isCrowdsaleWallet = void 0;\n    var address_1 = require_lib7();\n    function isCrowdsaleWallet(json) {\n      var data = null;\n      try {\n        data = JSON.parse(json);\n      } catch (error) {\n        return false;\n      }\n      return data.encseed && data.ethaddr;\n    }\n    exports2.isCrowdsaleWallet = isCrowdsaleWallet;\n    function isKeystoreWallet(json) {\n      var data = null;\n      try {\n        data = JSON.parse(json);\n      } catch (error) {\n        return false;\n      }\n      if (!data.version || parseInt(data.version) !== data.version || parseInt(data.version) !== 3) {\n        return false;\n      }\n      return true;\n    }\n    exports2.isKeystoreWallet = isKeystoreWallet;\n    function getJsonWalletAddress(json) {\n      if (isCrowdsaleWallet(json)) {\n        try {\n          return (0, address_1.getAddress)(JSON.parse(json).ethaddr);\n        } catch (error) {\n          return null;\n        }\n      }\n      if (isKeystoreWallet(json)) {\n        try {\n          return (0, address_1.getAddress)(JSON.parse(json).address);\n        } catch (error) {\n          return null;\n        }\n      }\n      return null;\n    }\n    exports2.getJsonWalletAddress = getJsonWalletAddress;\n  }\n});\n\n// node_modules/scrypt-js/scrypt.js\nvar require_scrypt = __commonJS({\n  \"node_modules/scrypt-js/scrypt.js\"(exports2, module2) {\n    \"use strict\";\n    (function(root) {\n      const MAX_VALUE = 2147483647;\n      function SHA256(m) {\n        const K = new Uint32Array([\n          1116352408,\n          1899447441,\n          3049323471,\n          3921009573,\n          961987163,\n          1508970993,\n          2453635748,\n          2870763221,\n          3624381080,\n          310598401,\n          607225278,\n          1426881987,\n          1925078388,\n          2162078206,\n          2614888103,\n          3248222580,\n          3835390401,\n          4022224774,\n          264347078,\n          604807628,\n          770255983,\n          1249150122,\n          1555081692,\n          1996064986,\n          2554220882,\n          2821834349,\n          2952996808,\n          3210313671,\n          3336571891,\n          3584528711,\n          113926993,\n          338241895,\n          666307205,\n          773529912,\n          1294757372,\n          1396182291,\n          1695183700,\n          1986661051,\n          2177026350,\n          2456956037,\n          2730485921,\n          2820302411,\n          3259730800,\n          3345764771,\n          3516065817,\n          3600352804,\n          4094571909,\n          275423344,\n          430227734,\n          506948616,\n          659060556,\n          883997877,\n          958139571,\n          1322822218,\n          1537002063,\n          1747873779,\n          1955562222,\n          2024104815,\n          2227730452,\n          2361852424,\n          2428436474,\n          2756734187,\n          3204031479,\n          3329325298\n        ]);\n        let h0 = 1779033703, h1 = 3144134277, h2 = 1013904242, h3 = 2773480762;\n        let h4 = 1359893119, h5 = 2600822924, h6 = 528734635, h7 = 1541459225;\n        const w = new Uint32Array(64);\n        function blocks(p2) {\n          let off = 0, len = p2.length;\n          while (len >= 64) {\n            let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, u, i2, j, t1, t2;\n            for (i2 = 0; i2 < 16; i2++) {\n              j = off + i2 * 4;\n              w[i2] = (p2[j] & 255) << 24 | (p2[j + 1] & 255) << 16 | (p2[j + 2] & 255) << 8 | p2[j + 3] & 255;\n            }\n            for (i2 = 16; i2 < 64; i2++) {\n              u = w[i2 - 2];\n              t1 = (u >>> 17 | u << 32 - 17) ^ (u >>> 19 | u << 32 - 19) ^ u >>> 10;\n              u = w[i2 - 15];\n              t2 = (u >>> 7 | u << 32 - 7) ^ (u >>> 18 | u << 32 - 18) ^ u >>> 3;\n              w[i2] = (t1 + w[i2 - 7] | 0) + (t2 + w[i2 - 16] | 0) | 0;\n            }\n            for (i2 = 0; i2 < 64; i2++) {\n              t1 = (((e >>> 6 | e << 32 - 6) ^ (e >>> 11 | e << 32 - 11) ^ (e >>> 25 | e << 32 - 25)) + (e & f ^ ~e & g) | 0) + (h + (K[i2] + w[i2] | 0) | 0) | 0;\n              t2 = ((a >>> 2 | a << 32 - 2) ^ (a >>> 13 | a << 32 - 13) ^ (a >>> 22 | a << 32 - 22)) + (a & b ^ a & c ^ b & c) | 0;\n              h = g;\n              g = f;\n              f = e;\n              e = d + t1 | 0;\n              d = c;\n              c = b;\n              b = a;\n              a = t1 + t2 | 0;\n            }\n            h0 = h0 + a | 0;\n            h1 = h1 + b | 0;\n            h2 = h2 + c | 0;\n            h3 = h3 + d | 0;\n            h4 = h4 + e | 0;\n            h5 = h5 + f | 0;\n            h6 = h6 + g | 0;\n            h7 = h7 + h | 0;\n            off += 64;\n            len -= 64;\n          }\n        }\n        blocks(m);\n        let i, bytesLeft = m.length % 64, bitLenHi = m.length / 536870912 | 0, bitLenLo = m.length << 3, numZeros = bytesLeft < 56 ? 56 : 120, p = m.slice(m.length - bytesLeft, m.length);\n        p.push(128);\n        for (i = bytesLeft + 1; i < numZeros; i++) {\n          p.push(0);\n        }\n        p.push(bitLenHi >>> 24 & 255);\n        p.push(bitLenHi >>> 16 & 255);\n        p.push(bitLenHi >>> 8 & 255);\n        p.push(bitLenHi >>> 0 & 255);\n        p.push(bitLenLo >>> 24 & 255);\n        p.push(bitLenLo >>> 16 & 255);\n        p.push(bitLenLo >>> 8 & 255);\n        p.push(bitLenLo >>> 0 & 255);\n        blocks(p);\n        return [\n          h0 >>> 24 & 255,\n          h0 >>> 16 & 255,\n          h0 >>> 8 & 255,\n          h0 >>> 0 & 255,\n          h1 >>> 24 & 255,\n          h1 >>> 16 & 255,\n          h1 >>> 8 & 255,\n          h1 >>> 0 & 255,\n          h2 >>> 24 & 255,\n          h2 >>> 16 & 255,\n          h2 >>> 8 & 255,\n          h2 >>> 0 & 255,\n          h3 >>> 24 & 255,\n          h3 >>> 16 & 255,\n          h3 >>> 8 & 255,\n          h3 >>> 0 & 255,\n          h4 >>> 24 & 255,\n          h4 >>> 16 & 255,\n          h4 >>> 8 & 255,\n          h4 >>> 0 & 255,\n          h5 >>> 24 & 255,\n          h5 >>> 16 & 255,\n          h5 >>> 8 & 255,\n          h5 >>> 0 & 255,\n          h6 >>> 24 & 255,\n          h6 >>> 16 & 255,\n          h6 >>> 8 & 255,\n          h6 >>> 0 & 255,\n          h7 >>> 24 & 255,\n          h7 >>> 16 & 255,\n          h7 >>> 8 & 255,\n          h7 >>> 0 & 255\n        ];\n      }\n      function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) {\n        password = password.length <= 64 ? password : SHA256(password);\n        const innerLen = 64 + salt.length + 4;\n        const inner = new Array(innerLen);\n        const outerKey = new Array(64);\n        let i;\n        let dk = [];\n        for (i = 0; i < 64; i++) {\n          inner[i] = 54;\n        }\n        for (i = 0; i < password.length; i++) {\n          inner[i] ^= password[i];\n        }\n        for (i = 0; i < salt.length; i++) {\n          inner[64 + i] = salt[i];\n        }\n        for (i = innerLen - 4; i < innerLen; i++) {\n          inner[i] = 0;\n        }\n        for (i = 0; i < 64; i++) outerKey[i] = 92;\n        for (i = 0; i < password.length; i++) outerKey[i] ^= password[i];\n        function incrementCounter() {\n          for (let i2 = innerLen - 1; i2 >= innerLen - 4; i2--) {\n            inner[i2]++;\n            if (inner[i2] <= 255) return;\n            inner[i2] = 0;\n          }\n        }\n        while (dkLen >= 32) {\n          incrementCounter();\n          dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))));\n          dkLen -= 32;\n        }\n        if (dkLen > 0) {\n          incrementCounter();\n          dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen));\n        }\n        return dk;\n      }\n      function blockmix_salsa8(BY, Yi, r, x, _X) {\n        let i;\n        arraycopy(BY, (2 * r - 1) * 16, _X, 0, 16);\n        for (i = 0; i < 2 * r; i++) {\n          blockxor(BY, i * 16, _X, 16);\n          salsa20_8(_X, x);\n          arraycopy(_X, 0, BY, Yi + i * 16, 16);\n        }\n        for (i = 0; i < r; i++) {\n          arraycopy(BY, Yi + i * 2 * 16, BY, i * 16, 16);\n        }\n        for (i = 0; i < r; i++) {\n          arraycopy(BY, Yi + (i * 2 + 1) * 16, BY, (i + r) * 16, 16);\n        }\n      }\n      function R(a, b) {\n        return a << b | a >>> 32 - b;\n      }\n      function salsa20_8(B, x) {\n        arraycopy(B, 0, x, 0, 16);\n        for (let i = 8; i > 0; i -= 2) {\n          x[4] ^= R(x[0] + x[12], 7);\n          x[8] ^= R(x[4] + x[0], 9);\n          x[12] ^= R(x[8] + x[4], 13);\n          x[0] ^= R(x[12] + x[8], 18);\n          x[9] ^= R(x[5] + x[1], 7);\n          x[13] ^= R(x[9] + x[5], 9);\n          x[1] ^= R(x[13] + x[9], 13);\n          x[5] ^= R(x[1] + x[13], 18);\n          x[14] ^= R(x[10] + x[6], 7);\n          x[2] ^= R(x[14] + x[10], 9);\n          x[6] ^= R(x[2] + x[14], 13);\n          x[10] ^= R(x[6] + x[2], 18);\n          x[3] ^= R(x[15] + x[11], 7);\n          x[7] ^= R(x[3] + x[15], 9);\n          x[11] ^= R(x[7] + x[3], 13);\n          x[15] ^= R(x[11] + x[7], 18);\n          x[1] ^= R(x[0] + x[3], 7);\n          x[2] ^= R(x[1] + x[0], 9);\n          x[3] ^= R(x[2] + x[1], 13);\n          x[0] ^= R(x[3] + x[2], 18);\n          x[6] ^= R(x[5] + x[4], 7);\n          x[7] ^= R(x[6] + x[5], 9);\n          x[4] ^= R(x[7] + x[6], 13);\n          x[5] ^= R(x[4] + x[7], 18);\n          x[11] ^= R(x[10] + x[9], 7);\n          x[8] ^= R(x[11] + x[10], 9);\n          x[9] ^= R(x[8] + x[11], 13);\n          x[10] ^= R(x[9] + x[8], 18);\n          x[12] ^= R(x[15] + x[14], 7);\n          x[13] ^= R(x[12] + x[15], 9);\n          x[14] ^= R(x[13] + x[12], 13);\n          x[15] ^= R(x[14] + x[13], 18);\n        }\n        for (let i = 0; i < 16; ++i) {\n          B[i] += x[i];\n        }\n      }\n      function blockxor(S, Si, D, len) {\n        for (let i = 0; i < len; i++) {\n          D[i] ^= S[Si + i];\n        }\n      }\n      function arraycopy(src, srcPos, dest, destPos, length) {\n        while (length--) {\n          dest[destPos++] = src[srcPos++];\n        }\n      }\n      function checkBufferish(o) {\n        if (!o || typeof o.length !== \"number\") {\n          return false;\n        }\n        for (let i = 0; i < o.length; i++) {\n          const v = o[i];\n          if (typeof v !== \"number\" || v % 1 || v < 0 || v >= 256) {\n            return false;\n          }\n        }\n        return true;\n      }\n      function ensureInteger(value, name2) {\n        if (typeof value !== \"number\" || value % 1) {\n          throw new Error(\"invalid \" + name2);\n        }\n        return value;\n      }\n      function _scrypt(password, salt, N, r, p, dkLen, callback) {\n        N = ensureInteger(N, \"N\");\n        r = ensureInteger(r, \"r\");\n        p = ensureInteger(p, \"p\");\n        dkLen = ensureInteger(dkLen, \"dkLen\");\n        if (N === 0 || (N & N - 1) !== 0) {\n          throw new Error(\"N must be power of 2\");\n        }\n        if (N > MAX_VALUE / 128 / r) {\n          throw new Error(\"N too large\");\n        }\n        if (r > MAX_VALUE / 128 / p) {\n          throw new Error(\"r too large\");\n        }\n        if (!checkBufferish(password)) {\n          throw new Error(\"password must be an array or buffer\");\n        }\n        password = Array.prototype.slice.call(password);\n        if (!checkBufferish(salt)) {\n          throw new Error(\"salt must be an array or buffer\");\n        }\n        salt = Array.prototype.slice.call(salt);\n        let b = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r);\n        const B = new Uint32Array(p * 32 * r);\n        for (let i = 0; i < B.length; i++) {\n          const j = i * 4;\n          B[i] = (b[j + 3] & 255) << 24 | (b[j + 2] & 255) << 16 | (b[j + 1] & 255) << 8 | (b[j + 0] & 255) << 0;\n        }\n        const XY = new Uint32Array(64 * r);\n        const V = new Uint32Array(32 * r * N);\n        const Yi = 32 * r;\n        const x = new Uint32Array(16);\n        const _X = new Uint32Array(16);\n        const totalOps = p * N * 2;\n        let currentOp = 0;\n        let lastPercent10 = null;\n        let stop = false;\n        let state = 0;\n        let i0 = 0, i1;\n        let Bi;\n        const limit = callback ? parseInt(1e3 / r) : 4294967295;\n        const nextTick = typeof setImmediate !== \"undefined\" ? setImmediate : setTimeout;\n        const incrementalSMix = function() {\n          if (stop) {\n            return callback(new Error(\"cancelled\"), currentOp / totalOps);\n          }\n          let steps;\n          switch (state) {\n            case 0:\n              Bi = i0 * 32 * r;\n              arraycopy(B, Bi, XY, 0, Yi);\n              state = 1;\n              i1 = 0;\n            case 1:\n              steps = N - i1;\n              if (steps > limit) {\n                steps = limit;\n              }\n              for (let i = 0; i < steps; i++) {\n                arraycopy(XY, 0, V, (i1 + i) * Yi, Yi);\n                blockmix_salsa8(XY, Yi, r, x, _X);\n              }\n              i1 += steps;\n              currentOp += steps;\n              if (callback) {\n                const percent10 = parseInt(1e3 * currentOp / totalOps);\n                if (percent10 !== lastPercent10) {\n                  stop = callback(null, currentOp / totalOps);\n                  if (stop) {\n                    break;\n                  }\n                  lastPercent10 = percent10;\n                }\n              }\n              if (i1 < N) {\n                break;\n              }\n              i1 = 0;\n              state = 2;\n            case 2:\n              steps = N - i1;\n              if (steps > limit) {\n                steps = limit;\n              }\n              for (let i = 0; i < steps; i++) {\n                const offset = (2 * r - 1) * 16;\n                const j = XY[offset] & N - 1;\n                blockxor(V, j * Yi, XY, Yi);\n                blockmix_salsa8(XY, Yi, r, x, _X);\n              }\n              i1 += steps;\n              currentOp += steps;\n              if (callback) {\n                const percent10 = parseInt(1e3 * currentOp / totalOps);\n                if (percent10 !== lastPercent10) {\n                  stop = callback(null, currentOp / totalOps);\n                  if (stop) {\n                    break;\n                  }\n                  lastPercent10 = percent10;\n                }\n              }\n              if (i1 < N) {\n                break;\n              }\n              arraycopy(XY, 0, B, Bi, Yi);\n              i0++;\n              if (i0 < p) {\n                state = 0;\n                break;\n              }\n              b = [];\n              for (let i = 0; i < B.length; i++) {\n                b.push(B[i] >> 0 & 255);\n                b.push(B[i] >> 8 & 255);\n                b.push(B[i] >> 16 & 255);\n                b.push(B[i] >> 24 & 255);\n              }\n              const derivedKey = PBKDF2_HMAC_SHA256_OneIter(password, b, dkLen);\n              if (callback) {\n                callback(null, 1, derivedKey);\n              }\n              return derivedKey;\n          }\n          if (callback) {\n            nextTick(incrementalSMix);\n          }\n        };\n        if (!callback) {\n          while (true) {\n            const derivedKey = incrementalSMix();\n            if (derivedKey != void 0) {\n              return derivedKey;\n            }\n          }\n        }\n        incrementalSMix();\n      }\n      const lib = {\n        scrypt: function(password, salt, N, r, p, dkLen, progressCallback) {\n          return new Promise(function(resolve, reject) {\n            let lastProgress = 0;\n            if (progressCallback) {\n              progressCallback(0);\n            }\n            _scrypt(password, salt, N, r, p, dkLen, function(error, progress, key) {\n              if (error) {\n                reject(error);\n              } else if (key) {\n                if (progressCallback && lastProgress !== 1) {\n                  progressCallback(1);\n                }\n                resolve(new Uint8Array(key));\n              } else if (progressCallback && progress !== lastProgress) {\n                lastProgress = progress;\n                return progressCallback(progress);\n              }\n            });\n          });\n        },\n        syncScrypt: function(password, salt, N, r, p, dkLen) {\n          return new Uint8Array(_scrypt(password, salt, N, r, p, dkLen));\n        }\n      };\n      if (typeof exports2 !== \"undefined\") {\n        module2.exports = lib;\n      } else if (typeof define === \"function\" && define.amd) {\n        define(lib);\n      } else if (root) {\n        if (root.scrypt) {\n          root._scrypt = root.scrypt;\n        }\n        root.scrypt = lib;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/keystore.js\nvar require_keystore = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/keystore.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encrypt = exports2.decrypt = exports2.decryptSync = exports2.KeystoreAccount = void 0;\n    var aes_js_1 = __importDefault(require_aes_js());\n    var scrypt_js_1 = __importDefault(require_scrypt());\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var hdnode_1 = require_lib21();\n    var keccak256_1 = require_lib5();\n    var pbkdf2_1 = require_lib18();\n    var random_1 = require_lib22();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var utils_1 = require_utils4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version18();\n    var logger = new logger_1.Logger(_version_1.version);\n    function hasMnemonic(value) {\n      return value != null && value.mnemonic && value.mnemonic.phrase;\n    }\n    var KeystoreAccount = (\n      /** @class */\n      function(_super) {\n        __extends(KeystoreAccount2, _super);\n        function KeystoreAccount2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        KeystoreAccount2.prototype.isKeystoreAccount = function(value) {\n          return !!(value && value._isKeystoreAccount);\n        };\n        return KeystoreAccount2;\n      }(properties_1.Description)\n    );\n    exports2.KeystoreAccount = KeystoreAccount;\n    function _decrypt(data, key, ciphertext) {\n      var cipher = (0, utils_1.searchPath)(data, \"crypto/cipher\");\n      if (cipher === \"aes-128-ctr\") {\n        var iv = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/cipherparams/iv\"));\n        var counter = new aes_js_1.default.Counter(iv);\n        var aesCtr = new aes_js_1.default.ModeOfOperation.ctr(key, counter);\n        return (0, bytes_1.arrayify)(aesCtr.decrypt(ciphertext));\n      }\n      return null;\n    }\n    function _getAccount(data, key) {\n      var ciphertext = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/ciphertext\"));\n      var computedMAC = (0, bytes_1.hexlify)((0, keccak256_1.keccak256)((0, bytes_1.concat)([key.slice(16, 32), ciphertext]))).substring(2);\n      if (computedMAC !== (0, utils_1.searchPath)(data, \"crypto/mac\").toLowerCase()) {\n        throw new Error(\"invalid password\");\n      }\n      var privateKey = _decrypt(data, key.slice(0, 16), ciphertext);\n      if (!privateKey) {\n        logger.throwError(\"unsupported cipher\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          operation: \"decrypt\"\n        });\n      }\n      var mnemonicKey = key.slice(32, 64);\n      var address = (0, transactions_1.computeAddress)(privateKey);\n      if (data.address) {\n        var check = data.address.toLowerCase();\n        if (check.substring(0, 2) !== \"0x\") {\n          check = \"0x\" + check;\n        }\n        if ((0, address_1.getAddress)(check) !== address) {\n          throw new Error(\"address mismatch\");\n        }\n      }\n      var account = {\n        _isKeystoreAccount: true,\n        address,\n        privateKey: (0, bytes_1.hexlify)(privateKey)\n      };\n      if ((0, utils_1.searchPath)(data, \"x-ethers/version\") === \"0.1\") {\n        var mnemonicCiphertext = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"x-ethers/mnemonicCiphertext\"));\n        var mnemonicIv = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"x-ethers/mnemonicCounter\"));\n        var mnemonicCounter = new aes_js_1.default.Counter(mnemonicIv);\n        var mnemonicAesCtr = new aes_js_1.default.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter);\n        var path = (0, utils_1.searchPath)(data, \"x-ethers/path\") || hdnode_1.defaultPath;\n        var locale = (0, utils_1.searchPath)(data, \"x-ethers/locale\") || \"en\";\n        var entropy = (0, bytes_1.arrayify)(mnemonicAesCtr.decrypt(mnemonicCiphertext));\n        try {\n          var mnemonic = (0, hdnode_1.entropyToMnemonic)(entropy, locale);\n          var node = hdnode_1.HDNode.fromMnemonic(mnemonic, null, locale).derivePath(path);\n          if (node.privateKey != account.privateKey) {\n            throw new Error(\"mnemonic mismatch\");\n          }\n          account.mnemonic = node.mnemonic;\n        } catch (error) {\n          if (error.code !== logger_1.Logger.errors.INVALID_ARGUMENT || error.argument !== \"wordlist\") {\n            throw error;\n          }\n        }\n      }\n      return new KeystoreAccount(account);\n    }\n    function pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc) {\n      return (0, bytes_1.arrayify)((0, pbkdf2_1.pbkdf2)(passwordBytes, salt, count, dkLen, prfFunc));\n    }\n    function pbkdf2(passwordBytes, salt, count, dkLen, prfFunc) {\n      return Promise.resolve(pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc));\n    }\n    function _computeKdfKey(data, password, pbkdf2Func, scryptFunc, progressCallback) {\n      var passwordBytes = (0, utils_1.getPassword)(password);\n      var kdf = (0, utils_1.searchPath)(data, \"crypto/kdf\");\n      if (kdf && typeof kdf === \"string\") {\n        var throwError = function(name2, value) {\n          return logger.throwArgumentError(\"invalid key-derivation function parameters\", name2, value);\n        };\n        if (kdf.toLowerCase() === \"scrypt\") {\n          var salt = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/kdfparams/salt\"));\n          var N = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/n\"));\n          var r = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/r\"));\n          var p = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/p\"));\n          if (!N || !r || !p) {\n            throwError(\"kdf\", kdf);\n          }\n          if ((N & N - 1) !== 0) {\n            throwError(\"N\", N);\n          }\n          var dkLen = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/dklen\"));\n          if (dkLen !== 32) {\n            throwError(\"dklen\", dkLen);\n          }\n          return scryptFunc(passwordBytes, salt, N, r, p, 64, progressCallback);\n        } else if (kdf.toLowerCase() === \"pbkdf2\") {\n          var salt = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/kdfparams/salt\"));\n          var prfFunc = null;\n          var prf = (0, utils_1.searchPath)(data, \"crypto/kdfparams/prf\");\n          if (prf === \"hmac-sha256\") {\n            prfFunc = \"sha256\";\n          } else if (prf === \"hmac-sha512\") {\n            prfFunc = \"sha512\";\n          } else {\n            throwError(\"prf\", prf);\n          }\n          var count = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/c\"));\n          var dkLen = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/dklen\"));\n          if (dkLen !== 32) {\n            throwError(\"dklen\", dkLen);\n          }\n          return pbkdf2Func(passwordBytes, salt, count, dkLen, prfFunc);\n        }\n      }\n      return logger.throwArgumentError(\"unsupported key-derivation function\", \"kdf\", kdf);\n    }\n    function decryptSync(json, password) {\n      var data = JSON.parse(json);\n      var key = _computeKdfKey(data, password, pbkdf2Sync, scrypt_js_1.default.syncScrypt);\n      return _getAccount(data, key);\n    }\n    exports2.decryptSync = decryptSync;\n    function decrypt(json, password, progressCallback) {\n      return __awaiter(this, void 0, void 0, function() {\n        var data, key;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              data = JSON.parse(json);\n              return [4, _computeKdfKey(data, password, pbkdf2, scrypt_js_1.default.scrypt, progressCallback)];\n            case 1:\n              key = _a.sent();\n              return [2, _getAccount(data, key)];\n          }\n        });\n      });\n    }\n    exports2.decrypt = decrypt;\n    function encrypt(account, password, options, progressCallback) {\n      try {\n        if ((0, address_1.getAddress)(account.address) !== (0, transactions_1.computeAddress)(account.privateKey)) {\n          throw new Error(\"address/privateKey mismatch\");\n        }\n        if (hasMnemonic(account)) {\n          var mnemonic = account.mnemonic;\n          var node = hdnode_1.HDNode.fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path || hdnode_1.defaultPath);\n          if (node.privateKey != account.privateKey) {\n            throw new Error(\"mnemonic mismatch\");\n          }\n        }\n      } catch (e) {\n        return Promise.reject(e);\n      }\n      if (typeof options === \"function\" && !progressCallback) {\n        progressCallback = options;\n        options = {};\n      }\n      if (!options) {\n        options = {};\n      }\n      var privateKey = (0, bytes_1.arrayify)(account.privateKey);\n      var passwordBytes = (0, utils_1.getPassword)(password);\n      var entropy = null;\n      var path = null;\n      var locale = null;\n      if (hasMnemonic(account)) {\n        var srcMnemonic = account.mnemonic;\n        entropy = (0, bytes_1.arrayify)((0, hdnode_1.mnemonicToEntropy)(srcMnemonic.phrase, srcMnemonic.locale || \"en\"));\n        path = srcMnemonic.path || hdnode_1.defaultPath;\n        locale = srcMnemonic.locale || \"en\";\n      }\n      var client = options.client;\n      if (!client) {\n        client = \"ethers.js\";\n      }\n      var salt = null;\n      if (options.salt) {\n        salt = (0, bytes_1.arrayify)(options.salt);\n      } else {\n        salt = (0, random_1.randomBytes)(32);\n        ;\n      }\n      var iv = null;\n      if (options.iv) {\n        iv = (0, bytes_1.arrayify)(options.iv);\n        if (iv.length !== 16) {\n          throw new Error(\"invalid iv\");\n        }\n      } else {\n        iv = (0, random_1.randomBytes)(16);\n      }\n      var uuidRandom = null;\n      if (options.uuid) {\n        uuidRandom = (0, bytes_1.arrayify)(options.uuid);\n        if (uuidRandom.length !== 16) {\n          throw new Error(\"invalid uuid\");\n        }\n      } else {\n        uuidRandom = (0, random_1.randomBytes)(16);\n      }\n      var N = 1 << 17, r = 8, p = 1;\n      if (options.scrypt) {\n        if (options.scrypt.N) {\n          N = options.scrypt.N;\n        }\n        if (options.scrypt.r) {\n          r = options.scrypt.r;\n        }\n        if (options.scrypt.p) {\n          p = options.scrypt.p;\n        }\n      }\n      return scrypt_js_1.default.scrypt(passwordBytes, salt, N, r, p, 64, progressCallback).then(function(key) {\n        key = (0, bytes_1.arrayify)(key);\n        var derivedKey = key.slice(0, 16);\n        var macPrefix = key.slice(16, 32);\n        var mnemonicKey = key.slice(32, 64);\n        var counter = new aes_js_1.default.Counter(iv);\n        var aesCtr = new aes_js_1.default.ModeOfOperation.ctr(derivedKey, counter);\n        var ciphertext = (0, bytes_1.arrayify)(aesCtr.encrypt(privateKey));\n        var mac = (0, keccak256_1.keccak256)((0, bytes_1.concat)([macPrefix, ciphertext]));\n        var data = {\n          address: account.address.substring(2).toLowerCase(),\n          id: (0, utils_1.uuidV4)(uuidRandom),\n          version: 3,\n          Crypto: {\n            cipher: \"aes-128-ctr\",\n            cipherparams: {\n              iv: (0, bytes_1.hexlify)(iv).substring(2)\n            },\n            ciphertext: (0, bytes_1.hexlify)(ciphertext).substring(2),\n            kdf: \"scrypt\",\n            kdfparams: {\n              salt: (0, bytes_1.hexlify)(salt).substring(2),\n              n: N,\n              dklen: 32,\n              p,\n              r\n            },\n            mac: mac.substring(2)\n          }\n        };\n        if (entropy) {\n          var mnemonicIv = (0, random_1.randomBytes)(16);\n          var mnemonicCounter = new aes_js_1.default.Counter(mnemonicIv);\n          var mnemonicAesCtr = new aes_js_1.default.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter);\n          var mnemonicCiphertext = (0, bytes_1.arrayify)(mnemonicAesCtr.encrypt(entropy));\n          var now = /* @__PURE__ */ new Date();\n          var timestamp = now.getUTCFullYear() + \"-\" + (0, utils_1.zpad)(now.getUTCMonth() + 1, 2) + \"-\" + (0, utils_1.zpad)(now.getUTCDate(), 2) + \"T\" + (0, utils_1.zpad)(now.getUTCHours(), 2) + \"-\" + (0, utils_1.zpad)(now.getUTCMinutes(), 2) + \"-\" + (0, utils_1.zpad)(now.getUTCSeconds(), 2) + \".0Z\";\n          data[\"x-ethers\"] = {\n            client,\n            gethFilename: \"UTC--\" + timestamp + \"--\" + data.address,\n            mnemonicCounter: (0, bytes_1.hexlify)(mnemonicIv).substring(2),\n            mnemonicCiphertext: (0, bytes_1.hexlify)(mnemonicCiphertext).substring(2),\n            path,\n            locale,\n            version: \"0.1\"\n          };\n        }\n        return JSON.stringify(data);\n      });\n    }\n    exports2.encrypt = encrypt;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/index.js\nvar require_lib23 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decryptJsonWalletSync = exports2.decryptJsonWallet = exports2.getJsonWalletAddress = exports2.isKeystoreWallet = exports2.isCrowdsaleWallet = exports2.encryptKeystore = exports2.decryptKeystoreSync = exports2.decryptKeystore = exports2.decryptCrowdsale = void 0;\n    var crowdsale_1 = require_crowdsale();\n    Object.defineProperty(exports2, \"decryptCrowdsale\", { enumerable: true, get: function() {\n      return crowdsale_1.decrypt;\n    } });\n    var inspect_1 = require_inspect();\n    Object.defineProperty(exports2, \"getJsonWalletAddress\", { enumerable: true, get: function() {\n      return inspect_1.getJsonWalletAddress;\n    } });\n    Object.defineProperty(exports2, \"isCrowdsaleWallet\", { enumerable: true, get: function() {\n      return inspect_1.isCrowdsaleWallet;\n    } });\n    Object.defineProperty(exports2, \"isKeystoreWallet\", { enumerable: true, get: function() {\n      return inspect_1.isKeystoreWallet;\n    } });\n    var keystore_1 = require_keystore();\n    Object.defineProperty(exports2, \"decryptKeystore\", { enumerable: true, get: function() {\n      return keystore_1.decrypt;\n    } });\n    Object.defineProperty(exports2, \"decryptKeystoreSync\", { enumerable: true, get: function() {\n      return keystore_1.decryptSync;\n    } });\n    Object.defineProperty(exports2, \"encryptKeystore\", { enumerable: true, get: function() {\n      return keystore_1.encrypt;\n    } });\n    function decryptJsonWallet(json, password, progressCallback) {\n      if ((0, inspect_1.isCrowdsaleWallet)(json)) {\n        if (progressCallback) {\n          progressCallback(0);\n        }\n        var account = (0, crowdsale_1.decrypt)(json, password);\n        if (progressCallback) {\n          progressCallback(1);\n        }\n        return Promise.resolve(account);\n      }\n      if ((0, inspect_1.isKeystoreWallet)(json)) {\n        return (0, keystore_1.decrypt)(json, password, progressCallback);\n      }\n      return Promise.reject(new Error(\"invalid JSON wallet\"));\n    }\n    exports2.decryptJsonWallet = decryptJsonWallet;\n    function decryptJsonWalletSync(json, password) {\n      if ((0, inspect_1.isCrowdsaleWallet)(json)) {\n        return (0, crowdsale_1.decrypt)(json, password);\n      }\n      if ((0, inspect_1.isKeystoreWallet)(json)) {\n        return (0, keystore_1.decryptSync)(json, password);\n      }\n      throw new Error(\"invalid JSON wallet\");\n    }\n    exports2.decryptJsonWalletSync = decryptJsonWalletSync;\n  }\n});\n\n// node_modules/@ethersproject/wallet/lib/_version.js\nvar require_version19 = __commonJS({\n  \"node_modules/@ethersproject/wallet/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"wallet/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/wallet/lib/index.js\nvar require_lib24 = __commonJS({\n  \"node_modules/@ethersproject/wallet/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.verifyTypedData = exports2.verifyMessage = exports2.Wallet = void 0;\n    var address_1 = require_lib7();\n    var abstract_provider_1 = require_lib12();\n    var abstract_signer_1 = require_lib13();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var hdnode_1 = require_lib21();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var random_1 = require_lib22();\n    var signing_key_1 = require_lib14();\n    var json_wallets_1 = require_lib23();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version19();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isAccount(value) {\n      return value != null && (0, bytes_1.isHexString)(value.privateKey, 32) && value.address != null;\n    }\n    function hasMnemonic(value) {\n      var mnemonic = value.mnemonic;\n      return mnemonic && mnemonic.phrase;\n    }\n    var Wallet = (\n      /** @class */\n      function(_super) {\n        __extends(Wallet2, _super);\n        function Wallet2(privateKey, provider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Wallet2);\n          _this = _super.call(this) || this;\n          if (isAccount(privateKey)) {\n            var signingKey_1 = new signing_key_1.SigningKey(privateKey.privateKey);\n            (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n              return signingKey_1;\n            });\n            (0, properties_1.defineReadOnly)(_this, \"address\", (0, transactions_1.computeAddress)(_this.publicKey));\n            if (_this.address !== (0, address_1.getAddress)(privateKey.address)) {\n              logger.throwArgumentError(\"privateKey/address mismatch\", \"privateKey\", \"[REDACTED]\");\n            }\n            if (hasMnemonic(privateKey)) {\n              var srcMnemonic_1 = privateKey.mnemonic;\n              (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n                return {\n                  phrase: srcMnemonic_1.phrase,\n                  path: srcMnemonic_1.path || hdnode_1.defaultPath,\n                  locale: srcMnemonic_1.locale || \"en\"\n                };\n              });\n              var mnemonic = _this.mnemonic;\n              var node = hdnode_1.HDNode.fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path);\n              if ((0, transactions_1.computeAddress)(node.privateKey) !== _this.address) {\n                logger.throwArgumentError(\"mnemonic/address mismatch\", \"privateKey\", \"[REDACTED]\");\n              }\n            } else {\n              (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n                return null;\n              });\n            }\n          } else {\n            if (signing_key_1.SigningKey.isSigningKey(privateKey)) {\n              if (privateKey.curve !== \"secp256k1\") {\n                logger.throwArgumentError(\"unsupported curve; must be secp256k1\", \"privateKey\", \"[REDACTED]\");\n              }\n              (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n                return privateKey;\n              });\n            } else {\n              if (typeof privateKey === \"string\") {\n                if (privateKey.match(/^[0-9a-f]*$/i) && privateKey.length === 64) {\n                  privateKey = \"0x\" + privateKey;\n                }\n              }\n              var signingKey_2 = new signing_key_1.SigningKey(privateKey);\n              (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n                return signingKey_2;\n              });\n            }\n            (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n              return null;\n            });\n            (0, properties_1.defineReadOnly)(_this, \"address\", (0, transactions_1.computeAddress)(_this.publicKey));\n          }\n          if (provider && !abstract_provider_1.Provider.isProvider(provider)) {\n            logger.throwArgumentError(\"invalid provider\", \"provider\", provider);\n          }\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider || null);\n          return _this;\n        }\n        Object.defineProperty(Wallet2.prototype, \"mnemonic\", {\n          get: function() {\n            return this._mnemonic();\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Wallet2.prototype, \"privateKey\", {\n          get: function() {\n            return this._signingKey().privateKey;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Wallet2.prototype, \"publicKey\", {\n          get: function() {\n            return this._signingKey().publicKey;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Wallet2.prototype.getAddress = function() {\n          return Promise.resolve(this.address);\n        };\n        Wallet2.prototype.connect = function(provider) {\n          return new Wallet2(this, provider);\n        };\n        Wallet2.prototype.signTransaction = function(transaction) {\n          var _this = this;\n          return (0, properties_1.resolveProperties)(transaction).then(function(tx) {\n            if (tx.from != null) {\n              if ((0, address_1.getAddress)(tx.from) !== _this.address) {\n                logger.throwArgumentError(\"transaction from address mismatch\", \"transaction.from\", transaction.from);\n              }\n              delete tx.from;\n            }\n            var signature = _this._signingKey().signDigest((0, keccak256_1.keccak256)((0, transactions_1.serialize)(tx)));\n            return (0, transactions_1.serialize)(tx, signature);\n          });\n        };\n        Wallet2.prototype.signMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, (0, bytes_1.joinSignature)(this._signingKey().signDigest((0, hash_1.hashMessage)(message)))];\n            });\n          });\n        };\n        Wallet2.prototype._signTypedData = function(domain, types, value) {\n          return __awaiter(this, void 0, void 0, function() {\n            var populated;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, hash_1._TypedDataEncoder.resolveNames(domain, types, value, function(name2) {\n                    if (_this.provider == null) {\n                      logger.throwError(\"cannot resolve ENS names without a provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                        operation: \"resolveName\",\n                        value: name2\n                      });\n                    }\n                    return _this.provider.resolveName(name2);\n                  })];\n                case 1:\n                  populated = _a.sent();\n                  return [2, (0, bytes_1.joinSignature)(this._signingKey().signDigest(hash_1._TypedDataEncoder.hash(populated.domain, types, populated.value)))];\n              }\n            });\n          });\n        };\n        Wallet2.prototype.encrypt = function(password, options, progressCallback) {\n          if (typeof options === \"function\" && !progressCallback) {\n            progressCallback = options;\n            options = {};\n          }\n          if (progressCallback && typeof progressCallback !== \"function\") {\n            throw new Error(\"invalid callback\");\n          }\n          if (!options) {\n            options = {};\n          }\n          return (0, json_wallets_1.encryptKeystore)(this, password, options, progressCallback);\n        };\n        Wallet2.createRandom = function(options) {\n          var entropy = (0, random_1.randomBytes)(16);\n          if (!options) {\n            options = {};\n          }\n          if (options.extraEntropy) {\n            entropy = (0, bytes_1.arrayify)((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.concat)([entropy, options.extraEntropy])), 0, 16));\n          }\n          var mnemonic = (0, hdnode_1.entropyToMnemonic)(entropy, options.locale);\n          return Wallet2.fromMnemonic(mnemonic, options.path, options.locale);\n        };\n        Wallet2.fromEncryptedJson = function(json, password, progressCallback) {\n          return (0, json_wallets_1.decryptJsonWallet)(json, password, progressCallback).then(function(account) {\n            return new Wallet2(account);\n          });\n        };\n        Wallet2.fromEncryptedJsonSync = function(json, password) {\n          return new Wallet2((0, json_wallets_1.decryptJsonWalletSync)(json, password));\n        };\n        Wallet2.fromMnemonic = function(mnemonic, path, wordlist) {\n          if (!path) {\n            path = hdnode_1.defaultPath;\n          }\n          return new Wallet2(hdnode_1.HDNode.fromMnemonic(mnemonic, null, wordlist).derivePath(path));\n        };\n        return Wallet2;\n      }(abstract_signer_1.Signer)\n    );\n    exports2.Wallet = Wallet;\n    function verifyMessage(message, signature) {\n      return (0, transactions_1.recoverAddress)((0, hash_1.hashMessage)(message), signature);\n    }\n    exports2.verifyMessage = verifyMessage;\n    function verifyTypedData(domain, types, value, signature) {\n      return (0, transactions_1.recoverAddress)(hash_1._TypedDataEncoder.hash(domain, types, value), signature);\n    }\n    exports2.verifyTypedData = verifyTypedData;\n  }\n});\n\n// node_modules/@ethersproject/networks/lib/_version.js\nvar require_version20 = __commonJS({\n  \"node_modules/@ethersproject/networks/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"networks/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/networks/lib/index.js\nvar require_lib25 = __commonJS({\n  \"node_modules/@ethersproject/networks/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getNetwork = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version20();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isRenetworkable(value) {\n      return value && typeof value.renetwork === \"function\";\n    }\n    function ethDefaultProvider(network) {\n      var func = function(providers, options) {\n        if (options == null) {\n          options = {};\n        }\n        var providerList = [];\n        if (providers.InfuraProvider) {\n          try {\n            providerList.push(new providers.InfuraProvider(network, options.infura));\n          } catch (error) {\n          }\n        }\n        if (providers.EtherscanProvider) {\n          try {\n            providerList.push(new providers.EtherscanProvider(network, options.etherscan));\n          } catch (error) {\n          }\n        }\n        if (providers.AlchemyProvider) {\n          try {\n            providerList.push(new providers.AlchemyProvider(network, options.alchemy));\n          } catch (error) {\n          }\n        }\n        if (providers.PocketProvider) {\n          var skip = [\"goerli\", \"ropsten\", \"rinkeby\"];\n          try {\n            var provider = new providers.PocketProvider(network);\n            if (provider.network && skip.indexOf(provider.network.name) === -1) {\n              providerList.push(provider);\n            }\n          } catch (error) {\n          }\n        }\n        if (providers.CloudflareProvider) {\n          try {\n            providerList.push(new providers.CloudflareProvider(network));\n          } catch (error) {\n          }\n        }\n        if (providerList.length === 0) {\n          return null;\n        }\n        if (providers.FallbackProvider) {\n          var quorum = 1;\n          if (options.quorum != null) {\n            quorum = options.quorum;\n          } else if (network === \"homestead\") {\n            quorum = 2;\n          }\n          return new providers.FallbackProvider(providerList, quorum);\n        }\n        return providerList[0];\n      };\n      func.renetwork = function(network2) {\n        return ethDefaultProvider(network2);\n      };\n      return func;\n    }\n    function etcDefaultProvider(url, network) {\n      var func = function(providers, options) {\n        if (providers.JsonRpcProvider) {\n          return new providers.JsonRpcProvider(url, network);\n        }\n        return null;\n      };\n      func.renetwork = function(network2) {\n        return etcDefaultProvider(url, network2);\n      };\n      return func;\n    }\n    var homestead = {\n      chainId: 1,\n      ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n      name: \"homestead\",\n      _defaultProvider: ethDefaultProvider(\"homestead\")\n    };\n    var ropsten = {\n      chainId: 3,\n      ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n      name: \"ropsten\",\n      _defaultProvider: ethDefaultProvider(\"ropsten\")\n    };\n    var classicMordor = {\n      chainId: 63,\n      name: \"classicMordor\",\n      _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/mordor\", \"classicMordor\")\n    };\n    var networks = {\n      unspecified: { chainId: 0, name: \"unspecified\" },\n      homestead,\n      mainnet: homestead,\n      morden: { chainId: 2, name: \"morden\" },\n      ropsten,\n      testnet: ropsten,\n      rinkeby: {\n        chainId: 4,\n        ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n        name: \"rinkeby\",\n        _defaultProvider: ethDefaultProvider(\"rinkeby\")\n      },\n      kovan: {\n        chainId: 42,\n        name: \"kovan\",\n        _defaultProvider: ethDefaultProvider(\"kovan\")\n      },\n      goerli: {\n        chainId: 5,\n        ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n        name: \"goerli\",\n        _defaultProvider: ethDefaultProvider(\"goerli\")\n      },\n      // ETC (See: #351)\n      classic: {\n        chainId: 61,\n        name: \"classic\",\n        _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/etc\", \"classic\")\n      },\n      classicMorden: { chainId: 62, name: \"classicMorden\" },\n      classicMordor,\n      classicTestnet: classicMordor,\n      classicKotti: {\n        chainId: 6,\n        name: \"classicKotti\",\n        _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/kotti\", \"classicKotti\")\n      },\n      xdai: { chainId: 100, name: \"xdai\" },\n      matic: { chainId: 137, name: \"matic\" },\n      maticmum: { chainId: 80001, name: \"maticmum\" },\n      optimism: { chainId: 10, name: \"optimism\" },\n      \"optimism-kovan\": { chainId: 69, name: \"optimism-kovan\" },\n      \"optimism-goerli\": { chainId: 420, name: \"optimism-goerli\" },\n      arbitrum: { chainId: 42161, name: \"arbitrum\" },\n      \"arbitrum-rinkeby\": { chainId: 421611, name: \"arbitrum-rinkeby\" },\n      bnb: { chainId: 56, name: \"bnb\" },\n      bnbt: { chainId: 97, name: \"bnbt\" }\n    };\n    function getNetwork(network) {\n      if (network == null) {\n        return null;\n      }\n      if (typeof network === \"number\") {\n        for (var name_1 in networks) {\n          var standard_1 = networks[name_1];\n          if (standard_1.chainId === network) {\n            return {\n              name: standard_1.name,\n              chainId: standard_1.chainId,\n              ensAddress: standard_1.ensAddress || null,\n              _defaultProvider: standard_1._defaultProvider || null\n            };\n          }\n        }\n        return {\n          chainId: network,\n          name: \"unknown\"\n        };\n      }\n      if (typeof network === \"string\") {\n        var standard_2 = networks[network];\n        if (standard_2 == null) {\n          return null;\n        }\n        return {\n          name: standard_2.name,\n          chainId: standard_2.chainId,\n          ensAddress: standard_2.ensAddress,\n          _defaultProvider: standard_2._defaultProvider || null\n        };\n      }\n      var standard = networks[network.name];\n      if (!standard) {\n        if (typeof network.chainId !== \"number\") {\n          logger.throwArgumentError(\"invalid network chainId\", \"network\", network);\n        }\n        return network;\n      }\n      if (network.chainId !== 0 && network.chainId !== standard.chainId) {\n        logger.throwArgumentError(\"network chainId mismatch\", \"network\", network);\n      }\n      var defaultProvider = network._defaultProvider || null;\n      if (defaultProvider == null && standard._defaultProvider) {\n        if (isRenetworkable(standard._defaultProvider)) {\n          defaultProvider = standard._defaultProvider.renetwork(network);\n        } else {\n          defaultProvider = standard._defaultProvider;\n        }\n      }\n      return {\n        name: network.name,\n        chainId: standard.chainId,\n        ensAddress: network.ensAddress || standard.ensAddress || null,\n        _defaultProvider: defaultProvider\n      };\n    }\n    exports2.getNetwork = getNetwork;\n  }\n});\n\n// node_modules/@ethersproject/base64/lib/base64.js\nvar require_base64 = __commonJS({\n  \"node_modules/@ethersproject/base64/lib/base64.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encode = exports2.decode = void 0;\n    var bytes_1 = require_lib2();\n    function decode(textData) {\n      return (0, bytes_1.arrayify)(new Uint8Array(Buffer.from(textData, \"base64\")));\n    }\n    exports2.decode = decode;\n    function encode(data) {\n      return Buffer.from((0, bytes_1.arrayify)(data)).toString(\"base64\");\n    }\n    exports2.encode = encode;\n  }\n});\n\n// node_modules/@ethersproject/base64/lib/index.js\nvar require_lib26 = __commonJS({\n  \"node_modules/@ethersproject/base64/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encode = exports2.decode = void 0;\n    var base64_1 = require_base64();\n    Object.defineProperty(exports2, \"decode\", { enumerable: true, get: function() {\n      return base64_1.decode;\n    } });\n    Object.defineProperty(exports2, \"encode\", { enumerable: true, get: function() {\n      return base64_1.encode;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/web/lib/_version.js\nvar require_version21 = __commonJS({\n  \"node_modules/@ethersproject/web/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"web/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/web/lib/geturl.js\nvar require_geturl = __commonJS({\n  \"node_modules/@ethersproject/web/lib/geturl.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getUrl = void 0;\n    var http_1 = __importDefault(require(\"http\"));\n    var https_1 = __importDefault(require(\"https\"));\n    var zlib_1 = require(\"zlib\");\n    var url_1 = require(\"url\");\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version21();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getResponse(request) {\n      return new Promise(function(resolve, reject) {\n        request.once(\"response\", function(resp) {\n          var response = {\n            statusCode: resp.statusCode,\n            statusMessage: resp.statusMessage,\n            headers: Object.keys(resp.headers).reduce(function(accum, name2) {\n              var value = resp.headers[name2];\n              if (Array.isArray(value)) {\n                value = value.join(\", \");\n              }\n              accum[name2] = value;\n              return accum;\n            }, {}),\n            body: null\n          };\n          resp.on(\"data\", function(chunk) {\n            if (response.body == null) {\n              response.body = new Uint8Array(0);\n            }\n            response.body = (0, bytes_1.concat)([response.body, chunk]);\n          });\n          resp.on(\"end\", function() {\n            if (response.headers[\"content-encoding\"] === \"gzip\") {\n              response.body = (0, bytes_1.arrayify)((0, zlib_1.gunzipSync)(response.body));\n            }\n            resolve(response);\n          });\n          resp.on(\"error\", function(error) {\n            error.response = response;\n            reject(error);\n          });\n        });\n        request.on(\"error\", function(error) {\n          reject(error);\n        });\n      });\n    }\n    function nonnull(value) {\n      if (value == null) {\n        return \"\";\n      }\n      return value;\n    }\n    function getUrl(href, options) {\n      return __awaiter(this, void 0, void 0, function() {\n        var url, request, req, response;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              if (options == null) {\n                options = {};\n              }\n              url = (0, url_1.parse)(href);\n              request = {\n                protocol: nonnull(url.protocol),\n                hostname: nonnull(url.hostname),\n                port: nonnull(url.port),\n                path: nonnull(url.pathname) + nonnull(url.search),\n                method: options.method || \"GET\",\n                headers: (0, properties_1.shallowCopy)(options.headers || {})\n              };\n              if (options.allowGzip) {\n                request.headers[\"accept-encoding\"] = \"gzip\";\n              }\n              req = null;\n              switch (nonnull(url.protocol)) {\n                case \"http:\":\n                  req = http_1.default.request(request);\n                  break;\n                case \"https:\":\n                  req = https_1.default.request(request);\n                  break;\n                default:\n                  logger.throwError(\"unsupported protocol \" + url.protocol, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    protocol: url.protocol,\n                    operation: \"request\"\n                  });\n              }\n              if (options.body) {\n                req.write(Buffer.from(options.body));\n              }\n              req.end();\n              return [4, getResponse(req)];\n            case 1:\n              response = _a.sent();\n              return [2, response];\n          }\n        });\n      });\n    }\n    exports2.getUrl = getUrl;\n  }\n});\n\n// node_modules/@ethersproject/web/lib/index.js\nvar require_lib27 = __commonJS({\n  \"node_modules/@ethersproject/web/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.poll = exports2.fetchJson = exports2._fetchData = void 0;\n    var base64_1 = require_lib26();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var strings_1 = require_lib9();\n    var logger_1 = require_lib();\n    var _version_1 = require_version21();\n    var logger = new logger_1.Logger(_version_1.version);\n    var geturl_1 = require_geturl();\n    function staller(duration) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, duration);\n      });\n    }\n    function bodyify(value, type) {\n      if (value == null) {\n        return null;\n      }\n      if (typeof value === \"string\") {\n        return value;\n      }\n      if ((0, bytes_1.isBytesLike)(value)) {\n        if (type && (type.split(\"/\")[0] === \"text\" || type.split(\";\")[0].trim() === \"application/json\")) {\n          try {\n            return (0, strings_1.toUtf8String)(value);\n          } catch (error) {\n          }\n          ;\n        }\n        return (0, bytes_1.hexlify)(value);\n      }\n      return value;\n    }\n    function _fetchData(connection, body, processFunc) {\n      var attemptLimit = typeof connection === \"object\" && connection.throttleLimit != null ? connection.throttleLimit : 12;\n      logger.assertArgument(attemptLimit > 0 && attemptLimit % 1 === 0, \"invalid connection throttle limit\", \"connection.throttleLimit\", attemptLimit);\n      var throttleCallback = typeof connection === \"object\" ? connection.throttleCallback : null;\n      var throttleSlotInterval = typeof connection === \"object\" && typeof connection.throttleSlotInterval === \"number\" ? connection.throttleSlotInterval : 100;\n      logger.assertArgument(throttleSlotInterval > 0 && throttleSlotInterval % 1 === 0, \"invalid connection throttle slot interval\", \"connection.throttleSlotInterval\", throttleSlotInterval);\n      var headers = {};\n      var url = null;\n      var options = {\n        method: \"GET\"\n      };\n      var allow304 = false;\n      var timeout = 2 * 60 * 1e3;\n      if (typeof connection === \"string\") {\n        url = connection;\n      } else if (typeof connection === \"object\") {\n        if (connection == null || connection.url == null) {\n          logger.throwArgumentError(\"missing URL\", \"connection.url\", connection);\n        }\n        url = connection.url;\n        if (typeof connection.timeout === \"number\" && connection.timeout > 0) {\n          timeout = connection.timeout;\n        }\n        if (connection.headers) {\n          for (var key in connection.headers) {\n            headers[key.toLowerCase()] = { key, value: String(connection.headers[key]) };\n            if ([\"if-none-match\", \"if-modified-since\"].indexOf(key.toLowerCase()) >= 0) {\n              allow304 = true;\n            }\n          }\n        }\n        options.allowGzip = !!connection.allowGzip;\n        if (connection.user != null && connection.password != null) {\n          if (url.substring(0, 6) !== \"https:\" && connection.allowInsecureAuthentication !== true) {\n            logger.throwError(\"basic authentication requires a secure https url\", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: \"url\", url, user: connection.user, password: \"[REDACTED]\" });\n          }\n          var authorization = connection.user + \":\" + connection.password;\n          headers[\"authorization\"] = {\n            key: \"Authorization\",\n            value: \"Basic \" + (0, base64_1.encode)((0, strings_1.toUtf8Bytes)(authorization))\n          };\n        }\n      }\n      var reData = new RegExp(\"^data:([a-z0-9-]+/[a-z0-9-]+);base64,(.*)$\", \"i\");\n      var dataMatch = url ? url.match(reData) : null;\n      if (dataMatch) {\n        try {\n          var response = {\n            statusCode: 200,\n            statusMessage: \"OK\",\n            headers: { \"content-type\": dataMatch[1] },\n            body: (0, base64_1.decode)(dataMatch[2])\n          };\n          var result2 = response.body;\n          if (processFunc) {\n            result2 = processFunc(response.body, response);\n          }\n          return Promise.resolve(result2);\n        } catch (error) {\n          logger.throwError(\"processing response error\", logger_1.Logger.errors.SERVER_ERROR, {\n            body: bodyify(dataMatch[1], dataMatch[2]),\n            error,\n            requestBody: null,\n            requestMethod: \"GET\",\n            url\n          });\n        }\n      }\n      if (body) {\n        options.method = \"POST\";\n        options.body = body;\n        if (headers[\"content-type\"] == null) {\n          headers[\"content-type\"] = { key: \"Content-Type\", value: \"application/octet-stream\" };\n        }\n        if (headers[\"content-length\"] == null) {\n          headers[\"content-length\"] = { key: \"Content-Length\", value: String(body.length) };\n        }\n      }\n      var flatHeaders = {};\n      Object.keys(headers).forEach(function(key2) {\n        var header = headers[key2];\n        flatHeaders[header.key] = header.value;\n      });\n      options.headers = flatHeaders;\n      var runningTimeout = function() {\n        var timer = null;\n        var promise = new Promise(function(resolve, reject) {\n          if (timeout) {\n            timer = setTimeout(function() {\n              if (timer == null) {\n                return;\n              }\n              timer = null;\n              reject(logger.makeError(\"timeout\", logger_1.Logger.errors.TIMEOUT, {\n                requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                requestMethod: options.method,\n                timeout,\n                url\n              }));\n            }, timeout);\n          }\n        });\n        var cancel = function() {\n          if (timer == null) {\n            return;\n          }\n          clearTimeout(timer);\n          timer = null;\n        };\n        return { promise, cancel };\n      }();\n      var runningFetch = function() {\n        return __awaiter(this, void 0, void 0, function() {\n          var attempt, response2, location_1, tryAgain, stall, retryAfter, error_1, body_1, result3, error_2, tryAgain, timeout_1;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                attempt = 0;\n                _a.label = 1;\n              case 1:\n                if (!(attempt < attemptLimit)) return [3, 20];\n                response2 = null;\n                _a.label = 2;\n              case 2:\n                _a.trys.push([2, 9, , 10]);\n                return [4, (0, geturl_1.getUrl)(url, options)];\n              case 3:\n                response2 = _a.sent();\n                if (!(attempt < attemptLimit)) return [3, 8];\n                if (!(response2.statusCode === 301 || response2.statusCode === 302)) return [3, 4];\n                location_1 = response2.headers.location || \"\";\n                if (options.method === \"GET\" && location_1.match(/^https:/)) {\n                  url = response2.headers.location;\n                  return [3, 19];\n                }\n                return [3, 8];\n              case 4:\n                if (!(response2.statusCode === 429)) return [3, 8];\n                tryAgain = true;\n                if (!throttleCallback) return [3, 6];\n                return [4, throttleCallback(attempt, url)];\n              case 5:\n                tryAgain = _a.sent();\n                _a.label = 6;\n              case 6:\n                if (!tryAgain) return [3, 8];\n                stall = 0;\n                retryAfter = response2.headers[\"retry-after\"];\n                if (typeof retryAfter === \"string\" && retryAfter.match(/^[1-9][0-9]*$/)) {\n                  stall = parseInt(retryAfter) * 1e3;\n                } else {\n                  stall = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n                }\n                return [4, staller(stall)];\n              case 7:\n                _a.sent();\n                return [3, 19];\n              case 8:\n                return [3, 10];\n              case 9:\n                error_1 = _a.sent();\n                response2 = error_1.response;\n                if (response2 == null) {\n                  runningTimeout.cancel();\n                  logger.throwError(\"missing response\", logger_1.Logger.errors.SERVER_ERROR, {\n                    requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                    requestMethod: options.method,\n                    serverError: error_1,\n                    url\n                  });\n                }\n                return [3, 10];\n              case 10:\n                body_1 = response2.body;\n                if (allow304 && response2.statusCode === 304) {\n                  body_1 = null;\n                } else if (response2.statusCode < 200 || response2.statusCode >= 300) {\n                  runningTimeout.cancel();\n                  logger.throwError(\"bad response\", logger_1.Logger.errors.SERVER_ERROR, {\n                    status: response2.statusCode,\n                    headers: response2.headers,\n                    body: bodyify(body_1, response2.headers ? response2.headers[\"content-type\"] : null),\n                    requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                    requestMethod: options.method,\n                    url\n                  });\n                }\n                if (!processFunc) return [3, 18];\n                _a.label = 11;\n              case 11:\n                _a.trys.push([11, 13, , 18]);\n                return [4, processFunc(body_1, response2)];\n              case 12:\n                result3 = _a.sent();\n                runningTimeout.cancel();\n                return [2, result3];\n              case 13:\n                error_2 = _a.sent();\n                if (!(error_2.throttleRetry && attempt < attemptLimit)) return [3, 17];\n                tryAgain = true;\n                if (!throttleCallback) return [3, 15];\n                return [4, throttleCallback(attempt, url)];\n              case 14:\n                tryAgain = _a.sent();\n                _a.label = 15;\n              case 15:\n                if (!tryAgain) return [3, 17];\n                timeout_1 = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n                return [4, staller(timeout_1)];\n              case 16:\n                _a.sent();\n                return [3, 19];\n              case 17:\n                runningTimeout.cancel();\n                logger.throwError(\"processing response error\", logger_1.Logger.errors.SERVER_ERROR, {\n                  body: bodyify(body_1, response2.headers ? response2.headers[\"content-type\"] : null),\n                  error: error_2,\n                  requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                  requestMethod: options.method,\n                  url\n                });\n                return [3, 18];\n              case 18:\n                runningTimeout.cancel();\n                return [2, body_1];\n              case 19:\n                attempt++;\n                return [3, 1];\n              case 20:\n                return [2, logger.throwError(\"failed response\", logger_1.Logger.errors.SERVER_ERROR, {\n                  requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                  requestMethod: options.method,\n                  url\n                })];\n            }\n          });\n        });\n      }();\n      return Promise.race([runningTimeout.promise, runningFetch]);\n    }\n    exports2._fetchData = _fetchData;\n    function fetchJson(connection, json, processFunc) {\n      var processJsonFunc = function(value, response) {\n        var result2 = null;\n        if (value != null) {\n          try {\n            result2 = JSON.parse((0, strings_1.toUtf8String)(value));\n          } catch (error) {\n            logger.throwError(\"invalid JSON\", logger_1.Logger.errors.SERVER_ERROR, {\n              body: value,\n              error\n            });\n          }\n        }\n        if (processFunc) {\n          result2 = processFunc(result2, response);\n        }\n        return result2;\n      };\n      var body = null;\n      if (json != null) {\n        body = (0, strings_1.toUtf8Bytes)(json);\n        var updated = typeof connection === \"string\" ? { url: connection } : (0, properties_1.shallowCopy)(connection);\n        if (updated.headers) {\n          var hasContentType = Object.keys(updated.headers).filter(function(k) {\n            return k.toLowerCase() === \"content-type\";\n          }).length !== 0;\n          if (!hasContentType) {\n            updated.headers = (0, properties_1.shallowCopy)(updated.headers);\n            updated.headers[\"content-type\"] = \"application/json\";\n          }\n        } else {\n          updated.headers = { \"content-type\": \"application/json\" };\n        }\n        connection = updated;\n      }\n      return _fetchData(connection, body, processJsonFunc);\n    }\n    exports2.fetchJson = fetchJson;\n    function poll(func, options) {\n      if (!options) {\n        options = {};\n      }\n      options = (0, properties_1.shallowCopy)(options);\n      if (options.floor == null) {\n        options.floor = 0;\n      }\n      if (options.ceiling == null) {\n        options.ceiling = 1e4;\n      }\n      if (options.interval == null) {\n        options.interval = 250;\n      }\n      return new Promise(function(resolve, reject) {\n        var timer = null;\n        var done = false;\n        var cancel = function() {\n          if (done) {\n            return false;\n          }\n          done = true;\n          if (timer) {\n            clearTimeout(timer);\n          }\n          return true;\n        };\n        if (options.timeout) {\n          timer = setTimeout(function() {\n            if (cancel()) {\n              reject(new Error(\"timeout\"));\n            }\n          }, options.timeout);\n        }\n        var retryLimit = options.retryLimit;\n        var attempt = 0;\n        function check() {\n          return func().then(function(result2) {\n            if (result2 !== void 0) {\n              if (cancel()) {\n                resolve(result2);\n              }\n            } else if (options.oncePoll) {\n              options.oncePoll.once(\"poll\", check);\n            } else if (options.onceBlock) {\n              options.onceBlock.once(\"block\", check);\n            } else if (!done) {\n              attempt++;\n              if (attempt > retryLimit) {\n                if (cancel()) {\n                  reject(new Error(\"retry limit reached\"));\n                }\n                return;\n              }\n              var timeout = options.interval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n              if (timeout < options.floor) {\n                timeout = options.floor;\n              }\n              if (timeout > options.ceiling) {\n                timeout = options.ceiling;\n              }\n              setTimeout(check, timeout);\n            }\n            return null;\n          }, function(error) {\n            if (cancel()) {\n              reject(error);\n            }\n          });\n        }\n        check();\n      });\n    }\n    exports2.poll = poll;\n  }\n});\n\n// node_modules/bech32/index.js\nvar require_bech32 = __commonJS({\n  \"node_modules/bech32/index.js\"(exports2, module2) {\n    \"use strict\";\n    var ALPHABET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\n    var ALPHABET_MAP = {};\n    for (z = 0; z < ALPHABET.length; z++) {\n      x = ALPHABET.charAt(z);\n      if (ALPHABET_MAP[x] !== void 0) throw new TypeError(x + \" is ambiguous\");\n      ALPHABET_MAP[x] = z;\n    }\n    var x;\n    var z;\n    function polymodStep(pre) {\n      var b = pre >> 25;\n      return (pre & 33554431) << 5 ^ -(b >> 0 & 1) & 996825010 ^ -(b >> 1 & 1) & 642813549 ^ -(b >> 2 & 1) & 513874426 ^ -(b >> 3 & 1) & 1027748829 ^ -(b >> 4 & 1) & 705979059;\n    }\n    function prefixChk(prefix) {\n      var chk = 1;\n      for (var i = 0; i < prefix.length; ++i) {\n        var c = prefix.charCodeAt(i);\n        if (c < 33 || c > 126) return \"Invalid prefix (\" + prefix + \")\";\n        chk = polymodStep(chk) ^ c >> 5;\n      }\n      chk = polymodStep(chk);\n      for (i = 0; i < prefix.length; ++i) {\n        var v = prefix.charCodeAt(i);\n        chk = polymodStep(chk) ^ v & 31;\n      }\n      return chk;\n    }\n    function encode(prefix, words, LIMIT) {\n      LIMIT = LIMIT || 90;\n      if (prefix.length + 7 + words.length > LIMIT) throw new TypeError(\"Exceeds length limit\");\n      prefix = prefix.toLowerCase();\n      var chk = prefixChk(prefix);\n      if (typeof chk === \"string\") throw new Error(chk);\n      var result2 = prefix + \"1\";\n      for (var i = 0; i < words.length; ++i) {\n        var x2 = words[i];\n        if (x2 >> 5 !== 0) throw new Error(\"Non 5-bit word\");\n        chk = polymodStep(chk) ^ x2;\n        result2 += ALPHABET.charAt(x2);\n      }\n      for (i = 0; i < 6; ++i) {\n        chk = polymodStep(chk);\n      }\n      chk ^= 1;\n      for (i = 0; i < 6; ++i) {\n        var v = chk >> (5 - i) * 5 & 31;\n        result2 += ALPHABET.charAt(v);\n      }\n      return result2;\n    }\n    function __decode(str, LIMIT) {\n      LIMIT = LIMIT || 90;\n      if (str.length < 8) return str + \" too short\";\n      if (str.length > LIMIT) return \"Exceeds length limit\";\n      var lowered = str.toLowerCase();\n      var uppered = str.toUpperCase();\n      if (str !== lowered && str !== uppered) return \"Mixed-case string \" + str;\n      str = lowered;\n      var split = str.lastIndexOf(\"1\");\n      if (split === -1) return \"No separator character for \" + str;\n      if (split === 0) return \"Missing prefix for \" + str;\n      var prefix = str.slice(0, split);\n      var wordChars = str.slice(split + 1);\n      if (wordChars.length < 6) return \"Data too short\";\n      var chk = prefixChk(prefix);\n      if (typeof chk === \"string\") return chk;\n      var words = [];\n      for (var i = 0; i < wordChars.length; ++i) {\n        var c = wordChars.charAt(i);\n        var v = ALPHABET_MAP[c];\n        if (v === void 0) return \"Unknown character \" + c;\n        chk = polymodStep(chk) ^ v;\n        if (i + 6 >= wordChars.length) continue;\n        words.push(v);\n      }\n      if (chk !== 1) return \"Invalid checksum for \" + str;\n      return { prefix, words };\n    }\n    function decodeUnsafe() {\n      var res = __decode.apply(null, arguments);\n      if (typeof res === \"object\") return res;\n    }\n    function decode(str) {\n      var res = __decode.apply(null, arguments);\n      if (typeof res === \"object\") return res;\n      throw new Error(res);\n    }\n    function convert(data, inBits, outBits, pad) {\n      var value = 0;\n      var bits = 0;\n      var maxV = (1 << outBits) - 1;\n      var result2 = [];\n      for (var i = 0; i < data.length; ++i) {\n        value = value << inBits | data[i];\n        bits += inBits;\n        while (bits >= outBits) {\n          bits -= outBits;\n          result2.push(value >> bits & maxV);\n        }\n      }\n      if (pad) {\n        if (bits > 0) {\n          result2.push(value << outBits - bits & maxV);\n        }\n      } else {\n        if (bits >= inBits) return \"Excess padding\";\n        if (value << outBits - bits & maxV) return \"Non-zero padding\";\n      }\n      return result2;\n    }\n    function toWordsUnsafe(bytes) {\n      var res = convert(bytes, 8, 5, true);\n      if (Array.isArray(res)) return res;\n    }\n    function toWords(bytes) {\n      var res = convert(bytes, 8, 5, true);\n      if (Array.isArray(res)) return res;\n      throw new Error(res);\n    }\n    function fromWordsUnsafe(words) {\n      var res = convert(words, 5, 8, false);\n      if (Array.isArray(res)) return res;\n    }\n    function fromWords(words) {\n      var res = convert(words, 5, 8, false);\n      if (Array.isArray(res)) return res;\n      throw new Error(res);\n    }\n    module2.exports = {\n      decodeUnsafe,\n      decode,\n      encode,\n      toWordsUnsafe,\n      toWords,\n      fromWordsUnsafe,\n      fromWords\n    };\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/_version.js\nvar require_version22 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"providers/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/formatter.js\nvar require_formatter = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/formatter.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.showThrottleMessage = exports2.isCommunityResource = exports2.isCommunityResourcable = exports2.Formatter = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var Formatter = (\n      /** @class */\n      function() {\n        function Formatter2() {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, Formatter2);\n          this.formats = this.getDefaultFormats();\n        }\n        Formatter2.prototype.getDefaultFormats = function() {\n          var _this = this;\n          var formats = {};\n          var address = this.address.bind(this);\n          var bigNumber = this.bigNumber.bind(this);\n          var blockTag = this.blockTag.bind(this);\n          var data = this.data.bind(this);\n          var hash = this.hash.bind(this);\n          var hex = this.hex.bind(this);\n          var number = this.number.bind(this);\n          var type = this.type.bind(this);\n          var strictData = function(v) {\n            return _this.data(v, true);\n          };\n          formats.transaction = {\n            hash,\n            type,\n            accessList: Formatter2.allowNull(this.accessList.bind(this), null),\n            blockHash: Formatter2.allowNull(hash, null),\n            blockNumber: Formatter2.allowNull(number, null),\n            transactionIndex: Formatter2.allowNull(number, null),\n            confirmations: Formatter2.allowNull(number, null),\n            from: address,\n            // either (gasPrice) or (maxPriorityFeePerGas + maxFeePerGas)\n            // must be set\n            gasPrice: Formatter2.allowNull(bigNumber),\n            maxPriorityFeePerGas: Formatter2.allowNull(bigNumber),\n            maxFeePerGas: Formatter2.allowNull(bigNumber),\n            gasLimit: bigNumber,\n            to: Formatter2.allowNull(address, null),\n            value: bigNumber,\n            nonce: number,\n            data,\n            r: Formatter2.allowNull(this.uint256),\n            s: Formatter2.allowNull(this.uint256),\n            v: Formatter2.allowNull(number),\n            creates: Formatter2.allowNull(address, null),\n            raw: Formatter2.allowNull(data)\n          };\n          formats.transactionRequest = {\n            from: Formatter2.allowNull(address),\n            nonce: Formatter2.allowNull(number),\n            gasLimit: Formatter2.allowNull(bigNumber),\n            gasPrice: Formatter2.allowNull(bigNumber),\n            maxPriorityFeePerGas: Formatter2.allowNull(bigNumber),\n            maxFeePerGas: Formatter2.allowNull(bigNumber),\n            to: Formatter2.allowNull(address),\n            value: Formatter2.allowNull(bigNumber),\n            data: Formatter2.allowNull(strictData),\n            type: Formatter2.allowNull(number),\n            accessList: Formatter2.allowNull(this.accessList.bind(this), null)\n          };\n          formats.receiptLog = {\n            transactionIndex: number,\n            blockNumber: number,\n            transactionHash: hash,\n            address,\n            topics: Formatter2.arrayOf(hash),\n            data,\n            logIndex: number,\n            blockHash: hash\n          };\n          formats.receipt = {\n            to: Formatter2.allowNull(this.address, null),\n            from: Formatter2.allowNull(this.address, null),\n            contractAddress: Formatter2.allowNull(address, null),\n            transactionIndex: number,\n            // should be allowNull(hash), but broken-EIP-658 support is handled in receipt\n            root: Formatter2.allowNull(hex),\n            gasUsed: bigNumber,\n            logsBloom: Formatter2.allowNull(data),\n            blockHash: hash,\n            transactionHash: hash,\n            logs: Formatter2.arrayOf(this.receiptLog.bind(this)),\n            blockNumber: number,\n            confirmations: Formatter2.allowNull(number, null),\n            cumulativeGasUsed: bigNumber,\n            effectiveGasPrice: Formatter2.allowNull(bigNumber),\n            status: Formatter2.allowNull(number),\n            type\n          };\n          formats.block = {\n            hash,\n            parentHash: hash,\n            number,\n            timestamp: number,\n            nonce: Formatter2.allowNull(hex),\n            difficulty: this.difficulty.bind(this),\n            gasLimit: bigNumber,\n            gasUsed: bigNumber,\n            miner: address,\n            extraData: data,\n            transactions: Formatter2.allowNull(Formatter2.arrayOf(hash)),\n            baseFeePerGas: Formatter2.allowNull(bigNumber)\n          };\n          formats.blockWithTransactions = (0, properties_1.shallowCopy)(formats.block);\n          formats.blockWithTransactions.transactions = Formatter2.allowNull(Formatter2.arrayOf(this.transactionResponse.bind(this)));\n          formats.filter = {\n            fromBlock: Formatter2.allowNull(blockTag, void 0),\n            toBlock: Formatter2.allowNull(blockTag, void 0),\n            blockHash: Formatter2.allowNull(hash, void 0),\n            address: Formatter2.allowNull(address, void 0),\n            topics: Formatter2.allowNull(this.topics.bind(this), void 0)\n          };\n          formats.filterLog = {\n            blockNumber: Formatter2.allowNull(number),\n            blockHash: Formatter2.allowNull(hash),\n            transactionIndex: number,\n            removed: Formatter2.allowNull(this.boolean.bind(this)),\n            address,\n            data: Formatter2.allowFalsish(data, \"0x\"),\n            topics: Formatter2.arrayOf(hash),\n            transactionHash: hash,\n            logIndex: number\n          };\n          return formats;\n        };\n        Formatter2.prototype.accessList = function(accessList) {\n          return (0, transactions_1.accessListify)(accessList || []);\n        };\n        Formatter2.prototype.number = function(number) {\n          if (number === \"0x\") {\n            return 0;\n          }\n          return bignumber_1.BigNumber.from(number).toNumber();\n        };\n        Formatter2.prototype.type = function(number) {\n          if (number === \"0x\" || number == null) {\n            return 0;\n          }\n          return bignumber_1.BigNumber.from(number).toNumber();\n        };\n        Formatter2.prototype.bigNumber = function(value) {\n          return bignumber_1.BigNumber.from(value);\n        };\n        Formatter2.prototype.boolean = function(value) {\n          if (typeof value === \"boolean\") {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            value = value.toLowerCase();\n            if (value === \"true\") {\n              return true;\n            }\n            if (value === \"false\") {\n              return false;\n            }\n          }\n          throw new Error(\"invalid boolean - \" + value);\n        };\n        Formatter2.prototype.hex = function(value, strict) {\n          if (typeof value === \"string\") {\n            if (!strict && value.substring(0, 2) !== \"0x\") {\n              value = \"0x\" + value;\n            }\n            if ((0, bytes_1.isHexString)(value)) {\n              return value.toLowerCase();\n            }\n          }\n          return logger.throwArgumentError(\"invalid hash\", \"value\", value);\n        };\n        Formatter2.prototype.data = function(value, strict) {\n          var result2 = this.hex(value, strict);\n          if (result2.length % 2 !== 0) {\n            throw new Error(\"invalid data; odd-length - \" + value);\n          }\n          return result2;\n        };\n        Formatter2.prototype.address = function(value) {\n          return (0, address_1.getAddress)(value);\n        };\n        Formatter2.prototype.callAddress = function(value) {\n          if (!(0, bytes_1.isHexString)(value, 32)) {\n            return null;\n          }\n          var address = (0, address_1.getAddress)((0, bytes_1.hexDataSlice)(value, 12));\n          return address === constants_1.AddressZero ? null : address;\n        };\n        Formatter2.prototype.contractAddress = function(value) {\n          return (0, address_1.getContractAddress)(value);\n        };\n        Formatter2.prototype.blockTag = function(blockTag) {\n          if (blockTag == null) {\n            return \"latest\";\n          }\n          if (blockTag === \"earliest\") {\n            return \"0x0\";\n          }\n          if (blockTag === \"latest\" || blockTag === \"pending\") {\n            return blockTag;\n          }\n          if (typeof blockTag === \"number\" || (0, bytes_1.isHexString)(blockTag)) {\n            return (0, bytes_1.hexValue)(blockTag);\n          }\n          throw new Error(\"invalid blockTag\");\n        };\n        Formatter2.prototype.hash = function(value, strict) {\n          var result2 = this.hex(value, strict);\n          if ((0, bytes_1.hexDataLength)(result2) !== 32) {\n            return logger.throwArgumentError(\"invalid hash\", \"value\", value);\n          }\n          return result2;\n        };\n        Formatter2.prototype.difficulty = function(value) {\n          if (value == null) {\n            return null;\n          }\n          var v = bignumber_1.BigNumber.from(value);\n          try {\n            return v.toNumber();\n          } catch (error) {\n          }\n          return null;\n        };\n        Formatter2.prototype.uint256 = function(value) {\n          if (!(0, bytes_1.isHexString)(value)) {\n            throw new Error(\"invalid uint256\");\n          }\n          return (0, bytes_1.hexZeroPad)(value, 32);\n        };\n        Formatter2.prototype._block = function(value, format) {\n          if (value.author != null && value.miner == null) {\n            value.miner = value.author;\n          }\n          var difficulty = value._difficulty != null ? value._difficulty : value.difficulty;\n          var result2 = Formatter2.check(format, value);\n          result2._difficulty = difficulty == null ? null : bignumber_1.BigNumber.from(difficulty);\n          return result2;\n        };\n        Formatter2.prototype.block = function(value) {\n          return this._block(value, this.formats.block);\n        };\n        Formatter2.prototype.blockWithTransactions = function(value) {\n          return this._block(value, this.formats.blockWithTransactions);\n        };\n        Formatter2.prototype.transactionRequest = function(value) {\n          return Formatter2.check(this.formats.transactionRequest, value);\n        };\n        Formatter2.prototype.transactionResponse = function(transaction) {\n          if (transaction.gas != null && transaction.gasLimit == null) {\n            transaction.gasLimit = transaction.gas;\n          }\n          if (transaction.to && bignumber_1.BigNumber.from(transaction.to).isZero()) {\n            transaction.to = \"0x0000000000000000000000000000000000000000\";\n          }\n          if (transaction.input != null && transaction.data == null) {\n            transaction.data = transaction.input;\n          }\n          if (transaction.to == null && transaction.creates == null) {\n            transaction.creates = this.contractAddress(transaction);\n          }\n          if ((transaction.type === 1 || transaction.type === 2) && transaction.accessList == null) {\n            transaction.accessList = [];\n          }\n          var result2 = Formatter2.check(this.formats.transaction, transaction);\n          if (transaction.chainId != null) {\n            var chainId = transaction.chainId;\n            if ((0, bytes_1.isHexString)(chainId)) {\n              chainId = bignumber_1.BigNumber.from(chainId).toNumber();\n            }\n            result2.chainId = chainId;\n          } else {\n            var chainId = transaction.networkId;\n            if (chainId == null && result2.v == null) {\n              chainId = transaction.chainId;\n            }\n            if ((0, bytes_1.isHexString)(chainId)) {\n              chainId = bignumber_1.BigNumber.from(chainId).toNumber();\n            }\n            if (typeof chainId !== \"number\" && result2.v != null) {\n              chainId = (result2.v - 35) / 2;\n              if (chainId < 0) {\n                chainId = 0;\n              }\n              chainId = parseInt(chainId);\n            }\n            if (typeof chainId !== \"number\") {\n              chainId = 0;\n            }\n            result2.chainId = chainId;\n          }\n          if (result2.blockHash && result2.blockHash.replace(/0/g, \"\") === \"x\") {\n            result2.blockHash = null;\n          }\n          return result2;\n        };\n        Formatter2.prototype.transaction = function(value) {\n          return (0, transactions_1.parse)(value);\n        };\n        Formatter2.prototype.receiptLog = function(value) {\n          return Formatter2.check(this.formats.receiptLog, value);\n        };\n        Formatter2.prototype.receipt = function(value) {\n          var result2 = Formatter2.check(this.formats.receipt, value);\n          if (result2.root != null) {\n            if (result2.root.length <= 4) {\n              var value_1 = bignumber_1.BigNumber.from(result2.root).toNumber();\n              if (value_1 === 0 || value_1 === 1) {\n                if (result2.status != null && result2.status !== value_1) {\n                  logger.throwArgumentError(\"alt-root-status/status mismatch\", \"value\", { root: result2.root, status: result2.status });\n                }\n                result2.status = value_1;\n                delete result2.root;\n              } else {\n                logger.throwArgumentError(\"invalid alt-root-status\", \"value.root\", result2.root);\n              }\n            } else if (result2.root.length !== 66) {\n              logger.throwArgumentError(\"invalid root hash\", \"value.root\", result2.root);\n            }\n          }\n          if (result2.status != null) {\n            result2.byzantium = true;\n          }\n          return result2;\n        };\n        Formatter2.prototype.topics = function(value) {\n          var _this = this;\n          if (Array.isArray(value)) {\n            return value.map(function(v) {\n              return _this.topics(v);\n            });\n          } else if (value != null) {\n            return this.hash(value, true);\n          }\n          return null;\n        };\n        Formatter2.prototype.filter = function(value) {\n          return Formatter2.check(this.formats.filter, value);\n        };\n        Formatter2.prototype.filterLog = function(value) {\n          return Formatter2.check(this.formats.filterLog, value);\n        };\n        Formatter2.check = function(format, object) {\n          var result2 = {};\n          for (var key in format) {\n            try {\n              var value = format[key](object[key]);\n              if (value !== void 0) {\n                result2[key] = value;\n              }\n            } catch (error) {\n              error.checkKey = key;\n              error.checkValue = object[key];\n              throw error;\n            }\n          }\n          return result2;\n        };\n        Formatter2.allowNull = function(format, nullValue) {\n          return function(value) {\n            if (value == null) {\n              return nullValue;\n            }\n            return format(value);\n          };\n        };\n        Formatter2.allowFalsish = function(format, replaceValue) {\n          return function(value) {\n            if (!value) {\n              return replaceValue;\n            }\n            return format(value);\n          };\n        };\n        Formatter2.arrayOf = function(format) {\n          return function(array) {\n            if (!Array.isArray(array)) {\n              throw new Error(\"not an array\");\n            }\n            var result2 = [];\n            array.forEach(function(value) {\n              result2.push(format(value));\n            });\n            return result2;\n          };\n        };\n        return Formatter2;\n      }()\n    );\n    exports2.Formatter = Formatter;\n    function isCommunityResourcable(value) {\n      return value && typeof value.isCommunityResource === \"function\";\n    }\n    exports2.isCommunityResourcable = isCommunityResourcable;\n    function isCommunityResource(value) {\n      return isCommunityResourcable(value) && value.isCommunityResource();\n    }\n    exports2.isCommunityResource = isCommunityResource;\n    var throttleMessage = false;\n    function showThrottleMessage() {\n      if (throttleMessage) {\n        return;\n      }\n      throttleMessage = true;\n      console.log(\"========= NOTICE =========\");\n      console.log(\"Request-Rate Exceeded  (this message will not be repeated)\");\n      console.log(\"\");\n      console.log(\"The default API keys for each service are provided as a highly-throttled,\");\n      console.log(\"community resource for low-traffic projects and early prototyping.\");\n      console.log(\"\");\n      console.log(\"While your application will continue to function, we highly recommended\");\n      console.log(\"signing up for your own API keys to improve performance, increase your\");\n      console.log(\"request rate/limit and enable other perks, such as metrics and advanced APIs.\");\n      console.log(\"\");\n      console.log(\"For more details: https://docs.ethers.io/api-keys/\");\n      console.log(\"==========================\");\n    }\n    exports2.showThrottleMessage = showThrottleMessage;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/base-provider.js\nvar require_base_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/base-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BaseProvider = exports2.Resolver = exports2.Event = void 0;\n    var abstract_provider_1 = require_lib12();\n    var basex_1 = require_lib17();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var hash_1 = require_lib10();\n    var networks_1 = require_lib25();\n    var properties_1 = require_lib4();\n    var sha2_1 = require_lib19();\n    var strings_1 = require_lib9();\n    var web_1 = require_lib27();\n    var bech32_1 = __importDefault(require_bech32());\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var formatter_1 = require_formatter();\n    function checkTopic(topic) {\n      if (topic == null) {\n        return \"null\";\n      }\n      if ((0, bytes_1.hexDataLength)(topic) !== 32) {\n        logger.throwArgumentError(\"invalid topic\", \"topic\", topic);\n      }\n      return topic.toLowerCase();\n    }\n    function serializeTopics(topics) {\n      topics = topics.slice();\n      while (topics.length > 0 && topics[topics.length - 1] == null) {\n        topics.pop();\n      }\n      return topics.map(function(topic) {\n        if (Array.isArray(topic)) {\n          var unique_1 = {};\n          topic.forEach(function(topic2) {\n            unique_1[checkTopic(topic2)] = true;\n          });\n          var sorted = Object.keys(unique_1);\n          sorted.sort();\n          return sorted.join(\"|\");\n        } else {\n          return checkTopic(topic);\n        }\n      }).join(\"&\");\n    }\n    function deserializeTopics(data) {\n      if (data === \"\") {\n        return [];\n      }\n      return data.split(/&/g).map(function(topic) {\n        if (topic === \"\") {\n          return [];\n        }\n        var comps = topic.split(\"|\").map(function(topic2) {\n          return topic2 === \"null\" ? null : topic2;\n        });\n        return comps.length === 1 ? comps[0] : comps;\n      });\n    }\n    function getEventTag(eventName) {\n      if (typeof eventName === \"string\") {\n        eventName = eventName.toLowerCase();\n        if ((0, bytes_1.hexDataLength)(eventName) === 32) {\n          return \"tx:\" + eventName;\n        }\n        if (eventName.indexOf(\":\") === -1) {\n          return eventName;\n        }\n      } else if (Array.isArray(eventName)) {\n        return \"filter:*:\" + serializeTopics(eventName);\n      } else if (abstract_provider_1.ForkEvent.isForkEvent(eventName)) {\n        logger.warn(\"not implemented\");\n        throw new Error(\"not implemented\");\n      } else if (eventName && typeof eventName === \"object\") {\n        return \"filter:\" + (eventName.address || \"*\") + \":\" + serializeTopics(eventName.topics || []);\n      }\n      throw new Error(\"invalid event - \" + eventName);\n    }\n    function getTime() {\n      return (/* @__PURE__ */ new Date()).getTime();\n    }\n    function stall(duration) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, duration);\n      });\n    }\n    var PollableEvents = [\"block\", \"network\", \"pending\", \"poll\"];\n    var Event = (\n      /** @class */\n      function() {\n        function Event2(tag, listener, once) {\n          (0, properties_1.defineReadOnly)(this, \"tag\", tag);\n          (0, properties_1.defineReadOnly)(this, \"listener\", listener);\n          (0, properties_1.defineReadOnly)(this, \"once\", once);\n        }\n        Object.defineProperty(Event2.prototype, \"event\", {\n          get: function() {\n            switch (this.type) {\n              case \"tx\":\n                return this.hash;\n              case \"filter\":\n                return this.filter;\n            }\n            return this.tag;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"type\", {\n          get: function() {\n            return this.tag.split(\":\")[0];\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"hash\", {\n          get: function() {\n            var comps = this.tag.split(\":\");\n            if (comps[0] !== \"tx\") {\n              return null;\n            }\n            return comps[1];\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"filter\", {\n          get: function() {\n            var comps = this.tag.split(\":\");\n            if (comps[0] !== \"filter\") {\n              return null;\n            }\n            var address = comps[1];\n            var topics = deserializeTopics(comps[2]);\n            var filter = {};\n            if (topics.length > 0) {\n              filter.topics = topics;\n            }\n            if (address && address !== \"*\") {\n              filter.address = address;\n            }\n            return filter;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Event2.prototype.pollable = function() {\n          return this.tag.indexOf(\":\") >= 0 || PollableEvents.indexOf(this.tag) >= 0;\n        };\n        return Event2;\n      }()\n    );\n    exports2.Event = Event;\n    var coinInfos = {\n      \"0\": { symbol: \"btc\", p2pkh: 0, p2sh: 5, prefix: \"bc\" },\n      \"2\": { symbol: \"ltc\", p2pkh: 48, p2sh: 50, prefix: \"ltc\" },\n      \"3\": { symbol: \"doge\", p2pkh: 30, p2sh: 22 },\n      \"60\": { symbol: \"eth\", ilk: \"eth\" },\n      \"61\": { symbol: \"etc\", ilk: \"eth\" },\n      \"700\": { symbol: \"xdai\", ilk: \"eth\" }\n    };\n    function bytes32ify(value) {\n      return (0, bytes_1.hexZeroPad)(bignumber_1.BigNumber.from(value).toHexString(), 32);\n    }\n    function base58Encode(data) {\n      return basex_1.Base58.encode((0, bytes_1.concat)([data, (0, bytes_1.hexDataSlice)((0, sha2_1.sha256)((0, sha2_1.sha256)(data)), 0, 4)]));\n    }\n    var matchers = [\n      new RegExp(\"^(https)://(.*)$\", \"i\"),\n      new RegExp(\"^(data):(.*)$\", \"i\"),\n      new RegExp(\"^(ipfs)://(.*)$\", \"i\"),\n      new RegExp(\"^eip155:[0-9]+/(erc[0-9]+):(.*)$\", \"i\")\n    ];\n    function _parseString(result2) {\n      try {\n        return (0, strings_1.toUtf8String)(_parseBytes(result2));\n      } catch (error) {\n      }\n      return null;\n    }\n    function _parseBytes(result2) {\n      if (result2 === \"0x\") {\n        return null;\n      }\n      var offset = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(result2, 0, 32)).toNumber();\n      var length = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(result2, offset, offset + 32)).toNumber();\n      return (0, bytes_1.hexDataSlice)(result2, offset + 32, offset + 32 + length);\n    }\n    var Resolver = (\n      /** @class */\n      function() {\n        function Resolver2(provider, address, name2, resolvedAddress) {\n          (0, properties_1.defineReadOnly)(this, \"provider\", provider);\n          (0, properties_1.defineReadOnly)(this, \"name\", name2);\n          (0, properties_1.defineReadOnly)(this, \"address\", provider.formatter.address(address));\n          (0, properties_1.defineReadOnly)(this, \"_resolvedAddress\", resolvedAddress);\n        }\n        Resolver2.prototype._fetchBytes = function(selector, parameters) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, _a, error_1;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  tx = {\n                    to: this.address,\n                    data: (0, bytes_1.hexConcat)([selector, (0, hash_1.namehash)(this.name), parameters || \"0x\"])\n                  };\n                  _b.label = 1;\n                case 1:\n                  _b.trys.push([1, 3, , 4]);\n                  _a = _parseBytes;\n                  return [4, this.provider.call(tx)];\n                case 2:\n                  return [2, _a.apply(void 0, [_b.sent()])];\n                case 3:\n                  error_1 = _b.sent();\n                  if (error_1.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  return [2, null];\n                case 4:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        Resolver2.prototype._getAddress = function(coinType, hexBytes) {\n          var coinInfo = coinInfos[String(coinType)];\n          if (coinInfo == null) {\n            logger.throwError(\"unsupported coin type: \" + coinType, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"getAddress(\" + coinType + \")\"\n            });\n          }\n          if (coinInfo.ilk === \"eth\") {\n            return this.provider.formatter.address(hexBytes);\n          }\n          var bytes = (0, bytes_1.arrayify)(hexBytes);\n          if (coinInfo.p2pkh != null) {\n            var p2pkh = hexBytes.match(/^0x76a9([0-9a-f][0-9a-f])([0-9a-f]*)88ac$/);\n            if (p2pkh) {\n              var length_1 = parseInt(p2pkh[1], 16);\n              if (p2pkh[2].length === length_1 * 2 && length_1 >= 1 && length_1 <= 75) {\n                return base58Encode((0, bytes_1.concat)([[coinInfo.p2pkh], \"0x\" + p2pkh[2]]));\n              }\n            }\n          }\n          if (coinInfo.p2sh != null) {\n            var p2sh = hexBytes.match(/^0xa9([0-9a-f][0-9a-f])([0-9a-f]*)87$/);\n            if (p2sh) {\n              var length_2 = parseInt(p2sh[1], 16);\n              if (p2sh[2].length === length_2 * 2 && length_2 >= 1 && length_2 <= 75) {\n                return base58Encode((0, bytes_1.concat)([[coinInfo.p2sh], \"0x\" + p2sh[2]]));\n              }\n            }\n          }\n          if (coinInfo.prefix != null) {\n            var length_3 = bytes[1];\n            var version_1 = bytes[0];\n            if (version_1 === 0) {\n              if (length_3 !== 20 && length_3 !== 32) {\n                version_1 = -1;\n              }\n            } else {\n              version_1 = -1;\n            }\n            if (version_1 >= 0 && bytes.length === 2 + length_3 && length_3 >= 1 && length_3 <= 75) {\n              var words = bech32_1.default.toWords(bytes.slice(2));\n              words.unshift(version_1);\n              return bech32_1.default.encode(coinInfo.prefix, words);\n            }\n          }\n          return null;\n        };\n        Resolver2.prototype.getAddress = function(coinType) {\n          return __awaiter(this, void 0, void 0, function() {\n            var transaction, hexBytes_1, error_2, hexBytes, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (coinType == null) {\n                    coinType = 60;\n                  }\n                  if (!(coinType === 60)) return [3, 4];\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  transaction = {\n                    to: this.address,\n                    data: \"0x3b3b57de\" + (0, hash_1.namehash)(this.name).substring(2)\n                  };\n                  return [4, this.provider.call(transaction)];\n                case 2:\n                  hexBytes_1 = _a.sent();\n                  if (hexBytes_1 === \"0x\" || hexBytes_1 === constants_1.HashZero) {\n                    return [2, null];\n                  }\n                  return [2, this.provider.formatter.callAddress(hexBytes_1)];\n                case 3:\n                  error_2 = _a.sent();\n                  if (error_2.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  throw error_2;\n                case 4:\n                  return [4, this._fetchBytes(\"0xf1cb7e06\", bytes32ify(coinType))];\n                case 5:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  address = this._getAddress(coinType, hexBytes);\n                  if (address == null) {\n                    logger.throwError(\"invalid or unsupported coin data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                      operation: \"getAddress(\" + coinType + \")\",\n                      coinType,\n                      data: hexBytes\n                    });\n                  }\n                  return [2, address];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getAvatar = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var linkage, avatar, i, match, _a, selector, owner, _b, comps, addr, tokenId, tokenOwner, _c, _d, balance, _e, _f, tx, metadataUrl, _g, metadata, error_3;\n            return __generator(this, function(_h) {\n              switch (_h.label) {\n                case 0:\n                  linkage = [];\n                  _h.label = 1;\n                case 1:\n                  _h.trys.push([1, 19, , 20]);\n                  return [4, this.getText(\"avatar\")];\n                case 2:\n                  avatar = _h.sent();\n                  if (avatar == null) {\n                    return [2, null];\n                  }\n                  i = 0;\n                  _h.label = 3;\n                case 3:\n                  if (!(i < matchers.length)) return [3, 18];\n                  match = avatar.match(matchers[i]);\n                  if (match == null) {\n                    return [3, 17];\n                  }\n                  _a = match[1];\n                  switch (_a) {\n                    case \"https\":\n                      return [3, 4];\n                    case \"data\":\n                      return [3, 5];\n                    case \"ipfs\":\n                      return [3, 6];\n                    case \"erc721\":\n                      return [3, 7];\n                    case \"erc1155\":\n                      return [3, 7];\n                  }\n                  return [3, 17];\n                case 4:\n                  linkage.push({ type: \"url\", content: avatar });\n                  return [2, { linkage, url: avatar }];\n                case 5:\n                  linkage.push({ type: \"data\", content: avatar });\n                  return [2, { linkage, url: avatar }];\n                case 6:\n                  linkage.push({ type: \"ipfs\", content: avatar });\n                  return [2, { linkage, url: \"https://gateway.ipfs.io/ipfs/\" + avatar.substring(7) }];\n                case 7:\n                  selector = match[1] === \"erc721\" ? \"0xc87b56dd\" : \"0x0e89341c\";\n                  linkage.push({ type: match[1], content: avatar });\n                  _b = this._resolvedAddress;\n                  if (_b) return [3, 9];\n                  return [4, this.getAddress()];\n                case 8:\n                  _b = _h.sent();\n                  _h.label = 9;\n                case 9:\n                  owner = _b;\n                  comps = (match[2] || \"\").split(\"/\");\n                  if (comps.length !== 2) {\n                    return [2, null];\n                  }\n                  return [4, this.provider.formatter.address(comps[0])];\n                case 10:\n                  addr = _h.sent();\n                  tokenId = (0, bytes_1.hexZeroPad)(bignumber_1.BigNumber.from(comps[1]).toHexString(), 32);\n                  if (!(match[1] === \"erc721\")) return [3, 12];\n                  _d = (_c = this.provider.formatter).callAddress;\n                  return [4, this.provider.call({\n                    to: addr,\n                    data: (0, bytes_1.hexConcat)([\"0x6352211e\", tokenId])\n                  })];\n                case 11:\n                  tokenOwner = _d.apply(_c, [_h.sent()]);\n                  if (owner !== tokenOwner) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"owner\", content: tokenOwner });\n                  return [3, 14];\n                case 12:\n                  if (!(match[1] === \"erc1155\")) return [3, 14];\n                  _f = (_e = bignumber_1.BigNumber).from;\n                  return [4, this.provider.call({\n                    to: addr,\n                    data: (0, bytes_1.hexConcat)([\"0x00fdd58e\", (0, bytes_1.hexZeroPad)(owner, 32), tokenId])\n                  })];\n                case 13:\n                  balance = _f.apply(_e, [_h.sent()]);\n                  if (balance.isZero()) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"balance\", content: balance.toString() });\n                  _h.label = 14;\n                case 14:\n                  tx = {\n                    to: this.provider.formatter.address(comps[0]),\n                    data: (0, bytes_1.hexConcat)([selector, tokenId])\n                  };\n                  _g = _parseString;\n                  return [4, this.provider.call(tx)];\n                case 15:\n                  metadataUrl = _g.apply(void 0, [_h.sent()]);\n                  if (metadataUrl == null) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"metadata-url\", content: metadataUrl });\n                  if (match[1] === \"erc1155\") {\n                    metadataUrl = metadataUrl.replace(\"{id}\", tokenId.substring(2));\n                  }\n                  return [4, (0, web_1.fetchJson)(metadataUrl)];\n                case 16:\n                  metadata = _h.sent();\n                  if (!metadata || typeof metadata.image !== \"string\" || !metadata.image.match(/^(https:\\/\\/|data:)/i)) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"metadata\", content: JSON.stringify(metadata) });\n                  linkage.push({ type: \"url\", content: metadata.image });\n                  return [2, { linkage, url: metadata.image }];\n                case 17:\n                  i++;\n                  return [3, 3];\n                case 18:\n                  return [3, 20];\n                case 19:\n                  error_3 = _h.sent();\n                  return [3, 20];\n                case 20:\n                  return [2, null];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getContentHash = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var hexBytes, ipfs, length_4, swarm;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._fetchBytes(\"0xbc1c58d1\")];\n                case 1:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  ipfs = hexBytes.match(/^0xe3010170(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/);\n                  if (ipfs) {\n                    length_4 = parseInt(ipfs[3], 16);\n                    if (ipfs[4].length === length_4 * 2) {\n                      return [2, \"ipfs://\" + basex_1.Base58.encode(\"0x\" + ipfs[1])];\n                    }\n                  }\n                  swarm = hexBytes.match(/^0xe40101fa011b20([0-9a-f]*)$/);\n                  if (swarm) {\n                    if (swarm[1].length === 32 * 2) {\n                      return [2, \"bzz://\" + swarm[1]];\n                    }\n                  }\n                  return [2, logger.throwError(\"invalid or unsupported content hash data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"getContentHash()\",\n                    data: hexBytes\n                  })];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getText = function(key) {\n          return __awaiter(this, void 0, void 0, function() {\n            var keyBytes, hexBytes;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  keyBytes = (0, strings_1.toUtf8Bytes)(key);\n                  keyBytes = (0, bytes_1.concat)([bytes32ify(64), bytes32ify(keyBytes.length), keyBytes]);\n                  if (keyBytes.length % 32 !== 0) {\n                    keyBytes = (0, bytes_1.concat)([keyBytes, (0, bytes_1.hexZeroPad)(\"0x\", 32 - key.length % 32)]);\n                  }\n                  return [4, this._fetchBytes(\"0x59d1d43c\", (0, bytes_1.hexlify)(keyBytes))];\n                case 1:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  return [2, (0, strings_1.toUtf8String)(hexBytes)];\n              }\n            });\n          });\n        };\n        return Resolver2;\n      }()\n    );\n    exports2.Resolver = Resolver;\n    var defaultFormatter = null;\n    var nextPollId = 1;\n    var BaseProvider = (\n      /** @class */\n      function(_super) {\n        __extends(BaseProvider2, _super);\n        function BaseProvider2(network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, abstract_provider_1.Provider);\n          _this = _super.call(this) || this;\n          _this._events = [];\n          _this._emitted = { block: -2 };\n          _this.formatter = _newTarget.getFormatter();\n          (0, properties_1.defineReadOnly)(_this, \"anyNetwork\", network === \"any\");\n          if (_this.anyNetwork) {\n            network = _this.detectNetwork();\n          }\n          if (network instanceof Promise) {\n            _this._networkPromise = network;\n            network.catch(function(error) {\n            });\n            _this._ready().catch(function(error) {\n            });\n          } else {\n            var knownNetwork = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n            if (knownNetwork) {\n              (0, properties_1.defineReadOnly)(_this, \"_network\", knownNetwork);\n              _this.emit(\"network\", knownNetwork, null);\n            } else {\n              logger.throwArgumentError(\"invalid network\", \"network\", network);\n            }\n          }\n          _this._maxInternalBlockNumber = -1024;\n          _this._lastBlockNumber = -2;\n          _this._pollingInterval = 4e3;\n          _this._fastQueryDate = 0;\n          return _this;\n        }\n        BaseProvider2.prototype._ready = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, error_4;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(this._network == null)) return [3, 7];\n                  network = null;\n                  if (!this._networkPromise) return [3, 4];\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  return [4, this._networkPromise];\n                case 2:\n                  network = _a.sent();\n                  return [3, 4];\n                case 3:\n                  error_4 = _a.sent();\n                  return [3, 4];\n                case 4:\n                  if (!(network == null)) return [3, 6];\n                  return [4, this.detectNetwork()];\n                case 5:\n                  network = _a.sent();\n                  _a.label = 6;\n                case 6:\n                  if (!network) {\n                    logger.throwError(\"no network detected\", logger_1.Logger.errors.UNKNOWN_ERROR, {});\n                  }\n                  if (this._network == null) {\n                    if (this.anyNetwork) {\n                      this._network = network;\n                    } else {\n                      (0, properties_1.defineReadOnly)(this, \"_network\", network);\n                    }\n                    this.emit(\"network\", network, null);\n                  }\n                  _a.label = 7;\n                case 7:\n                  return [2, this._network];\n              }\n            });\n          });\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"ready\", {\n          // This will always return the most recently established network.\n          // For \"any\", this can change (a \"network\" event is emitted before\n          // any change is reflected); otherwise this cannot change\n          get: function() {\n            var _this = this;\n            return (0, web_1.poll)(function() {\n              return _this._ready().then(function(network) {\n                return network;\n              }, function(error) {\n                if (error.code === logger_1.Logger.errors.NETWORK_ERROR && error.event === \"noNetwork\") {\n                  return void 0;\n                }\n                throw error;\n              });\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.getFormatter = function() {\n          if (defaultFormatter == null) {\n            defaultFormatter = new formatter_1.Formatter();\n          }\n          return defaultFormatter;\n        };\n        BaseProvider2.getNetwork = function(network) {\n          return (0, networks_1.getNetwork)(network == null ? \"homestead\" : network);\n        };\n        BaseProvider2.prototype._getInternalBlockNumber = function(maxAge) {\n          return __awaiter(this, void 0, void 0, function() {\n            var internalBlockNumber, result2, error_5, reqTime, checkInternalBlockNumber;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._ready()];\n                case 1:\n                  _a.sent();\n                  if (!(maxAge > 0)) return [3, 7];\n                  _a.label = 2;\n                case 2:\n                  if (!this._internalBlockNumber) return [3, 7];\n                  internalBlockNumber = this._internalBlockNumber;\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, internalBlockNumber];\n                case 4:\n                  result2 = _a.sent();\n                  if (getTime() - result2.respTime <= maxAge) {\n                    return [2, result2.blockNumber];\n                  }\n                  return [3, 7];\n                case 5:\n                  error_5 = _a.sent();\n                  if (this._internalBlockNumber === internalBlockNumber) {\n                    return [3, 7];\n                  }\n                  return [3, 6];\n                case 6:\n                  return [3, 2];\n                case 7:\n                  reqTime = getTime();\n                  checkInternalBlockNumber = (0, properties_1.resolveProperties)({\n                    blockNumber: this.perform(\"getBlockNumber\", {}),\n                    networkError: this.getNetwork().then(function(network) {\n                      return null;\n                    }, function(error) {\n                      return error;\n                    })\n                  }).then(function(_a2) {\n                    var blockNumber = _a2.blockNumber, networkError = _a2.networkError;\n                    if (networkError) {\n                      if (_this._internalBlockNumber === checkInternalBlockNumber) {\n                        _this._internalBlockNumber = null;\n                      }\n                      throw networkError;\n                    }\n                    var respTime = getTime();\n                    blockNumber = bignumber_1.BigNumber.from(blockNumber).toNumber();\n                    if (blockNumber < _this._maxInternalBlockNumber) {\n                      blockNumber = _this._maxInternalBlockNumber;\n                    }\n                    _this._maxInternalBlockNumber = blockNumber;\n                    _this._setFastBlockNumber(blockNumber);\n                    return { blockNumber, reqTime, respTime };\n                  });\n                  this._internalBlockNumber = checkInternalBlockNumber;\n                  checkInternalBlockNumber.catch(function(error) {\n                    if (_this._internalBlockNumber === checkInternalBlockNumber) {\n                      _this._internalBlockNumber = null;\n                    }\n                  });\n                  return [4, checkInternalBlockNumber];\n                case 8:\n                  return [2, _a.sent().blockNumber];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.poll = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var pollId, runners, blockNumber, error_6, i;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  pollId = nextPollId++;\n                  runners = [];\n                  blockNumber = null;\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  return [4, this._getInternalBlockNumber(100 + this.pollingInterval / 2)];\n                case 2:\n                  blockNumber = _a.sent();\n                  return [3, 4];\n                case 3:\n                  error_6 = _a.sent();\n                  this.emit(\"error\", error_6);\n                  return [\n                    2\n                    /*return*/\n                  ];\n                case 4:\n                  this._setFastBlockNumber(blockNumber);\n                  this.emit(\"poll\", pollId, blockNumber);\n                  if (blockNumber === this._lastBlockNumber) {\n                    this.emit(\"didPoll\", pollId);\n                    return [\n                      2\n                      /*return*/\n                    ];\n                  }\n                  if (this._emitted.block === -2) {\n                    this._emitted.block = blockNumber - 1;\n                  }\n                  if (Math.abs(this._emitted.block - blockNumber) > 1e3) {\n                    logger.warn(\"network block skew detected; skipping block events (emitted=\" + this._emitted.block + \" blockNumber\" + blockNumber + \")\");\n                    this.emit(\"error\", logger.makeError(\"network block skew detected\", logger_1.Logger.errors.NETWORK_ERROR, {\n                      blockNumber,\n                      event: \"blockSkew\",\n                      previousBlockNumber: this._emitted.block\n                    }));\n                    this.emit(\"block\", blockNumber);\n                  } else {\n                    for (i = this._emitted.block + 1; i <= blockNumber; i++) {\n                      this.emit(\"block\", i);\n                    }\n                  }\n                  if (this._emitted.block !== blockNumber) {\n                    this._emitted.block = blockNumber;\n                    Object.keys(this._emitted).forEach(function(key) {\n                      if (key === \"block\") {\n                        return;\n                      }\n                      var eventBlockNumber = _this._emitted[key];\n                      if (eventBlockNumber === \"pending\") {\n                        return;\n                      }\n                      if (blockNumber - eventBlockNumber > 12) {\n                        delete _this._emitted[key];\n                      }\n                    });\n                  }\n                  if (this._lastBlockNumber === -2) {\n                    this._lastBlockNumber = blockNumber - 1;\n                  }\n                  this._events.forEach(function(event) {\n                    switch (event.type) {\n                      case \"tx\": {\n                        var hash_2 = event.hash;\n                        var runner = _this.getTransactionReceipt(hash_2).then(function(receipt) {\n                          if (!receipt || receipt.blockNumber == null) {\n                            return null;\n                          }\n                          _this._emitted[\"t:\" + hash_2] = receipt.blockNumber;\n                          _this.emit(hash_2, receipt);\n                          return null;\n                        }).catch(function(error) {\n                          _this.emit(\"error\", error);\n                        });\n                        runners.push(runner);\n                        break;\n                      }\n                      case \"filter\": {\n                        var filter_1 = event.filter;\n                        filter_1.fromBlock = _this._lastBlockNumber + 1;\n                        filter_1.toBlock = blockNumber;\n                        var runner = _this.getLogs(filter_1).then(function(logs) {\n                          if (logs.length === 0) {\n                            return;\n                          }\n                          logs.forEach(function(log) {\n                            _this._emitted[\"b:\" + log.blockHash] = log.blockNumber;\n                            _this._emitted[\"t:\" + log.transactionHash] = log.blockNumber;\n                            _this.emit(filter_1, log);\n                          });\n                        }).catch(function(error) {\n                          _this.emit(\"error\", error);\n                        });\n                        runners.push(runner);\n                        break;\n                      }\n                    }\n                  });\n                  this._lastBlockNumber = blockNumber;\n                  Promise.all(runners).then(function() {\n                    _this.emit(\"didPoll\", pollId);\n                  }).catch(function(error) {\n                    _this.emit(\"error\", error);\n                  });\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.resetEventsBlock = function(blockNumber) {\n          this._lastBlockNumber = blockNumber - 1;\n          if (this.polling) {\n            this.poll();\n          }\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"network\", {\n          get: function() {\n            return this._network;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, logger.throwError(\"provider does not support network detection\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"provider.detectNetwork\"\n              })];\n            });\n          });\n        };\n        BaseProvider2.prototype.getNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, currentNetwork, error;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._ready()];\n                case 1:\n                  network = _a.sent();\n                  return [4, this.detectNetwork()];\n                case 2:\n                  currentNetwork = _a.sent();\n                  if (!(network.chainId !== currentNetwork.chainId)) return [3, 5];\n                  if (!this.anyNetwork) return [3, 4];\n                  this._network = currentNetwork;\n                  this._lastBlockNumber = -2;\n                  this._fastBlockNumber = null;\n                  this._fastBlockNumberPromise = null;\n                  this._fastQueryDate = 0;\n                  this._emitted.block = -2;\n                  this._maxInternalBlockNumber = -1024;\n                  this._internalBlockNumber = null;\n                  this.emit(\"network\", currentNetwork, network);\n                  return [4, stall(0)];\n                case 3:\n                  _a.sent();\n                  return [2, this._network];\n                case 4:\n                  error = logger.makeError(\"underlying network changed\", logger_1.Logger.errors.NETWORK_ERROR, {\n                    event: \"changed\",\n                    network,\n                    detectedNetwork: currentNetwork\n                  });\n                  this.emit(\"error\", error);\n                  throw error;\n                case 5:\n                  return [2, network];\n              }\n            });\n          });\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"blockNumber\", {\n          get: function() {\n            var _this = this;\n            this._getInternalBlockNumber(100 + this.pollingInterval / 2).then(function(blockNumber) {\n              _this._setFastBlockNumber(blockNumber);\n            }, function(error) {\n            });\n            return this._fastBlockNumber != null ? this._fastBlockNumber : -1;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(BaseProvider2.prototype, \"polling\", {\n          get: function() {\n            return this._poller != null;\n          },\n          set: function(value) {\n            var _this = this;\n            if (value && !this._poller) {\n              this._poller = setInterval(function() {\n                _this.poll();\n              }, this.pollingInterval);\n              if (!this._bootstrapPoll) {\n                this._bootstrapPoll = setTimeout(function() {\n                  _this.poll();\n                  _this._bootstrapPoll = setTimeout(function() {\n                    if (!_this._poller) {\n                      _this.poll();\n                    }\n                    _this._bootstrapPoll = null;\n                  }, _this.pollingInterval);\n                }, 0);\n              }\n            } else if (!value && this._poller) {\n              clearInterval(this._poller);\n              this._poller = null;\n            }\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(BaseProvider2.prototype, \"pollingInterval\", {\n          get: function() {\n            return this._pollingInterval;\n          },\n          set: function(value) {\n            var _this = this;\n            if (typeof value !== \"number\" || value <= 0 || parseInt(String(value)) != value) {\n              throw new Error(\"invalid polling interval\");\n            }\n            this._pollingInterval = value;\n            if (this._poller) {\n              clearInterval(this._poller);\n              this._poller = setInterval(function() {\n                _this.poll();\n              }, this._pollingInterval);\n            }\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.prototype._getFastBlockNumber = function() {\n          var _this = this;\n          var now = getTime();\n          if (now - this._fastQueryDate > 2 * this._pollingInterval) {\n            this._fastQueryDate = now;\n            this._fastBlockNumberPromise = this.getBlockNumber().then(function(blockNumber) {\n              if (_this._fastBlockNumber == null || blockNumber > _this._fastBlockNumber) {\n                _this._fastBlockNumber = blockNumber;\n              }\n              return _this._fastBlockNumber;\n            });\n          }\n          return this._fastBlockNumberPromise;\n        };\n        BaseProvider2.prototype._setFastBlockNumber = function(blockNumber) {\n          if (this._fastBlockNumber != null && blockNumber < this._fastBlockNumber) {\n            return;\n          }\n          this._fastQueryDate = getTime();\n          if (this._fastBlockNumber == null || blockNumber > this._fastBlockNumber) {\n            this._fastBlockNumber = blockNumber;\n            this._fastBlockNumberPromise = Promise.resolve(blockNumber);\n          }\n        };\n        BaseProvider2.prototype.waitForTransaction = function(transactionHash, confirmations, timeout) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this._waitForTransaction(transactionHash, confirmations == null ? 1 : confirmations, timeout || 0, null)];\n            });\n          });\n        };\n        BaseProvider2.prototype._waitForTransaction = function(transactionHash, confirmations, timeout, replaceable) {\n          return __awaiter(this, void 0, void 0, function() {\n            var receipt;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getTransactionReceipt(transactionHash)];\n                case 1:\n                  receipt = _a.sent();\n                  if ((receipt ? receipt.confirmations : 0) >= confirmations) {\n                    return [2, receipt];\n                  }\n                  return [2, new Promise(function(resolve, reject) {\n                    var cancelFuncs = [];\n                    var done = false;\n                    var alreadyDone = function() {\n                      if (done) {\n                        return true;\n                      }\n                      done = true;\n                      cancelFuncs.forEach(function(func) {\n                        func();\n                      });\n                      return false;\n                    };\n                    var minedHandler = function(receipt2) {\n                      if (receipt2.confirmations < confirmations) {\n                        return;\n                      }\n                      if (alreadyDone()) {\n                        return;\n                      }\n                      resolve(receipt2);\n                    };\n                    _this.on(transactionHash, minedHandler);\n                    cancelFuncs.push(function() {\n                      _this.removeListener(transactionHash, minedHandler);\n                    });\n                    if (replaceable) {\n                      var lastBlockNumber_1 = replaceable.startBlock;\n                      var scannedBlock_1 = null;\n                      var replaceHandler_1 = function(blockNumber) {\n                        return __awaiter(_this, void 0, void 0, function() {\n                          var _this2 = this;\n                          return __generator(this, function(_a2) {\n                            switch (_a2.label) {\n                              case 0:\n                                if (done) {\n                                  return [\n                                    2\n                                    /*return*/\n                                  ];\n                                }\n                                return [4, stall(1e3)];\n                              case 1:\n                                _a2.sent();\n                                this.getTransactionCount(replaceable.from).then(function(nonce) {\n                                  return __awaiter(_this2, void 0, void 0, function() {\n                                    var mined, block, ti, tx, receipt_1, reason;\n                                    return __generator(this, function(_a3) {\n                                      switch (_a3.label) {\n                                        case 0:\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (!(nonce <= replaceable.nonce)) return [3, 1];\n                                          lastBlockNumber_1 = blockNumber;\n                                          return [3, 9];\n                                        case 1:\n                                          return [4, this.getTransaction(transactionHash)];\n                                        case 2:\n                                          mined = _a3.sent();\n                                          if (mined && mined.blockNumber != null) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (scannedBlock_1 == null) {\n                                            scannedBlock_1 = lastBlockNumber_1 - 3;\n                                            if (scannedBlock_1 < replaceable.startBlock) {\n                                              scannedBlock_1 = replaceable.startBlock;\n                                            }\n                                          }\n                                          _a3.label = 3;\n                                        case 3:\n                                          if (!(scannedBlock_1 <= blockNumber)) return [3, 9];\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          return [4, this.getBlockWithTransactions(scannedBlock_1)];\n                                        case 4:\n                                          block = _a3.sent();\n                                          ti = 0;\n                                          _a3.label = 5;\n                                        case 5:\n                                          if (!(ti < block.transactions.length)) return [3, 8];\n                                          tx = block.transactions[ti];\n                                          if (tx.hash === transactionHash) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (!(tx.from === replaceable.from && tx.nonce === replaceable.nonce)) return [3, 7];\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          return [4, this.waitForTransaction(tx.hash, confirmations)];\n                                        case 6:\n                                          receipt_1 = _a3.sent();\n                                          if (alreadyDone()) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          reason = \"replaced\";\n                                          if (tx.data === replaceable.data && tx.to === replaceable.to && tx.value.eq(replaceable.value)) {\n                                            reason = \"repriced\";\n                                          } else if (tx.data === \"0x\" && tx.from === tx.to && tx.value.isZero()) {\n                                            reason = \"cancelled\";\n                                          }\n                                          reject(logger.makeError(\"transaction was replaced\", logger_1.Logger.errors.TRANSACTION_REPLACED, {\n                                            cancelled: reason === \"replaced\" || reason === \"cancelled\",\n                                            reason,\n                                            replacement: this._wrapTransaction(tx),\n                                            hash: transactionHash,\n                                            receipt: receipt_1\n                                          }));\n                                          return [\n                                            2\n                                            /*return*/\n                                          ];\n                                        case 7:\n                                          ti++;\n                                          return [3, 5];\n                                        case 8:\n                                          scannedBlock_1++;\n                                          return [3, 3];\n                                        case 9:\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          this.once(\"block\", replaceHandler_1);\n                                          return [\n                                            2\n                                            /*return*/\n                                          ];\n                                      }\n                                    });\n                                  });\n                                }, function(error) {\n                                  if (done) {\n                                    return;\n                                  }\n                                  _this2.once(\"block\", replaceHandler_1);\n                                });\n                                return [\n                                  2\n                                  /*return*/\n                                ];\n                            }\n                          });\n                        });\n                      };\n                      if (done) {\n                        return;\n                      }\n                      _this.once(\"block\", replaceHandler_1);\n                      cancelFuncs.push(function() {\n                        _this.removeListener(\"block\", replaceHandler_1);\n                      });\n                    }\n                    if (typeof timeout === \"number\" && timeout > 0) {\n                      var timer_1 = setTimeout(function() {\n                        if (alreadyDone()) {\n                          return;\n                        }\n                        reject(logger.makeError(\"timeout exceeded\", logger_1.Logger.errors.TIMEOUT, { timeout }));\n                      }, timeout);\n                      if (timer_1.unref) {\n                        timer_1.unref();\n                      }\n                      cancelFuncs.push(function() {\n                        clearTimeout(timer_1);\n                      });\n                    }\n                  })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBlockNumber = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this._getInternalBlockNumber(0)];\n            });\n          });\n        };\n        BaseProvider2.prototype.getGasPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var result2;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, this.perform(\"getGasPrice\", {})];\n                case 2:\n                  result2 = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result2)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getGasPrice\",\n                      result: result2,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBalance = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2, result2;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params2 = _a.sent();\n                  return [4, this.perform(\"getBalance\", params2)];\n                case 3:\n                  result2 = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result2)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getBalance\",\n                      params: params2,\n                      result: result2,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getTransactionCount = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2, result2;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params2 = _a.sent();\n                  return [4, this.perform(\"getTransactionCount\", params2)];\n                case 3:\n                  result2 = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result2).toNumber()];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getTransactionCount\",\n                      params: params2,\n                      result: result2,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getCode = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2, result2;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params2 = _a.sent();\n                  return [4, this.perform(\"getCode\", params2)];\n                case 3:\n                  result2 = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result2)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getCode\",\n                      params: params2,\n                      result: result2,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getStorageAt = function(addressOrName, position, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2, result2;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag),\n                    position: Promise.resolve(position).then(function(p) {\n                      return (0, bytes_1.hexValue)(p);\n                    })\n                  })];\n                case 2:\n                  params2 = _a.sent();\n                  return [4, this.perform(\"getStorageAt\", params2)];\n                case 3:\n                  result2 = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result2)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getStorageAt\",\n                      params: params2,\n                      result: result2,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._wrapTransaction = function(tx, hash, startBlock) {\n          var _this = this;\n          if (hash != null && (0, bytes_1.hexDataLength)(hash) !== 32) {\n            throw new Error(\"invalid response - sendTransaction\");\n          }\n          var result2 = tx;\n          if (hash != null && tx.hash !== hash) {\n            logger.throwError(\"Transaction hash mismatch from Provider.sendTransaction.\", logger_1.Logger.errors.UNKNOWN_ERROR, { expectedHash: tx.hash, returnedHash: hash });\n          }\n          result2.wait = function(confirms, timeout) {\n            return __awaiter(_this, void 0, void 0, function() {\n              var replacement, receipt;\n              return __generator(this, function(_a) {\n                switch (_a.label) {\n                  case 0:\n                    if (confirms == null) {\n                      confirms = 1;\n                    }\n                    if (timeout == null) {\n                      timeout = 0;\n                    }\n                    replacement = void 0;\n                    if (confirms !== 0 && startBlock != null) {\n                      replacement = {\n                        data: tx.data,\n                        from: tx.from,\n                        nonce: tx.nonce,\n                        to: tx.to,\n                        value: tx.value,\n                        startBlock\n                      };\n                    }\n                    return [4, this._waitForTransaction(tx.hash, confirms, timeout, replacement)];\n                  case 1:\n                    receipt = _a.sent();\n                    if (receipt == null && confirms === 0) {\n                      return [2, null];\n                    }\n                    this._emitted[\"t:\" + tx.hash] = receipt.blockNumber;\n                    if (receipt.status === 0) {\n                      logger.throwError(\"transaction failed\", logger_1.Logger.errors.CALL_EXCEPTION, {\n                        transactionHash: tx.hash,\n                        transaction: tx,\n                        receipt\n                      });\n                    }\n                    return [2, receipt];\n                }\n              });\n            });\n          };\n          return result2;\n        };\n        BaseProvider2.prototype.sendTransaction = function(signedTransaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var hexTx, tx, blockNumber, hash, error_7;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, Promise.resolve(signedTransaction).then(function(t) {\n                    return (0, bytes_1.hexlify)(t);\n                  })];\n                case 2:\n                  hexTx = _a.sent();\n                  tx = this.formatter.transaction(signedTransaction);\n                  if (tx.confirmations == null) {\n                    tx.confirmations = 0;\n                  }\n                  return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                case 3:\n                  blockNumber = _a.sent();\n                  _a.label = 4;\n                case 4:\n                  _a.trys.push([4, 6, , 7]);\n                  return [4, this.perform(\"sendTransaction\", { signedTransaction: hexTx })];\n                case 5:\n                  hash = _a.sent();\n                  return [2, this._wrapTransaction(tx, hash, blockNumber)];\n                case 6:\n                  error_7 = _a.sent();\n                  error_7.transaction = tx;\n                  error_7.transactionHash = tx.hash;\n                  throw error_7;\n                case 7:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getTransactionRequest = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var values, tx, _a, _b;\n            var _this = this;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, transaction];\n                case 1:\n                  values = _c.sent();\n                  tx = {};\n                  [\"from\", \"to\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? _this._getAddress(v) : null;\n                    });\n                  });\n                  [\"gasLimit\", \"gasPrice\", \"maxFeePerGas\", \"maxPriorityFeePerGas\", \"value\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? bignumber_1.BigNumber.from(v) : null;\n                    });\n                  });\n                  [\"type\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v != null ? v : null;\n                    });\n                  });\n                  if (values.accessList) {\n                    tx.accessList = this.formatter.accessList(values.accessList);\n                  }\n                  [\"data\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? (0, bytes_1.hexlify)(v) : null;\n                    });\n                  });\n                  _b = (_a = this.formatter).transactionRequest;\n                  return [4, (0, properties_1.resolveProperties)(tx)];\n                case 2:\n                  return [2, _b.apply(_a, [_c.sent()])];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getFilter = function(filter) {\n          return __awaiter(this, void 0, void 0, function() {\n            var result2, _a, _b;\n            var _this = this;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, filter];\n                case 1:\n                  filter = _c.sent();\n                  result2 = {};\n                  if (filter.address != null) {\n                    result2.address = this._getAddress(filter.address);\n                  }\n                  [\"blockHash\", \"topics\"].forEach(function(key) {\n                    if (filter[key] == null) {\n                      return;\n                    }\n                    result2[key] = filter[key];\n                  });\n                  [\"fromBlock\", \"toBlock\"].forEach(function(key) {\n                    if (filter[key] == null) {\n                      return;\n                    }\n                    result2[key] = _this._getBlockTag(filter[key]);\n                  });\n                  _b = (_a = this.formatter).filter;\n                  return [4, (0, properties_1.resolveProperties)(result2)];\n                case 2:\n                  return [2, _b.apply(_a, [_c.sent()])];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.call = function(transaction, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2, result2;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    transaction: this._getTransactionRequest(transaction),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params2 = _a.sent();\n                  return [4, this.perform(\"call\", params2)];\n                case 3:\n                  result2 = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result2)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"call\",\n                      params: params2,\n                      result: result2,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.estimateGas = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2, result2;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    transaction: this._getTransactionRequest(transaction)\n                  })];\n                case 2:\n                  params2 = _a.sent();\n                  return [4, this.perform(\"estimateGas\", params2)];\n                case 3:\n                  result2 = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result2)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"estimateGas\",\n                      params: params2,\n                      result: result2,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getAddress = function(addressOrName) {\n          return __awaiter(this, void 0, void 0, function() {\n            var address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, addressOrName];\n                case 1:\n                  addressOrName = _a.sent();\n                  if (typeof addressOrName !== \"string\") {\n                    logger.throwArgumentError(\"invalid address or ENS name\", \"name\", addressOrName);\n                  }\n                  return [4, this.resolveName(addressOrName)];\n                case 2:\n                  address = _a.sent();\n                  if (address == null) {\n                    logger.throwError(\"ENS name not configured\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                      operation: \"resolveName(\" + JSON.stringify(addressOrName) + \")\"\n                    });\n                  }\n                  return [2, address];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getBlock = function(blockHashOrBlockTag, includeTransactions) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber, params2, _a, error_8;\n            var _this = this;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _b.sent();\n                  return [4, blockHashOrBlockTag];\n                case 2:\n                  blockHashOrBlockTag = _b.sent();\n                  blockNumber = -128;\n                  params2 = {\n                    includeTransactions: !!includeTransactions\n                  };\n                  if (!(0, bytes_1.isHexString)(blockHashOrBlockTag, 32)) return [3, 3];\n                  params2.blockHash = blockHashOrBlockTag;\n                  return [3, 6];\n                case 3:\n                  _b.trys.push([3, 5, , 6]);\n                  _a = params2;\n                  return [4, this._getBlockTag(blockHashOrBlockTag)];\n                case 4:\n                  _a.blockTag = _b.sent();\n                  if ((0, bytes_1.isHexString)(params2.blockTag)) {\n                    blockNumber = parseInt(params2.blockTag.substring(2), 16);\n                  }\n                  return [3, 6];\n                case 5:\n                  error_8 = _b.sent();\n                  logger.throwArgumentError(\"invalid block hash or block tag\", \"blockHashOrBlockTag\", blockHashOrBlockTag);\n                  return [3, 6];\n                case 6:\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var block, blockNumber_1, i, tx, confirmations, blockWithTxs;\n                      var _this2 = this;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getBlock\", params2)];\n                          case 1:\n                            block = _a2.sent();\n                            if (block == null) {\n                              if (params2.blockHash != null) {\n                                if (this._emitted[\"b:\" + params2.blockHash] == null) {\n                                  return [2, null];\n                                }\n                              }\n                              if (params2.blockTag != null) {\n                                if (blockNumber > this._emitted.block) {\n                                  return [2, null];\n                                }\n                              }\n                              return [2, void 0];\n                            }\n                            if (!includeTransactions) return [3, 8];\n                            blockNumber_1 = null;\n                            i = 0;\n                            _a2.label = 2;\n                          case 2:\n                            if (!(i < block.transactions.length)) return [3, 7];\n                            tx = block.transactions[i];\n                            if (!(tx.blockNumber == null)) return [3, 3];\n                            tx.confirmations = 0;\n                            return [3, 6];\n                          case 3:\n                            if (!(tx.confirmations == null)) return [3, 6];\n                            if (!(blockNumber_1 == null)) return [3, 5];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 4:\n                            blockNumber_1 = _a2.sent();\n                            _a2.label = 5;\n                          case 5:\n                            confirmations = blockNumber_1 - tx.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            tx.confirmations = confirmations;\n                            _a2.label = 6;\n                          case 6:\n                            i++;\n                            return [3, 2];\n                          case 7:\n                            blockWithTxs = this.formatter.blockWithTransactions(block);\n                            blockWithTxs.transactions = blockWithTxs.transactions.map(function(tx2) {\n                              return _this2._wrapTransaction(tx2);\n                            });\n                            return [2, blockWithTxs];\n                          case 8:\n                            return [2, this.formatter.block(block)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBlock = function(blockHashOrBlockTag) {\n          return this._getBlock(blockHashOrBlockTag, false);\n        };\n        BaseProvider2.prototype.getBlockWithTransactions = function(blockHashOrBlockTag) {\n          return this._getBlock(blockHashOrBlockTag, true);\n        };\n        BaseProvider2.prototype.getTransaction = function(transactionHash) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, transactionHash];\n                case 2:\n                  transactionHash = _a.sent();\n                  params2 = { transactionHash: this.formatter.hash(transactionHash, true) };\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var result2, tx, blockNumber, confirmations;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getTransaction\", params2)];\n                          case 1:\n                            result2 = _a2.sent();\n                            if (result2 == null) {\n                              if (this._emitted[\"t:\" + transactionHash] == null) {\n                                return [2, null];\n                              }\n                              return [2, void 0];\n                            }\n                            tx = this.formatter.transactionResponse(result2);\n                            if (!(tx.blockNumber == null)) return [3, 2];\n                            tx.confirmations = 0;\n                            return [3, 4];\n                          case 2:\n                            if (!(tx.confirmations == null)) return [3, 4];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 3:\n                            blockNumber = _a2.sent();\n                            confirmations = blockNumber - tx.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            tx.confirmations = confirmations;\n                            _a2.label = 4;\n                          case 4:\n                            return [2, this._wrapTransaction(tx)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getTransactionReceipt = function(transactionHash) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, transactionHash];\n                case 2:\n                  transactionHash = _a.sent();\n                  params2 = { transactionHash: this.formatter.hash(transactionHash, true) };\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var result2, receipt, blockNumber, confirmations;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getTransactionReceipt\", params2)];\n                          case 1:\n                            result2 = _a2.sent();\n                            if (result2 == null) {\n                              if (this._emitted[\"t:\" + transactionHash] == null) {\n                                return [2, null];\n                              }\n                              return [2, void 0];\n                            }\n                            if (result2.blockHash == null) {\n                              return [2, void 0];\n                            }\n                            receipt = this.formatter.receipt(result2);\n                            if (!(receipt.blockNumber == null)) return [3, 2];\n                            receipt.confirmations = 0;\n                            return [3, 4];\n                          case 2:\n                            if (!(receipt.confirmations == null)) return [3, 4];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 3:\n                            blockNumber = _a2.sent();\n                            confirmations = blockNumber - receipt.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            receipt.confirmations = confirmations;\n                            _a2.label = 4;\n                          case 4:\n                            return [2, receipt];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getLogs = function(filter) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2, logs;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({ filter: this._getFilter(filter) })];\n                case 2:\n                  params2 = _a.sent();\n                  return [4, this.perform(\"getLogs\", params2)];\n                case 3:\n                  logs = _a.sent();\n                  logs.forEach(function(log) {\n                    if (log.removed == null) {\n                      log.removed = false;\n                    }\n                  });\n                  return [2, formatter_1.Formatter.arrayOf(this.formatter.filterLog.bind(this.formatter))(logs)];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getEtherPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [2, this.perform(\"getEtherPrice\", {})];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getBlockTag = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, blockTag];\n                case 1:\n                  blockTag = _a.sent();\n                  if (!(typeof blockTag === \"number\" && blockTag < 0)) return [3, 3];\n                  if (blockTag % 1) {\n                    logger.throwArgumentError(\"invalid BlockTag\", \"blockTag\", blockTag);\n                  }\n                  return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                case 2:\n                  blockNumber = _a.sent();\n                  blockNumber += blockTag;\n                  if (blockNumber < 0) {\n                    blockNumber = 0;\n                  }\n                  return [2, this.formatter.blockTag(blockNumber)];\n                case 3:\n                  return [2, this.formatter.blockTag(blockTag)];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getResolver = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var address, error_9;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  _a.trys.push([0, 2, , 3]);\n                  return [4, this._getResolver(name2)];\n                case 1:\n                  address = _a.sent();\n                  if (address == null) {\n                    return [2, null];\n                  }\n                  return [2, new Resolver(this, address, name2)];\n                case 2:\n                  error_9 = _a.sent();\n                  if (error_9.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  return [2, null];\n                case 3:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getResolver = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, transaction, _a, _b, error_10;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  network = _c.sent();\n                  if (!network.ensAddress) {\n                    logger.throwError(\"network does not support ENS\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"ENS\", network: network.name });\n                  }\n                  transaction = {\n                    to: network.ensAddress,\n                    data: \"0x0178b8bf\" + (0, hash_1.namehash)(name2).substring(2)\n                  };\n                  _c.label = 2;\n                case 2:\n                  _c.trys.push([2, 4, , 5]);\n                  _b = (_a = this.formatter).callAddress;\n                  return [4, this.call(transaction)];\n                case 3:\n                  return [2, _b.apply(_a, [_c.sent()])];\n                case 4:\n                  error_10 = _c.sent();\n                  if (error_10.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  throw error_10;\n                case 5:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.resolveName = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var resolver;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, name2];\n                case 1:\n                  name2 = _a.sent();\n                  try {\n                    return [2, Promise.resolve(this.formatter.address(name2))];\n                  } catch (error) {\n                    if ((0, bytes_1.isHexString)(name2)) {\n                      throw error;\n                    }\n                  }\n                  if (typeof name2 !== \"string\") {\n                    logger.throwArgumentError(\"invalid ENS name\", \"name\", name2);\n                  }\n                  return [4, this.getResolver(name2)];\n                case 2:\n                  resolver = _a.sent();\n                  if (!resolver) {\n                    return [2, null];\n                  }\n                  return [4, resolver.getAddress()];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.lookupAddress = function(address) {\n          return __awaiter(this, void 0, void 0, function() {\n            var reverseName, resolverAddress, bytes, _a, length, name2, addr;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, address];\n                case 1:\n                  address = _b.sent();\n                  address = this.formatter.address(address);\n                  reverseName = address.substring(2).toLowerCase() + \".addr.reverse\";\n                  return [4, this._getResolver(reverseName)];\n                case 2:\n                  resolverAddress = _b.sent();\n                  if (!resolverAddress) {\n                    return [2, null];\n                  }\n                  _a = bytes_1.arrayify;\n                  return [4, this.call({\n                    to: resolverAddress,\n                    data: \"0x691f3431\" + (0, hash_1.namehash)(reverseName).substring(2)\n                  })];\n                case 3:\n                  bytes = _a.apply(void 0, [_b.sent()]);\n                  if (bytes.length < 32 || !bignumber_1.BigNumber.from(bytes.slice(0, 32)).eq(32)) {\n                    return [2, null];\n                  }\n                  bytes = bytes.slice(32);\n                  if (bytes.length < 32) {\n                    return [2, null];\n                  }\n                  length = bignumber_1.BigNumber.from(bytes.slice(0, 32)).toNumber();\n                  bytes = bytes.slice(32);\n                  if (length > bytes.length) {\n                    return [2, null];\n                  }\n                  name2 = (0, strings_1.toUtf8String)(bytes.slice(0, length));\n                  return [4, this.resolveName(name2)];\n                case 4:\n                  addr = _b.sent();\n                  if (addr != address) {\n                    return [2, null];\n                  }\n                  return [2, name2];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getAvatar = function(nameOrAddress) {\n          return __awaiter(this, void 0, void 0, function() {\n            var resolver, address, reverseName, resolverAddress, avatar;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  resolver = null;\n                  if (!(0, bytes_1.isHexString)(nameOrAddress)) return [3, 2];\n                  address = this.formatter.address(nameOrAddress);\n                  reverseName = address.substring(2).toLowerCase() + \".addr.reverse\";\n                  return [4, this._getResolver(reverseName)];\n                case 1:\n                  resolverAddress = _a.sent();\n                  if (!resolverAddress) {\n                    return [2, null];\n                  }\n                  resolver = new Resolver(this, resolverAddress, \"_\", address);\n                  return [3, 4];\n                case 2:\n                  return [4, this.getResolver(nameOrAddress)];\n                case 3:\n                  resolver = _a.sent();\n                  if (!resolver) {\n                    return [2, null];\n                  }\n                  _a.label = 4;\n                case 4:\n                  return [4, resolver.getAvatar()];\n                case 5:\n                  avatar = _a.sent();\n                  if (avatar == null) {\n                    return [2, null];\n                  }\n                  return [2, avatar.url];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.perform = function(method, params2) {\n          return logger.throwError(method + \" not implemented\", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method });\n        };\n        BaseProvider2.prototype._startEvent = function(event) {\n          this.polling = this._events.filter(function(e) {\n            return e.pollable();\n          }).length > 0;\n        };\n        BaseProvider2.prototype._stopEvent = function(event) {\n          this.polling = this._events.filter(function(e) {\n            return e.pollable();\n          }).length > 0;\n        };\n        BaseProvider2.prototype._addEventListener = function(eventName, listener, once) {\n          var event = new Event(getEventTag(eventName), listener, once);\n          this._events.push(event);\n          this._startEvent(event);\n          return this;\n        };\n        BaseProvider2.prototype.on = function(eventName, listener) {\n          return this._addEventListener(eventName, listener, false);\n        };\n        BaseProvider2.prototype.once = function(eventName, listener) {\n          return this._addEventListener(eventName, listener, true);\n        };\n        BaseProvider2.prototype.emit = function(eventName) {\n          var _this = this;\n          var args = [];\n          for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n          }\n          var result2 = false;\n          var stopped = [];\n          var eventTag = getEventTag(eventName);\n          this._events = this._events.filter(function(event) {\n            if (event.tag !== eventTag) {\n              return true;\n            }\n            setTimeout(function() {\n              event.listener.apply(_this, args);\n            }, 0);\n            result2 = true;\n            if (event.once) {\n              stopped.push(event);\n              return false;\n            }\n            return true;\n          });\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return result2;\n        };\n        BaseProvider2.prototype.listenerCount = function(eventName) {\n          if (!eventName) {\n            return this._events.length;\n          }\n          var eventTag = getEventTag(eventName);\n          return this._events.filter(function(event) {\n            return event.tag === eventTag;\n          }).length;\n        };\n        BaseProvider2.prototype.listeners = function(eventName) {\n          if (eventName == null) {\n            return this._events.map(function(event) {\n              return event.listener;\n            });\n          }\n          var eventTag = getEventTag(eventName);\n          return this._events.filter(function(event) {\n            return event.tag === eventTag;\n          }).map(function(event) {\n            return event.listener;\n          });\n        };\n        BaseProvider2.prototype.off = function(eventName, listener) {\n          var _this = this;\n          if (listener == null) {\n            return this.removeAllListeners(eventName);\n          }\n          var stopped = [];\n          var found = false;\n          var eventTag = getEventTag(eventName);\n          this._events = this._events.filter(function(event) {\n            if (event.tag !== eventTag || event.listener != listener) {\n              return true;\n            }\n            if (found) {\n              return true;\n            }\n            found = true;\n            stopped.push(event);\n            return false;\n          });\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return this;\n        };\n        BaseProvider2.prototype.removeAllListeners = function(eventName) {\n          var _this = this;\n          var stopped = [];\n          if (eventName == null) {\n            stopped = this._events;\n            this._events = [];\n          } else {\n            var eventTag_1 = getEventTag(eventName);\n            this._events = this._events.filter(function(event) {\n              if (event.tag !== eventTag_1) {\n                return true;\n              }\n              stopped.push(event);\n              return false;\n            });\n          }\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return this;\n        };\n        return BaseProvider2;\n      }(abstract_provider_1.Provider)\n    );\n    exports2.BaseProvider = BaseProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/json-rpc-provider.js\nvar require_json_rpc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/json-rpc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.JsonRpcProvider = exports2.JsonRpcSigner = void 0;\n    var abstract_signer_1 = require_lib13();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var properties_1 = require_lib4();\n    var strings_1 = require_lib9();\n    var transactions_1 = require_lib15();\n    var web_1 = require_lib27();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var base_provider_1 = require_base_provider();\n    var errorGas = [\"call\", \"estimateGas\"];\n    function checkError(method, error, params2) {\n      if (method === \"call\" && error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        var e = error.error;\n        if (e && e.message.match(\"reverted\") && (0, bytes_1.isHexString)(e.data)) {\n          return e.data;\n        }\n        logger.throwError(\"missing revert data in call exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n          error,\n          data: \"0x\"\n        });\n      }\n      var message = error.message;\n      if (error.code === logger_1.Logger.errors.SERVER_ERROR && error.error && typeof error.error.message === \"string\") {\n        message = error.error.message;\n      } else if (typeof error.body === \"string\") {\n        message = error.body;\n      } else if (typeof error.responseText === \"string\") {\n        message = error.responseText;\n      }\n      message = (message || \"\").toLowerCase();\n      var transaction = params2.transaction || params2.signedTransaction;\n      if (message.match(/insufficient funds|base fee exceeds gas limit/)) {\n        logger.throwError(\"insufficient funds for intrinsic transaction cost\", logger_1.Logger.errors.INSUFFICIENT_FUNDS, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/nonce too low/)) {\n        logger.throwError(\"nonce has already been used\", logger_1.Logger.errors.NONCE_EXPIRED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/replacement transaction underpriced/)) {\n        logger.throwError(\"replacement fee too low\", logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/only replay-protected/)) {\n        logger.throwError(\"legacy pre-eip-155 transactions not supported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (errorGas.indexOf(method) >= 0 && message.match(/gas required exceeds allowance|always failing transaction|execution reverted/)) {\n        logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n          error,\n          method,\n          transaction\n        });\n      }\n      throw error;\n    }\n    function timer(timeout) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, timeout);\n      });\n    }\n    function getResult(payload) {\n      if (payload.error) {\n        var error = new Error(payload.error.message);\n        error.code = payload.error.code;\n        error.data = payload.error.data;\n        throw error;\n      }\n      return payload.result;\n    }\n    function getLowerCase(value) {\n      if (value) {\n        return value.toLowerCase();\n      }\n      return value;\n    }\n    var _constructorGuard = {};\n    var JsonRpcSigner = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcSigner2, _super);\n        function JsonRpcSigner2(constructorGuard, provider, addressOrIndex) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, JsonRpcSigner2);\n          _this = _super.call(this) || this;\n          if (constructorGuard !== _constructorGuard) {\n            throw new Error(\"do not call the JsonRpcSigner constructor directly; use provider.getSigner\");\n          }\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider);\n          if (addressOrIndex == null) {\n            addressOrIndex = 0;\n          }\n          if (typeof addressOrIndex === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"_address\", _this.provider.formatter.address(addressOrIndex));\n            (0, properties_1.defineReadOnly)(_this, \"_index\", null);\n          } else if (typeof addressOrIndex === \"number\") {\n            (0, properties_1.defineReadOnly)(_this, \"_index\", addressOrIndex);\n            (0, properties_1.defineReadOnly)(_this, \"_address\", null);\n          } else {\n            logger.throwArgumentError(\"invalid address or index\", \"addressOrIndex\", addressOrIndex);\n          }\n          return _this;\n        }\n        JsonRpcSigner2.prototype.connect = function(provider) {\n          return logger.throwError(\"cannot alter JSON-RPC Signer connection\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"connect\"\n          });\n        };\n        JsonRpcSigner2.prototype.connectUnchecked = function() {\n          return new UncheckedJsonRpcSigner(_constructorGuard, this.provider, this._address || this._index);\n        };\n        JsonRpcSigner2.prototype.getAddress = function() {\n          var _this = this;\n          if (this._address) {\n            return Promise.resolve(this._address);\n          }\n          return this.provider.send(\"eth_accounts\", []).then(function(accounts) {\n            if (accounts.length <= _this._index) {\n              logger.throwError(\"unknown account #\" + _this._index, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"getAddress\"\n              });\n            }\n            return _this.provider.formatter.address(accounts[_this._index]);\n          });\n        };\n        JsonRpcSigner2.prototype.sendUncheckedTransaction = function(transaction) {\n          var _this = this;\n          transaction = (0, properties_1.shallowCopy)(transaction);\n          var fromAddress = this.getAddress().then(function(address) {\n            if (address) {\n              address = address.toLowerCase();\n            }\n            return address;\n          });\n          if (transaction.gasLimit == null) {\n            var estimate = (0, properties_1.shallowCopy)(transaction);\n            estimate.from = fromAddress;\n            transaction.gasLimit = this.provider.estimateGas(estimate);\n          }\n          if (transaction.to != null) {\n            transaction.to = Promise.resolve(transaction.to).then(function(to) {\n              return __awaiter(_this, void 0, void 0, function() {\n                var address;\n                return __generator(this, function(_a) {\n                  switch (_a.label) {\n                    case 0:\n                      if (to == null) {\n                        return [2, null];\n                      }\n                      return [4, this.provider.resolveName(to)];\n                    case 1:\n                      address = _a.sent();\n                      if (address == null) {\n                        logger.throwArgumentError(\"provided ENS name resolves to null\", \"tx.to\", to);\n                      }\n                      return [2, address];\n                  }\n                });\n              });\n            });\n          }\n          return (0, properties_1.resolveProperties)({\n            tx: (0, properties_1.resolveProperties)(transaction),\n            sender: fromAddress\n          }).then(function(_a) {\n            var tx = _a.tx, sender = _a.sender;\n            if (tx.from != null) {\n              if (tx.from.toLowerCase() !== sender) {\n                logger.throwArgumentError(\"from address mismatch\", \"transaction\", transaction);\n              }\n            } else {\n              tx.from = sender;\n            }\n            var hexTx = _this.provider.constructor.hexlifyTransaction(tx, { from: true });\n            return _this.provider.send(\"eth_sendTransaction\", [hexTx]).then(function(hash) {\n              return hash;\n            }, function(error) {\n              return checkError(\"sendTransaction\", error, hexTx);\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.signTransaction = function(transaction) {\n          return logger.throwError(\"signing transactions is unsupported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"signTransaction\"\n          });\n        };\n        JsonRpcSigner2.prototype.sendTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber, hash, error_1;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.provider._getInternalBlockNumber(100 + 2 * this.provider.pollingInterval)];\n                case 1:\n                  blockNumber = _a.sent();\n                  return [4, this.sendUncheckedTransaction(transaction)];\n                case 2:\n                  hash = _a.sent();\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var tx;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.provider.getTransaction(hash)];\n                          case 1:\n                            tx = _a2.sent();\n                            if (tx === null) {\n                              return [2, void 0];\n                            }\n                            return [2, this.provider._wrapTransaction(tx, hash, blockNumber)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this.provider })];\n                case 4:\n                  return [2, _a.sent()];\n                case 5:\n                  error_1 = _a.sent();\n                  error_1.transactionHash = hash;\n                  throw error_1;\n                case 6:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.signMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            var data, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  data = typeof message === \"string\" ? (0, strings_1.toUtf8Bytes)(message) : message;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"personal_sign\", [(0, bytes_1.hexlify)(data), address.toLowerCase()])];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype._legacySignMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            var data, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  data = typeof message === \"string\" ? (0, strings_1.toUtf8Bytes)(message) : message;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"eth_sign\", [address.toLowerCase(), (0, bytes_1.hexlify)(data)])];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype._signTypedData = function(domain, types, value) {\n          return __awaiter(this, void 0, void 0, function() {\n            var populated, address;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, hash_1._TypedDataEncoder.resolveNames(domain, types, value, function(name2) {\n                    return _this.provider.resolveName(name2);\n                  })];\n                case 1:\n                  populated = _a.sent();\n                  return [4, this.getAddress()];\n                case 2:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"eth_signTypedData_v4\", [\n                    address.toLowerCase(),\n                    JSON.stringify(hash_1._TypedDataEncoder.getPayload(populated.domain, types, populated.value))\n                  ])];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.unlock = function(password) {\n          return __awaiter(this, void 0, void 0, function() {\n            var provider, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  provider = this.provider;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [2, provider.send(\"personal_unlockAccount\", [address.toLowerCase(), password, null])];\n              }\n            });\n          });\n        };\n        return JsonRpcSigner2;\n      }(abstract_signer_1.Signer)\n    );\n    exports2.JsonRpcSigner = JsonRpcSigner;\n    var UncheckedJsonRpcSigner = (\n      /** @class */\n      function(_super) {\n        __extends(UncheckedJsonRpcSigner2, _super);\n        function UncheckedJsonRpcSigner2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        UncheckedJsonRpcSigner2.prototype.sendTransaction = function(transaction) {\n          var _this = this;\n          return this.sendUncheckedTransaction(transaction).then(function(hash) {\n            return {\n              hash,\n              nonce: null,\n              gasLimit: null,\n              gasPrice: null,\n              data: null,\n              value: null,\n              chainId: null,\n              confirmations: 0,\n              from: null,\n              wait: function(confirmations) {\n                return _this.provider.waitForTransaction(hash, confirmations);\n              }\n            };\n          });\n        };\n        return UncheckedJsonRpcSigner2;\n      }(JsonRpcSigner)\n    );\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      value: true,\n      type: true,\n      accessList: true,\n      maxFeePerGas: true,\n      maxPriorityFeePerGas: true\n    };\n    var JsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcProvider2, _super);\n        function JsonRpcProvider2(url, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, JsonRpcProvider2);\n          var networkOrReady = network;\n          if (networkOrReady == null) {\n            networkOrReady = new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                _this.detectNetwork().then(function(network2) {\n                  resolve(network2);\n                }, function(error) {\n                  reject(error);\n                });\n              }, 0);\n            });\n          }\n          _this = _super.call(this, networkOrReady) || this;\n          if (!url) {\n            url = (0, properties_1.getStatic)(_this.constructor, \"defaultUrl\")();\n          }\n          if (typeof url === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"connection\", Object.freeze({\n              url\n            }));\n          } else {\n            (0, properties_1.defineReadOnly)(_this, \"connection\", Object.freeze((0, properties_1.shallowCopy)(url)));\n          }\n          _this._nextId = 42;\n          return _this;\n        }\n        Object.defineProperty(JsonRpcProvider2.prototype, \"_cache\", {\n          get: function() {\n            if (this._eventLoopCache == null) {\n              this._eventLoopCache = {};\n            }\n            return this._eventLoopCache;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        JsonRpcProvider2.defaultUrl = function() {\n          return \"http://localhost:8545\";\n        };\n        JsonRpcProvider2.prototype.detectNetwork = function() {\n          var _this = this;\n          if (!this._cache[\"detectNetwork\"]) {\n            this._cache[\"detectNetwork\"] = this._uncachedDetectNetwork();\n            setTimeout(function() {\n              _this._cache[\"detectNetwork\"] = null;\n            }, 0);\n          }\n          return this._cache[\"detectNetwork\"];\n        };\n        JsonRpcProvider2.prototype._uncachedDetectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var chainId, error_2, error_3, getNetwork;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, timer(0)];\n                case 1:\n                  _a.sent();\n                  chainId = null;\n                  _a.label = 2;\n                case 2:\n                  _a.trys.push([2, 4, , 9]);\n                  return [4, this.send(\"eth_chainId\", [])];\n                case 3:\n                  chainId = _a.sent();\n                  return [3, 9];\n                case 4:\n                  error_2 = _a.sent();\n                  _a.label = 5;\n                case 5:\n                  _a.trys.push([5, 7, , 8]);\n                  return [4, this.send(\"net_version\", [])];\n                case 6:\n                  chainId = _a.sent();\n                  return [3, 8];\n                case 7:\n                  error_3 = _a.sent();\n                  return [3, 8];\n                case 8:\n                  return [3, 9];\n                case 9:\n                  if (chainId != null) {\n                    getNetwork = (0, properties_1.getStatic)(this.constructor, \"getNetwork\");\n                    try {\n                      return [2, getNetwork(bignumber_1.BigNumber.from(chainId).toNumber())];\n                    } catch (error) {\n                      return [2, logger.throwError(\"could not detect network\", logger_1.Logger.errors.NETWORK_ERROR, {\n                        chainId,\n                        event: \"invalidNetwork\",\n                        serverError: error\n                      })];\n                    }\n                  }\n                  return [2, logger.throwError(\"could not detect network\", logger_1.Logger.errors.NETWORK_ERROR, {\n                    event: \"noNetwork\"\n                  })];\n              }\n            });\n          });\n        };\n        JsonRpcProvider2.prototype.getSigner = function(addressOrIndex) {\n          return new JsonRpcSigner(_constructorGuard, this, addressOrIndex);\n        };\n        JsonRpcProvider2.prototype.getUncheckedSigner = function(addressOrIndex) {\n          return this.getSigner(addressOrIndex).connectUnchecked();\n        };\n        JsonRpcProvider2.prototype.listAccounts = function() {\n          var _this = this;\n          return this.send(\"eth_accounts\", []).then(function(accounts) {\n            return accounts.map(function(a) {\n              return _this.formatter.address(a);\n            });\n          });\n        };\n        JsonRpcProvider2.prototype.send = function(method, params2) {\n          var _this = this;\n          var request = {\n            method,\n            params: params2,\n            id: this._nextId++,\n            jsonrpc: \"2.0\"\n          };\n          this.emit(\"debug\", {\n            action: \"request\",\n            request: (0, properties_1.deepCopy)(request),\n            provider: this\n          });\n          var cache = [\"eth_chainId\", \"eth_blockNumber\"].indexOf(method) >= 0;\n          if (cache && this._cache[method]) {\n            return this._cache[method];\n          }\n          var result2 = (0, web_1.fetchJson)(this.connection, JSON.stringify(request), getResult).then(function(result3) {\n            _this.emit(\"debug\", {\n              action: \"response\",\n              request,\n              response: result3,\n              provider: _this\n            });\n            return result3;\n          }, function(error) {\n            _this.emit(\"debug\", {\n              action: \"response\",\n              error,\n              request,\n              provider: _this\n            });\n            throw error;\n          });\n          if (cache) {\n            this._cache[method] = result2;\n            setTimeout(function() {\n              _this._cache[method] = null;\n            }, 0);\n          }\n          return result2;\n        };\n        JsonRpcProvider2.prototype.prepareRequest = function(method, params2) {\n          switch (method) {\n            case \"getBlockNumber\":\n              return [\"eth_blockNumber\", []];\n            case \"getGasPrice\":\n              return [\"eth_gasPrice\", []];\n            case \"getBalance\":\n              return [\"eth_getBalance\", [getLowerCase(params2.address), params2.blockTag]];\n            case \"getTransactionCount\":\n              return [\"eth_getTransactionCount\", [getLowerCase(params2.address), params2.blockTag]];\n            case \"getCode\":\n              return [\"eth_getCode\", [getLowerCase(params2.address), params2.blockTag]];\n            case \"getStorageAt\":\n              return [\"eth_getStorageAt\", [getLowerCase(params2.address), params2.position, params2.blockTag]];\n            case \"sendTransaction\":\n              return [\"eth_sendRawTransaction\", [params2.signedTransaction]];\n            case \"getBlock\":\n              if (params2.blockTag) {\n                return [\"eth_getBlockByNumber\", [params2.blockTag, !!params2.includeTransactions]];\n              } else if (params2.blockHash) {\n                return [\"eth_getBlockByHash\", [params2.blockHash, !!params2.includeTransactions]];\n              }\n              return null;\n            case \"getTransaction\":\n              return [\"eth_getTransactionByHash\", [params2.transactionHash]];\n            case \"getTransactionReceipt\":\n              return [\"eth_getTransactionReceipt\", [params2.transactionHash]];\n            case \"call\": {\n              var hexlifyTransaction = (0, properties_1.getStatic)(this.constructor, \"hexlifyTransaction\");\n              return [\"eth_call\", [hexlifyTransaction(params2.transaction, { from: true }), params2.blockTag]];\n            }\n            case \"estimateGas\": {\n              var hexlifyTransaction = (0, properties_1.getStatic)(this.constructor, \"hexlifyTransaction\");\n              return [\"eth_estimateGas\", [hexlifyTransaction(params2.transaction, { from: true })]];\n            }\n            case \"getLogs\":\n              if (params2.filter && params2.filter.address != null) {\n                params2.filter.address = getLowerCase(params2.filter.address);\n              }\n              return [\"eth_getLogs\", [params2.filter]];\n            default:\n              break;\n          }\n          return null;\n        };\n        JsonRpcProvider2.prototype.perform = function(method, params2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, feeData, args, error_4;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"call\" || method === \"estimateGas\")) return [3, 2];\n                  tx = params2.transaction;\n                  if (!(tx && tx.type != null && bignumber_1.BigNumber.from(tx.type).isZero())) return [3, 2];\n                  if (!(tx.maxFeePerGas == null && tx.maxPriorityFeePerGas == null)) return [3, 2];\n                  return [4, this.getFeeData()];\n                case 1:\n                  feeData = _a.sent();\n                  if (feeData.maxFeePerGas == null && feeData.maxPriorityFeePerGas == null) {\n                    params2 = (0, properties_1.shallowCopy)(params2);\n                    params2.transaction = (0, properties_1.shallowCopy)(tx);\n                    delete params2.transaction.type;\n                  }\n                  _a.label = 2;\n                case 2:\n                  args = this.prepareRequest(method, params2);\n                  if (args == null) {\n                    logger.throwError(method + \" not implemented\", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method });\n                  }\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, this.send(args[0], args[1])];\n                case 4:\n                  return [2, _a.sent()];\n                case 5:\n                  error_4 = _a.sent();\n                  return [2, checkError(method, error_4, params2)];\n                case 6:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        JsonRpcProvider2.prototype._startEvent = function(event) {\n          if (event.tag === \"pending\") {\n            this._startPending();\n          }\n          _super.prototype._startEvent.call(this, event);\n        };\n        JsonRpcProvider2.prototype._startPending = function() {\n          if (this._pendingFilter != null) {\n            return;\n          }\n          var self2 = this;\n          var pendingFilter = this.send(\"eth_newPendingTransactionFilter\", []);\n          this._pendingFilter = pendingFilter;\n          pendingFilter.then(function(filterId) {\n            function poll() {\n              self2.send(\"eth_getFilterChanges\", [filterId]).then(function(hashes) {\n                if (self2._pendingFilter != pendingFilter) {\n                  return null;\n                }\n                var seq = Promise.resolve();\n                hashes.forEach(function(hash) {\n                  self2._emitted[\"t:\" + hash.toLowerCase()] = \"pending\";\n                  seq = seq.then(function() {\n                    return self2.getTransaction(hash).then(function(tx) {\n                      self2.emit(\"pending\", tx);\n                      return null;\n                    });\n                  });\n                });\n                return seq.then(function() {\n                  return timer(1e3);\n                });\n              }).then(function() {\n                if (self2._pendingFilter != pendingFilter) {\n                  self2.send(\"eth_uninstallFilter\", [filterId]);\n                  return;\n                }\n                setTimeout(function() {\n                  poll();\n                }, 0);\n                return null;\n              }).catch(function(error) {\n              });\n            }\n            poll();\n            return filterId;\n          }).catch(function(error) {\n          });\n        };\n        JsonRpcProvider2.prototype._stopEvent = function(event) {\n          if (event.tag === \"pending\" && this.listenerCount(\"pending\") === 0) {\n            this._pendingFilter = null;\n          }\n          _super.prototype._stopEvent.call(this, event);\n        };\n        JsonRpcProvider2.hexlifyTransaction = function(transaction, allowExtra) {\n          var allowed = (0, properties_1.shallowCopy)(allowedTransactionKeys);\n          if (allowExtra) {\n            for (var key in allowExtra) {\n              if (allowExtra[key]) {\n                allowed[key] = true;\n              }\n            }\n          }\n          (0, properties_1.checkProperties)(transaction, allowed);\n          var result2 = {};\n          [\"gasLimit\", \"gasPrice\", \"type\", \"maxFeePerGas\", \"maxPriorityFeePerGas\", \"nonce\", \"value\"].forEach(function(key2) {\n            if (transaction[key2] == null) {\n              return;\n            }\n            var value = (0, bytes_1.hexValue)(transaction[key2]);\n            if (key2 === \"gasLimit\") {\n              key2 = \"gas\";\n            }\n            result2[key2] = value;\n          });\n          [\"from\", \"to\", \"data\"].forEach(function(key2) {\n            if (transaction[key2] == null) {\n              return;\n            }\n            result2[key2] = (0, bytes_1.hexlify)(transaction[key2]);\n          });\n          if (transaction.accessList) {\n            result2[\"accessList\"] = (0, transactions_1.accessListify)(transaction.accessList);\n          }\n          return result2;\n        };\n        return JsonRpcProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.JsonRpcProvider = JsonRpcProvider;\n  }\n});\n\n// node_modules/ws/lib/constants.js\nvar require_constants = __commonJS({\n  \"node_modules/ws/lib/constants.js\"(exports2, module2) {\n    \"use strict\";\n    module2.exports = {\n      BINARY_TYPES: [\"nodebuffer\", \"arraybuffer\", \"fragments\"],\n      GUID: \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\",\n      kStatusCode: Symbol(\"status-code\"),\n      kWebSocket: Symbol(\"websocket\"),\n      EMPTY_BUFFER: Buffer.alloc(0),\n      NOOP: () => {\n      }\n    };\n  }\n});\n\n// node_modules/ws/lib/buffer-util.js\nvar require_buffer_util = __commonJS({\n  \"node_modules/ws/lib/buffer-util.js\"(exports2, module2) {\n    \"use strict\";\n    var { EMPTY_BUFFER } = require_constants();\n    function concat(list, totalLength) {\n      if (list.length === 0) return EMPTY_BUFFER;\n      if (list.length === 1) return list[0];\n      const target = Buffer.allocUnsafe(totalLength);\n      let offset = 0;\n      for (let i = 0; i < list.length; i++) {\n        const buf = list[i];\n        target.set(buf, offset);\n        offset += buf.length;\n      }\n      if (offset < totalLength) return target.slice(0, offset);\n      return target;\n    }\n    function _mask(source, mask, output, offset, length) {\n      for (let i = 0; i < length; i++) {\n        output[offset + i] = source[i] ^ mask[i & 3];\n      }\n    }\n    function _unmask(buffer, mask) {\n      const length = buffer.length;\n      for (let i = 0; i < length; i++) {\n        buffer[i] ^= mask[i & 3];\n      }\n    }\n    function toArrayBuffer(buf) {\n      if (buf.byteLength === buf.buffer.byteLength) {\n        return buf.buffer;\n      }\n      return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n    }\n    function toBuffer(data) {\n      toBuffer.readOnly = true;\n      if (Buffer.isBuffer(data)) return data;\n      let buf;\n      if (data instanceof ArrayBuffer) {\n        buf = Buffer.from(data);\n      } else if (ArrayBuffer.isView(data)) {\n        buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n      } else {\n        buf = Buffer.from(data);\n        toBuffer.readOnly = false;\n      }\n      return buf;\n    }\n    try {\n      const bufferUtil = require(\"bufferutil\");\n      const bu = bufferUtil.BufferUtil || bufferUtil;\n      module2.exports = {\n        concat,\n        mask(source, mask, output, offset, length) {\n          if (length < 48) _mask(source, mask, output, offset, length);\n          else bu.mask(source, mask, output, offset, length);\n        },\n        toArrayBuffer,\n        toBuffer,\n        unmask(buffer, mask) {\n          if (buffer.length < 32) _unmask(buffer, mask);\n          else bu.unmask(buffer, mask);\n        }\n      };\n    } catch (e) {\n      module2.exports = {\n        concat,\n        mask: _mask,\n        toArrayBuffer,\n        toBuffer,\n        unmask: _unmask\n      };\n    }\n  }\n});\n\n// node_modules/ws/lib/limiter.js\nvar require_limiter = __commonJS({\n  \"node_modules/ws/lib/limiter.js\"(exports2, module2) {\n    \"use strict\";\n    var kDone = Symbol(\"kDone\");\n    var kRun = Symbol(\"kRun\");\n    var Limiter = class {\n      /**\n       * Creates a new `Limiter`.\n       *\n       * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n       *     to run concurrently\n       */\n      constructor(concurrency) {\n        this[kDone] = () => {\n          this.pending--;\n          this[kRun]();\n        };\n        this.concurrency = concurrency || Infinity;\n        this.jobs = [];\n        this.pending = 0;\n      }\n      /**\n       * Adds a job to the queue.\n       *\n       * @param {Function} job The job to run\n       * @public\n       */\n      add(job) {\n        this.jobs.push(job);\n        this[kRun]();\n      }\n      /**\n       * Removes a job from the queue and runs it if possible.\n       *\n       * @private\n       */\n      [kRun]() {\n        if (this.pending === this.concurrency) return;\n        if (this.jobs.length) {\n          const job = this.jobs.shift();\n          this.pending++;\n          job(this[kDone]);\n        }\n      }\n    };\n    module2.exports = Limiter;\n  }\n});\n\n// node_modules/ws/lib/permessage-deflate.js\nvar require_permessage_deflate = __commonJS({\n  \"node_modules/ws/lib/permessage-deflate.js\"(exports2, module2) {\n    \"use strict\";\n    var zlib = require(\"zlib\");\n    var bufferUtil = require_buffer_util();\n    var Limiter = require_limiter();\n    var { kStatusCode, NOOP } = require_constants();\n    var TRAILER = Buffer.from([0, 0, 255, 255]);\n    var kPerMessageDeflate = Symbol(\"permessage-deflate\");\n    var kTotalLength = Symbol(\"total-length\");\n    var kCallback = Symbol(\"callback\");\n    var kBuffers = Symbol(\"buffers\");\n    var kError = Symbol(\"error\");\n    var zlibLimiter;\n    var PerMessageDeflate = class {\n      /**\n       * Creates a PerMessageDeflate instance.\n       *\n       * @param {Object} [options] Configuration options\n       * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n       *     disabling of server context takeover\n       * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n       *     acknowledge disabling of client context takeover\n       * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n       *     use of a custom server window size\n       * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n       *     for, or request, a custom client window size\n       * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n       *     deflate\n       * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n       *     inflate\n       * @param {Number} [options.threshold=1024] Size (in bytes) below which\n       *     messages should not be compressed\n       * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n       *     calls to zlib\n       * @param {Boolean} [isServer=false] Create the instance in either server or\n       *     client mode\n       * @param {Number} [maxPayload=0] The maximum allowed message length\n       */\n      constructor(options, isServer, maxPayload) {\n        this._maxPayload = maxPayload | 0;\n        this._options = options || {};\n        this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024;\n        this._isServer = !!isServer;\n        this._deflate = null;\n        this._inflate = null;\n        this.params = null;\n        if (!zlibLimiter) {\n          const concurrency = this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10;\n          zlibLimiter = new Limiter(concurrency);\n        }\n      }\n      /**\n       * @type {String}\n       */\n      static get extensionName() {\n        return \"permessage-deflate\";\n      }\n      /**\n       * Create an extension negotiation offer.\n       *\n       * @return {Object} Extension parameters\n       * @public\n       */\n      offer() {\n        const params2 = {};\n        if (this._options.serverNoContextTakeover) {\n          params2.server_no_context_takeover = true;\n        }\n        if (this._options.clientNoContextTakeover) {\n          params2.client_no_context_takeover = true;\n        }\n        if (this._options.serverMaxWindowBits) {\n          params2.server_max_window_bits = this._options.serverMaxWindowBits;\n        }\n        if (this._options.clientMaxWindowBits) {\n          params2.client_max_window_bits = this._options.clientMaxWindowBits;\n        } else if (this._options.clientMaxWindowBits == null) {\n          params2.client_max_window_bits = true;\n        }\n        return params2;\n      }\n      /**\n       * Accept an extension negotiation offer/response.\n       *\n       * @param {Array} configurations The extension negotiation offers/reponse\n       * @return {Object} Accepted configuration\n       * @public\n       */\n      accept(configurations) {\n        configurations = this.normalizeParams(configurations);\n        this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations);\n        return this.params;\n      }\n      /**\n       * Releases all resources used by the extension.\n       *\n       * @public\n       */\n      cleanup() {\n        if (this._inflate) {\n          this._inflate.close();\n          this._inflate = null;\n        }\n        if (this._deflate) {\n          const callback = this._deflate[kCallback];\n          this._deflate.close();\n          this._deflate = null;\n          if (callback) {\n            callback(\n              new Error(\n                \"The deflate stream was closed while data was being processed\"\n              )\n            );\n          }\n        }\n      }\n      /**\n       *  Accept an extension negotiation offer.\n       *\n       * @param {Array} offers The extension negotiation offers\n       * @return {Object} Accepted configuration\n       * @private\n       */\n      acceptAsServer(offers) {\n        const opts = this._options;\n        const accepted = offers.find((params2) => {\n          if (opts.serverNoContextTakeover === false && params2.server_no_context_takeover || params2.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === \"number\" && opts.serverMaxWindowBits > params2.server_max_window_bits) || typeof opts.clientMaxWindowBits === \"number\" && !params2.client_max_window_bits) {\n            return false;\n          }\n          return true;\n        });\n        if (!accepted) {\n          throw new Error(\"None of the extension offers can be accepted\");\n        }\n        if (opts.serverNoContextTakeover) {\n          accepted.server_no_context_takeover = true;\n        }\n        if (opts.clientNoContextTakeover) {\n          accepted.client_no_context_takeover = true;\n        }\n        if (typeof opts.serverMaxWindowBits === \"number\") {\n          accepted.server_max_window_bits = opts.serverMaxWindowBits;\n        }\n        if (typeof opts.clientMaxWindowBits === \"number\") {\n          accepted.client_max_window_bits = opts.clientMaxWindowBits;\n        } else if (accepted.client_max_window_bits === true || opts.clientMaxWindowBits === false) {\n          delete accepted.client_max_window_bits;\n        }\n        return accepted;\n      }\n      /**\n       * Accept the extension negotiation response.\n       *\n       * @param {Array} response The extension negotiation response\n       * @return {Object} Accepted configuration\n       * @private\n       */\n      acceptAsClient(response) {\n        const params2 = response[0];\n        if (this._options.clientNoContextTakeover === false && params2.client_no_context_takeover) {\n          throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n        }\n        if (!params2.client_max_window_bits) {\n          if (typeof this._options.clientMaxWindowBits === \"number\") {\n            params2.client_max_window_bits = this._options.clientMaxWindowBits;\n          }\n        } else if (this._options.clientMaxWindowBits === false || typeof this._options.clientMaxWindowBits === \"number\" && params2.client_max_window_bits > this._options.clientMaxWindowBits) {\n          throw new Error(\n            'Unexpected or invalid parameter \"client_max_window_bits\"'\n          );\n        }\n        return params2;\n      }\n      /**\n       * Normalize parameters.\n       *\n       * @param {Array} configurations The extension negotiation offers/reponse\n       * @return {Array} The offers/response with normalized parameters\n       * @private\n       */\n      normalizeParams(configurations) {\n        configurations.forEach((params2) => {\n          Object.keys(params2).forEach((key) => {\n            let value = params2[key];\n            if (value.length > 1) {\n              throw new Error(`Parameter \"${key}\" must have only a single value`);\n            }\n            value = value[0];\n            if (key === \"client_max_window_bits\") {\n              if (value !== true) {\n                const num = +value;\n                if (!Number.isInteger(num) || num < 8 || num > 15) {\n                  throw new TypeError(\n                    `Invalid value for parameter \"${key}\": ${value}`\n                  );\n                }\n                value = num;\n              } else if (!this._isServer) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n            } else if (key === \"server_max_window_bits\") {\n              const num = +value;\n              if (!Number.isInteger(num) || num < 8 || num > 15) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n              value = num;\n            } else if (key === \"client_no_context_takeover\" || key === \"server_no_context_takeover\") {\n              if (value !== true) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n            } else {\n              throw new Error(`Unknown parameter \"${key}\"`);\n            }\n            params2[key] = value;\n          });\n        });\n        return configurations;\n      }\n      /**\n       * Decompress data. Concurrency limited.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @public\n       */\n      decompress(data, fin, callback) {\n        zlibLimiter.add((done) => {\n          this._decompress(data, fin, (err, result2) => {\n            done();\n            callback(err, result2);\n          });\n        });\n      }\n      /**\n       * Compress data. Concurrency limited.\n       *\n       * @param {Buffer} data Data to compress\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @public\n       */\n      compress(data, fin, callback) {\n        zlibLimiter.add((done) => {\n          this._compress(data, fin, (err, result2) => {\n            done();\n            callback(err, result2);\n          });\n        });\n      }\n      /**\n       * Decompress data.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @private\n       */\n      _decompress(data, fin, callback) {\n        const endpoint = this._isServer ? \"client\" : \"server\";\n        if (!this._inflate) {\n          const key = `${endpoint}_max_window_bits`;\n          const windowBits = typeof this.params[key] !== \"number\" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key];\n          this._inflate = zlib.createInflateRaw({\n            ...this._options.zlibInflateOptions,\n            windowBits\n          });\n          this._inflate[kPerMessageDeflate] = this;\n          this._inflate[kTotalLength] = 0;\n          this._inflate[kBuffers] = [];\n          this._inflate.on(\"error\", inflateOnError);\n          this._inflate.on(\"data\", inflateOnData);\n        }\n        this._inflate[kCallback] = callback;\n        this._inflate.write(data);\n        if (fin) this._inflate.write(TRAILER);\n        this._inflate.flush(() => {\n          const err = this._inflate[kError];\n          if (err) {\n            this._inflate.close();\n            this._inflate = null;\n            callback(err);\n            return;\n          }\n          const data2 = bufferUtil.concat(\n            this._inflate[kBuffers],\n            this._inflate[kTotalLength]\n          );\n          if (this._inflate._readableState.endEmitted) {\n            this._inflate.close();\n            this._inflate = null;\n          } else {\n            this._inflate[kTotalLength] = 0;\n            this._inflate[kBuffers] = [];\n            if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n              this._inflate.reset();\n            }\n          }\n          callback(null, data2);\n        });\n      }\n      /**\n       * Compress data.\n       *\n       * @param {Buffer} data Data to compress\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @private\n       */\n      _compress(data, fin, callback) {\n        const endpoint = this._isServer ? \"server\" : \"client\";\n        if (!this._deflate) {\n          const key = `${endpoint}_max_window_bits`;\n          const windowBits = typeof this.params[key] !== \"number\" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key];\n          this._deflate = zlib.createDeflateRaw({\n            ...this._options.zlibDeflateOptions,\n            windowBits\n          });\n          this._deflate[kTotalLength] = 0;\n          this._deflate[kBuffers] = [];\n          this._deflate.on(\"error\", NOOP);\n          this._deflate.on(\"data\", deflateOnData);\n        }\n        this._deflate[kCallback] = callback;\n        this._deflate.write(data);\n        this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n          if (!this._deflate) {\n            return;\n          }\n          let data2 = bufferUtil.concat(\n            this._deflate[kBuffers],\n            this._deflate[kTotalLength]\n          );\n          if (fin) data2 = data2.slice(0, data2.length - 4);\n          this._deflate[kCallback] = null;\n          this._deflate[kTotalLength] = 0;\n          this._deflate[kBuffers] = [];\n          if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n            this._deflate.reset();\n          }\n          callback(null, data2);\n        });\n      }\n    };\n    module2.exports = PerMessageDeflate;\n    function deflateOnData(chunk) {\n      this[kBuffers].push(chunk);\n      this[kTotalLength] += chunk.length;\n    }\n    function inflateOnData(chunk) {\n      this[kTotalLength] += chunk.length;\n      if (this[kPerMessageDeflate]._maxPayload < 1 || this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload) {\n        this[kBuffers].push(chunk);\n        return;\n      }\n      this[kError] = new RangeError(\"Max payload size exceeded\");\n      this[kError][kStatusCode] = 1009;\n      this.removeListener(\"data\", inflateOnData);\n      this.reset();\n    }\n    function inflateOnError(err) {\n      this[kPerMessageDeflate]._inflate = null;\n      err[kStatusCode] = 1007;\n      this[kCallback](err);\n    }\n  }\n});\n\n// node_modules/ws/lib/validation.js\nvar require_validation = __commonJS({\n  \"node_modules/ws/lib/validation.js\"(exports2, module2) {\n    \"use strict\";\n    function isValidStatusCode(code) {\n      return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999;\n    }\n    function _isValidUTF8(buf) {\n      const len = buf.length;\n      let i = 0;\n      while (i < len) {\n        if ((buf[i] & 128) === 0) {\n          i++;\n        } else if ((buf[i] & 224) === 192) {\n          if (i + 1 === len || (buf[i + 1] & 192) !== 128 || (buf[i] & 254) === 192) {\n            return false;\n          }\n          i += 2;\n        } else if ((buf[i] & 240) === 224) {\n          if (i + 2 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || buf[i] === 224 && (buf[i + 1] & 224) === 128 || // Overlong\n          buf[i] === 237 && (buf[i + 1] & 224) === 160) {\n            return false;\n          }\n          i += 3;\n        } else if ((buf[i] & 248) === 240) {\n          if (i + 3 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || (buf[i + 3] & 192) !== 128 || buf[i] === 240 && (buf[i + 1] & 240) === 128 || // Overlong\n          buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) {\n            return false;\n          }\n          i += 4;\n        } else {\n          return false;\n        }\n      }\n      return true;\n    }\n    try {\n      let isValidUTF8 = require(\"utf-8-validate\");\n      if (typeof isValidUTF8 === \"object\") {\n        isValidUTF8 = isValidUTF8.Validation.isValidUTF8;\n      }\n      module2.exports = {\n        isValidStatusCode,\n        isValidUTF8(buf) {\n          return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf);\n        }\n      };\n    } catch (e) {\n      module2.exports = {\n        isValidStatusCode,\n        isValidUTF8: _isValidUTF8\n      };\n    }\n  }\n});\n\n// node_modules/ws/lib/receiver.js\nvar require_receiver = __commonJS({\n  \"node_modules/ws/lib/receiver.js\"(exports2, module2) {\n    \"use strict\";\n    var { Writable } = require(\"stream\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var {\n      BINARY_TYPES,\n      EMPTY_BUFFER,\n      kStatusCode,\n      kWebSocket\n    } = require_constants();\n    var { concat, toArrayBuffer, unmask } = require_buffer_util();\n    var { isValidStatusCode, isValidUTF8 } = require_validation();\n    var GET_INFO = 0;\n    var GET_PAYLOAD_LENGTH_16 = 1;\n    var GET_PAYLOAD_LENGTH_64 = 2;\n    var GET_MASK = 3;\n    var GET_DATA = 4;\n    var INFLATING = 5;\n    var Receiver = class extends Writable {\n      /**\n       * Creates a Receiver instance.\n       *\n       * @param {String} [binaryType=nodebuffer] The type for binary data\n       * @param {Object} [extensions] An object containing the negotiated extensions\n       * @param {Boolean} [isServer=false] Specifies whether to operate in client or\n       *     server mode\n       * @param {Number} [maxPayload=0] The maximum allowed message length\n       */\n      constructor(binaryType, extensions, isServer, maxPayload) {\n        super();\n        this._binaryType = binaryType || BINARY_TYPES[0];\n        this[kWebSocket] = void 0;\n        this._extensions = extensions || {};\n        this._isServer = !!isServer;\n        this._maxPayload = maxPayload | 0;\n        this._bufferedBytes = 0;\n        this._buffers = [];\n        this._compressed = false;\n        this._payloadLength = 0;\n        this._mask = void 0;\n        this._fragmented = 0;\n        this._masked = false;\n        this._fin = false;\n        this._opcode = 0;\n        this._totalPayloadLength = 0;\n        this._messageLength = 0;\n        this._fragments = [];\n        this._state = GET_INFO;\n        this._loop = false;\n      }\n      /**\n       * Implements `Writable.prototype._write()`.\n       *\n       * @param {Buffer} chunk The chunk of data to write\n       * @param {String} encoding The character encoding of `chunk`\n       * @param {Function} cb Callback\n       * @private\n       */\n      _write(chunk, encoding, cb) {\n        if (this._opcode === 8 && this._state == GET_INFO) return cb();\n        this._bufferedBytes += chunk.length;\n        this._buffers.push(chunk);\n        this.startLoop(cb);\n      }\n      /**\n       * Consumes `n` bytes from the buffered data.\n       *\n       * @param {Number} n The number of bytes to consume\n       * @return {Buffer} The consumed bytes\n       * @private\n       */\n      consume(n) {\n        this._bufferedBytes -= n;\n        if (n === this._buffers[0].length) return this._buffers.shift();\n        if (n < this._buffers[0].length) {\n          const buf = this._buffers[0];\n          this._buffers[0] = buf.slice(n);\n          return buf.slice(0, n);\n        }\n        const dst = Buffer.allocUnsafe(n);\n        do {\n          const buf = this._buffers[0];\n          const offset = dst.length - n;\n          if (n >= buf.length) {\n            dst.set(this._buffers.shift(), offset);\n          } else {\n            dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n            this._buffers[0] = buf.slice(n);\n          }\n          n -= buf.length;\n        } while (n > 0);\n        return dst;\n      }\n      /**\n       * Starts the parsing loop.\n       *\n       * @param {Function} cb Callback\n       * @private\n       */\n      startLoop(cb) {\n        let err;\n        this._loop = true;\n        do {\n          switch (this._state) {\n            case GET_INFO:\n              err = this.getInfo();\n              break;\n            case GET_PAYLOAD_LENGTH_16:\n              err = this.getPayloadLength16();\n              break;\n            case GET_PAYLOAD_LENGTH_64:\n              err = this.getPayloadLength64();\n              break;\n            case GET_MASK:\n              this.getMask();\n              break;\n            case GET_DATA:\n              err = this.getData(cb);\n              break;\n            default:\n              this._loop = false;\n              return;\n          }\n        } while (this._loop);\n        cb(err);\n      }\n      /**\n       * Reads the first two bytes of a frame.\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getInfo() {\n        if (this._bufferedBytes < 2) {\n          this._loop = false;\n          return;\n        }\n        const buf = this.consume(2);\n        if ((buf[0] & 48) !== 0) {\n          this._loop = false;\n          return error(RangeError, \"RSV2 and RSV3 must be clear\", true, 1002);\n        }\n        const compressed = (buf[0] & 64) === 64;\n        if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n          this._loop = false;\n          return error(RangeError, \"RSV1 must be clear\", true, 1002);\n        }\n        this._fin = (buf[0] & 128) === 128;\n        this._opcode = buf[0] & 15;\n        this._payloadLength = buf[1] & 127;\n        if (this._opcode === 0) {\n          if (compressed) {\n            this._loop = false;\n            return error(RangeError, \"RSV1 must be clear\", true, 1002);\n          }\n          if (!this._fragmented) {\n            this._loop = false;\n            return error(RangeError, \"invalid opcode 0\", true, 1002);\n          }\n          this._opcode = this._fragmented;\n        } else if (this._opcode === 1 || this._opcode === 2) {\n          if (this._fragmented) {\n            this._loop = false;\n            return error(RangeError, `invalid opcode ${this._opcode}`, true, 1002);\n          }\n          this._compressed = compressed;\n        } else if (this._opcode > 7 && this._opcode < 11) {\n          if (!this._fin) {\n            this._loop = false;\n            return error(RangeError, \"FIN must be set\", true, 1002);\n          }\n          if (compressed) {\n            this._loop = false;\n            return error(RangeError, \"RSV1 must be clear\", true, 1002);\n          }\n          if (this._payloadLength > 125) {\n            this._loop = false;\n            return error(\n              RangeError,\n              `invalid payload length ${this._payloadLength}`,\n              true,\n              1002\n            );\n          }\n        } else {\n          this._loop = false;\n          return error(RangeError, `invalid opcode ${this._opcode}`, true, 1002);\n        }\n        if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n        this._masked = (buf[1] & 128) === 128;\n        if (this._isServer) {\n          if (!this._masked) {\n            this._loop = false;\n            return error(RangeError, \"MASK must be set\", true, 1002);\n          }\n        } else if (this._masked) {\n          this._loop = false;\n          return error(RangeError, \"MASK must be clear\", true, 1002);\n        }\n        if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n        else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n        else return this.haveLength();\n      }\n      /**\n       * Gets extended payload length (7+16).\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getPayloadLength16() {\n        if (this._bufferedBytes < 2) {\n          this._loop = false;\n          return;\n        }\n        this._payloadLength = this.consume(2).readUInt16BE(0);\n        return this.haveLength();\n      }\n      /**\n       * Gets extended payload length (7+64).\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getPayloadLength64() {\n        if (this._bufferedBytes < 8) {\n          this._loop = false;\n          return;\n        }\n        const buf = this.consume(8);\n        const num = buf.readUInt32BE(0);\n        if (num > Math.pow(2, 53 - 32) - 1) {\n          this._loop = false;\n          return error(\n            RangeError,\n            \"Unsupported WebSocket frame: payload length > 2^53 - 1\",\n            false,\n            1009\n          );\n        }\n        this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n        return this.haveLength();\n      }\n      /**\n       * Payload length has been read.\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      haveLength() {\n        if (this._payloadLength && this._opcode < 8) {\n          this._totalPayloadLength += this._payloadLength;\n          if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n            this._loop = false;\n            return error(RangeError, \"Max payload size exceeded\", false, 1009);\n          }\n        }\n        if (this._masked) this._state = GET_MASK;\n        else this._state = GET_DATA;\n      }\n      /**\n       * Reads mask bytes.\n       *\n       * @private\n       */\n      getMask() {\n        if (this._bufferedBytes < 4) {\n          this._loop = false;\n          return;\n        }\n        this._mask = this.consume(4);\n        this._state = GET_DATA;\n      }\n      /**\n       * Reads data bytes.\n       *\n       * @param {Function} cb Callback\n       * @return {(Error|RangeError|undefined)} A possible error\n       * @private\n       */\n      getData(cb) {\n        let data = EMPTY_BUFFER;\n        if (this._payloadLength) {\n          if (this._bufferedBytes < this._payloadLength) {\n            this._loop = false;\n            return;\n          }\n          data = this.consume(this._payloadLength);\n          if (this._masked) unmask(data, this._mask);\n        }\n        if (this._opcode > 7) return this.controlMessage(data);\n        if (this._compressed) {\n          this._state = INFLATING;\n          this.decompress(data, cb);\n          return;\n        }\n        if (data.length) {\n          this._messageLength = this._totalPayloadLength;\n          this._fragments.push(data);\n        }\n        return this.dataMessage();\n      }\n      /**\n       * Decompresses data.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Function} cb Callback\n       * @private\n       */\n      decompress(data, cb) {\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n          if (err) return cb(err);\n          if (buf.length) {\n            this._messageLength += buf.length;\n            if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n              return cb(\n                error(RangeError, \"Max payload size exceeded\", false, 1009)\n              );\n            }\n            this._fragments.push(buf);\n          }\n          const er = this.dataMessage();\n          if (er) return cb(er);\n          this.startLoop(cb);\n        });\n      }\n      /**\n       * Handles a data message.\n       *\n       * @return {(Error|undefined)} A possible error\n       * @private\n       */\n      dataMessage() {\n        if (this._fin) {\n          const messageLength = this._messageLength;\n          const fragments = this._fragments;\n          this._totalPayloadLength = 0;\n          this._messageLength = 0;\n          this._fragmented = 0;\n          this._fragments = [];\n          if (this._opcode === 2) {\n            let data;\n            if (this._binaryType === \"nodebuffer\") {\n              data = concat(fragments, messageLength);\n            } else if (this._binaryType === \"arraybuffer\") {\n              data = toArrayBuffer(concat(fragments, messageLength));\n            } else {\n              data = fragments;\n            }\n            this.emit(\"message\", data);\n          } else {\n            const buf = concat(fragments, messageLength);\n            if (!isValidUTF8(buf)) {\n              this._loop = false;\n              return error(Error, \"invalid UTF-8 sequence\", true, 1007);\n            }\n            this.emit(\"message\", buf.toString());\n          }\n        }\n        this._state = GET_INFO;\n      }\n      /**\n       * Handles a control message.\n       *\n       * @param {Buffer} data Data to handle\n       * @return {(Error|RangeError|undefined)} A possible error\n       * @private\n       */\n      controlMessage(data) {\n        if (this._opcode === 8) {\n          this._loop = false;\n          if (data.length === 0) {\n            this.emit(\"conclude\", 1005, \"\");\n            this.end();\n          } else if (data.length === 1) {\n            return error(RangeError, \"invalid payload length 1\", true, 1002);\n          } else {\n            const code = data.readUInt16BE(0);\n            if (!isValidStatusCode(code)) {\n              return error(RangeError, `invalid status code ${code}`, true, 1002);\n            }\n            const buf = data.slice(2);\n            if (!isValidUTF8(buf)) {\n              return error(Error, \"invalid UTF-8 sequence\", true, 1007);\n            }\n            this.emit(\"conclude\", code, buf.toString());\n            this.end();\n          }\n        } else if (this._opcode === 9) {\n          this.emit(\"ping\", data);\n        } else {\n          this.emit(\"pong\", data);\n        }\n        this._state = GET_INFO;\n      }\n    };\n    module2.exports = Receiver;\n    function error(ErrorCtor, message, prefix, statusCode) {\n      const err = new ErrorCtor(\n        prefix ? `Invalid WebSocket frame: ${message}` : message\n      );\n      Error.captureStackTrace(err, error);\n      err[kStatusCode] = statusCode;\n      return err;\n    }\n  }\n});\n\n// node_modules/ws/lib/sender.js\nvar require_sender = __commonJS({\n  \"node_modules/ws/lib/sender.js\"(exports2, module2) {\n    \"use strict\";\n    var { randomFillSync } = require(\"crypto\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var { EMPTY_BUFFER } = require_constants();\n    var { isValidStatusCode } = require_validation();\n    var { mask: applyMask, toBuffer } = require_buffer_util();\n    var mask = Buffer.alloc(4);\n    var Sender = class _Sender {\n      /**\n       * Creates a Sender instance.\n       *\n       * @param {net.Socket} socket The connection socket\n       * @param {Object} [extensions] An object containing the negotiated extensions\n       */\n      constructor(socket, extensions) {\n        this._extensions = extensions || {};\n        this._socket = socket;\n        this._firstFragment = true;\n        this._compress = false;\n        this._bufferedBytes = 0;\n        this._deflating = false;\n        this._queue = [];\n      }\n      /**\n       * Frames a piece of data according to the HyBi WebSocket protocol.\n       *\n       * @param {Buffer} data The data to frame\n       * @param {Object} options Options object\n       * @param {Number} options.opcode The opcode\n       * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n       *     modified\n       * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n       *     FIN bit\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n       *     RSV1 bit\n       * @return {Buffer[]} The framed data as a list of `Buffer` instances\n       * @public\n       */\n      static frame(data, options) {\n        const merge = options.mask && options.readOnly;\n        let offset = options.mask ? 6 : 2;\n        let payloadLength = data.length;\n        if (data.length >= 65536) {\n          offset += 8;\n          payloadLength = 127;\n        } else if (data.length > 125) {\n          offset += 2;\n          payloadLength = 126;\n        }\n        const target = Buffer.allocUnsafe(merge ? data.length + offset : offset);\n        target[0] = options.fin ? options.opcode | 128 : options.opcode;\n        if (options.rsv1) target[0] |= 64;\n        target[1] = payloadLength;\n        if (payloadLength === 126) {\n          target.writeUInt16BE(data.length, 2);\n        } else if (payloadLength === 127) {\n          target.writeUInt32BE(0, 2);\n          target.writeUInt32BE(data.length, 6);\n        }\n        if (!options.mask) return [target, data];\n        randomFillSync(mask, 0, 4);\n        target[1] |= 128;\n        target[offset - 4] = mask[0];\n        target[offset - 3] = mask[1];\n        target[offset - 2] = mask[2];\n        target[offset - 1] = mask[3];\n        if (merge) {\n          applyMask(data, mask, target, offset, data.length);\n          return [target];\n        }\n        applyMask(data, mask, data, 0, data.length);\n        return [target, data];\n      }\n      /**\n       * Sends a close message to the other peer.\n       *\n       * @param {Number} [code] The status code component of the body\n       * @param {String} [data] The message component of the body\n       * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      close(code, data, mask2, cb) {\n        let buf;\n        if (code === void 0) {\n          buf = EMPTY_BUFFER;\n        } else if (typeof code !== \"number\" || !isValidStatusCode(code)) {\n          throw new TypeError(\"First argument must be a valid error code number\");\n        } else if (data === void 0 || data === \"\") {\n          buf = Buffer.allocUnsafe(2);\n          buf.writeUInt16BE(code, 0);\n        } else {\n          const length = Buffer.byteLength(data);\n          if (length > 123) {\n            throw new RangeError(\"The message must not be greater than 123 bytes\");\n          }\n          buf = Buffer.allocUnsafe(2 + length);\n          buf.writeUInt16BE(code, 0);\n          buf.write(data, 2);\n        }\n        if (this._deflating) {\n          this.enqueue([this.doClose, buf, mask2, cb]);\n        } else {\n          this.doClose(buf, mask2, cb);\n        }\n      }\n      /**\n       * Frames and sends a close message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doClose(data, mask2, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 8,\n            mask: mask2,\n            readOnly: false\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a ping message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      ping(data, mask2, cb) {\n        const buf = toBuffer(data);\n        if (buf.length > 125) {\n          throw new RangeError(\"The data size must not be greater than 125 bytes\");\n        }\n        if (this._deflating) {\n          this.enqueue([this.doPing, buf, mask2, toBuffer.readOnly, cb]);\n        } else {\n          this.doPing(buf, mask2, toBuffer.readOnly, cb);\n        }\n      }\n      /**\n       * Frames and sends a ping message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doPing(data, mask2, readOnly, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 9,\n            mask: mask2,\n            readOnly\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a pong message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      pong(data, mask2, cb) {\n        const buf = toBuffer(data);\n        if (buf.length > 125) {\n          throw new RangeError(\"The data size must not be greater than 125 bytes\");\n        }\n        if (this._deflating) {\n          this.enqueue([this.doPong, buf, mask2, toBuffer.readOnly, cb]);\n        } else {\n          this.doPong(buf, mask2, toBuffer.readOnly, cb);\n        }\n      }\n      /**\n       * Frames and sends a pong message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doPong(data, mask2, readOnly, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 10,\n            mask: mask2,\n            readOnly\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a data message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Object} options Options object\n       * @param {Boolean} [options.compress=false] Specifies whether or not to\n       *     compress `data`\n       * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n       *     or text\n       * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n       *     last one\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      send(data, options, cb) {\n        const buf = toBuffer(data);\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        let opcode = options.binary ? 2 : 1;\n        let rsv1 = options.compress;\n        if (this._firstFragment) {\n          this._firstFragment = false;\n          if (rsv1 && perMessageDeflate) {\n            rsv1 = buf.length >= perMessageDeflate._threshold;\n          }\n          this._compress = rsv1;\n        } else {\n          rsv1 = false;\n          opcode = 0;\n        }\n        if (options.fin) this._firstFragment = true;\n        if (perMessageDeflate) {\n          const opts = {\n            fin: options.fin,\n            rsv1,\n            opcode,\n            mask: options.mask,\n            readOnly: toBuffer.readOnly\n          };\n          if (this._deflating) {\n            this.enqueue([this.dispatch, buf, this._compress, opts, cb]);\n          } else {\n            this.dispatch(buf, this._compress, opts, cb);\n          }\n        } else {\n          this.sendFrame(\n            _Sender.frame(buf, {\n              fin: options.fin,\n              rsv1: false,\n              opcode,\n              mask: options.mask,\n              readOnly: toBuffer.readOnly\n            }),\n            cb\n          );\n        }\n      }\n      /**\n       * Dispatches a data message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [compress=false] Specifies whether or not to compress\n       *     `data`\n       * @param {Object} options Options object\n       * @param {Number} options.opcode The opcode\n       * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n       *     modified\n       * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n       *     FIN bit\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n       *     RSV1 bit\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      dispatch(data, compress, options, cb) {\n        if (!compress) {\n          this.sendFrame(_Sender.frame(data, options), cb);\n          return;\n        }\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        this._bufferedBytes += data.length;\n        this._deflating = true;\n        perMessageDeflate.compress(data, options.fin, (_, buf) => {\n          if (this._socket.destroyed) {\n            const err = new Error(\n              \"The socket was closed while data was being compressed\"\n            );\n            if (typeof cb === \"function\") cb(err);\n            for (let i = 0; i < this._queue.length; i++) {\n              const callback = this._queue[i][4];\n              if (typeof callback === \"function\") callback(err);\n            }\n            return;\n          }\n          this._bufferedBytes -= data.length;\n          this._deflating = false;\n          options.readOnly = false;\n          this.sendFrame(_Sender.frame(buf, options), cb);\n          this.dequeue();\n        });\n      }\n      /**\n       * Executes queued send operations.\n       *\n       * @private\n       */\n      dequeue() {\n        while (!this._deflating && this._queue.length) {\n          const params2 = this._queue.shift();\n          this._bufferedBytes -= params2[1].length;\n          Reflect.apply(params2[0], this, params2.slice(1));\n        }\n      }\n      /**\n       * Enqueues a send operation.\n       *\n       * @param {Array} params Send operation parameters.\n       * @private\n       */\n      enqueue(params2) {\n        this._bufferedBytes += params2[1].length;\n        this._queue.push(params2);\n      }\n      /**\n       * Sends a frame.\n       *\n       * @param {Buffer[]} list The frame to send\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      sendFrame(list, cb) {\n        if (list.length === 2) {\n          this._socket.cork();\n          this._socket.write(list[0]);\n          this._socket.write(list[1], cb);\n          this._socket.uncork();\n        } else {\n          this._socket.write(list[0], cb);\n        }\n      }\n    };\n    module2.exports = Sender;\n  }\n});\n\n// node_modules/ws/lib/event-target.js\nvar require_event_target = __commonJS({\n  \"node_modules/ws/lib/event-target.js\"(exports2, module2) {\n    \"use strict\";\n    var Event = class {\n      /**\n       * Create a new `Event`.\n       *\n       * @param {String} type The name of the event\n       * @param {Object} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(type, target) {\n        this.target = target;\n        this.type = type;\n      }\n    };\n    var MessageEvent = class extends Event {\n      /**\n       * Create a new `MessageEvent`.\n       *\n       * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(data, target) {\n        super(\"message\", target);\n        this.data = data;\n      }\n    };\n    var CloseEvent = class extends Event {\n      /**\n       * Create a new `CloseEvent`.\n       *\n       * @param {Number} code The status code explaining why the connection is being\n       *     closed\n       * @param {String} reason A human-readable string explaining why the\n       *     connection is closing\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(code, reason, target) {\n        super(\"close\", target);\n        this.wasClean = target._closeFrameReceived && target._closeFrameSent;\n        this.reason = reason;\n        this.code = code;\n      }\n    };\n    var OpenEvent = class extends Event {\n      /**\n       * Create a new `OpenEvent`.\n       *\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(target) {\n        super(\"open\", target);\n      }\n    };\n    var ErrorEvent = class extends Event {\n      /**\n       * Create a new `ErrorEvent`.\n       *\n       * @param {Object} error The error that generated this event\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(error, target) {\n        super(\"error\", target);\n        this.message = error.message;\n        this.error = error;\n      }\n    };\n    var EventTarget = {\n      /**\n       * Register an event listener.\n       *\n       * @param {String} type A string representing the event type to listen for\n       * @param {Function} listener The listener to add\n       * @param {Object} [options] An options object specifies characteristics about\n       *     the event listener\n       * @param {Boolean} [options.once=false] A `Boolean`` indicating that the\n       *     listener should be invoked at most once after being added. If `true`,\n       *     the listener would be automatically removed when invoked.\n       * @public\n       */\n      addEventListener(type, listener, options) {\n        if (typeof listener !== \"function\") return;\n        function onMessage(data) {\n          listener.call(this, new MessageEvent(data, this));\n        }\n        function onClose(code, message) {\n          listener.call(this, new CloseEvent(code, message, this));\n        }\n        function onError(error) {\n          listener.call(this, new ErrorEvent(error, this));\n        }\n        function onOpen() {\n          listener.call(this, new OpenEvent(this));\n        }\n        const method = options && options.once ? \"once\" : \"on\";\n        if (type === \"message\") {\n          onMessage._listener = listener;\n          this[method](type, onMessage);\n        } else if (type === \"close\") {\n          onClose._listener = listener;\n          this[method](type, onClose);\n        } else if (type === \"error\") {\n          onError._listener = listener;\n          this[method](type, onError);\n        } else if (type === \"open\") {\n          onOpen._listener = listener;\n          this[method](type, onOpen);\n        } else {\n          this[method](type, listener);\n        }\n      },\n      /**\n       * Remove an event listener.\n       *\n       * @param {String} type A string representing the event type to remove\n       * @param {Function} listener The listener to remove\n       * @public\n       */\n      removeEventListener(type, listener) {\n        const listeners = this.listeners(type);\n        for (let i = 0; i < listeners.length; i++) {\n          if (listeners[i] === listener || listeners[i]._listener === listener) {\n            this.removeListener(type, listeners[i]);\n          }\n        }\n      }\n    };\n    module2.exports = EventTarget;\n  }\n});\n\n// node_modules/ws/lib/extension.js\nvar require_extension = __commonJS({\n  \"node_modules/ws/lib/extension.js\"(exports2, module2) {\n    \"use strict\";\n    var tokenChars = [\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 0 - 15\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 16 - 31\n      0,\n      1,\n      0,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      1,\n      1,\n      0,\n      1,\n      1,\n      0,\n      // 32 - 47\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 48 - 63\n      0,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      // 64 - 79\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      0,\n      1,\n      1,\n      // 80 - 95\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      // 96 - 111\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      1,\n      0,\n      1,\n      0\n      // 112 - 127\n    ];\n    function push(dest, name2, elem) {\n      if (dest[name2] === void 0) dest[name2] = [elem];\n      else dest[name2].push(elem);\n    }\n    function parse(header) {\n      const offers = /* @__PURE__ */ Object.create(null);\n      if (header === void 0 || header === \"\") return offers;\n      let params2 = /* @__PURE__ */ Object.create(null);\n      let mustUnescape = false;\n      let isEscaping = false;\n      let inQuotes = false;\n      let extensionName;\n      let paramName;\n      let start = -1;\n      let end = -1;\n      let i = 0;\n      for (; i < header.length; i++) {\n        const code = header.charCodeAt(i);\n        if (extensionName === void 0) {\n          if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (code === 32 || code === 9) {\n            if (end === -1 && start !== -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            const name2 = header.slice(start, end);\n            if (code === 44) {\n              push(offers, name2, params2);\n              params2 = /* @__PURE__ */ Object.create(null);\n            } else {\n              extensionName = name2;\n            }\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        } else if (paramName === void 0) {\n          if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (code === 32 || code === 9) {\n            if (end === -1 && start !== -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            push(params2, header.slice(start, end), true);\n            if (code === 44) {\n              push(offers, extensionName, params2);\n              params2 = /* @__PURE__ */ Object.create(null);\n              extensionName = void 0;\n            }\n            start = end = -1;\n          } else if (code === 61 && start !== -1 && end === -1) {\n            paramName = header.slice(start, i);\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        } else {\n          if (isEscaping) {\n            if (tokenChars[code] !== 1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (start === -1) start = i;\n            else if (!mustUnescape) mustUnescape = true;\n            isEscaping = false;\n          } else if (inQuotes) {\n            if (tokenChars[code] === 1) {\n              if (start === -1) start = i;\n            } else if (code === 34 && start !== -1) {\n              inQuotes = false;\n              end = i;\n            } else if (code === 92) {\n              isEscaping = true;\n            } else {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n          } else if (code === 34 && header.charCodeAt(i - 1) === 61) {\n            inQuotes = true;\n          } else if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (start !== -1 && (code === 32 || code === 9)) {\n            if (end === -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            let value = header.slice(start, end);\n            if (mustUnescape) {\n              value = value.replace(/\\\\/g, \"\");\n              mustUnescape = false;\n            }\n            push(params2, paramName, value);\n            if (code === 44) {\n              push(offers, extensionName, params2);\n              params2 = /* @__PURE__ */ Object.create(null);\n              extensionName = void 0;\n            }\n            paramName = void 0;\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        }\n      }\n      if (start === -1 || inQuotes) {\n        throw new SyntaxError(\"Unexpected end of input\");\n      }\n      if (end === -1) end = i;\n      const token = header.slice(start, end);\n      if (extensionName === void 0) {\n        push(offers, token, params2);\n      } else {\n        if (paramName === void 0) {\n          push(params2, token, true);\n        } else if (mustUnescape) {\n          push(params2, paramName, token.replace(/\\\\/g, \"\"));\n        } else {\n          push(params2, paramName, token);\n        }\n        push(offers, extensionName, params2);\n      }\n      return offers;\n    }\n    function format(extensions) {\n      return Object.keys(extensions).map((extension) => {\n        let configurations = extensions[extension];\n        if (!Array.isArray(configurations)) configurations = [configurations];\n        return configurations.map((params2) => {\n          return [extension].concat(\n            Object.keys(params2).map((k) => {\n              let values = params2[k];\n              if (!Array.isArray(values)) values = [values];\n              return values.map((v) => v === true ? k : `${k}=${v}`).join(\"; \");\n            })\n          ).join(\"; \");\n        }).join(\", \");\n      }).join(\", \");\n    }\n    module2.exports = { format, parse };\n  }\n});\n\n// node_modules/ws/lib/websocket.js\nvar require_websocket = __commonJS({\n  \"node_modules/ws/lib/websocket.js\"(exports2, module2) {\n    \"use strict\";\n    var EventEmitter = require(\"events\");\n    var https = require(\"https\");\n    var http = require(\"http\");\n    var net = require(\"net\");\n    var tls = require(\"tls\");\n    var { randomBytes, createHash } = require(\"crypto\");\n    var { URL } = require(\"url\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var Receiver = require_receiver();\n    var Sender = require_sender();\n    var {\n      BINARY_TYPES,\n      EMPTY_BUFFER,\n      GUID,\n      kStatusCode,\n      kWebSocket,\n      NOOP\n    } = require_constants();\n    var { addEventListener, removeEventListener } = require_event_target();\n    var { format, parse } = require_extension();\n    var { toBuffer } = require_buffer_util();\n    var readyStates = [\"CONNECTING\", \"OPEN\", \"CLOSING\", \"CLOSED\"];\n    var protocolVersions = [8, 13];\n    var closeTimeout = 30 * 1e3;\n    var WebSocket = class _WebSocket extends EventEmitter {\n      /**\n       * Create a new `WebSocket`.\n       *\n       * @param {(String|url.URL)} address The URL to which to connect\n       * @param {(String|String[])} [protocols] The subprotocols\n       * @param {Object} [options] Connection options\n       */\n      constructor(address, protocols, options) {\n        super();\n        this._binaryType = BINARY_TYPES[0];\n        this._closeCode = 1006;\n        this._closeFrameReceived = false;\n        this._closeFrameSent = false;\n        this._closeMessage = \"\";\n        this._closeTimer = null;\n        this._extensions = {};\n        this._protocol = \"\";\n        this._readyState = _WebSocket.CONNECTING;\n        this._receiver = null;\n        this._sender = null;\n        this._socket = null;\n        if (address !== null) {\n          this._bufferedAmount = 0;\n          this._isServer = false;\n          this._redirects = 0;\n          if (Array.isArray(protocols)) {\n            protocols = protocols.join(\", \");\n          } else if (typeof protocols === \"object\" && protocols !== null) {\n            options = protocols;\n            protocols = void 0;\n          }\n          initAsClient(this, address, protocols, options);\n        } else {\n          this._isServer = true;\n        }\n      }\n      /**\n       * This deviates from the WHATWG interface since ws doesn't support the\n       * required default \"blob\" type (instead we define a custom \"nodebuffer\"\n       * type).\n       *\n       * @type {String}\n       */\n      get binaryType() {\n        return this._binaryType;\n      }\n      set binaryType(type) {\n        if (!BINARY_TYPES.includes(type)) return;\n        this._binaryType = type;\n        if (this._receiver) this._receiver._binaryType = type;\n      }\n      /**\n       * @type {Number}\n       */\n      get bufferedAmount() {\n        if (!this._socket) return this._bufferedAmount;\n        return this._socket._writableState.length + this._sender._bufferedBytes;\n      }\n      /**\n       * @type {String}\n       */\n      get extensions() {\n        return Object.keys(this._extensions).join();\n      }\n      /**\n       * @type {String}\n       */\n      get protocol() {\n        return this._protocol;\n      }\n      /**\n       * @type {Number}\n       */\n      get readyState() {\n        return this._readyState;\n      }\n      /**\n       * @type {String}\n       */\n      get url() {\n        return this._url;\n      }\n      /**\n       * Set up the socket and the internal resources.\n       *\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Number} [maxPayload=0] The maximum allowed message size\n       * @private\n       */\n      setSocket(socket, head, maxPayload) {\n        const receiver = new Receiver(\n          this.binaryType,\n          this._extensions,\n          this._isServer,\n          maxPayload\n        );\n        this._sender = new Sender(socket, this._extensions);\n        this._receiver = receiver;\n        this._socket = socket;\n        receiver[kWebSocket] = this;\n        socket[kWebSocket] = this;\n        receiver.on(\"conclude\", receiverOnConclude);\n        receiver.on(\"drain\", receiverOnDrain);\n        receiver.on(\"error\", receiverOnError);\n        receiver.on(\"message\", receiverOnMessage);\n        receiver.on(\"ping\", receiverOnPing);\n        receiver.on(\"pong\", receiverOnPong);\n        socket.setTimeout(0);\n        socket.setNoDelay();\n        if (head.length > 0) socket.unshift(head);\n        socket.on(\"close\", socketOnClose);\n        socket.on(\"data\", socketOnData);\n        socket.on(\"end\", socketOnEnd);\n        socket.on(\"error\", socketOnError);\n        this._readyState = _WebSocket.OPEN;\n        this.emit(\"open\");\n      }\n      /**\n       * Emit the `'close'` event.\n       *\n       * @private\n       */\n      emitClose() {\n        if (!this._socket) {\n          this._readyState = _WebSocket.CLOSED;\n          this.emit(\"close\", this._closeCode, this._closeMessage);\n          return;\n        }\n        if (this._extensions[PerMessageDeflate.extensionName]) {\n          this._extensions[PerMessageDeflate.extensionName].cleanup();\n        }\n        this._receiver.removeAllListeners();\n        this._readyState = _WebSocket.CLOSED;\n        this.emit(\"close\", this._closeCode, this._closeMessage);\n      }\n      /**\n       * Start a closing handshake.\n       *\n       *          +----------+   +-----------+   +----------+\n       *     - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n       *    |     +----------+   +-----------+   +----------+     |\n       *          +----------+   +-----------+         |\n       * CLOSING  |ws.close()|<--|close frame|<--+-----+       CLOSING\n       *          +----------+   +-----------+   |\n       *    |           |                        |   +---+        |\n       *                +------------------------+-->|fin| - - - -\n       *    |         +---+                      |   +---+\n       *     - - - - -|fin|<---------------------+\n       *              +---+\n       *\n       * @param {Number} [code] Status code explaining why the connection is closing\n       * @param {String} [data] A string explaining why the connection is closing\n       * @public\n       */\n      close(code, data) {\n        if (this.readyState === _WebSocket.CLOSED) return;\n        if (this.readyState === _WebSocket.CONNECTING) {\n          const msg = \"WebSocket was closed before the connection was established\";\n          return abortHandshake(this, this._req, msg);\n        }\n        if (this.readyState === _WebSocket.CLOSING) {\n          if (this._closeFrameSent && this._closeFrameReceived) this._socket.end();\n          return;\n        }\n        this._readyState = _WebSocket.CLOSING;\n        this._sender.close(code, data, !this._isServer, (err) => {\n          if (err) return;\n          this._closeFrameSent = true;\n          if (this._closeFrameReceived) this._socket.end();\n        });\n        this._closeTimer = setTimeout(\n          this._socket.destroy.bind(this._socket),\n          closeTimeout\n        );\n      }\n      /**\n       * Send a ping.\n       *\n       * @param {*} [data] The data to send\n       * @param {Boolean} [mask] Indicates whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when the ping is sent\n       * @public\n       */\n      ping(data, mask, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof data === \"function\") {\n          cb = data;\n          data = mask = void 0;\n        } else if (typeof mask === \"function\") {\n          cb = mask;\n          mask = void 0;\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        if (mask === void 0) mask = !this._isServer;\n        this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n      }\n      /**\n       * Send a pong.\n       *\n       * @param {*} [data] The data to send\n       * @param {Boolean} [mask] Indicates whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when the pong is sent\n       * @public\n       */\n      pong(data, mask, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof data === \"function\") {\n          cb = data;\n          data = mask = void 0;\n        } else if (typeof mask === \"function\") {\n          cb = mask;\n          mask = void 0;\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        if (mask === void 0) mask = !this._isServer;\n        this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n      }\n      /**\n       * Send a data message.\n       *\n       * @param {*} data The message to send\n       * @param {Object} [options] Options object\n       * @param {Boolean} [options.compress] Specifies whether or not to compress\n       *     `data`\n       * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n       *     text\n       * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n       *     last one\n       * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when data is written out\n       * @public\n       */\n      send(data, options, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof options === \"function\") {\n          cb = options;\n          options = {};\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        const opts = {\n          binary: typeof data !== \"string\",\n          mask: !this._isServer,\n          compress: true,\n          fin: true,\n          ...options\n        };\n        if (!this._extensions[PerMessageDeflate.extensionName]) {\n          opts.compress = false;\n        }\n        this._sender.send(data || EMPTY_BUFFER, opts, cb);\n      }\n      /**\n       * Forcibly close the connection.\n       *\n       * @public\n       */\n      terminate() {\n        if (this.readyState === _WebSocket.CLOSED) return;\n        if (this.readyState === _WebSocket.CONNECTING) {\n          const msg = \"WebSocket was closed before the connection was established\";\n          return abortHandshake(this, this._req, msg);\n        }\n        if (this._socket) {\n          this._readyState = _WebSocket.CLOSING;\n          this._socket.destroy();\n        }\n      }\n    };\n    readyStates.forEach((readyState, i) => {\n      const descriptor = { enumerable: true, value: i };\n      Object.defineProperty(WebSocket.prototype, readyState, descriptor);\n      Object.defineProperty(WebSocket, readyState, descriptor);\n    });\n    [\n      \"binaryType\",\n      \"bufferedAmount\",\n      \"extensions\",\n      \"protocol\",\n      \"readyState\",\n      \"url\"\n    ].forEach((property) => {\n      Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n    });\n    [\"open\", \"error\", \"close\", \"message\"].forEach((method) => {\n      Object.defineProperty(WebSocket.prototype, `on${method}`, {\n        configurable: true,\n        enumerable: true,\n        /**\n         * Return the listener of the event.\n         *\n         * @return {(Function|undefined)} The event listener or `undefined`\n         * @public\n         */\n        get() {\n          const listeners = this.listeners(method);\n          for (let i = 0; i < listeners.length; i++) {\n            if (listeners[i]._listener) return listeners[i]._listener;\n          }\n          return void 0;\n        },\n        /**\n         * Add a listener for the event.\n         *\n         * @param {Function} listener The listener to add\n         * @public\n         */\n        set(listener) {\n          const listeners = this.listeners(method);\n          for (let i = 0; i < listeners.length; i++) {\n            if (listeners[i]._listener) this.removeListener(method, listeners[i]);\n          }\n          this.addEventListener(method, listener);\n        }\n      });\n    });\n    WebSocket.prototype.addEventListener = addEventListener;\n    WebSocket.prototype.removeEventListener = removeEventListener;\n    module2.exports = WebSocket;\n    function initAsClient(websocket, address, protocols, options) {\n      const opts = {\n        protocolVersion: protocolVersions[1],\n        maxPayload: 100 * 1024 * 1024,\n        perMessageDeflate: true,\n        followRedirects: false,\n        maxRedirects: 10,\n        ...options,\n        createConnection: void 0,\n        socketPath: void 0,\n        hostname: void 0,\n        protocol: void 0,\n        timeout: void 0,\n        method: void 0,\n        host: void 0,\n        path: void 0,\n        port: void 0\n      };\n      if (!protocolVersions.includes(opts.protocolVersion)) {\n        throw new RangeError(\n          `Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(\", \")})`\n        );\n      }\n      let parsedUrl;\n      if (address instanceof URL) {\n        parsedUrl = address;\n        websocket._url = address.href;\n      } else {\n        parsedUrl = new URL(address);\n        websocket._url = address;\n      }\n      const isUnixSocket = parsedUrl.protocol === \"ws+unix:\";\n      if (!parsedUrl.host && (!isUnixSocket || !parsedUrl.pathname)) {\n        throw new Error(`Invalid URL: ${websocket.url}`);\n      }\n      const isSecure = parsedUrl.protocol === \"wss:\" || parsedUrl.protocol === \"https:\";\n      const defaultPort = isSecure ? 443 : 80;\n      const key = randomBytes(16).toString(\"base64\");\n      const get = isSecure ? https.get : http.get;\n      let perMessageDeflate;\n      opts.createConnection = isSecure ? tlsConnect : netConnect;\n      opts.defaultPort = opts.defaultPort || defaultPort;\n      opts.port = parsedUrl.port || defaultPort;\n      opts.host = parsedUrl.hostname.startsWith(\"[\") ? parsedUrl.hostname.slice(1, -1) : parsedUrl.hostname;\n      opts.headers = {\n        \"Sec-WebSocket-Version\": opts.protocolVersion,\n        \"Sec-WebSocket-Key\": key,\n        Connection: \"Upgrade\",\n        Upgrade: \"websocket\",\n        ...opts.headers\n      };\n      opts.path = parsedUrl.pathname + parsedUrl.search;\n      opts.timeout = opts.handshakeTimeout;\n      if (opts.perMessageDeflate) {\n        perMessageDeflate = new PerMessageDeflate(\n          opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n          false,\n          opts.maxPayload\n        );\n        opts.headers[\"Sec-WebSocket-Extensions\"] = format({\n          [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n        });\n      }\n      if (protocols) {\n        opts.headers[\"Sec-WebSocket-Protocol\"] = protocols;\n      }\n      if (opts.origin) {\n        if (opts.protocolVersion < 13) {\n          opts.headers[\"Sec-WebSocket-Origin\"] = opts.origin;\n        } else {\n          opts.headers.Origin = opts.origin;\n        }\n      }\n      if (parsedUrl.username || parsedUrl.password) {\n        opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n      }\n      if (isUnixSocket) {\n        const parts = opts.path.split(\":\");\n        opts.socketPath = parts[0];\n        opts.path = parts[1];\n      }\n      let req = websocket._req = get(opts);\n      if (opts.timeout) {\n        req.on(\"timeout\", () => {\n          abortHandshake(websocket, req, \"Opening handshake has timed out\");\n        });\n      }\n      req.on(\"error\", (err) => {\n        if (req === null || req.aborted) return;\n        req = websocket._req = null;\n        websocket._readyState = WebSocket.CLOSING;\n        websocket.emit(\"error\", err);\n        websocket.emitClose();\n      });\n      req.on(\"response\", (res) => {\n        const location = res.headers.location;\n        const statusCode = res.statusCode;\n        if (location && opts.followRedirects && statusCode >= 300 && statusCode < 400) {\n          if (++websocket._redirects > opts.maxRedirects) {\n            abortHandshake(websocket, req, \"Maximum redirects exceeded\");\n            return;\n          }\n          req.abort();\n          const addr = new URL(location, address);\n          initAsClient(websocket, addr, protocols, options);\n        } else if (!websocket.emit(\"unexpected-response\", req, res)) {\n          abortHandshake(\n            websocket,\n            req,\n            `Unexpected server response: ${res.statusCode}`\n          );\n        }\n      });\n      req.on(\"upgrade\", (res, socket, head) => {\n        websocket.emit(\"upgrade\", res);\n        if (websocket.readyState !== WebSocket.CONNECTING) return;\n        req = websocket._req = null;\n        const digest = createHash(\"sha1\").update(key + GUID).digest(\"base64\");\n        if (res.headers[\"sec-websocket-accept\"] !== digest) {\n          abortHandshake(websocket, socket, \"Invalid Sec-WebSocket-Accept header\");\n          return;\n        }\n        const serverProt = res.headers[\"sec-websocket-protocol\"];\n        const protList = (protocols || \"\").split(/, */);\n        let protError;\n        if (!protocols && serverProt) {\n          protError = \"Server sent a subprotocol but none was requested\";\n        } else if (protocols && !serverProt) {\n          protError = \"Server sent no subprotocol\";\n        } else if (serverProt && !protList.includes(serverProt)) {\n          protError = \"Server sent an invalid subprotocol\";\n        }\n        if (protError) {\n          abortHandshake(websocket, socket, protError);\n          return;\n        }\n        if (serverProt) websocket._protocol = serverProt;\n        if (perMessageDeflate) {\n          try {\n            const extensions = parse(res.headers[\"sec-websocket-extensions\"]);\n            if (extensions[PerMessageDeflate.extensionName]) {\n              perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n              websocket._extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n            }\n          } catch (err) {\n            abortHandshake(\n              websocket,\n              socket,\n              \"Invalid Sec-WebSocket-Extensions header\"\n            );\n            return;\n          }\n        }\n        websocket.setSocket(socket, head, opts.maxPayload);\n      });\n    }\n    function netConnect(options) {\n      options.path = options.socketPath;\n      return net.connect(options);\n    }\n    function tlsConnect(options) {\n      options.path = void 0;\n      if (!options.servername && options.servername !== \"\") {\n        options.servername = net.isIP(options.host) ? \"\" : options.host;\n      }\n      return tls.connect(options);\n    }\n    function abortHandshake(websocket, stream, message) {\n      websocket._readyState = WebSocket.CLOSING;\n      const err = new Error(message);\n      Error.captureStackTrace(err, abortHandshake);\n      if (stream.setHeader) {\n        stream.abort();\n        if (stream.socket && !stream.socket.destroyed) {\n          stream.socket.destroy();\n        }\n        stream.once(\"abort\", websocket.emitClose.bind(websocket));\n        websocket.emit(\"error\", err);\n      } else {\n        stream.destroy(err);\n        stream.once(\"error\", websocket.emit.bind(websocket, \"error\"));\n        stream.once(\"close\", websocket.emitClose.bind(websocket));\n      }\n    }\n    function sendAfterClose(websocket, data, cb) {\n      if (data) {\n        const length = toBuffer(data).length;\n        if (websocket._socket) websocket._sender._bufferedBytes += length;\n        else websocket._bufferedAmount += length;\n      }\n      if (cb) {\n        const err = new Error(\n          `WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})`\n        );\n        cb(err);\n      }\n    }\n    function receiverOnConclude(code, reason) {\n      const websocket = this[kWebSocket];\n      websocket._socket.removeListener(\"data\", socketOnData);\n      websocket._socket.resume();\n      websocket._closeFrameReceived = true;\n      websocket._closeMessage = reason;\n      websocket._closeCode = code;\n      if (code === 1005) websocket.close();\n      else websocket.close(code, reason);\n    }\n    function receiverOnDrain() {\n      this[kWebSocket]._socket.resume();\n    }\n    function receiverOnError(err) {\n      const websocket = this[kWebSocket];\n      websocket._socket.removeListener(\"data\", socketOnData);\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._closeCode = err[kStatusCode];\n      websocket.emit(\"error\", err);\n      websocket._socket.destroy();\n    }\n    function receiverOnFinish() {\n      this[kWebSocket].emitClose();\n    }\n    function receiverOnMessage(data) {\n      this[kWebSocket].emit(\"message\", data);\n    }\n    function receiverOnPing(data) {\n      const websocket = this[kWebSocket];\n      websocket.pong(data, !websocket._isServer, NOOP);\n      websocket.emit(\"ping\", data);\n    }\n    function receiverOnPong(data) {\n      this[kWebSocket].emit(\"pong\", data);\n    }\n    function socketOnClose() {\n      const websocket = this[kWebSocket];\n      this.removeListener(\"close\", socketOnClose);\n      this.removeListener(\"end\", socketOnEnd);\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._socket.read();\n      websocket._receiver.end();\n      this.removeListener(\"data\", socketOnData);\n      this[kWebSocket] = void 0;\n      clearTimeout(websocket._closeTimer);\n      if (websocket._receiver._writableState.finished || websocket._receiver._writableState.errorEmitted) {\n        websocket.emitClose();\n      } else {\n        websocket._receiver.on(\"error\", receiverOnFinish);\n        websocket._receiver.on(\"finish\", receiverOnFinish);\n      }\n    }\n    function socketOnData(chunk) {\n      if (!this[kWebSocket]._receiver.write(chunk)) {\n        this.pause();\n      }\n    }\n    function socketOnEnd() {\n      const websocket = this[kWebSocket];\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._receiver.end();\n      this.end();\n    }\n    function socketOnError() {\n      const websocket = this[kWebSocket];\n      this.removeListener(\"error\", socketOnError);\n      this.on(\"error\", NOOP);\n      if (websocket) {\n        websocket._readyState = WebSocket.CLOSING;\n        this.destroy();\n      }\n    }\n  }\n});\n\n// node_modules/ws/lib/stream.js\nvar require_stream = __commonJS({\n  \"node_modules/ws/lib/stream.js\"(exports2, module2) {\n    \"use strict\";\n    var { Duplex } = require(\"stream\");\n    function emitClose(stream) {\n      stream.emit(\"close\");\n    }\n    function duplexOnEnd() {\n      if (!this.destroyed && this._writableState.finished) {\n        this.destroy();\n      }\n    }\n    function duplexOnError(err) {\n      this.removeListener(\"error\", duplexOnError);\n      this.destroy();\n      if (this.listenerCount(\"error\") === 0) {\n        this.emit(\"error\", err);\n      }\n    }\n    function createWebSocketStream(ws, options) {\n      let resumeOnReceiverDrain = true;\n      function receiverOnDrain() {\n        if (resumeOnReceiverDrain) ws._socket.resume();\n      }\n      if (ws.readyState === ws.CONNECTING) {\n        ws.once(\"open\", function open() {\n          ws._receiver.removeAllListeners(\"drain\");\n          ws._receiver.on(\"drain\", receiverOnDrain);\n        });\n      } else {\n        ws._receiver.removeAllListeners(\"drain\");\n        ws._receiver.on(\"drain\", receiverOnDrain);\n      }\n      const duplex = new Duplex({\n        ...options,\n        autoDestroy: false,\n        emitClose: false,\n        objectMode: false,\n        writableObjectMode: false\n      });\n      ws.on(\"message\", function message(msg) {\n        if (!duplex.push(msg)) {\n          resumeOnReceiverDrain = false;\n          ws._socket.pause();\n        }\n      });\n      ws.once(\"error\", function error(err) {\n        if (duplex.destroyed) return;\n        duplex.destroy(err);\n      });\n      ws.once(\"close\", function close() {\n        if (duplex.destroyed) return;\n        duplex.push(null);\n      });\n      duplex._destroy = function(err, callback) {\n        if (ws.readyState === ws.CLOSED) {\n          callback(err);\n          process.nextTick(emitClose, duplex);\n          return;\n        }\n        let called = false;\n        ws.once(\"error\", function error(err2) {\n          called = true;\n          callback(err2);\n        });\n        ws.once(\"close\", function close() {\n          if (!called) callback(err);\n          process.nextTick(emitClose, duplex);\n        });\n        ws.terminate();\n      };\n      duplex._final = function(callback) {\n        if (ws.readyState === ws.CONNECTING) {\n          ws.once(\"open\", function open() {\n            duplex._final(callback);\n          });\n          return;\n        }\n        if (ws._socket === null) return;\n        if (ws._socket._writableState.finished) {\n          callback();\n          if (duplex._readableState.endEmitted) duplex.destroy();\n        } else {\n          ws._socket.once(\"finish\", function finish() {\n            callback();\n          });\n          ws.close();\n        }\n      };\n      duplex._read = function() {\n        if (ws.readyState === ws.OPEN && !resumeOnReceiverDrain) {\n          resumeOnReceiverDrain = true;\n          if (!ws._receiver._writableState.needDrain) ws._socket.resume();\n        }\n      };\n      duplex._write = function(chunk, encoding, callback) {\n        if (ws.readyState === ws.CONNECTING) {\n          ws.once(\"open\", function open() {\n            duplex._write(chunk, encoding, callback);\n          });\n          return;\n        }\n        ws.send(chunk, callback);\n      };\n      duplex.on(\"end\", duplexOnEnd);\n      duplex.on(\"error\", duplexOnError);\n      return duplex;\n    }\n    module2.exports = createWebSocketStream;\n  }\n});\n\n// node_modules/ws/lib/websocket-server.js\nvar require_websocket_server = __commonJS({\n  \"node_modules/ws/lib/websocket-server.js\"(exports2, module2) {\n    \"use strict\";\n    var EventEmitter = require(\"events\");\n    var { createHash } = require(\"crypto\");\n    var { createServer, STATUS_CODES } = require(\"http\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var WebSocket = require_websocket();\n    var { format, parse } = require_extension();\n    var { GUID, kWebSocket } = require_constants();\n    var keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n    var WebSocketServer = class extends EventEmitter {\n      /**\n       * Create a `WebSocketServer` instance.\n       *\n       * @param {Object} options Configuration options\n       * @param {Number} [options.backlog=511] The maximum length of the queue of\n       *     pending connections\n       * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n       *     track clients\n       * @param {Function} [options.handleProtocols] A hook to handle protocols\n       * @param {String} [options.host] The hostname where to bind the server\n       * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n       *     size\n       * @param {Boolean} [options.noServer=false] Enable no server mode\n       * @param {String} [options.path] Accept only connections matching this path\n       * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n       *     permessage-deflate\n       * @param {Number} [options.port] The port where to bind the server\n       * @param {http.Server} [options.server] A pre-created HTTP/S server to use\n       * @param {Function} [options.verifyClient] A hook to reject connections\n       * @param {Function} [callback] A listener for the `listening` event\n       */\n      constructor(options, callback) {\n        super();\n        options = {\n          maxPayload: 100 * 1024 * 1024,\n          perMessageDeflate: false,\n          handleProtocols: null,\n          clientTracking: true,\n          verifyClient: null,\n          noServer: false,\n          backlog: null,\n          // use default (511 as implemented in net.js)\n          server: null,\n          host: null,\n          path: null,\n          port: null,\n          ...options\n        };\n        if (options.port == null && !options.server && !options.noServer) {\n          throw new TypeError(\n            'One of the \"port\", \"server\", or \"noServer\" options must be specified'\n          );\n        }\n        if (options.port != null) {\n          this._server = createServer((req, res) => {\n            const body = STATUS_CODES[426];\n            res.writeHead(426, {\n              \"Content-Length\": body.length,\n              \"Content-Type\": \"text/plain\"\n            });\n            res.end(body);\n          });\n          this._server.listen(\n            options.port,\n            options.host,\n            options.backlog,\n            callback\n          );\n        } else if (options.server) {\n          this._server = options.server;\n        }\n        if (this._server) {\n          const emitConnection = this.emit.bind(this, \"connection\");\n          this._removeListeners = addListeners(this._server, {\n            listening: this.emit.bind(this, \"listening\"),\n            error: this.emit.bind(this, \"error\"),\n            upgrade: (req, socket, head) => {\n              this.handleUpgrade(req, socket, head, emitConnection);\n            }\n          });\n        }\n        if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n        if (options.clientTracking) this.clients = /* @__PURE__ */ new Set();\n        this.options = options;\n      }\n      /**\n       * Returns the bound address, the address family name, and port of the server\n       * as reported by the operating system if listening on an IP socket.\n       * If the server is listening on a pipe or UNIX domain socket, the name is\n       * returned as a string.\n       *\n       * @return {(Object|String|null)} The address of the server\n       * @public\n       */\n      address() {\n        if (this.options.noServer) {\n          throw new Error('The server is operating in \"noServer\" mode');\n        }\n        if (!this._server) return null;\n        return this._server.address();\n      }\n      /**\n       * Close the server.\n       *\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      close(cb) {\n        if (cb) this.once(\"close\", cb);\n        if (this.clients) {\n          for (const client of this.clients) client.terminate();\n        }\n        const server = this._server;\n        if (server) {\n          this._removeListeners();\n          this._removeListeners = this._server = null;\n          if (this.options.port != null) {\n            server.close(() => this.emit(\"close\"));\n            return;\n          }\n        }\n        process.nextTick(emitClose, this);\n      }\n      /**\n       * See if a given request should be handled by this server instance.\n       *\n       * @param {http.IncomingMessage} req Request object to inspect\n       * @return {Boolean} `true` if the request is valid, else `false`\n       * @public\n       */\n      shouldHandle(req) {\n        if (this.options.path) {\n          const index = req.url.indexOf(\"?\");\n          const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n          if (pathname !== this.options.path) return false;\n        }\n        return true;\n      }\n      /**\n       * Handle a HTTP Upgrade request.\n       *\n       * @param {http.IncomingMessage} req The request object\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Function} cb Callback\n       * @public\n       */\n      handleUpgrade(req, socket, head, cb) {\n        socket.on(\"error\", socketOnError);\n        const key = req.headers[\"sec-websocket-key\"] !== void 0 ? req.headers[\"sec-websocket-key\"].trim() : false;\n        const version = +req.headers[\"sec-websocket-version\"];\n        const extensions = {};\n        if (req.method !== \"GET\" || req.headers.upgrade.toLowerCase() !== \"websocket\" || !key || !keyRegex.test(key) || version !== 8 && version !== 13 || !this.shouldHandle(req)) {\n          return abortHandshake(socket, 400);\n        }\n        if (this.options.perMessageDeflate) {\n          const perMessageDeflate = new PerMessageDeflate(\n            this.options.perMessageDeflate,\n            true,\n            this.options.maxPayload\n          );\n          try {\n            const offers = parse(req.headers[\"sec-websocket-extensions\"]);\n            if (offers[PerMessageDeflate.extensionName]) {\n              perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n              extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n            }\n          } catch (err) {\n            return abortHandshake(socket, 400);\n          }\n        }\n        if (this.options.verifyClient) {\n          const info = {\n            origin: req.headers[`${version === 8 ? \"sec-websocket-origin\" : \"origin\"}`],\n            secure: !!(req.socket.authorized || req.socket.encrypted),\n            req\n          };\n          if (this.options.verifyClient.length === 2) {\n            this.options.verifyClient(info, (verified, code, message, headers) => {\n              if (!verified) {\n                return abortHandshake(socket, code || 401, message, headers);\n              }\n              this.completeUpgrade(key, extensions, req, socket, head, cb);\n            });\n            return;\n          }\n          if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n        }\n        this.completeUpgrade(key, extensions, req, socket, head, cb);\n      }\n      /**\n       * Upgrade the connection to WebSocket.\n       *\n       * @param {String} key The value of the `Sec-WebSocket-Key` header\n       * @param {Object} extensions The accepted extensions\n       * @param {http.IncomingMessage} req The request object\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Function} cb Callback\n       * @throws {Error} If called more than once with the same socket\n       * @private\n       */\n      completeUpgrade(key, extensions, req, socket, head, cb) {\n        if (!socket.readable || !socket.writable) return socket.destroy();\n        if (socket[kWebSocket]) {\n          throw new Error(\n            \"server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration\"\n          );\n        }\n        const digest = createHash(\"sha1\").update(key + GUID).digest(\"base64\");\n        const headers = [\n          \"HTTP/1.1 101 Switching Protocols\",\n          \"Upgrade: websocket\",\n          \"Connection: Upgrade\",\n          `Sec-WebSocket-Accept: ${digest}`\n        ];\n        const ws = new WebSocket(null);\n        let protocol = req.headers[\"sec-websocket-protocol\"];\n        if (protocol) {\n          protocol = protocol.split(\",\").map(trim);\n          if (this.options.handleProtocols) {\n            protocol = this.options.handleProtocols(protocol, req);\n          } else {\n            protocol = protocol[0];\n          }\n          if (protocol) {\n            headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n            ws._protocol = protocol;\n          }\n        }\n        if (extensions[PerMessageDeflate.extensionName]) {\n          const params2 = extensions[PerMessageDeflate.extensionName].params;\n          const value = format({\n            [PerMessageDeflate.extensionName]: [params2]\n          });\n          headers.push(`Sec-WebSocket-Extensions: ${value}`);\n          ws._extensions = extensions;\n        }\n        this.emit(\"headers\", headers, req);\n        socket.write(headers.concat(\"\\r\\n\").join(\"\\r\\n\"));\n        socket.removeListener(\"error\", socketOnError);\n        ws.setSocket(socket, head, this.options.maxPayload);\n        if (this.clients) {\n          this.clients.add(ws);\n          ws.on(\"close\", () => this.clients.delete(ws));\n        }\n        cb(ws, req);\n      }\n    };\n    module2.exports = WebSocketServer;\n    function addListeners(server, map) {\n      for (const event of Object.keys(map)) server.on(event, map[event]);\n      return function removeListeners() {\n        for (const event of Object.keys(map)) {\n          server.removeListener(event, map[event]);\n        }\n      };\n    }\n    function emitClose(server) {\n      server.emit(\"close\");\n    }\n    function socketOnError() {\n      this.destroy();\n    }\n    function abortHandshake(socket, code, message, headers) {\n      if (socket.writable) {\n        message = message || STATUS_CODES[code];\n        headers = {\n          Connection: \"close\",\n          \"Content-Type\": \"text/html\",\n          \"Content-Length\": Buffer.byteLength(message),\n          ...headers\n        };\n        socket.write(\n          `HTTP/1.1 ${code} ${STATUS_CODES[code]}\\r\n` + Object.keys(headers).map((h) => `${h}: ${headers[h]}`).join(\"\\r\\n\") + \"\\r\\n\\r\\n\" + message\n        );\n      }\n      socket.removeListener(\"error\", socketOnError);\n      socket.destroy();\n    }\n    function trim(str) {\n      return str.trim();\n    }\n  }\n});\n\n// node_modules/ws/index.js\nvar require_ws = __commonJS({\n  \"node_modules/ws/index.js\"(exports2, module2) {\n    \"use strict\";\n    var WebSocket = require_websocket();\n    WebSocket.createWebSocketStream = require_stream();\n    WebSocket.Server = require_websocket_server();\n    WebSocket.Receiver = require_receiver();\n    WebSocket.Sender = require_sender();\n    module2.exports = WebSocket;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/ws.js\nvar require_ws2 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/ws.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.WebSocket = void 0;\n    var ws_1 = __importDefault(require_ws());\n    exports2.WebSocket = ws_1.default;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/websocket-provider.js\nvar require_websocket_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/websocket-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.WebSocketProvider = void 0;\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var ws_1 = require_ws2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var NextId = 1;\n    var WebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(WebSocketProvider2, _super);\n        function WebSocketProvider2(url, network) {\n          var _this = this;\n          if (network === \"any\") {\n            logger.throwError(\"WebSocketProvider does not support 'any' network yet\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"network:any\"\n            });\n          }\n          _this = _super.call(this, url, network) || this;\n          _this._pollingInterval = -1;\n          _this._wsReady = false;\n          (0, properties_1.defineReadOnly)(_this, \"_websocket\", new ws_1.WebSocket(_this.connection.url));\n          (0, properties_1.defineReadOnly)(_this, \"_requests\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_subs\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_subIds\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_detectNetwork\", _super.prototype.detectNetwork.call(_this));\n          _this._websocket.onopen = function() {\n            _this._wsReady = true;\n            Object.keys(_this._requests).forEach(function(id) {\n              _this._websocket.send(_this._requests[id].payload);\n            });\n          };\n          _this._websocket.onmessage = function(messageEvent) {\n            var data = messageEvent.data;\n            var result2 = JSON.parse(data);\n            if (result2.id != null) {\n              var id = String(result2.id);\n              var request = _this._requests[id];\n              delete _this._requests[id];\n              if (result2.result !== void 0) {\n                request.callback(null, result2.result);\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  request: JSON.parse(request.payload),\n                  response: result2.result,\n                  provider: _this\n                });\n              } else {\n                var error = null;\n                if (result2.error) {\n                  error = new Error(result2.error.message || \"unknown error\");\n                  (0, properties_1.defineReadOnly)(error, \"code\", result2.error.code || null);\n                  (0, properties_1.defineReadOnly)(error, \"response\", data);\n                } else {\n                  error = new Error(\"unknown error\");\n                }\n                request.callback(error, void 0);\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  error,\n                  request: JSON.parse(request.payload),\n                  provider: _this\n                });\n              }\n            } else if (result2.method === \"eth_subscription\") {\n              var sub = _this._subs[result2.params.subscription];\n              if (sub) {\n                sub.processFunc(result2.params.result);\n              }\n            } else {\n              console.warn(\"this should not happen\");\n            }\n          };\n          var fauxPoll = setInterval(function() {\n            _this.emit(\"poll\");\n          }, 1e3);\n          if (fauxPoll.unref) {\n            fauxPoll.unref();\n          }\n          return _this;\n        }\n        WebSocketProvider2.prototype.detectNetwork = function() {\n          return this._detectNetwork;\n        };\n        Object.defineProperty(WebSocketProvider2.prototype, \"pollingInterval\", {\n          get: function() {\n            return 0;\n          },\n          set: function(value) {\n            logger.throwError(\"cannot set polling interval on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setPollingInterval\"\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        WebSocketProvider2.prototype.resetEventsBlock = function(blockNumber) {\n          logger.throwError(\"cannot reset events block on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"resetEventBlock\"\n          });\n        };\n        WebSocketProvider2.prototype.poll = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, null];\n            });\n          });\n        };\n        Object.defineProperty(WebSocketProvider2.prototype, \"polling\", {\n          set: function(value) {\n            if (!value) {\n              return;\n            }\n            logger.throwError(\"cannot set polling on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setPolling\"\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        WebSocketProvider2.prototype.send = function(method, params2) {\n          var _this = this;\n          var rid = NextId++;\n          return new Promise(function(resolve, reject) {\n            function callback(error, result2) {\n              if (error) {\n                return reject(error);\n              }\n              return resolve(result2);\n            }\n            var payload = JSON.stringify({\n              method,\n              params: params2,\n              id: rid,\n              jsonrpc: \"2.0\"\n            });\n            _this.emit(\"debug\", {\n              action: \"request\",\n              request: JSON.parse(payload),\n              provider: _this\n            });\n            _this._requests[String(rid)] = { callback, payload };\n            if (_this._wsReady) {\n              _this._websocket.send(payload);\n            }\n          });\n        };\n        WebSocketProvider2.defaultUrl = function() {\n          return \"ws://localhost:8546\";\n        };\n        WebSocketProvider2.prototype._subscribe = function(tag, param, processFunc) {\n          return __awaiter(this, void 0, void 0, function() {\n            var subIdPromise, subId;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  subIdPromise = this._subIds[tag];\n                  if (subIdPromise == null) {\n                    subIdPromise = Promise.all(param).then(function(param2) {\n                      return _this.send(\"eth_subscribe\", param2);\n                    });\n                    this._subIds[tag] = subIdPromise;\n                  }\n                  return [4, subIdPromise];\n                case 1:\n                  subId = _a.sent();\n                  this._subs[subId] = { tag, processFunc };\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        WebSocketProvider2.prototype._startEvent = function(event) {\n          var _this = this;\n          switch (event.type) {\n            case \"block\":\n              this._subscribe(\"block\", [\"newHeads\"], function(result2) {\n                var blockNumber = bignumber_1.BigNumber.from(result2.number).toNumber();\n                _this._emitted.block = blockNumber;\n                _this.emit(\"block\", blockNumber);\n              });\n              break;\n            case \"pending\":\n              this._subscribe(\"pending\", [\"newPendingTransactions\"], function(result2) {\n                _this.emit(\"pending\", result2);\n              });\n              break;\n            case \"filter\":\n              this._subscribe(event.tag, [\"logs\", this._getFilter(event.filter)], function(result2) {\n                if (result2.removed == null) {\n                  result2.removed = false;\n                }\n                _this.emit(event.filter, _this.formatter.filterLog(result2));\n              });\n              break;\n            case \"tx\": {\n              var emitReceipt_1 = function(event2) {\n                var hash = event2.hash;\n                _this.getTransactionReceipt(hash).then(function(receipt) {\n                  if (!receipt) {\n                    return;\n                  }\n                  _this.emit(hash, receipt);\n                });\n              };\n              emitReceipt_1(event);\n              this._subscribe(\"tx\", [\"newHeads\"], function(result2) {\n                _this._events.filter(function(e) {\n                  return e.type === \"tx\";\n                }).forEach(emitReceipt_1);\n              });\n              break;\n            }\n            case \"debug\":\n            case \"poll\":\n            case \"willPoll\":\n            case \"didPoll\":\n            case \"error\":\n              break;\n            default:\n              console.log(\"unhandled:\", event);\n              break;\n          }\n        };\n        WebSocketProvider2.prototype._stopEvent = function(event) {\n          var _this = this;\n          var tag = event.tag;\n          if (event.type === \"tx\") {\n            if (this._events.filter(function(e) {\n              return e.type === \"tx\";\n            }).length) {\n              return;\n            }\n            tag = \"tx\";\n          } else if (this.listenerCount(event.event)) {\n            return;\n          }\n          var subId = this._subIds[tag];\n          if (!subId) {\n            return;\n          }\n          delete this._subIds[tag];\n          subId.then(function(subId2) {\n            if (!_this._subs[subId2]) {\n              return;\n            }\n            delete _this._subs[subId2];\n            _this.send(\"eth_unsubscribe\", [subId2]);\n          });\n        };\n        WebSocketProvider2.prototype.destroy = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(this._websocket.readyState === ws_1.WebSocket.CONNECTING)) return [3, 2];\n                  return [4, new Promise(function(resolve) {\n                    _this._websocket.onopen = function() {\n                      resolve(true);\n                    };\n                    _this._websocket.onerror = function() {\n                      resolve(false);\n                    };\n                  })];\n                case 1:\n                  _a.sent();\n                  _a.label = 2;\n                case 2:\n                  this._websocket.close(1e3);\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        return WebSocketProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.WebSocketProvider = WebSocketProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/url-json-rpc-provider.js\nvar require_url_json_rpc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/url-json-rpc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.UrlJsonRpcProvider = exports2.StaticJsonRpcProvider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var StaticJsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(StaticJsonRpcProvider2, _super);\n        function StaticJsonRpcProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        StaticJsonRpcProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  network = this.network;\n                  if (!(network == null)) return [3, 2];\n                  return [4, _super.prototype.detectNetwork.call(this)];\n                case 1:\n                  network = _a.sent();\n                  if (!network) {\n                    logger.throwError(\"no network detected\", logger_1.Logger.errors.UNKNOWN_ERROR, {});\n                  }\n                  if (this._network == null) {\n                    (0, properties_1.defineReadOnly)(this, \"_network\", network);\n                    this.emit(\"network\", network, null);\n                  }\n                  _a.label = 2;\n                case 2:\n                  return [2, network];\n              }\n            });\n          });\n        };\n        return StaticJsonRpcProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.StaticJsonRpcProvider = StaticJsonRpcProvider;\n    var UrlJsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(UrlJsonRpcProvider2, _super);\n        function UrlJsonRpcProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkAbstract(_newTarget, UrlJsonRpcProvider2);\n          network = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n          apiKey = (0, properties_1.getStatic)(_newTarget, \"getApiKey\")(apiKey);\n          var connection = (0, properties_1.getStatic)(_newTarget, \"getUrl\")(network, apiKey);\n          _this = _super.call(this, connection, network) || this;\n          if (typeof apiKey === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"apiKey\", apiKey);\n          } else if (apiKey != null) {\n            Object.keys(apiKey).forEach(function(key) {\n              (0, properties_1.defineReadOnly)(_this, key, apiKey[key]);\n            });\n          }\n          return _this;\n        }\n        UrlJsonRpcProvider2.prototype._startPending = function() {\n          logger.warn(\"WARNING: API provider does not support pending filters\");\n        };\n        UrlJsonRpcProvider2.prototype.isCommunityResource = function() {\n          return false;\n        };\n        UrlJsonRpcProvider2.prototype.getSigner = function(address) {\n          return logger.throwError(\"API provider does not support signing\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"getSigner\" });\n        };\n        UrlJsonRpcProvider2.prototype.listAccounts = function() {\n          return Promise.resolve([]);\n        };\n        UrlJsonRpcProvider2.getApiKey = function(apiKey) {\n          return apiKey;\n        };\n        UrlJsonRpcProvider2.getUrl = function(network, apiKey) {\n          return logger.throwError(\"not implemented; sub-classes must override getUrl\", logger_1.Logger.errors.NOT_IMPLEMENTED, {\n            operation: \"getUrl\"\n          });\n        };\n        return UrlJsonRpcProvider2;\n      }(StaticJsonRpcProvider)\n    );\n    exports2.UrlJsonRpcProvider = UrlJsonRpcProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/alchemy-provider.js\nvar require_alchemy_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/alchemy-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AlchemyProvider = exports2.AlchemyWebSocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var formatter_1 = require_formatter();\n    var websocket_provider_1 = require_websocket_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultApiKey = \"_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC\";\n    var AlchemyWebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(AlchemyWebSocketProvider2, _super);\n        function AlchemyWebSocketProvider2(network, apiKey) {\n          var _this = this;\n          var provider = new AlchemyProvider(network, apiKey);\n          var url = provider.connection.url.replace(/^http/i, \"ws\").replace(\".alchemyapi.\", \".ws.alchemyapi.\");\n          _this = _super.call(this, url, provider.network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", provider.apiKey);\n          return _this;\n        }\n        AlchemyWebSocketProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return AlchemyWebSocketProvider2;\n      }(websocket_provider_1.WebSocketProvider)\n    );\n    exports2.AlchemyWebSocketProvider = AlchemyWebSocketProvider;\n    var AlchemyProvider = (\n      /** @class */\n      function(_super) {\n        __extends(AlchemyProvider2, _super);\n        function AlchemyProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        AlchemyProvider2.getWebSocketProvider = function(network, apiKey) {\n          return new AlchemyWebSocketProvider(network, apiKey);\n        };\n        AlchemyProvider2.getApiKey = function(apiKey) {\n          if (apiKey == null) {\n            return defaultApiKey;\n          }\n          if (apiKey && typeof apiKey !== \"string\") {\n            logger.throwArgumentError(\"invalid apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKey;\n        };\n        AlchemyProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"eth-mainnet.alchemyapi.io/v2/\";\n              break;\n            case \"ropsten\":\n              host = \"eth-ropsten.alchemyapi.io/v2/\";\n              break;\n            case \"rinkeby\":\n              host = \"eth-rinkeby.alchemyapi.io/v2/\";\n              break;\n            case \"goerli\":\n              host = \"eth-goerli.alchemyapi.io/v2/\";\n              break;\n            case \"kovan\":\n              host = \"eth-kovan.alchemyapi.io/v2/\";\n              break;\n            case \"matic\":\n              host = \"polygon-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"maticmum\":\n              host = \"polygon-mumbai.g.alchemy.com/v2/\";\n              break;\n            case \"arbitrum\":\n              host = \"arb-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"arbitrum-rinkeby\":\n              host = \"arb-rinkeby.g.alchemy.com/v2/\";\n              break;\n            case \"optimism\":\n              host = \"opt-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"optimism-kovan\":\n              host = \"opt-kovan.g.alchemy.com/v2/\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return {\n            allowGzip: true,\n            url: \"https://\" + host + apiKey,\n            throttleCallback: function(attempt, url) {\n              if (apiKey === defaultApiKey) {\n                (0, formatter_1.showThrottleMessage)();\n              }\n              return Promise.resolve(true);\n            }\n          };\n        };\n        AlchemyProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return AlchemyProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.AlchemyProvider = AlchemyProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/cloudflare-provider.js\nvar require_cloudflare_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/cloudflare-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.CloudflareProvider = void 0;\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var CloudflareProvider = (\n      /** @class */\n      function(_super) {\n        __extends(CloudflareProvider2, _super);\n        function CloudflareProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        CloudflareProvider2.getApiKey = function(apiKey) {\n          if (apiKey != null) {\n            logger.throwArgumentError(\"apiKey not supported for cloudflare\", \"apiKey\", apiKey);\n          }\n          return null;\n        };\n        CloudflareProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"https://cloudflare-eth.com/\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return host;\n        };\n        CloudflareProvider2.prototype.perform = function(method, params2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var block;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"getBlockNumber\")) return [3, 2];\n                  return [4, _super.prototype.perform.call(this, \"getBlock\", { blockTag: \"latest\" })];\n                case 1:\n                  block = _a.sent();\n                  return [2, block.number];\n                case 2:\n                  return [2, _super.prototype.perform.call(this, method, params2)];\n              }\n            });\n          });\n        };\n        return CloudflareProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.CloudflareProvider = CloudflareProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/etherscan-provider.js\nvar require_etherscan_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/etherscan-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherscanProvider = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var web_1 = require_lib27();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var base_provider_1 = require_base_provider();\n    function getTransactionPostData(transaction) {\n      var result2 = {};\n      for (var key in transaction) {\n        if (transaction[key] == null) {\n          continue;\n        }\n        var value = transaction[key];\n        if (key === \"type\" && value === 0) {\n          continue;\n        }\n        if ({ type: true, gasLimit: true, gasPrice: true, maxFeePerGs: true, maxPriorityFeePerGas: true, nonce: true, value: true }[key]) {\n          value = (0, bytes_1.hexValue)((0, bytes_1.hexlify)(value));\n        } else if (key === \"accessList\") {\n          value = \"[\" + (0, transactions_1.accessListify)(value).map(function(set) {\n            return '{address:\"' + set.address + '\",storageKeys:[\"' + set.storageKeys.join('\",\"') + '\"]}';\n          }).join(\",\") + \"]\";\n        } else {\n          value = (0, bytes_1.hexlify)(value);\n        }\n        result2[key] = value;\n      }\n      return result2;\n    }\n    function getResult(result2) {\n      if (result2.status == 0 && (result2.message === \"No records found\" || result2.message === \"No transactions found\")) {\n        return result2.result;\n      }\n      if (result2.status != 1 || result2.message != \"OK\") {\n        var error = new Error(\"invalid response\");\n        error.result = JSON.stringify(result2);\n        if ((result2.result || \"\").toLowerCase().indexOf(\"rate limit\") >= 0) {\n          error.throttleRetry = true;\n        }\n        throw error;\n      }\n      return result2.result;\n    }\n    function getJsonResult(result2) {\n      if (result2 && result2.status == 0 && result2.message == \"NOTOK\" && (result2.result || \"\").toLowerCase().indexOf(\"rate limit\") >= 0) {\n        var error = new Error(\"throttled response\");\n        error.result = JSON.stringify(result2);\n        error.throttleRetry = true;\n        throw error;\n      }\n      if (result2.jsonrpc != \"2.0\") {\n        var error = new Error(\"invalid response\");\n        error.result = JSON.stringify(result2);\n        throw error;\n      }\n      if (result2.error) {\n        var error = new Error(result2.error.message || \"unknown error\");\n        if (result2.error.code) {\n          error.code = result2.error.code;\n        }\n        if (result2.error.data) {\n          error.data = result2.error.data;\n        }\n        throw error;\n      }\n      return result2.result;\n    }\n    function checkLogTag(blockTag) {\n      if (blockTag === \"pending\") {\n        throw new Error(\"pending not supported\");\n      }\n      if (blockTag === \"latest\") {\n        return blockTag;\n      }\n      return parseInt(blockTag.substring(2), 16);\n    }\n    var defaultApiKey = \"9D13ZE7XSBTJ94N9BNJ2MA33VMAY2YPIRB\";\n    function checkError(method, error, transaction) {\n      if (method === \"call\" && error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        var e = error.error;\n        if (e && (e.message.match(/reverted/i) || e.message.match(/VM execution error/i))) {\n          var data = e.data;\n          if (data) {\n            data = \"0x\" + data.replace(/^.*0x/i, \"\");\n          }\n          if ((0, bytes_1.isHexString)(data)) {\n            return data;\n          }\n          logger.throwError(\"missing revert data in call exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n            error,\n            data: \"0x\"\n          });\n        }\n      }\n      var message = error.message;\n      if (error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        if (error.error && typeof error.error.message === \"string\") {\n          message = error.error.message;\n        } else if (typeof error.body === \"string\") {\n          message = error.body;\n        } else if (typeof error.responseText === \"string\") {\n          message = error.responseText;\n        }\n      }\n      message = (message || \"\").toLowerCase();\n      if (message.match(/insufficient funds/)) {\n        logger.throwError(\"insufficient funds for intrinsic transaction cost\", logger_1.Logger.errors.INSUFFICIENT_FUNDS, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/same hash was already imported|transaction nonce is too low|nonce too low/)) {\n        logger.throwError(\"nonce has already been used\", logger_1.Logger.errors.NONCE_EXPIRED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/another transaction with same nonce/)) {\n        logger.throwError(\"replacement fee too low\", logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/execution failed due to an exception|execution reverted/)) {\n        logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n          error,\n          method,\n          transaction\n        });\n      }\n      throw error;\n    }\n    var EtherscanProvider = (\n      /** @class */\n      function(_super) {\n        __extends(EtherscanProvider2, _super);\n        function EtherscanProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, EtherscanProvider2);\n          _this = _super.call(this, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"baseUrl\", _this.getBaseUrl());\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", apiKey || defaultApiKey);\n          return _this;\n        }\n        EtherscanProvider2.prototype.getBaseUrl = function() {\n          switch (this.network ? this.network.name : \"invalid\") {\n            case \"homestead\":\n              return \"https://api.etherscan.io\";\n            case \"ropsten\":\n              return \"https://api-ropsten.etherscan.io\";\n            case \"rinkeby\":\n              return \"https://api-rinkeby.etherscan.io\";\n            case \"kovan\":\n              return \"https://api-kovan.etherscan.io\";\n            case \"goerli\":\n              return \"https://api-goerli.etherscan.io\";\n            default:\n          }\n          return logger.throwArgumentError(\"unsupported network\", \"network\", name);\n        };\n        EtherscanProvider2.prototype.getUrl = function(module3, params2) {\n          var query = Object.keys(params2).reduce(function(accum, key) {\n            var value = params2[key];\n            if (value != null) {\n              accum += \"&\" + key + \"=\" + value;\n            }\n            return accum;\n          }, \"\");\n          var apiKey = this.apiKey ? \"&apikey=\" + this.apiKey : \"\";\n          return this.baseUrl + \"/api?module=\" + module3 + query + apiKey;\n        };\n        EtherscanProvider2.prototype.getPostUrl = function() {\n          return this.baseUrl + \"/api\";\n        };\n        EtherscanProvider2.prototype.getPostData = function(module3, params2) {\n          params2.module = module3;\n          params2.apikey = this.apiKey;\n          return params2;\n        };\n        EtherscanProvider2.prototype.fetch = function(module3, params2, post) {\n          return __awaiter(this, void 0, void 0, function() {\n            var url, payload, procFunc, connection, payloadStr, result2;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  url = post ? this.getPostUrl() : this.getUrl(module3, params2);\n                  payload = post ? this.getPostData(module3, params2) : null;\n                  procFunc = module3 === \"proxy\" ? getJsonResult : getResult;\n                  this.emit(\"debug\", {\n                    action: \"request\",\n                    request: url,\n                    provider: this\n                  });\n                  connection = {\n                    url,\n                    throttleSlotInterval: 1e3,\n                    throttleCallback: function(attempt, url2) {\n                      if (_this.isCommunityResource()) {\n                        (0, formatter_1.showThrottleMessage)();\n                      }\n                      return Promise.resolve(true);\n                    }\n                  };\n                  payloadStr = null;\n                  if (payload) {\n                    connection.headers = { \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\" };\n                    payloadStr = Object.keys(payload).map(function(key) {\n                      return key + \"=\" + payload[key];\n                    }).join(\"&\");\n                  }\n                  return [4, (0, web_1.fetchJson)(connection, payloadStr, procFunc || getJsonResult)];\n                case 1:\n                  result2 = _a.sent();\n                  this.emit(\"debug\", {\n                    action: \"response\",\n                    request: url,\n                    response: (0, properties_1.deepCopy)(result2),\n                    provider: this\n                  });\n                  return [2, result2];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this.network];\n            });\n          });\n        };\n        EtherscanProvider2.prototype.perform = function(method, params2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var _a, postData, error_1, postData, error_2, args, topic0, logs, blocks, i, log, block, _b;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  _a = method;\n                  switch (_a) {\n                    case \"getBlockNumber\":\n                      return [3, 1];\n                    case \"getGasPrice\":\n                      return [3, 2];\n                    case \"getBalance\":\n                      return [3, 3];\n                    case \"getTransactionCount\":\n                      return [3, 4];\n                    case \"getCode\":\n                      return [3, 5];\n                    case \"getStorageAt\":\n                      return [3, 6];\n                    case \"sendTransaction\":\n                      return [3, 7];\n                    case \"getBlock\":\n                      return [3, 8];\n                    case \"getTransaction\":\n                      return [3, 9];\n                    case \"getTransactionReceipt\":\n                      return [3, 10];\n                    case \"call\":\n                      return [3, 11];\n                    case \"estimateGas\":\n                      return [3, 15];\n                    case \"getLogs\":\n                      return [3, 19];\n                    case \"getEtherPrice\":\n                      return [3, 26];\n                  }\n                  return [3, 28];\n                case 1:\n                  return [2, this.fetch(\"proxy\", { action: \"eth_blockNumber\" })];\n                case 2:\n                  return [2, this.fetch(\"proxy\", { action: \"eth_gasPrice\" })];\n                case 3:\n                  return [2, this.fetch(\"account\", {\n                    action: \"balance\",\n                    address: params2.address,\n                    tag: params2.blockTag\n                  })];\n                case 4:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionCount\",\n                    address: params2.address,\n                    tag: params2.blockTag\n                  })];\n                case 5:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getCode\",\n                    address: params2.address,\n                    tag: params2.blockTag\n                  })];\n                case 6:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getStorageAt\",\n                    address: params2.address,\n                    position: params2.position,\n                    tag: params2.blockTag\n                  })];\n                case 7:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_sendRawTransaction\",\n                    hex: params2.signedTransaction\n                  }, true).catch(function(error) {\n                    return checkError(\"sendTransaction\", error, params2.signedTransaction);\n                  })];\n                case 8:\n                  if (params2.blockTag) {\n                    return [2, this.fetch(\"proxy\", {\n                      action: \"eth_getBlockByNumber\",\n                      tag: params2.blockTag,\n                      boolean: params2.includeTransactions ? \"true\" : \"false\"\n                    })];\n                  }\n                  throw new Error(\"getBlock by blockHash not implemented\");\n                case 9:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionByHash\",\n                    txhash: params2.transactionHash\n                  })];\n                case 10:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionReceipt\",\n                    txhash: params2.transactionHash\n                  })];\n                case 11:\n                  if (params2.blockTag !== \"latest\") {\n                    throw new Error(\"EtherscanProvider does not support blockTag for call\");\n                  }\n                  postData = getTransactionPostData(params2.transaction);\n                  postData.module = \"proxy\";\n                  postData.action = \"eth_call\";\n                  _c.label = 12;\n                case 12:\n                  _c.trys.push([12, 14, , 15]);\n                  return [4, this.fetch(\"proxy\", postData, true)];\n                case 13:\n                  return [2, _c.sent()];\n                case 14:\n                  error_1 = _c.sent();\n                  return [2, checkError(\"call\", error_1, params2.transaction)];\n                case 15:\n                  postData = getTransactionPostData(params2.transaction);\n                  postData.module = \"proxy\";\n                  postData.action = \"eth_estimateGas\";\n                  _c.label = 16;\n                case 16:\n                  _c.trys.push([16, 18, , 19]);\n                  return [4, this.fetch(\"proxy\", postData, true)];\n                case 17:\n                  return [2, _c.sent()];\n                case 18:\n                  error_2 = _c.sent();\n                  return [2, checkError(\"estimateGas\", error_2, params2.transaction)];\n                case 19:\n                  args = { action: \"getLogs\" };\n                  if (params2.filter.fromBlock) {\n                    args.fromBlock = checkLogTag(params2.filter.fromBlock);\n                  }\n                  if (params2.filter.toBlock) {\n                    args.toBlock = checkLogTag(params2.filter.toBlock);\n                  }\n                  if (params2.filter.address) {\n                    args.address = params2.filter.address;\n                  }\n                  if (params2.filter.topics && params2.filter.topics.length > 0) {\n                    if (params2.filter.topics.length > 1) {\n                      logger.throwError(\"unsupported topic count\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { topics: params2.filter.topics });\n                    }\n                    if (params2.filter.topics.length === 1) {\n                      topic0 = params2.filter.topics[0];\n                      if (typeof topic0 !== \"string\" || topic0.length !== 66) {\n                        logger.throwError(\"unsupported topic format\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { topic0 });\n                      }\n                      args.topic0 = topic0;\n                    }\n                  }\n                  return [4, this.fetch(\"logs\", args)];\n                case 20:\n                  logs = _c.sent();\n                  blocks = {};\n                  i = 0;\n                  _c.label = 21;\n                case 21:\n                  if (!(i < logs.length)) return [3, 25];\n                  log = logs[i];\n                  if (log.blockHash != null) {\n                    return [3, 24];\n                  }\n                  if (!(blocks[log.blockNumber] == null)) return [3, 23];\n                  return [4, this.getBlock(log.blockNumber)];\n                case 22:\n                  block = _c.sent();\n                  if (block) {\n                    blocks[log.blockNumber] = block.hash;\n                  }\n                  _c.label = 23;\n                case 23:\n                  log.blockHash = blocks[log.blockNumber];\n                  _c.label = 24;\n                case 24:\n                  i++;\n                  return [3, 21];\n                case 25:\n                  return [2, logs];\n                case 26:\n                  if (this.network.name !== \"homestead\") {\n                    return [2, 0];\n                  }\n                  _b = parseFloat;\n                  return [4, this.fetch(\"stats\", { action: \"ethprice\" })];\n                case 27:\n                  return [2, _b.apply(void 0, [_c.sent().ethusd])];\n                case 28:\n                  return [3, 29];\n                case 29:\n                  return [2, _super.prototype.perform.call(this, method, params2)];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.getHistory = function(addressOrName, startBlock, endBlock) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params2, result2;\n            var _a;\n            var _this = this;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  _a = {\n                    action: \"txlist\"\n                  };\n                  return [4, this.resolveName(addressOrName)];\n                case 1:\n                  params2 = (_a.address = _b.sent(), _a.startblock = startBlock == null ? 0 : startBlock, _a.endblock = endBlock == null ? 99999999 : endBlock, _a.sort = \"asc\", _a);\n                  return [4, this.fetch(\"account\", params2)];\n                case 2:\n                  result2 = _b.sent();\n                  return [2, result2.map(function(tx) {\n                    [\"contractAddress\", \"to\"].forEach(function(key) {\n                      if (tx[key] == \"\") {\n                        delete tx[key];\n                      }\n                    });\n                    if (tx.creates == null && tx.contractAddress != null) {\n                      tx.creates = tx.contractAddress;\n                    }\n                    var item = _this.formatter.transactionResponse(tx);\n                    if (tx.timeStamp) {\n                      item.timestamp = parseInt(tx.timeStamp);\n                    }\n                    return item;\n                  })];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return EtherscanProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.EtherscanProvider = EtherscanProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/fallback-provider.js\nvar require_fallback_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/fallback-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result2) {\n          result2.done ? resolve(result2.value) : adopt(result2.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FallbackProvider = void 0;\n    var abstract_provider_1 = require_lib12();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var random_1 = require_lib22();\n    var web_1 = require_lib27();\n    var base_provider_1 = require_base_provider();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    function now() {\n      return (/* @__PURE__ */ new Date()).getTime();\n    }\n    function checkNetworks(networks) {\n      var result2 = null;\n      for (var i = 0; i < networks.length; i++) {\n        var network = networks[i];\n        if (network == null) {\n          return null;\n        }\n        if (result2) {\n          if (!(result2.name === network.name && result2.chainId === network.chainId && (result2.ensAddress === network.ensAddress || result2.ensAddress == null && network.ensAddress == null))) {\n            logger.throwArgumentError(\"provider mismatch\", \"networks\", networks);\n          }\n        } else {\n          result2 = network;\n        }\n      }\n      return result2;\n    }\n    function median(values, maxDelta) {\n      values = values.slice().sort();\n      var middle = Math.floor(values.length / 2);\n      if (values.length % 2) {\n        return values[middle];\n      }\n      var a = values[middle - 1], b = values[middle];\n      if (maxDelta != null && Math.abs(a - b) > maxDelta) {\n        return null;\n      }\n      return (a + b) / 2;\n    }\n    function serialize(value) {\n      if (value === null) {\n        return \"null\";\n      } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n        return JSON.stringify(value);\n      } else if (typeof value === \"string\") {\n        return value;\n      } else if (bignumber_1.BigNumber.isBigNumber(value)) {\n        return value.toString();\n      } else if (Array.isArray(value)) {\n        return JSON.stringify(value.map(function(i) {\n          return serialize(i);\n        }));\n      } else if (typeof value === \"object\") {\n        var keys = Object.keys(value);\n        keys.sort();\n        return \"{\" + keys.map(function(key) {\n          var v = value[key];\n          if (typeof v === \"function\") {\n            v = \"[function]\";\n          } else {\n            v = serialize(v);\n          }\n          return JSON.stringify(key) + \":\" + v;\n        }).join(\",\") + \"}\";\n      }\n      throw new Error(\"unknown value type: \" + typeof value);\n    }\n    var nextRid = 1;\n    function stall(duration) {\n      var cancel = null;\n      var timer = null;\n      var promise = new Promise(function(resolve) {\n        cancel = function() {\n          if (timer) {\n            clearTimeout(timer);\n            timer = null;\n          }\n          resolve();\n        };\n        timer = setTimeout(cancel, duration);\n      });\n      var wait = function(func) {\n        promise = promise.then(func);\n        return promise;\n      };\n      function getPromise() {\n        return promise;\n      }\n      return { cancel, getPromise, wait };\n    }\n    var ForwardErrors = [\n      logger_1.Logger.errors.CALL_EXCEPTION,\n      logger_1.Logger.errors.INSUFFICIENT_FUNDS,\n      logger_1.Logger.errors.NONCE_EXPIRED,\n      logger_1.Logger.errors.REPLACEMENT_UNDERPRICED,\n      logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT\n    ];\n    var ForwardProperties = [\n      \"address\",\n      \"args\",\n      \"errorArgs\",\n      \"errorSignature\",\n      \"method\",\n      \"transaction\"\n    ];\n    function exposeDebugConfig(config, now2) {\n      var result2 = {\n        weight: config.weight\n      };\n      Object.defineProperty(result2, \"provider\", { get: function() {\n        return config.provider;\n      } });\n      if (config.start) {\n        result2.start = config.start;\n      }\n      if (now2) {\n        result2.duration = now2 - config.start;\n      }\n      if (config.done) {\n        if (config.error) {\n          result2.error = config.error;\n        } else {\n          result2.result = config.result || null;\n        }\n      }\n      return result2;\n    }\n    function normalizedTally(normalize, quorum) {\n      return function(configs) {\n        var tally = {};\n        configs.forEach(function(c) {\n          var value = normalize(c.result);\n          if (!tally[value]) {\n            tally[value] = { count: 0, result: c.result };\n          }\n          tally[value].count++;\n        });\n        var keys = Object.keys(tally);\n        for (var i = 0; i < keys.length; i++) {\n          var check = tally[keys[i]];\n          if (check.count >= quorum) {\n            return check.result;\n          }\n        }\n        return void 0;\n      };\n    }\n    function getProcessFunc(provider, method, params2) {\n      var normalize = serialize;\n      switch (method) {\n        case \"getBlockNumber\":\n          return function(configs) {\n            var values = configs.map(function(c) {\n              return c.result;\n            });\n            var blockNumber = median(configs.map(function(c) {\n              return c.result;\n            }), 2);\n            if (blockNumber == null) {\n              return void 0;\n            }\n            blockNumber = Math.ceil(blockNumber);\n            if (values.indexOf(blockNumber + 1) >= 0) {\n              blockNumber++;\n            }\n            if (blockNumber >= provider._highestBlockNumber) {\n              provider._highestBlockNumber = blockNumber;\n            }\n            return provider._highestBlockNumber;\n          };\n        case \"getGasPrice\":\n          return function(configs) {\n            var values = configs.map(function(c) {\n              return c.result;\n            });\n            values.sort();\n            return values[Math.floor(values.length / 2)];\n          };\n        case \"getEtherPrice\":\n          return function(configs) {\n            return median(configs.map(function(c) {\n              return c.result;\n            }));\n          };\n        case \"getBalance\":\n        case \"getTransactionCount\":\n        case \"getCode\":\n        case \"getStorageAt\":\n        case \"call\":\n        case \"estimateGas\":\n        case \"getLogs\":\n          break;\n        case \"getTransaction\":\n        case \"getTransactionReceipt\":\n          normalize = function(tx) {\n            if (tx == null) {\n              return null;\n            }\n            tx = (0, properties_1.shallowCopy)(tx);\n            tx.confirmations = -1;\n            return serialize(tx);\n          };\n          break;\n        case \"getBlock\":\n          if (params2.includeTransactions) {\n            normalize = function(block) {\n              if (block == null) {\n                return null;\n              }\n              block = (0, properties_1.shallowCopy)(block);\n              block.transactions = block.transactions.map(function(tx) {\n                tx = (0, properties_1.shallowCopy)(tx);\n                tx.confirmations = -1;\n                return tx;\n              });\n              return serialize(block);\n            };\n          } else {\n            normalize = function(block) {\n              if (block == null) {\n                return null;\n              }\n              return serialize(block);\n            };\n          }\n          break;\n        default:\n          throw new Error(\"unknown method: \" + method);\n      }\n      return normalizedTally(normalize, provider.quorum);\n    }\n    function waitForSync(config, blockNumber) {\n      return __awaiter(this, void 0, void 0, function() {\n        var provider;\n        return __generator(this, function(_a) {\n          provider = config.provider;\n          if (provider.blockNumber != null && provider.blockNumber >= blockNumber || blockNumber === -1) {\n            return [2, provider];\n          }\n          return [2, (0, web_1.poll)(function() {\n            return new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                if (provider.blockNumber >= blockNumber) {\n                  return resolve(provider);\n                }\n                if (config.cancelled) {\n                  return resolve(null);\n                }\n                return resolve(void 0);\n              }, 0);\n            });\n          }, { oncePoll: provider })];\n        });\n      });\n    }\n    function getRunner(config, currentBlockNumber, method, params2) {\n      return __awaiter(this, void 0, void 0, function() {\n        var provider, _a, filter;\n        return __generator(this, function(_b) {\n          switch (_b.label) {\n            case 0:\n              provider = config.provider;\n              _a = method;\n              switch (_a) {\n                case \"getBlockNumber\":\n                  return [3, 1];\n                case \"getGasPrice\":\n                  return [3, 1];\n                case \"getEtherPrice\":\n                  return [3, 2];\n                case \"getBalance\":\n                  return [3, 3];\n                case \"getTransactionCount\":\n                  return [3, 3];\n                case \"getCode\":\n                  return [3, 3];\n                case \"getStorageAt\":\n                  return [3, 6];\n                case \"getBlock\":\n                  return [3, 9];\n                case \"call\":\n                  return [3, 12];\n                case \"estimateGas\":\n                  return [3, 12];\n                case \"getTransaction\":\n                  return [3, 15];\n                case \"getTransactionReceipt\":\n                  return [3, 15];\n                case \"getLogs\":\n                  return [3, 16];\n              }\n              return [3, 19];\n            case 1:\n              return [2, provider[method]()];\n            case 2:\n              if (provider.getEtherPrice) {\n                return [2, provider.getEtherPrice()];\n              }\n              return [3, 19];\n            case 3:\n              if (!(params2.blockTag && (0, bytes_1.isHexString)(params2.blockTag))) return [3, 5];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 4:\n              provider = _b.sent();\n              _b.label = 5;\n            case 5:\n              return [2, provider[method](params2.address, params2.blockTag || \"latest\")];\n            case 6:\n              if (!(params2.blockTag && (0, bytes_1.isHexString)(params2.blockTag))) return [3, 8];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 7:\n              provider = _b.sent();\n              _b.label = 8;\n            case 8:\n              return [2, provider.getStorageAt(params2.address, params2.position, params2.blockTag || \"latest\")];\n            case 9:\n              if (!(params2.blockTag && (0, bytes_1.isHexString)(params2.blockTag))) return [3, 11];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 10:\n              provider = _b.sent();\n              _b.label = 11;\n            case 11:\n              return [2, provider[params2.includeTransactions ? \"getBlockWithTransactions\" : \"getBlock\"](params2.blockTag || params2.blockHash)];\n            case 12:\n              if (!(params2.blockTag && (0, bytes_1.isHexString)(params2.blockTag))) return [3, 14];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 13:\n              provider = _b.sent();\n              _b.label = 14;\n            case 14:\n              return [2, provider[method](params2.transaction)];\n            case 15:\n              return [2, provider[method](params2.transactionHash)];\n            case 16:\n              filter = params2.filter;\n              if (!(filter.fromBlock && (0, bytes_1.isHexString)(filter.fromBlock) || filter.toBlock && (0, bytes_1.isHexString)(filter.toBlock))) return [3, 18];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 17:\n              provider = _b.sent();\n              _b.label = 18;\n            case 18:\n              return [2, provider.getLogs(filter)];\n            case 19:\n              return [2, logger.throwError(\"unknown method error\", logger_1.Logger.errors.UNKNOWN_ERROR, {\n                method,\n                params: params2\n              })];\n          }\n        });\n      });\n    }\n    var FallbackProvider = (\n      /** @class */\n      function(_super) {\n        __extends(FallbackProvider2, _super);\n        function FallbackProvider2(providers, quorum) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, FallbackProvider2);\n          if (providers.length === 0) {\n            logger.throwArgumentError(\"missing providers\", \"providers\", providers);\n          }\n          var providerConfigs = providers.map(function(configOrProvider, index) {\n            if (abstract_provider_1.Provider.isProvider(configOrProvider)) {\n              var stallTimeout = (0, formatter_1.isCommunityResource)(configOrProvider) ? 2e3 : 750;\n              var priority = 1;\n              return Object.freeze({ provider: configOrProvider, weight: 1, stallTimeout, priority });\n            }\n            var config = (0, properties_1.shallowCopy)(configOrProvider);\n            if (config.priority == null) {\n              config.priority = 1;\n            }\n            if (config.stallTimeout == null) {\n              config.stallTimeout = (0, formatter_1.isCommunityResource)(configOrProvider) ? 2e3 : 750;\n            }\n            if (config.weight == null) {\n              config.weight = 1;\n            }\n            var weight = config.weight;\n            if (weight % 1 || weight > 512 || weight < 1) {\n              logger.throwArgumentError(\"invalid weight; must be integer in [1, 512]\", \"providers[\" + index + \"].weight\", weight);\n            }\n            return Object.freeze(config);\n          });\n          var total = providerConfigs.reduce(function(accum, c) {\n            return accum + c.weight;\n          }, 0);\n          if (quorum == null) {\n            quorum = total / 2;\n          } else if (quorum > total) {\n            logger.throwArgumentError(\"quorum will always fail; larger than total weight\", \"quorum\", quorum);\n          }\n          var networkOrReady = checkNetworks(providerConfigs.map(function(c) {\n            return c.provider.network;\n          }));\n          if (networkOrReady == null) {\n            networkOrReady = new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                _this.detectNetwork().then(resolve, reject);\n              }, 0);\n            });\n          }\n          _this = _super.call(this, networkOrReady) || this;\n          (0, properties_1.defineReadOnly)(_this, \"providerConfigs\", Object.freeze(providerConfigs));\n          (0, properties_1.defineReadOnly)(_this, \"quorum\", quorum);\n          _this._highestBlockNumber = -1;\n          return _this;\n        }\n        FallbackProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var networks;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, Promise.all(this.providerConfigs.map(function(c) {\n                    return c.provider.getNetwork();\n                  }))];\n                case 1:\n                  networks = _a.sent();\n                  return [2, checkNetworks(networks)];\n              }\n            });\n          });\n        };\n        FallbackProvider2.prototype.perform = function(method, params2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var results, i_1, result2, processFunc, configs, currentBlockNumber, i, first, _loop_1, this_1, state_1;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"sendTransaction\")) return [3, 2];\n                  return [4, Promise.all(this.providerConfigs.map(function(c) {\n                    return c.provider.sendTransaction(params2.signedTransaction).then(function(result3) {\n                      return result3.hash;\n                    }, function(error) {\n                      return error;\n                    });\n                  }))];\n                case 1:\n                  results = _a.sent();\n                  for (i_1 = 0; i_1 < results.length; i_1++) {\n                    result2 = results[i_1];\n                    if (typeof result2 === \"string\") {\n                      return [2, result2];\n                    }\n                  }\n                  throw results[0];\n                case 2:\n                  if (!(this._highestBlockNumber === -1 && method !== \"getBlockNumber\")) return [3, 4];\n                  return [4, this.getBlockNumber()];\n                case 3:\n                  _a.sent();\n                  _a.label = 4;\n                case 4:\n                  processFunc = getProcessFunc(this, method, params2);\n                  configs = (0, random_1.shuffled)(this.providerConfigs.map(properties_1.shallowCopy));\n                  configs.sort(function(a, b) {\n                    return a.priority - b.priority;\n                  });\n                  currentBlockNumber = this._highestBlockNumber;\n                  i = 0;\n                  first = true;\n                  _loop_1 = function() {\n                    var t0, inflightWeight, _loop_2, waiting, results2, result3, errors;\n                    return __generator(this, function(_b) {\n                      switch (_b.label) {\n                        case 0:\n                          t0 = now();\n                          inflightWeight = configs.filter(function(c) {\n                            return c.runner && t0 - c.start < c.stallTimeout;\n                          }).reduce(function(accum, c) {\n                            return accum + c.weight;\n                          }, 0);\n                          _loop_2 = function() {\n                            var config = configs[i++];\n                            var rid = nextRid++;\n                            config.start = now();\n                            config.staller = stall(config.stallTimeout);\n                            config.staller.wait(function() {\n                              config.staller = null;\n                            });\n                            config.runner = getRunner(config, currentBlockNumber, method, params2).then(function(result4) {\n                              config.done = true;\n                              config.result = result4;\n                              if (_this.listenerCount(\"debug\")) {\n                                _this.emit(\"debug\", {\n                                  action: \"request\",\n                                  rid,\n                                  backend: exposeDebugConfig(config, now()),\n                                  request: { method, params: (0, properties_1.deepCopy)(params2) },\n                                  provider: _this\n                                });\n                              }\n                            }, function(error) {\n                              config.done = true;\n                              config.error = error;\n                              if (_this.listenerCount(\"debug\")) {\n                                _this.emit(\"debug\", {\n                                  action: \"request\",\n                                  rid,\n                                  backend: exposeDebugConfig(config, now()),\n                                  request: { method, params: (0, properties_1.deepCopy)(params2) },\n                                  provider: _this\n                                });\n                              }\n                            });\n                            if (this_1.listenerCount(\"debug\")) {\n                              this_1.emit(\"debug\", {\n                                action: \"request\",\n                                rid,\n                                backend: exposeDebugConfig(config, null),\n                                request: { method, params: (0, properties_1.deepCopy)(params2) },\n                                provider: this_1\n                              });\n                            }\n                            inflightWeight += config.weight;\n                          };\n                          while (inflightWeight < this_1.quorum && i < configs.length) {\n                            _loop_2();\n                          }\n                          waiting = [];\n                          configs.forEach(function(c) {\n                            if (c.done || !c.runner) {\n                              return;\n                            }\n                            waiting.push(c.runner);\n                            if (c.staller) {\n                              waiting.push(c.staller.getPromise());\n                            }\n                          });\n                          if (!waiting.length) return [3, 2];\n                          return [4, Promise.race(waiting)];\n                        case 1:\n                          _b.sent();\n                          _b.label = 2;\n                        case 2:\n                          results2 = configs.filter(function(c) {\n                            return c.done && c.error == null;\n                          });\n                          if (!(results2.length >= this_1.quorum)) return [3, 5];\n                          result3 = processFunc(results2);\n                          if (result3 !== void 0) {\n                            configs.forEach(function(c) {\n                              if (c.staller) {\n                                c.staller.cancel();\n                              }\n                              c.cancelled = true;\n                            });\n                            return [2, { value: result3 }];\n                          }\n                          if (!!first) return [3, 4];\n                          return [4, stall(100).getPromise()];\n                        case 3:\n                          _b.sent();\n                          _b.label = 4;\n                        case 4:\n                          first = false;\n                          _b.label = 5;\n                        case 5:\n                          errors = configs.reduce(function(accum, c) {\n                            if (!c.done || c.error == null) {\n                              return accum;\n                            }\n                            var code = c.error.code;\n                            if (ForwardErrors.indexOf(code) >= 0) {\n                              if (!accum[code]) {\n                                accum[code] = { error: c.error, weight: 0 };\n                              }\n                              accum[code].weight += c.weight;\n                            }\n                            return accum;\n                          }, {});\n                          Object.keys(errors).forEach(function(errorCode) {\n                            var tally = errors[errorCode];\n                            if (tally.weight < _this.quorum) {\n                              return;\n                            }\n                            configs.forEach(function(c) {\n                              if (c.staller) {\n                                c.staller.cancel();\n                              }\n                              c.cancelled = true;\n                            });\n                            var e = tally.error;\n                            var props = {};\n                            ForwardProperties.forEach(function(name2) {\n                              if (e[name2] == null) {\n                                return;\n                              }\n                              props[name2] = e[name2];\n                            });\n                            logger.throwError(e.reason || e.message, errorCode, props);\n                          });\n                          if (configs.filter(function(c) {\n                            return !c.done;\n                          }).length === 0) {\n                            return [2, \"break\"];\n                          }\n                          return [\n                            2\n                            /*return*/\n                          ];\n                      }\n                    });\n                  };\n                  this_1 = this;\n                  _a.label = 5;\n                case 5:\n                  if (false) return [3, 7];\n                  return [5, _loop_1()];\n                case 6:\n                  state_1 = _a.sent();\n                  if (typeof state_1 === \"object\")\n                    return [2, state_1.value];\n                  if (state_1 === \"break\")\n                    return [3, 7];\n                  return [3, 5];\n                case 7:\n                  configs.forEach(function(c) {\n                    if (c.staller) {\n                      c.staller.cancel();\n                    }\n                    c.cancelled = true;\n                  });\n                  return [2, logger.throwError(\"failed to meet quorum\", logger_1.Logger.errors.SERVER_ERROR, {\n                    method,\n                    params: params2,\n                    //results: configs.map((c) => c.result),\n                    //errors: configs.map((c) => c.error),\n                    results: configs.map(function(c) {\n                      return exposeDebugConfig(c);\n                    }),\n                    provider: this\n                  })];\n              }\n            });\n          });\n        };\n        return FallbackProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.FallbackProvider = FallbackProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/ipc-provider.js\nvar require_ipc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/ipc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.IpcProvider = void 0;\n    var net_1 = require(\"net\");\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var IpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(IpcProvider2, _super);\n        function IpcProvider2(path, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, IpcProvider2);\n          if (path == null) {\n            logger.throwError(\"missing path\", logger_1.Logger.errors.MISSING_ARGUMENT, { arg: \"path\" });\n          }\n          _this = _super.call(this, \"ipc://\" + path, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"path\", path);\n          return _this;\n        }\n        IpcProvider2.prototype.send = function(method, params2) {\n          var _this = this;\n          var payload = JSON.stringify({\n            method,\n            params: params2,\n            id: 42,\n            jsonrpc: \"2.0\"\n          });\n          return new Promise(function(resolve, reject) {\n            var response = Buffer.alloc(0);\n            var stream = (0, net_1.connect)(_this.path);\n            stream.on(\"data\", function(data) {\n              response = Buffer.concat([response, data]);\n            });\n            stream.on(\"end\", function() {\n              try {\n                resolve(JSON.parse(response.toString()).result);\n                stream.destroy();\n              } catch (error) {\n                reject(error);\n                stream.destroy();\n              }\n            });\n            stream.on(\"error\", function(error) {\n              reject(error);\n              stream.destroy();\n            });\n            stream.write(payload);\n            stream.end();\n          });\n        };\n        return IpcProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.IpcProvider = IpcProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/infura-provider.js\nvar require_infura_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/infura-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.InfuraProvider = exports2.InfuraWebSocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var websocket_provider_1 = require_websocket_provider();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultProjectId = \"84842078b09946638c03157f83405213\";\n    var InfuraWebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(InfuraWebSocketProvider2, _super);\n        function InfuraWebSocketProvider2(network, apiKey) {\n          var _this = this;\n          var provider = new InfuraProvider(network, apiKey);\n          var connection = provider.connection;\n          if (connection.password) {\n            logger.throwError(\"INFURA WebSocket project secrets unsupported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"InfuraProvider.getWebSocketProvider()\"\n            });\n          }\n          var url = connection.url.replace(/^http/i, \"ws\").replace(\"/v3/\", \"/ws/v3/\");\n          _this = _super.call(this, url, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", provider.projectId);\n          (0, properties_1.defineReadOnly)(_this, \"projectId\", provider.projectId);\n          (0, properties_1.defineReadOnly)(_this, \"projectSecret\", provider.projectSecret);\n          return _this;\n        }\n        InfuraWebSocketProvider2.prototype.isCommunityResource = function() {\n          return this.projectId === defaultProjectId;\n        };\n        return InfuraWebSocketProvider2;\n      }(websocket_provider_1.WebSocketProvider)\n    );\n    exports2.InfuraWebSocketProvider = InfuraWebSocketProvider;\n    var InfuraProvider = (\n      /** @class */\n      function(_super) {\n        __extends(InfuraProvider2, _super);\n        function InfuraProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        InfuraProvider2.getWebSocketProvider = function(network, apiKey) {\n          return new InfuraWebSocketProvider(network, apiKey);\n        };\n        InfuraProvider2.getApiKey = function(apiKey) {\n          var apiKeyObj = {\n            apiKey: defaultProjectId,\n            projectId: defaultProjectId,\n            projectSecret: null\n          };\n          if (apiKey == null) {\n            return apiKeyObj;\n          }\n          if (typeof apiKey === \"string\") {\n            apiKeyObj.projectId = apiKey;\n          } else if (apiKey.projectSecret != null) {\n            logger.assertArgument(typeof apiKey.projectId === \"string\", \"projectSecret requires a projectId\", \"projectId\", apiKey.projectId);\n            logger.assertArgument(typeof apiKey.projectSecret === \"string\", \"invalid projectSecret\", \"projectSecret\", \"[REDACTED]\");\n            apiKeyObj.projectId = apiKey.projectId;\n            apiKeyObj.projectSecret = apiKey.projectSecret;\n          } else if (apiKey.projectId) {\n            apiKeyObj.projectId = apiKey.projectId;\n          }\n          apiKeyObj.apiKey = apiKeyObj.projectId;\n          return apiKeyObj;\n        };\n        InfuraProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network ? network.name : \"unknown\") {\n            case \"homestead\":\n              host = \"mainnet.infura.io\";\n              break;\n            case \"ropsten\":\n              host = \"ropsten.infura.io\";\n              break;\n            case \"rinkeby\":\n              host = \"rinkeby.infura.io\";\n              break;\n            case \"kovan\":\n              host = \"kovan.infura.io\";\n              break;\n            case \"goerli\":\n              host = \"goerli.infura.io\";\n              break;\n            case \"matic\":\n              host = \"polygon-mainnet.infura.io\";\n              break;\n            case \"maticmum\":\n              host = \"polygon-mumbai.infura.io\";\n              break;\n            case \"optimism\":\n              host = \"optimism-mainnet.infura.io\";\n              break;\n            case \"optimism-kovan\":\n              host = \"optimism-kovan.infura.io\";\n              break;\n            case \"arbitrum\":\n              host = \"arbitrum-mainnet.infura.io\";\n              break;\n            case \"arbitrum-rinkeby\":\n              host = \"arbitrum-rinkeby.infura.io\";\n              break;\n            default:\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n          }\n          var connection = {\n            allowGzip: true,\n            url: \"https://\" + host + \"/v3/\" + apiKey.projectId,\n            throttleCallback: function(attempt, url) {\n              if (apiKey.projectId === defaultProjectId) {\n                (0, formatter_1.showThrottleMessage)();\n              }\n              return Promise.resolve(true);\n            }\n          };\n          if (apiKey.projectSecret != null) {\n            connection.user = \"\";\n            connection.password = apiKey.projectSecret;\n          }\n          return connection;\n        };\n        InfuraProvider2.prototype.isCommunityResource = function() {\n          return this.projectId === defaultProjectId;\n        };\n        return InfuraProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.InfuraProvider = InfuraProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/json-rpc-batch-provider.js\nvar require_json_rpc_batch_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/json-rpc-batch-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.JsonRpcBatchProvider = void 0;\n    var properties_1 = require_lib4();\n    var web_1 = require_lib27();\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var JsonRpcBatchProvider = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcBatchProvider2, _super);\n        function JsonRpcBatchProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        JsonRpcBatchProvider2.prototype.send = function(method, params2) {\n          var _this = this;\n          var request = {\n            method,\n            params: params2,\n            id: this._nextId++,\n            jsonrpc: \"2.0\"\n          };\n          if (this._pendingBatch == null) {\n            this._pendingBatch = [];\n          }\n          var inflightRequest = { request, resolve: null, reject: null };\n          var promise = new Promise(function(resolve, reject) {\n            inflightRequest.resolve = resolve;\n            inflightRequest.reject = reject;\n          });\n          this._pendingBatch.push(inflightRequest);\n          if (!this._pendingBatchAggregator) {\n            this._pendingBatchAggregator = setTimeout(function() {\n              var batch = _this._pendingBatch;\n              _this._pendingBatch = null;\n              _this._pendingBatchAggregator = null;\n              var request2 = batch.map(function(inflight) {\n                return inflight.request;\n              });\n              _this.emit(\"debug\", {\n                action: \"requestBatch\",\n                request: (0, properties_1.deepCopy)(request2),\n                provider: _this\n              });\n              return (0, web_1.fetchJson)(_this.connection, JSON.stringify(request2)).then(function(result2) {\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  request: request2,\n                  response: result2,\n                  provider: _this\n                });\n                batch.forEach(function(inflightRequest2, index) {\n                  var payload = result2[index];\n                  if (payload.error) {\n                    var error = new Error(payload.error.message);\n                    error.code = payload.error.code;\n                    error.data = payload.error.data;\n                    inflightRequest2.reject(error);\n                  } else {\n                    inflightRequest2.resolve(payload.result);\n                  }\n                });\n              }, function(error) {\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  error,\n                  request: request2,\n                  provider: _this\n                });\n                batch.forEach(function(inflightRequest2) {\n                  inflightRequest2.reject(error);\n                });\n              });\n            }, 10);\n          }\n          return promise;\n        };\n        return JsonRpcBatchProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.JsonRpcBatchProvider = JsonRpcBatchProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/nodesmith-provider.js\nvar require_nodesmith_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/nodesmith-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NodesmithProvider = void 0;\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var defaultApiKey = \"ETHERS_JS_SHARED\";\n    var NodesmithProvider = (\n      /** @class */\n      function(_super) {\n        __extends(NodesmithProvider2, _super);\n        function NodesmithProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        NodesmithProvider2.getApiKey = function(apiKey) {\n          if (apiKey && typeof apiKey !== \"string\") {\n            logger.throwArgumentError(\"invalid apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKey || defaultApiKey;\n        };\n        NodesmithProvider2.getUrl = function(network, apiKey) {\n          logger.warn(\"NodeSmith will be discontinued on 2019-12-20; please migrate to another platform.\");\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"https://ethereum.api.nodesmith.io/v1/mainnet/jsonrpc\";\n              break;\n            case \"ropsten\":\n              host = \"https://ethereum.api.nodesmith.io/v1/ropsten/jsonrpc\";\n              break;\n            case \"rinkeby\":\n              host = \"https://ethereum.api.nodesmith.io/v1/rinkeby/jsonrpc\";\n              break;\n            case \"goerli\":\n              host = \"https://ethereum.api.nodesmith.io/v1/goerli/jsonrpc\";\n              break;\n            case \"kovan\":\n              host = \"https://ethereum.api.nodesmith.io/v1/kovan/jsonrpc\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return host + \"?apiKey=\" + apiKey;\n        };\n        return NodesmithProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.NodesmithProvider = NodesmithProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/pocket-provider.js\nvar require_pocket_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/pocket-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.PocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultApplicationIds = {\n      homestead: \"6004bcd10040261633ade990\",\n      ropsten: \"6004bd4d0040261633ade991\",\n      rinkeby: \"6004bda20040261633ade994\",\n      goerli: \"6004bd860040261633ade992\"\n    };\n    var PocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(PocketProvider2, _super);\n        function PocketProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          if (apiKey == null) {\n            var n = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n            if (n) {\n              var applicationId = defaultApplicationIds[n.name];\n              if (applicationId) {\n                apiKey = {\n                  applicationId,\n                  loadBalancer: true\n                };\n              }\n            }\n            if (apiKey == null) {\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n            }\n          }\n          _this = _super.call(this, network, apiKey) || this;\n          return _this;\n        }\n        PocketProvider2.getApiKey = function(apiKey) {\n          if (apiKey == null) {\n            logger.throwArgumentError(\"PocketProvider.getApiKey does not support null apiKey\", \"apiKey\", apiKey);\n          }\n          var apiKeyObj = {\n            applicationId: null,\n            loadBalancer: false,\n            applicationSecretKey: null\n          };\n          if (typeof apiKey === \"string\") {\n            apiKeyObj.applicationId = apiKey;\n          } else if (apiKey.applicationSecretKey != null) {\n            logger.assertArgument(typeof apiKey.applicationId === \"string\", \"applicationSecretKey requires an applicationId\", \"applicationId\", apiKey.applicationId);\n            logger.assertArgument(typeof apiKey.applicationSecretKey === \"string\", \"invalid applicationSecretKey\", \"applicationSecretKey\", \"[REDACTED]\");\n            apiKeyObj.applicationId = apiKey.applicationId;\n            apiKeyObj.applicationSecretKey = apiKey.applicationSecretKey;\n            apiKeyObj.loadBalancer = !!apiKey.loadBalancer;\n          } else if (apiKey.applicationId) {\n            logger.assertArgument(typeof apiKey.applicationId === \"string\", \"apiKey.applicationId must be a string\", \"apiKey.applicationId\", apiKey.applicationId);\n            apiKeyObj.applicationId = apiKey.applicationId;\n            apiKeyObj.loadBalancer = !!apiKey.loadBalancer;\n          } else {\n            logger.throwArgumentError(\"unsupported PocketProvider apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKeyObj;\n        };\n        PocketProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network ? network.name : \"unknown\") {\n            case \"homestead\":\n              host = \"eth-mainnet.gateway.pokt.network\";\n              break;\n            case \"ropsten\":\n              host = \"eth-ropsten.gateway.pokt.network\";\n              break;\n            case \"rinkeby\":\n              host = \"eth-rinkeby.gateway.pokt.network\";\n              break;\n            case \"goerli\":\n              host = \"eth-goerli.gateway.pokt.network\";\n              break;\n            default:\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n          }\n          var url = null;\n          if (apiKey.loadBalancer) {\n            url = \"https://\" + host + \"/v1/lb/\" + apiKey.applicationId;\n          } else {\n            url = \"https://\" + host + \"/v1/\" + apiKey.applicationId;\n          }\n          var connection = { url };\n          connection.headers = {};\n          if (apiKey.applicationSecretKey != null) {\n            connection.user = \"\";\n            connection.password = apiKey.applicationSecretKey;\n          }\n          return connection;\n        };\n        PocketProvider2.prototype.isCommunityResource = function() {\n          return this.applicationId === defaultApplicationIds[this.network.name];\n        };\n        return PocketProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.PocketProvider = PocketProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/web3-provider.js\nvar require_web3_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/web3-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Web3Provider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var _nextId = 1;\n    function buildWeb3LegacyFetcher(provider, sendFunc) {\n      var fetcher = \"Web3LegacyFetcher\";\n      return function(method, params2) {\n        var _this = this;\n        var request = {\n          method,\n          params: params2,\n          id: _nextId++,\n          jsonrpc: \"2.0\"\n        };\n        return new Promise(function(resolve, reject) {\n          _this.emit(\"debug\", {\n            action: \"request\",\n            fetcher,\n            request: (0, properties_1.deepCopy)(request),\n            provider: _this\n          });\n          sendFunc(request, function(error, response) {\n            if (error) {\n              _this.emit(\"debug\", {\n                action: \"response\",\n                fetcher,\n                error,\n                request,\n                provider: _this\n              });\n              return reject(error);\n            }\n            _this.emit(\"debug\", {\n              action: \"response\",\n              fetcher,\n              request,\n              response,\n              provider: _this\n            });\n            if (response.error) {\n              var error_1 = new Error(response.error.message);\n              error_1.code = response.error.code;\n              error_1.data = response.error.data;\n              return reject(error_1);\n            }\n            resolve(response.result);\n          });\n        });\n      };\n    }\n    function buildEip1193Fetcher(provider) {\n      return function(method, params2) {\n        var _this = this;\n        if (params2 == null) {\n          params2 = [];\n        }\n        var request = { method, params: params2 };\n        this.emit(\"debug\", {\n          action: \"request\",\n          fetcher: \"Eip1193Fetcher\",\n          request: (0, properties_1.deepCopy)(request),\n          provider: this\n        });\n        return provider.request(request).then(function(response) {\n          _this.emit(\"debug\", {\n            action: \"response\",\n            fetcher: \"Eip1193Fetcher\",\n            request,\n            response,\n            provider: _this\n          });\n          return response;\n        }, function(error) {\n          _this.emit(\"debug\", {\n            action: \"response\",\n            fetcher: \"Eip1193Fetcher\",\n            request,\n            error,\n            provider: _this\n          });\n          throw error;\n        });\n      };\n    }\n    var Web3Provider = (\n      /** @class */\n      function(_super) {\n        __extends(Web3Provider2, _super);\n        function Web3Provider2(provider, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Web3Provider2);\n          if (provider == null) {\n            logger.throwArgumentError(\"missing provider\", \"provider\", provider);\n          }\n          var path = null;\n          var jsonRpcFetchFunc = null;\n          var subprovider = null;\n          if (typeof provider === \"function\") {\n            path = \"unknown:\";\n            jsonRpcFetchFunc = provider;\n          } else {\n            path = provider.host || provider.path || \"\";\n            if (!path && provider.isMetaMask) {\n              path = \"metamask\";\n            }\n            subprovider = provider;\n            if (provider.request) {\n              if (path === \"\") {\n                path = \"eip-1193:\";\n              }\n              jsonRpcFetchFunc = buildEip1193Fetcher(provider);\n            } else if (provider.sendAsync) {\n              jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider));\n            } else if (provider.send) {\n              jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider));\n            } else {\n              logger.throwArgumentError(\"unsupported provider\", \"provider\", provider);\n            }\n            if (!path) {\n              path = \"unknown:\";\n            }\n          }\n          _this = _super.call(this, path, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"jsonRpcFetchFunc\", jsonRpcFetchFunc);\n          (0, properties_1.defineReadOnly)(_this, \"provider\", subprovider);\n          return _this;\n        }\n        Web3Provider2.prototype.send = function(method, params2) {\n          return this.jsonRpcFetchFunc(method, params2);\n        };\n        return Web3Provider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.Web3Provider = Web3Provider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/index.js\nvar require_lib28 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Formatter = exports2.showThrottleMessage = exports2.isCommunityResourcable = exports2.isCommunityResource = exports2.getNetwork = exports2.getDefaultProvider = exports2.JsonRpcSigner = exports2.IpcProvider = exports2.WebSocketProvider = exports2.Web3Provider = exports2.StaticJsonRpcProvider = exports2.PocketProvider = exports2.NodesmithProvider = exports2.JsonRpcBatchProvider = exports2.JsonRpcProvider = exports2.InfuraWebSocketProvider = exports2.InfuraProvider = exports2.EtherscanProvider = exports2.CloudflareProvider = exports2.AlchemyWebSocketProvider = exports2.AlchemyProvider = exports2.FallbackProvider = exports2.UrlJsonRpcProvider = exports2.Resolver = exports2.BaseProvider = exports2.Provider = void 0;\n    var abstract_provider_1 = require_lib12();\n    Object.defineProperty(exports2, \"Provider\", { enumerable: true, get: function() {\n      return abstract_provider_1.Provider;\n    } });\n    var networks_1 = require_lib25();\n    Object.defineProperty(exports2, \"getNetwork\", { enumerable: true, get: function() {\n      return networks_1.getNetwork;\n    } });\n    var base_provider_1 = require_base_provider();\n    Object.defineProperty(exports2, \"BaseProvider\", { enumerable: true, get: function() {\n      return base_provider_1.BaseProvider;\n    } });\n    Object.defineProperty(exports2, \"Resolver\", { enumerable: true, get: function() {\n      return base_provider_1.Resolver;\n    } });\n    var alchemy_provider_1 = require_alchemy_provider();\n    Object.defineProperty(exports2, \"AlchemyProvider\", { enumerable: true, get: function() {\n      return alchemy_provider_1.AlchemyProvider;\n    } });\n    Object.defineProperty(exports2, \"AlchemyWebSocketProvider\", { enumerable: true, get: function() {\n      return alchemy_provider_1.AlchemyWebSocketProvider;\n    } });\n    var cloudflare_provider_1 = require_cloudflare_provider();\n    Object.defineProperty(exports2, \"CloudflareProvider\", { enumerable: true, get: function() {\n      return cloudflare_provider_1.CloudflareProvider;\n    } });\n    var etherscan_provider_1 = require_etherscan_provider();\n    Object.defineProperty(exports2, \"EtherscanProvider\", { enumerable: true, get: function() {\n      return etherscan_provider_1.EtherscanProvider;\n    } });\n    var fallback_provider_1 = require_fallback_provider();\n    Object.defineProperty(exports2, \"FallbackProvider\", { enumerable: true, get: function() {\n      return fallback_provider_1.FallbackProvider;\n    } });\n    var ipc_provider_1 = require_ipc_provider();\n    Object.defineProperty(exports2, \"IpcProvider\", { enumerable: true, get: function() {\n      return ipc_provider_1.IpcProvider;\n    } });\n    var infura_provider_1 = require_infura_provider();\n    Object.defineProperty(exports2, \"InfuraProvider\", { enumerable: true, get: function() {\n      return infura_provider_1.InfuraProvider;\n    } });\n    Object.defineProperty(exports2, \"InfuraWebSocketProvider\", { enumerable: true, get: function() {\n      return infura_provider_1.InfuraWebSocketProvider;\n    } });\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    Object.defineProperty(exports2, \"JsonRpcProvider\", { enumerable: true, get: function() {\n      return json_rpc_provider_1.JsonRpcProvider;\n    } });\n    Object.defineProperty(exports2, \"JsonRpcSigner\", { enumerable: true, get: function() {\n      return json_rpc_provider_1.JsonRpcSigner;\n    } });\n    var json_rpc_batch_provider_1 = require_json_rpc_batch_provider();\n    Object.defineProperty(exports2, \"JsonRpcBatchProvider\", { enumerable: true, get: function() {\n      return json_rpc_batch_provider_1.JsonRpcBatchProvider;\n    } });\n    var nodesmith_provider_1 = require_nodesmith_provider();\n    Object.defineProperty(exports2, \"NodesmithProvider\", { enumerable: true, get: function() {\n      return nodesmith_provider_1.NodesmithProvider;\n    } });\n    var pocket_provider_1 = require_pocket_provider();\n    Object.defineProperty(exports2, \"PocketProvider\", { enumerable: true, get: function() {\n      return pocket_provider_1.PocketProvider;\n    } });\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    Object.defineProperty(exports2, \"StaticJsonRpcProvider\", { enumerable: true, get: function() {\n      return url_json_rpc_provider_1.StaticJsonRpcProvider;\n    } });\n    Object.defineProperty(exports2, \"UrlJsonRpcProvider\", { enumerable: true, get: function() {\n      return url_json_rpc_provider_1.UrlJsonRpcProvider;\n    } });\n    var web3_provider_1 = require_web3_provider();\n    Object.defineProperty(exports2, \"Web3Provider\", { enumerable: true, get: function() {\n      return web3_provider_1.Web3Provider;\n    } });\n    var websocket_provider_1 = require_websocket_provider();\n    Object.defineProperty(exports2, \"WebSocketProvider\", { enumerable: true, get: function() {\n      return websocket_provider_1.WebSocketProvider;\n    } });\n    var formatter_1 = require_formatter();\n    Object.defineProperty(exports2, \"Formatter\", { enumerable: true, get: function() {\n      return formatter_1.Formatter;\n    } });\n    Object.defineProperty(exports2, \"isCommunityResourcable\", { enumerable: true, get: function() {\n      return formatter_1.isCommunityResourcable;\n    } });\n    Object.defineProperty(exports2, \"isCommunityResource\", { enumerable: true, get: function() {\n      return formatter_1.isCommunityResource;\n    } });\n    Object.defineProperty(exports2, \"showThrottleMessage\", { enumerable: true, get: function() {\n      return formatter_1.showThrottleMessage;\n    } });\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getDefaultProvider(network, options) {\n      if (network == null) {\n        network = \"homestead\";\n      }\n      if (typeof network === \"string\") {\n        var match = network.match(/^(ws|http)s?:/i);\n        if (match) {\n          switch (match[1]) {\n            case \"http\":\n              return new json_rpc_provider_1.JsonRpcProvider(network);\n            case \"ws\":\n              return new websocket_provider_1.WebSocketProvider(network);\n            default:\n              logger.throwArgumentError(\"unsupported URL scheme\", \"network\", network);\n          }\n        }\n      }\n      var n = (0, networks_1.getNetwork)(network);\n      if (!n || !n._defaultProvider) {\n        logger.throwError(\"unsupported getDefaultProvider network\", logger_1.Logger.errors.NETWORK_ERROR, {\n          operation: \"getDefaultProvider\",\n          network\n        });\n      }\n      return n._defaultProvider({\n        FallbackProvider: fallback_provider_1.FallbackProvider,\n        AlchemyProvider: alchemy_provider_1.AlchemyProvider,\n        CloudflareProvider: cloudflare_provider_1.CloudflareProvider,\n        EtherscanProvider: etherscan_provider_1.EtherscanProvider,\n        InfuraProvider: infura_provider_1.InfuraProvider,\n        JsonRpcProvider: json_rpc_provider_1.JsonRpcProvider,\n        NodesmithProvider: nodesmith_provider_1.NodesmithProvider,\n        PocketProvider: pocket_provider_1.PocketProvider,\n        Web3Provider: web3_provider_1.Web3Provider,\n        IpcProvider: ipc_provider_1.IpcProvider\n      }, options);\n    }\n    exports2.getDefaultProvider = getDefaultProvider;\n  }\n});\n\n// node_modules/@ethersproject/solidity/lib/_version.js\nvar require_version23 = __commonJS({\n  \"node_modules/@ethersproject/solidity/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"solidity/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/solidity/lib/index.js\nvar require_lib29 = __commonJS({\n  \"node_modules/@ethersproject/solidity/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.sha256 = exports2.keccak256 = exports2.pack = void 0;\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var sha2_1 = require_lib19();\n    var strings_1 = require_lib9();\n    var regexBytes = new RegExp(\"^bytes([0-9]+)$\");\n    var regexNumber = new RegExp(\"^(u?int)([0-9]*)$\");\n    var regexArray = new RegExp(\"^(.*)\\\\[([0-9]*)\\\\]$\");\n    var Zeros = \"0000000000000000000000000000000000000000000000000000000000000000\";\n    var logger_1 = require_lib();\n    var _version_1 = require_version23();\n    var logger = new logger_1.Logger(_version_1.version);\n    function _pack(type, value, isArray) {\n      switch (type) {\n        case \"address\":\n          if (isArray) {\n            return (0, bytes_1.zeroPad)(value, 32);\n          }\n          return (0, bytes_1.arrayify)(value);\n        case \"string\":\n          return (0, strings_1.toUtf8Bytes)(value);\n        case \"bytes\":\n          return (0, bytes_1.arrayify)(value);\n        case \"bool\":\n          value = value ? \"0x01\" : \"0x00\";\n          if (isArray) {\n            return (0, bytes_1.zeroPad)(value, 32);\n          }\n          return (0, bytes_1.arrayify)(value);\n      }\n      var match = type.match(regexNumber);\n      if (match) {\n        var size = parseInt(match[2] || \"256\");\n        if (match[2] && String(size) !== match[2] || size % 8 !== 0 || size === 0 || size > 256) {\n          logger.throwArgumentError(\"invalid number type\", \"type\", type);\n        }\n        if (isArray) {\n          size = 256;\n        }\n        value = bignumber_1.BigNumber.from(value).toTwos(size);\n        return (0, bytes_1.zeroPad)(value, size / 8);\n      }\n      match = type.match(regexBytes);\n      if (match) {\n        var size = parseInt(match[1]);\n        if (String(size) !== match[1] || size === 0 || size > 32) {\n          logger.throwArgumentError(\"invalid bytes type\", \"type\", type);\n        }\n        if ((0, bytes_1.arrayify)(value).byteLength !== size) {\n          logger.throwArgumentError(\"invalid value for \" + type, \"value\", value);\n        }\n        if (isArray) {\n          return (0, bytes_1.arrayify)((value + Zeros).substring(0, 66));\n        }\n        return value;\n      }\n      match = type.match(regexArray);\n      if (match && Array.isArray(value)) {\n        var baseType_1 = match[1];\n        var count = parseInt(match[2] || String(value.length));\n        if (count != value.length) {\n          logger.throwArgumentError(\"invalid array length for \" + type, \"value\", value);\n        }\n        var result_1 = [];\n        value.forEach(function(value2) {\n          result_1.push(_pack(baseType_1, value2, true));\n        });\n        return (0, bytes_1.concat)(result_1);\n      }\n      return logger.throwArgumentError(\"invalid type\", \"type\", type);\n    }\n    function pack(types, values) {\n      if (types.length != values.length) {\n        logger.throwArgumentError(\"wrong number of values; expected ${ types.length }\", \"values\", values);\n      }\n      var tight = [];\n      types.forEach(function(type, index) {\n        tight.push(_pack(type, values[index]));\n      });\n      return (0, bytes_1.hexlify)((0, bytes_1.concat)(tight));\n    }\n    exports2.pack = pack;\n    function keccak256(types, values) {\n      return (0, keccak256_1.keccak256)(pack(types, values));\n    }\n    exports2.keccak256 = keccak256;\n    function sha256(types, values) {\n      return (0, sha2_1.sha256)(pack(types, values));\n    }\n    exports2.sha256 = sha256;\n  }\n});\n\n// node_modules/@ethersproject/units/lib/_version.js\nvar require_version24 = __commonJS({\n  \"node_modules/@ethersproject/units/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"units/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/units/lib/index.js\nvar require_lib30 = __commonJS({\n  \"node_modules/@ethersproject/units/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parseEther = exports2.formatEther = exports2.parseUnits = exports2.formatUnits = exports2.commify = void 0;\n    var bignumber_1 = require_lib3();\n    var logger_1 = require_lib();\n    var _version_1 = require_version24();\n    var logger = new logger_1.Logger(_version_1.version);\n    var names = [\n      \"wei\",\n      \"kwei\",\n      \"mwei\",\n      \"gwei\",\n      \"szabo\",\n      \"finney\",\n      \"ether\"\n    ];\n    function commify(value) {\n      var comps = String(value).split(\".\");\n      if (comps.length > 2 || !comps[0].match(/^-?[0-9]*$/) || comps[1] && !comps[1].match(/^[0-9]*$/) || value === \".\" || value === \"-.\") {\n        logger.throwArgumentError(\"invalid value\", \"value\", value);\n      }\n      var whole = comps[0];\n      var negative = \"\";\n      if (whole.substring(0, 1) === \"-\") {\n        negative = \"-\";\n        whole = whole.substring(1);\n      }\n      while (whole.substring(0, 1) === \"0\") {\n        whole = whole.substring(1);\n      }\n      if (whole === \"\") {\n        whole = \"0\";\n      }\n      var suffix = \"\";\n      if (comps.length === 2) {\n        suffix = \".\" + (comps[1] || \"0\");\n      }\n      while (suffix.length > 2 && suffix[suffix.length - 1] === \"0\") {\n        suffix = suffix.substring(0, suffix.length - 1);\n      }\n      var formatted = [];\n      while (whole.length) {\n        if (whole.length <= 3) {\n          formatted.unshift(whole);\n          break;\n        } else {\n          var index = whole.length - 3;\n          formatted.unshift(whole.substring(index));\n          whole = whole.substring(0, index);\n        }\n      }\n      return negative + formatted.join(\",\") + suffix;\n    }\n    exports2.commify = commify;\n    function formatUnits(value, unitName) {\n      if (typeof unitName === \"string\") {\n        var index = names.indexOf(unitName);\n        if (index !== -1) {\n          unitName = 3 * index;\n        }\n      }\n      return (0, bignumber_1.formatFixed)(value, unitName != null ? unitName : 18);\n    }\n    exports2.formatUnits = formatUnits;\n    function parseUnits(value, unitName) {\n      if (typeof value !== \"string\") {\n        logger.throwArgumentError(\"value must be a string\", \"value\", value);\n      }\n      if (typeof unitName === \"string\") {\n        var index = names.indexOf(unitName);\n        if (index !== -1) {\n          unitName = 3 * index;\n        }\n      }\n      return (0, bignumber_1.parseFixed)(value, unitName != null ? unitName : 18);\n    }\n    exports2.parseUnits = parseUnits;\n    function formatEther(wei) {\n      return formatUnits(wei, 18);\n    }\n    exports2.formatEther = formatEther;\n    function parseEther(ether) {\n      return parseUnits(ether, 18);\n    }\n    exports2.parseEther = parseEther;\n  }\n});\n\n// node_modules/ethers/lib/utils.js\nvar require_utils5 = __commonJS({\n  \"node_modules/ethers/lib/utils.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result2 = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result2, mod, k);\n      }\n      __setModuleDefault(result2, mod);\n      return result2;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.formatBytes32String = exports2.Utf8ErrorFuncs = exports2.toUtf8String = exports2.toUtf8CodePoints = exports2.toUtf8Bytes = exports2._toEscapedUtf8String = exports2.nameprep = exports2.hexDataSlice = exports2.hexDataLength = exports2.hexZeroPad = exports2.hexValue = exports2.hexStripZeros = exports2.hexConcat = exports2.isHexString = exports2.hexlify = exports2.base64 = exports2.base58 = exports2.TransactionDescription = exports2.LogDescription = exports2.Interface = exports2.SigningKey = exports2.HDNode = exports2.defaultPath = exports2.isBytesLike = exports2.isBytes = exports2.zeroPad = exports2.stripZeros = exports2.concat = exports2.arrayify = exports2.shallowCopy = exports2.resolveProperties = exports2.getStatic = exports2.defineReadOnly = exports2.deepCopy = exports2.checkProperties = exports2.poll = exports2.fetchJson = exports2._fetchData = exports2.RLP = exports2.Logger = exports2.checkResultErrors = exports2.FormatTypes = exports2.ParamType = exports2.FunctionFragment = exports2.EventFragment = exports2.ErrorFragment = exports2.ConstructorFragment = exports2.Fragment = exports2.defaultAbiCoder = exports2.AbiCoder = void 0;\n    exports2.Indexed = exports2.Utf8ErrorReason = exports2.UnicodeNormalizationForm = exports2.SupportedAlgorithm = exports2.mnemonicToSeed = exports2.isValidMnemonic = exports2.entropyToMnemonic = exports2.mnemonicToEntropy = exports2.getAccountPath = exports2.verifyTypedData = exports2.verifyMessage = exports2.recoverPublicKey = exports2.computePublicKey = exports2.recoverAddress = exports2.computeAddress = exports2.getJsonWalletAddress = exports2.TransactionTypes = exports2.serializeTransaction = exports2.parseTransaction = exports2.accessListify = exports2.joinSignature = exports2.splitSignature = exports2.soliditySha256 = exports2.solidityKeccak256 = exports2.solidityPack = exports2.shuffled = exports2.randomBytes = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = exports2.keccak256 = exports2.computeHmac = exports2.commify = exports2.parseUnits = exports2.formatUnits = exports2.parseEther = exports2.formatEther = exports2.isAddress = exports2.getCreate2Address = exports2.getContractAddress = exports2.getIcapAddress = exports2.getAddress = exports2._TypedDataEncoder = exports2.id = exports2.isValidName = exports2.namehash = exports2.hashMessage = exports2.parseBytes32String = void 0;\n    var abi_1 = require_lib11();\n    Object.defineProperty(exports2, \"AbiCoder\", { enumerable: true, get: function() {\n      return abi_1.AbiCoder;\n    } });\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return abi_1.checkResultErrors;\n    } });\n    Object.defineProperty(exports2, \"ConstructorFragment\", { enumerable: true, get: function() {\n      return abi_1.ConstructorFragment;\n    } });\n    Object.defineProperty(exports2, \"defaultAbiCoder\", { enumerable: true, get: function() {\n      return abi_1.defaultAbiCoder;\n    } });\n    Object.defineProperty(exports2, \"ErrorFragment\", { enumerable: true, get: function() {\n      return abi_1.ErrorFragment;\n    } });\n    Object.defineProperty(exports2, \"EventFragment\", { enumerable: true, get: function() {\n      return abi_1.EventFragment;\n    } });\n    Object.defineProperty(exports2, \"FormatTypes\", { enumerable: true, get: function() {\n      return abi_1.FormatTypes;\n    } });\n    Object.defineProperty(exports2, \"Fragment\", { enumerable: true, get: function() {\n      return abi_1.Fragment;\n    } });\n    Object.defineProperty(exports2, \"FunctionFragment\", { enumerable: true, get: function() {\n      return abi_1.FunctionFragment;\n    } });\n    Object.defineProperty(exports2, \"Indexed\", { enumerable: true, get: function() {\n      return abi_1.Indexed;\n    } });\n    Object.defineProperty(exports2, \"Interface\", { enumerable: true, get: function() {\n      return abi_1.Interface;\n    } });\n    Object.defineProperty(exports2, \"LogDescription\", { enumerable: true, get: function() {\n      return abi_1.LogDescription;\n    } });\n    Object.defineProperty(exports2, \"ParamType\", { enumerable: true, get: function() {\n      return abi_1.ParamType;\n    } });\n    Object.defineProperty(exports2, \"TransactionDescription\", { enumerable: true, get: function() {\n      return abi_1.TransactionDescription;\n    } });\n    var address_1 = require_lib7();\n    Object.defineProperty(exports2, \"getAddress\", { enumerable: true, get: function() {\n      return address_1.getAddress;\n    } });\n    Object.defineProperty(exports2, \"getCreate2Address\", { enumerable: true, get: function() {\n      return address_1.getCreate2Address;\n    } });\n    Object.defineProperty(exports2, \"getContractAddress\", { enumerable: true, get: function() {\n      return address_1.getContractAddress;\n    } });\n    Object.defineProperty(exports2, \"getIcapAddress\", { enumerable: true, get: function() {\n      return address_1.getIcapAddress;\n    } });\n    Object.defineProperty(exports2, \"isAddress\", { enumerable: true, get: function() {\n      return address_1.isAddress;\n    } });\n    var base64 = __importStar(require_lib26());\n    exports2.base64 = base64;\n    var basex_1 = require_lib17();\n    Object.defineProperty(exports2, \"base58\", { enumerable: true, get: function() {\n      return basex_1.Base58;\n    } });\n    var bytes_1 = require_lib2();\n    Object.defineProperty(exports2, \"arrayify\", { enumerable: true, get: function() {\n      return bytes_1.arrayify;\n    } });\n    Object.defineProperty(exports2, \"concat\", { enumerable: true, get: function() {\n      return bytes_1.concat;\n    } });\n    Object.defineProperty(exports2, \"hexConcat\", { enumerable: true, get: function() {\n      return bytes_1.hexConcat;\n    } });\n    Object.defineProperty(exports2, \"hexDataSlice\", { enumerable: true, get: function() {\n      return bytes_1.hexDataSlice;\n    } });\n    Object.defineProperty(exports2, \"hexDataLength\", { enumerable: true, get: function() {\n      return bytes_1.hexDataLength;\n    } });\n    Object.defineProperty(exports2, \"hexlify\", { enumerable: true, get: function() {\n      return bytes_1.hexlify;\n    } });\n    Object.defineProperty(exports2, \"hexStripZeros\", { enumerable: true, get: function() {\n      return bytes_1.hexStripZeros;\n    } });\n    Object.defineProperty(exports2, \"hexValue\", { enumerable: true, get: function() {\n      return bytes_1.hexValue;\n    } });\n    Object.defineProperty(exports2, \"hexZeroPad\", { enumerable: true, get: function() {\n      return bytes_1.hexZeroPad;\n    } });\n    Object.defineProperty(exports2, \"isBytes\", { enumerable: true, get: function() {\n      return bytes_1.isBytes;\n    } });\n    Object.defineProperty(exports2, \"isBytesLike\", { enumerable: true, get: function() {\n      return bytes_1.isBytesLike;\n    } });\n    Object.defineProperty(exports2, \"isHexString\", { enumerable: true, get: function() {\n      return bytes_1.isHexString;\n    } });\n    Object.defineProperty(exports2, \"joinSignature\", { enumerable: true, get: function() {\n      return bytes_1.joinSignature;\n    } });\n    Object.defineProperty(exports2, \"zeroPad\", { enumerable: true, get: function() {\n      return bytes_1.zeroPad;\n    } });\n    Object.defineProperty(exports2, \"splitSignature\", { enumerable: true, get: function() {\n      return bytes_1.splitSignature;\n    } });\n    Object.defineProperty(exports2, \"stripZeros\", { enumerable: true, get: function() {\n      return bytes_1.stripZeros;\n    } });\n    var hash_1 = require_lib10();\n    Object.defineProperty(exports2, \"_TypedDataEncoder\", { enumerable: true, get: function() {\n      return hash_1._TypedDataEncoder;\n    } });\n    Object.defineProperty(exports2, \"hashMessage\", { enumerable: true, get: function() {\n      return hash_1.hashMessage;\n    } });\n    Object.defineProperty(exports2, \"id\", { enumerable: true, get: function() {\n      return hash_1.id;\n    } });\n    Object.defineProperty(exports2, \"isValidName\", { enumerable: true, get: function() {\n      return hash_1.isValidName;\n    } });\n    Object.defineProperty(exports2, \"namehash\", { enumerable: true, get: function() {\n      return hash_1.namehash;\n    } });\n    var hdnode_1 = require_lib21();\n    Object.defineProperty(exports2, \"defaultPath\", { enumerable: true, get: function() {\n      return hdnode_1.defaultPath;\n    } });\n    Object.defineProperty(exports2, \"entropyToMnemonic\", { enumerable: true, get: function() {\n      return hdnode_1.entropyToMnemonic;\n    } });\n    Object.defineProperty(exports2, \"getAccountPath\", { enumerable: true, get: function() {\n      return hdnode_1.getAccountPath;\n    } });\n    Object.defineProperty(exports2, \"HDNode\", { enumerable: true, get: function() {\n      return hdnode_1.HDNode;\n    } });\n    Object.defineProperty(exports2, \"isValidMnemonic\", { enumerable: true, get: function() {\n      return hdnode_1.isValidMnemonic;\n    } });\n    Object.defineProperty(exports2, \"mnemonicToEntropy\", { enumerable: true, get: function() {\n      return hdnode_1.mnemonicToEntropy;\n    } });\n    Object.defineProperty(exports2, \"mnemonicToSeed\", { enumerable: true, get: function() {\n      return hdnode_1.mnemonicToSeed;\n    } });\n    var json_wallets_1 = require_lib23();\n    Object.defineProperty(exports2, \"getJsonWalletAddress\", { enumerable: true, get: function() {\n      return json_wallets_1.getJsonWalletAddress;\n    } });\n    var keccak256_1 = require_lib5();\n    Object.defineProperty(exports2, \"keccak256\", { enumerable: true, get: function() {\n      return keccak256_1.keccak256;\n    } });\n    var logger_1 = require_lib();\n    Object.defineProperty(exports2, \"Logger\", { enumerable: true, get: function() {\n      return logger_1.Logger;\n    } });\n    var sha2_1 = require_lib19();\n    Object.defineProperty(exports2, \"computeHmac\", { enumerable: true, get: function() {\n      return sha2_1.computeHmac;\n    } });\n    Object.defineProperty(exports2, \"ripemd160\", { enumerable: true, get: function() {\n      return sha2_1.ripemd160;\n    } });\n    Object.defineProperty(exports2, \"sha256\", { enumerable: true, get: function() {\n      return sha2_1.sha256;\n    } });\n    Object.defineProperty(exports2, \"sha512\", { enumerable: true, get: function() {\n      return sha2_1.sha512;\n    } });\n    var solidity_1 = require_lib29();\n    Object.defineProperty(exports2, \"solidityKeccak256\", { enumerable: true, get: function() {\n      return solidity_1.keccak256;\n    } });\n    Object.defineProperty(exports2, \"solidityPack\", { enumerable: true, get: function() {\n      return solidity_1.pack;\n    } });\n    Object.defineProperty(exports2, \"soliditySha256\", { enumerable: true, get: function() {\n      return solidity_1.sha256;\n    } });\n    var random_1 = require_lib22();\n    Object.defineProperty(exports2, \"randomBytes\", { enumerable: true, get: function() {\n      return random_1.randomBytes;\n    } });\n    Object.defineProperty(exports2, \"shuffled\", { enumerable: true, get: function() {\n      return random_1.shuffled;\n    } });\n    var properties_1 = require_lib4();\n    Object.defineProperty(exports2, \"checkProperties\", { enumerable: true, get: function() {\n      return properties_1.checkProperties;\n    } });\n    Object.defineProperty(exports2, \"deepCopy\", { enumerable: true, get: function() {\n      return properties_1.deepCopy;\n    } });\n    Object.defineProperty(exports2, \"defineReadOnly\", { enumerable: true, get: function() {\n      return properties_1.defineReadOnly;\n    } });\n    Object.defineProperty(exports2, \"getStatic\", { enumerable: true, get: function() {\n      return properties_1.getStatic;\n    } });\n    Object.defineProperty(exports2, \"resolveProperties\", { enumerable: true, get: function() {\n      return properties_1.resolveProperties;\n    } });\n    Object.defineProperty(exports2, \"shallowCopy\", { enumerable: true, get: function() {\n      return properties_1.shallowCopy;\n    } });\n    var RLP = __importStar(require_lib6());\n    exports2.RLP = RLP;\n    var signing_key_1 = require_lib14();\n    Object.defineProperty(exports2, \"computePublicKey\", { enumerable: true, get: function() {\n      return signing_key_1.computePublicKey;\n    } });\n    Object.defineProperty(exports2, \"recoverPublicKey\", { enumerable: true, get: function() {\n      return signing_key_1.recoverPublicKey;\n    } });\n    Object.defineProperty(exports2, \"SigningKey\", { enumerable: true, get: function() {\n      return signing_key_1.SigningKey;\n    } });\n    var strings_1 = require_lib9();\n    Object.defineProperty(exports2, \"formatBytes32String\", { enumerable: true, get: function() {\n      return strings_1.formatBytes32String;\n    } });\n    Object.defineProperty(exports2, \"nameprep\", { enumerable: true, get: function() {\n      return strings_1.nameprep;\n    } });\n    Object.defineProperty(exports2, \"parseBytes32String\", { enumerable: true, get: function() {\n      return strings_1.parseBytes32String;\n    } });\n    Object.defineProperty(exports2, \"_toEscapedUtf8String\", { enumerable: true, get: function() {\n      return strings_1._toEscapedUtf8String;\n    } });\n    Object.defineProperty(exports2, \"toUtf8Bytes\", { enumerable: true, get: function() {\n      return strings_1.toUtf8Bytes;\n    } });\n    Object.defineProperty(exports2, \"toUtf8CodePoints\", { enumerable: true, get: function() {\n      return strings_1.toUtf8CodePoints;\n    } });\n    Object.defineProperty(exports2, \"toUtf8String\", { enumerable: true, get: function() {\n      return strings_1.toUtf8String;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorFuncs\", { enumerable: true, get: function() {\n      return strings_1.Utf8ErrorFuncs;\n    } });\n    var transactions_1 = require_lib15();\n    Object.defineProperty(exports2, \"accessListify\", { enumerable: true, get: function() {\n      return transactions_1.accessListify;\n    } });\n    Object.defineProperty(exports2, \"computeAddress\", { enumerable: true, get: function() {\n      return transactions_1.computeAddress;\n    } });\n    Object.defineProperty(exports2, \"parseTransaction\", { enumerable: true, get: function() {\n      return transactions_1.parse;\n    } });\n    Object.defineProperty(exports2, \"recoverAddress\", { enumerable: true, get: function() {\n      return transactions_1.recoverAddress;\n    } });\n    Object.defineProperty(exports2, \"serializeTransaction\", { enumerable: true, get: function() {\n      return transactions_1.serialize;\n    } });\n    Object.defineProperty(exports2, \"TransactionTypes\", { enumerable: true, get: function() {\n      return transactions_1.TransactionTypes;\n    } });\n    var units_1 = require_lib30();\n    Object.defineProperty(exports2, \"commify\", { enumerable: true, get: function() {\n      return units_1.commify;\n    } });\n    Object.defineProperty(exports2, \"formatEther\", { enumerable: true, get: function() {\n      return units_1.formatEther;\n    } });\n    Object.defineProperty(exports2, \"parseEther\", { enumerable: true, get: function() {\n      return units_1.parseEther;\n    } });\n    Object.defineProperty(exports2, \"formatUnits\", { enumerable: true, get: function() {\n      return units_1.formatUnits;\n    } });\n    Object.defineProperty(exports2, \"parseUnits\", { enumerable: true, get: function() {\n      return units_1.parseUnits;\n    } });\n    var wallet_1 = require_lib24();\n    Object.defineProperty(exports2, \"verifyMessage\", { enumerable: true, get: function() {\n      return wallet_1.verifyMessage;\n    } });\n    Object.defineProperty(exports2, \"verifyTypedData\", { enumerable: true, get: function() {\n      return wallet_1.verifyTypedData;\n    } });\n    var web_1 = require_lib27();\n    Object.defineProperty(exports2, \"_fetchData\", { enumerable: true, get: function() {\n      return web_1._fetchData;\n    } });\n    Object.defineProperty(exports2, \"fetchJson\", { enumerable: true, get: function() {\n      return web_1.fetchJson;\n    } });\n    Object.defineProperty(exports2, \"poll\", { enumerable: true, get: function() {\n      return web_1.poll;\n    } });\n    var sha2_2 = require_lib19();\n    Object.defineProperty(exports2, \"SupportedAlgorithm\", { enumerable: true, get: function() {\n      return sha2_2.SupportedAlgorithm;\n    } });\n    var strings_2 = require_lib9();\n    Object.defineProperty(exports2, \"UnicodeNormalizationForm\", { enumerable: true, get: function() {\n      return strings_2.UnicodeNormalizationForm;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorReason\", { enumerable: true, get: function() {\n      return strings_2.Utf8ErrorReason;\n    } });\n  }\n});\n\n// node_modules/ethers/lib/_version.js\nvar require_version25 = __commonJS({\n  \"node_modules/ethers/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"ethers/5.5.2\";\n  }\n});\n\n// node_modules/ethers/lib/ethers.js\nvar require_ethers = __commonJS({\n  \"node_modules/ethers/lib/ethers.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result2 = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result2, mod, k);\n      }\n      __setModuleDefault(result2, mod);\n      return result2;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.version = exports2.wordlists = exports2.utils = exports2.logger = exports2.errors = exports2.constants = exports2.FixedNumber = exports2.BigNumber = exports2.ContractFactory = exports2.Contract = exports2.BaseContract = exports2.providers = exports2.getDefaultProvider = exports2.VoidSigner = exports2.Wallet = exports2.Signer = void 0;\n    var contracts_1 = require_lib16();\n    Object.defineProperty(exports2, \"BaseContract\", { enumerable: true, get: function() {\n      return contracts_1.BaseContract;\n    } });\n    Object.defineProperty(exports2, \"Contract\", { enumerable: true, get: function() {\n      return contracts_1.Contract;\n    } });\n    Object.defineProperty(exports2, \"ContractFactory\", { enumerable: true, get: function() {\n      return contracts_1.ContractFactory;\n    } });\n    var bignumber_1 = require_lib3();\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return bignumber_1.BigNumber;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return bignumber_1.FixedNumber;\n    } });\n    var abstract_signer_1 = require_lib13();\n    Object.defineProperty(exports2, \"Signer\", { enumerable: true, get: function() {\n      return abstract_signer_1.Signer;\n    } });\n    Object.defineProperty(exports2, \"VoidSigner\", { enumerable: true, get: function() {\n      return abstract_signer_1.VoidSigner;\n    } });\n    var wallet_1 = require_lib24();\n    Object.defineProperty(exports2, \"Wallet\", { enumerable: true, get: function() {\n      return wallet_1.Wallet;\n    } });\n    var constants = __importStar(require_lib8());\n    exports2.constants = constants;\n    var providers = __importStar(require_lib28());\n    exports2.providers = providers;\n    var providers_1 = require_lib28();\n    Object.defineProperty(exports2, \"getDefaultProvider\", { enumerable: true, get: function() {\n      return providers_1.getDefaultProvider;\n    } });\n    var wordlists_1 = require_lib20();\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return wordlists_1.Wordlist;\n    } });\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return wordlists_1.wordlists;\n    } });\n    var utils = __importStar(require_utils5());\n    exports2.utils = utils;\n    var logger_1 = require_lib();\n    Object.defineProperty(exports2, \"errors\", { enumerable: true, get: function() {\n      return logger_1.ErrorCode;\n    } });\n    var _version_1 = require_version25();\n    Object.defineProperty(exports2, \"version\", { enumerable: true, get: function() {\n      return _version_1.version;\n    } });\n    var logger = new logger_1.Logger(_version_1.version);\n    exports2.logger = logger;\n  }\n});\n\n// node_modules/ethers/lib/index.js\nvar require_lib31 = __commonJS({\n  \"node_modules/ethers/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result2 = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result2, mod, k);\n      }\n      __setModuleDefault(result2, mod);\n      return result2;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.version = exports2.wordlists = exports2.utils = exports2.logger = exports2.errors = exports2.constants = exports2.FixedNumber = exports2.BigNumber = exports2.ContractFactory = exports2.Contract = exports2.BaseContract = exports2.providers = exports2.getDefaultProvider = exports2.VoidSigner = exports2.Wallet = exports2.Signer = exports2.ethers = void 0;\n    var ethers2 = __importStar(require_ethers());\n    exports2.ethers = ethers2;\n    try {\n      anyGlobal = window;\n      if (anyGlobal._ethers == null) {\n        anyGlobal._ethers = ethers2;\n      }\n    } catch (error) {\n    }\n    var anyGlobal;\n    var ethers_1 = require_ethers();\n    Object.defineProperty(exports2, \"Signer\", { enumerable: true, get: function() {\n      return ethers_1.Signer;\n    } });\n    Object.defineProperty(exports2, \"Wallet\", { enumerable: true, get: function() {\n      return ethers_1.Wallet;\n    } });\n    Object.defineProperty(exports2, \"VoidSigner\", { enumerable: true, get: function() {\n      return ethers_1.VoidSigner;\n    } });\n    Object.defineProperty(exports2, \"getDefaultProvider\", { enumerable: true, get: function() {\n      return ethers_1.getDefaultProvider;\n    } });\n    Object.defineProperty(exports2, \"providers\", { enumerable: true, get: function() {\n      return ethers_1.providers;\n    } });\n    Object.defineProperty(exports2, \"BaseContract\", { enumerable: true, get: function() {\n      return ethers_1.BaseContract;\n    } });\n    Object.defineProperty(exports2, \"Contract\", { enumerable: true, get: function() {\n      return ethers_1.Contract;\n    } });\n    Object.defineProperty(exports2, \"ContractFactory\", { enumerable: true, get: function() {\n      return ethers_1.ContractFactory;\n    } });\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return ethers_1.BigNumber;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return ethers_1.FixedNumber;\n    } });\n    Object.defineProperty(exports2, \"constants\", { enumerable: true, get: function() {\n      return ethers_1.constants;\n    } });\n    Object.defineProperty(exports2, \"errors\", { enumerable: true, get: function() {\n      return ethers_1.errors;\n    } });\n    Object.defineProperty(exports2, \"logger\", { enumerable: true, get: function() {\n      return ethers_1.logger;\n    } });\n    Object.defineProperty(exports2, \"utils\", { enumerable: true, get: function() {\n      return ethers_1.utils;\n    } });\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return ethers_1.wordlists;\n    } });\n    Object.defineProperty(exports2, \"version\", { enumerable: true, get: function() {\n      return ethers_1.version;\n    } });\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return ethers_1.Wordlist;\n    } });\n  }\n});\n\n// node_modules/jsbi/dist/jsbi-cjs.js\nvar require_jsbi_cjs = __commonJS({\n  \"node_modules/jsbi/dist/jsbi-cjs.js\"(exports2, module2) {\n    \"use strict\";\n    var JSBI3 = class _JSBI extends Array {\n      constructor(i, _) {\n        if (super(i), this.sign = _, i > _JSBI.__kMaxLength) throw new RangeError(\"Maximum BigInt size exceeded\");\n      }\n      static BigInt(i) {\n        var _ = Math.floor, t = Number.isFinite;\n        if (\"number\" == typeof i) {\n          if (0 === i) return _JSBI.__zero();\n          if (_JSBI.__isOneDigitInt(i)) return 0 > i ? _JSBI.__oneDigit(-i, true) : _JSBI.__oneDigit(i, false);\n          if (!t(i) || _(i) !== i) throw new RangeError(\"The number \" + i + \" cannot be converted to BigInt because it is not an integer\");\n          return _JSBI.__fromDouble(i);\n        }\n        if (\"string\" == typeof i) {\n          const _2 = _JSBI.__fromString(i);\n          if (null === _2) throw new SyntaxError(\"Cannot convert \" + i + \" to a BigInt\");\n          return _2;\n        }\n        if (\"boolean\" == typeof i) return true === i ? _JSBI.__oneDigit(1, false) : _JSBI.__zero();\n        if (\"object\" == typeof i) {\n          if (i.constructor === _JSBI) return i;\n          const _2 = _JSBI.__toPrimitive(i);\n          return _JSBI.BigInt(_2);\n        }\n        throw new TypeError(\"Cannot convert \" + i + \" to a BigInt\");\n      }\n      toDebugString() {\n        const i = [\"BigInt[\"];\n        for (const _ of this) i.push((_ ? (_ >>> 0).toString(16) : _) + \", \");\n        return i.push(\"]\"), i.join(\"\");\n      }\n      toString(i = 10) {\n        if (2 > i || 36 < i) throw new RangeError(\"toString() radix argument must be between 2 and 36\");\n        return 0 === this.length ? \"0\" : 0 == (i & i - 1) ? _JSBI.__toStringBasePowerOfTwo(this, i) : _JSBI.__toStringGeneric(this, i, false);\n      }\n      static toNumber(i) {\n        const _ = i.length;\n        if (0 === _) return 0;\n        if (1 === _) {\n          const _2 = i.__unsignedDigit(0);\n          return i.sign ? -_2 : _2;\n        }\n        const t = i.__digit(_ - 1), e = _JSBI.__clz30(t), n = 30 * _ - e;\n        if (1024 < n) return i.sign ? -Infinity : 1 / 0;\n        let g = n - 1, o = t, s = _ - 1;\n        const l = e + 3;\n        let r = 32 === l ? 0 : o << l;\n        r >>>= 12;\n        const a = l - 12;\n        let u = 12 <= l ? 0 : o << 20 + l, d = 20 + l;\n        for (0 < a && 0 < s && (s--, o = i.__digit(s), r |= o >>> 30 - a, u = o << a + 2, d = a + 2); 0 < d && 0 < s; ) s--, o = i.__digit(s), u |= 30 <= d ? o << d - 30 : o >>> 30 - d, d -= 30;\n        const h = _JSBI.__decideRounding(i, d, s, o);\n        if ((1 === h || 0 === h && 1 == (1 & u)) && (u = u + 1 >>> 0, 0 === u && (r++, 0 != r >>> 20 && (r = 0, g++, 1023 < g)))) return i.sign ? -Infinity : 1 / 0;\n        const m = i.sign ? -2147483648 : 0;\n        return g = g + 1023 << 20, _JSBI.__kBitConversionInts[1] = m | g | r, _JSBI.__kBitConversionInts[0] = u, _JSBI.__kBitConversionDouble[0];\n      }\n      static unaryMinus(i) {\n        if (0 === i.length) return i;\n        const _ = i.__copy();\n        return _.sign = !i.sign, _;\n      }\n      static bitwiseNot(i) {\n        return i.sign ? _JSBI.__absoluteSubOne(i).__trim() : _JSBI.__absoluteAddOne(i, true);\n      }\n      static exponentiate(i, _) {\n        if (_.sign) throw new RangeError(\"Exponent must be positive\");\n        if (0 === _.length) return _JSBI.__oneDigit(1, false);\n        if (0 === i.length) return i;\n        if (1 === i.length && 1 === i.__digit(0)) return i.sign && 0 == (1 & _.__digit(0)) ? _JSBI.unaryMinus(i) : i;\n        if (1 < _.length) throw new RangeError(\"BigInt too big\");\n        let t = _.__unsignedDigit(0);\n        if (1 === t) return i;\n        if (t >= _JSBI.__kMaxLengthBits) throw new RangeError(\"BigInt too big\");\n        if (1 === i.length && 2 === i.__digit(0)) {\n          const _2 = 1 + (0 | t / 30), e2 = i.sign && 0 != (1 & t), n2 = new _JSBI(_2, e2);\n          n2.__initializeDigits();\n          const g = 1 << t % 30;\n          return n2.__setDigit(_2 - 1, g), n2;\n        }\n        let e = null, n = i;\n        for (0 != (1 & t) && (e = i), t >>= 1; 0 !== t; t >>= 1) n = _JSBI.multiply(n, n), 0 != (1 & t) && (null === e ? e = n : e = _JSBI.multiply(e, n));\n        return e;\n      }\n      static multiply(_, t) {\n        if (0 === _.length) return _;\n        if (0 === t.length) return t;\n        let i = _.length + t.length;\n        30 <= _.__clzmsd() + t.__clzmsd() && i--;\n        const e = new _JSBI(i, _.sign !== t.sign);\n        e.__initializeDigits();\n        for (let n = 0; n < _.length; n++) _JSBI.__multiplyAccumulate(t, _.__digit(n), e, n);\n        return e.__trim();\n      }\n      static divide(i, _) {\n        if (0 === _.length) throw new RangeError(\"Division by zero\");\n        if (0 > _JSBI.__absoluteCompare(i, _)) return _JSBI.__zero();\n        const t = i.sign !== _.sign, e = _.__unsignedDigit(0);\n        let n;\n        if (1 === _.length && 32767 >= e) {\n          if (1 === e) return t === i.sign ? i : _JSBI.unaryMinus(i);\n          n = _JSBI.__absoluteDivSmall(i, e, null);\n        } else n = _JSBI.__absoluteDivLarge(i, _, true, false);\n        return n.sign = t, n.__trim();\n      }\n      static remainder(i, _) {\n        if (0 === _.length) throw new RangeError(\"Division by zero\");\n        if (0 > _JSBI.__absoluteCompare(i, _)) return i;\n        const t = _.__unsignedDigit(0);\n        if (1 === _.length && 32767 >= t) {\n          if (1 === t) return _JSBI.__zero();\n          const _2 = _JSBI.__absoluteModSmall(i, t);\n          return 0 === _2 ? _JSBI.__zero() : _JSBI.__oneDigit(_2, i.sign);\n        }\n        const e = _JSBI.__absoluteDivLarge(i, _, false, true);\n        return e.sign = i.sign, e.__trim();\n      }\n      static add(i, _) {\n        const t = i.sign;\n        return t === _.sign ? _JSBI.__absoluteAdd(i, _, t) : 0 <= _JSBI.__absoluteCompare(i, _) ? _JSBI.__absoluteSub(i, _, t) : _JSBI.__absoluteSub(_, i, !t);\n      }\n      static subtract(i, _) {\n        const t = i.sign;\n        return t === _.sign ? 0 <= _JSBI.__absoluteCompare(i, _) ? _JSBI.__absoluteSub(i, _, t) : _JSBI.__absoluteSub(_, i, !t) : _JSBI.__absoluteAdd(i, _, t);\n      }\n      static leftShift(i, _) {\n        return 0 === _.length || 0 === i.length ? i : _.sign ? _JSBI.__rightShiftByAbsolute(i, _) : _JSBI.__leftShiftByAbsolute(i, _);\n      }\n      static signedRightShift(i, _) {\n        return 0 === _.length || 0 === i.length ? i : _.sign ? _JSBI.__leftShiftByAbsolute(i, _) : _JSBI.__rightShiftByAbsolute(i, _);\n      }\n      static unsignedRightShift() {\n        throw new TypeError(\"BigInts have no unsigned right shift; use >> instead\");\n      }\n      static lessThan(i, _) {\n        return 0 > _JSBI.__compareToBigInt(i, _);\n      }\n      static lessThanOrEqual(i, _) {\n        return 0 >= _JSBI.__compareToBigInt(i, _);\n      }\n      static greaterThan(i, _) {\n        return 0 < _JSBI.__compareToBigInt(i, _);\n      }\n      static greaterThanOrEqual(i, _) {\n        return 0 <= _JSBI.__compareToBigInt(i, _);\n      }\n      static equal(_, t) {\n        if (_.sign !== t.sign) return false;\n        if (_.length !== t.length) return false;\n        for (let e = 0; e < _.length; e++) if (_.__digit(e) !== t.__digit(e)) return false;\n        return true;\n      }\n      static notEqual(i, _) {\n        return !_JSBI.equal(i, _);\n      }\n      static bitwiseAnd(i, _) {\n        var t = Math.max;\n        if (!i.sign && !_.sign) return _JSBI.__absoluteAnd(i, _).__trim();\n        if (i.sign && _.sign) {\n          const e = t(i.length, _.length) + 1;\n          let n = _JSBI.__absoluteSubOne(i, e);\n          const g = _JSBI.__absoluteSubOne(_);\n          return n = _JSBI.__absoluteOr(n, g, n), _JSBI.__absoluteAddOne(n, true, n).__trim();\n        }\n        return i.sign && ([i, _] = [_, i]), _JSBI.__absoluteAndNot(i, _JSBI.__absoluteSubOne(_)).__trim();\n      }\n      static bitwiseXor(i, _) {\n        var t = Math.max;\n        if (!i.sign && !_.sign) return _JSBI.__absoluteXor(i, _).__trim();\n        if (i.sign && _.sign) {\n          const e2 = t(i.length, _.length), n2 = _JSBI.__absoluteSubOne(i, e2), g = _JSBI.__absoluteSubOne(_);\n          return _JSBI.__absoluteXor(n2, g, n2).__trim();\n        }\n        const e = t(i.length, _.length) + 1;\n        i.sign && ([i, _] = [_, i]);\n        let n = _JSBI.__absoluteSubOne(_, e);\n        return n = _JSBI.__absoluteXor(n, i, n), _JSBI.__absoluteAddOne(n, true, n).__trim();\n      }\n      static bitwiseOr(i, _) {\n        var t = Math.max;\n        const e = t(i.length, _.length);\n        if (!i.sign && !_.sign) return _JSBI.__absoluteOr(i, _).__trim();\n        if (i.sign && _.sign) {\n          let t2 = _JSBI.__absoluteSubOne(i, e);\n          const n2 = _JSBI.__absoluteSubOne(_);\n          return t2 = _JSBI.__absoluteAnd(t2, n2, t2), _JSBI.__absoluteAddOne(t2, true, t2).__trim();\n        }\n        i.sign && ([i, _] = [_, i]);\n        let n = _JSBI.__absoluteSubOne(_, e);\n        return n = _JSBI.__absoluteAndNot(n, i, n), _JSBI.__absoluteAddOne(n, true, n).__trim();\n      }\n      static asIntN(_, t) {\n        var i = Math.floor;\n        if (0 === t.length) return t;\n        if (_ = i(_), 0 > _) throw new RangeError(\"Invalid value: not (convertible to) a safe integer\");\n        if (0 === _) return _JSBI.__zero();\n        if (_ >= _JSBI.__kMaxLengthBits) return t;\n        const e = 0 | (_ + 29) / 30;\n        if (t.length < e) return t;\n        const g = t.__unsignedDigit(e - 1), o = 1 << (_ - 1) % 30;\n        if (t.length === e && g < o) return t;\n        if (!((g & o) === o)) return _JSBI.__truncateToNBits(_, t);\n        if (!t.sign) return _JSBI.__truncateAndSubFromPowerOfTwo(_, t, true);\n        if (0 == (g & o - 1)) {\n          for (let n = e - 2; 0 <= n; n--) if (0 !== t.__digit(n)) return _JSBI.__truncateAndSubFromPowerOfTwo(_, t, false);\n          return t.length === e && g === o ? t : _JSBI.__truncateToNBits(_, t);\n        }\n        return _JSBI.__truncateAndSubFromPowerOfTwo(_, t, false);\n      }\n      static asUintN(i, _) {\n        var t = Math.floor;\n        if (0 === _.length) return _;\n        if (i = t(i), 0 > i) throw new RangeError(\"Invalid value: not (convertible to) a safe integer\");\n        if (0 === i) return _JSBI.__zero();\n        if (_.sign) {\n          if (i > _JSBI.__kMaxLengthBits) throw new RangeError(\"BigInt too big\");\n          return _JSBI.__truncateAndSubFromPowerOfTwo(i, _, false);\n        }\n        if (i >= _JSBI.__kMaxLengthBits) return _;\n        const e = 0 | (i + 29) / 30;\n        if (_.length < e) return _;\n        const g = i % 30;\n        if (_.length == e) {\n          if (0 === g) return _;\n          const i2 = _.__digit(e - 1);\n          if (0 == i2 >>> g) return _;\n        }\n        return _JSBI.__truncateToNBits(i, _);\n      }\n      static ADD(i, _) {\n        if (i = _JSBI.__toPrimitive(i), _ = _JSBI.__toPrimitive(_), \"string\" == typeof i) return \"string\" != typeof _ && (_ = _.toString()), i + _;\n        if (\"string\" == typeof _) return i.toString() + _;\n        if (i = _JSBI.__toNumeric(i), _ = _JSBI.__toNumeric(_), _JSBI.__isBigInt(i) && _JSBI.__isBigInt(_)) return _JSBI.add(i, _);\n        if (\"number\" == typeof i && \"number\" == typeof _) return i + _;\n        throw new TypeError(\"Cannot mix BigInt and other types, use explicit conversions\");\n      }\n      static LT(i, _) {\n        return _JSBI.__compare(i, _, 0);\n      }\n      static LE(i, _) {\n        return _JSBI.__compare(i, _, 1);\n      }\n      static GT(i, _) {\n        return _JSBI.__compare(i, _, 2);\n      }\n      static GE(i, _) {\n        return _JSBI.__compare(i, _, 3);\n      }\n      static EQ(i, _) {\n        for (; ; ) {\n          if (_JSBI.__isBigInt(i)) return _JSBI.__isBigInt(_) ? _JSBI.equal(i, _) : _JSBI.EQ(_, i);\n          if (\"number\" == typeof i) {\n            if (_JSBI.__isBigInt(_)) return _JSBI.__equalToNumber(_, i);\n            if (\"object\" != typeof _) return i == _;\n            _ = _JSBI.__toPrimitive(_);\n          } else if (\"string\" == typeof i) {\n            if (_JSBI.__isBigInt(_)) return i = _JSBI.__fromString(i), null !== i && _JSBI.equal(i, _);\n            if (\"object\" != typeof _) return i == _;\n            _ = _JSBI.__toPrimitive(_);\n          } else if (\"boolean\" == typeof i) {\n            if (_JSBI.__isBigInt(_)) return _JSBI.__equalToNumber(_, +i);\n            if (\"object\" != typeof _) return i == _;\n            _ = _JSBI.__toPrimitive(_);\n          } else if (\"symbol\" == typeof i) {\n            if (_JSBI.__isBigInt(_)) return false;\n            if (\"object\" != typeof _) return i == _;\n            _ = _JSBI.__toPrimitive(_);\n          } else if (\"object\" == typeof i) {\n            if (\"object\" == typeof _ && _.constructor !== _JSBI) return i == _;\n            i = _JSBI.__toPrimitive(i);\n          } else return i == _;\n        }\n      }\n      static NE(i, _) {\n        return !_JSBI.EQ(i, _);\n      }\n      static __zero() {\n        return new _JSBI(0, false);\n      }\n      static __oneDigit(i, _) {\n        const t = new _JSBI(1, _);\n        return t.__setDigit(0, i), t;\n      }\n      __copy() {\n        const _ = new _JSBI(this.length, this.sign);\n        for (let t = 0; t < this.length; t++) _[t] = this[t];\n        return _;\n      }\n      __trim() {\n        let i = this.length, _ = this[i - 1];\n        for (; 0 === _; ) i--, _ = this[i - 1], this.pop();\n        return 0 === i && (this.sign = false), this;\n      }\n      __initializeDigits() {\n        for (let _ = 0; _ < this.length; _++) this[_] = 0;\n      }\n      static __decideRounding(i, _, t, e) {\n        if (0 < _) return -1;\n        let n;\n        if (0 > _) n = -_ - 1;\n        else {\n          if (0 === t) return -1;\n          t--, e = i.__digit(t), n = 29;\n        }\n        let g = 1 << n;\n        if (0 == (e & g)) return -1;\n        if (g -= 1, 0 != (e & g)) return 1;\n        for (; 0 < t; ) if (t--, 0 !== i.__digit(t)) return 1;\n        return 0;\n      }\n      static __fromDouble(i) {\n        _JSBI.__kBitConversionDouble[0] = i;\n        const _ = 2047 & _JSBI.__kBitConversionInts[1] >>> 20, t = _ - 1023, e = (0 | t / 30) + 1, n = new _JSBI(e, 0 > i);\n        let g = 1048575 & _JSBI.__kBitConversionInts[1] | 1048576, o = _JSBI.__kBitConversionInts[0];\n        const s = 20, l = t % 30;\n        let r, a = 0;\n        if (l < 20) {\n          const i2 = s - l;\n          a = i2 + 32, r = g >>> i2, g = g << 32 - i2 | o >>> i2, o <<= 32 - i2;\n        } else if (l === 20) a = 32, r = g, g = o, o = 0;\n        else {\n          const i2 = l - s;\n          a = 32 - i2, r = g << i2 | o >>> 32 - i2, g = o << i2, o = 0;\n        }\n        n.__setDigit(e - 1, r);\n        for (let _2 = e - 2; 0 <= _2; _2--) 0 < a ? (a -= 30, r = g >>> 2, g = g << 30 | o >>> 2, o <<= 30) : r = 0, n.__setDigit(_2, r);\n        return n.__trim();\n      }\n      static __isWhitespace(i) {\n        return !!(13 >= i && 9 <= i) || (159 >= i ? 32 == i : 131071 >= i ? 160 == i || 5760 == i : 196607 >= i ? (i &= 131071, 10 >= i || 40 == i || 41 == i || 47 == i || 95 == i || 4096 == i) : 65279 == i);\n      }\n      static __fromString(i, _ = 0) {\n        let t = 0;\n        const e = i.length;\n        let n = 0;\n        if (n === e) return _JSBI.__zero();\n        let g = i.charCodeAt(n);\n        for (; _JSBI.__isWhitespace(g); ) {\n          if (++n === e) return _JSBI.__zero();\n          g = i.charCodeAt(n);\n        }\n        if (43 === g) {\n          if (++n === e) return null;\n          g = i.charCodeAt(n), t = 1;\n        } else if (45 === g) {\n          if (++n === e) return null;\n          g = i.charCodeAt(n), t = -1;\n        }\n        if (0 === _) {\n          if (_ = 10, 48 === g) {\n            if (++n === e) return _JSBI.__zero();\n            if (g = i.charCodeAt(n), 88 === g || 120 === g) {\n              if (_ = 16, ++n === e) return null;\n              g = i.charCodeAt(n);\n            } else if (79 === g || 111 === g) {\n              if (_ = 8, ++n === e) return null;\n              g = i.charCodeAt(n);\n            } else if (66 === g || 98 === g) {\n              if (_ = 2, ++n === e) return null;\n              g = i.charCodeAt(n);\n            }\n          }\n        } else if (16 === _ && 48 === g) {\n          if (++n === e) return _JSBI.__zero();\n          if (g = i.charCodeAt(n), 88 === g || 120 === g) {\n            if (++n === e) return null;\n            g = i.charCodeAt(n);\n          }\n        }\n        if (0 != t && 10 !== _) return null;\n        for (; 48 === g; ) {\n          if (++n === e) return _JSBI.__zero();\n          g = i.charCodeAt(n);\n        }\n        const o = e - n;\n        let s = _JSBI.__kMaxBitsPerChar[_], l = _JSBI.__kBitsPerCharTableMultiplier - 1;\n        if (o > 1073741824 / s) return null;\n        const r = s * o + l >>> _JSBI.__kBitsPerCharTableShift, a = new _JSBI(0 | (r + 29) / 30, false), u = 10 > _ ? _ : 10, h = 10 < _ ? _ - 10 : 0;\n        if (0 == (_ & _ - 1)) {\n          s >>= _JSBI.__kBitsPerCharTableShift;\n          const _2 = [], t2 = [];\n          let o2 = false;\n          do {\n            let l2 = 0, r2 = 0;\n            for (; ; ) {\n              let _3;\n              if (g - 48 >>> 0 < u) _3 = g - 48;\n              else if ((32 | g) - 97 >>> 0 < h) _3 = (32 | g) - 87;\n              else {\n                o2 = true;\n                break;\n              }\n              if (r2 += s, l2 = l2 << s | _3, ++n === e) {\n                o2 = true;\n                break;\n              }\n              if (g = i.charCodeAt(n), 30 < r2 + s) break;\n            }\n            _2.push(l2), t2.push(r2);\n          } while (!o2);\n          _JSBI.__fillFromParts(a, _2, t2);\n        } else {\n          a.__initializeDigits();\n          let t2 = false, o2 = 0;\n          do {\n            let r2 = 0, b = 1;\n            for (; ; ) {\n              let s2;\n              if (g - 48 >>> 0 < u) s2 = g - 48;\n              else if ((32 | g) - 97 >>> 0 < h) s2 = (32 | g) - 87;\n              else {\n                t2 = true;\n                break;\n              }\n              const l2 = b * _;\n              if (1073741823 < l2) break;\n              if (b = l2, r2 = r2 * _ + s2, o2++, ++n === e) {\n                t2 = true;\n                break;\n              }\n              g = i.charCodeAt(n);\n            }\n            l = 30 * _JSBI.__kBitsPerCharTableMultiplier - 1;\n            const D = 0 | (s * o2 + l >>> _JSBI.__kBitsPerCharTableShift) / 30;\n            a.__inplaceMultiplyAdd(b, r2, D);\n          } while (!t2);\n        }\n        if (n !== e) {\n          if (!_JSBI.__isWhitespace(g)) return null;\n          for (n++; n < e; n++) if (g = i.charCodeAt(n), !_JSBI.__isWhitespace(g)) return null;\n        }\n        return a.sign = -1 == t, a.__trim();\n      }\n      static __fillFromParts(_, t, e) {\n        let n = 0, g = 0, o = 0;\n        for (let s = t.length - 1; 0 <= s; s--) {\n          const i = t[s], l = e[s];\n          g |= i << o, o += l, 30 === o ? (_.__setDigit(n++, g), o = 0, g = 0) : 30 < o && (_.__setDigit(n++, 1073741823 & g), o -= 30, g = i >>> l - o);\n        }\n        if (0 !== g) {\n          if (n >= _.length) throw new Error(\"implementation bug\");\n          _.__setDigit(n++, g);\n        }\n        for (; n < _.length; n++) _.__setDigit(n, 0);\n      }\n      static __toStringBasePowerOfTwo(_, i) {\n        const t = _.length;\n        let e = i - 1;\n        e = (85 & e >>> 1) + (85 & e), e = (51 & e >>> 2) + (51 & e), e = (15 & e >>> 4) + (15 & e);\n        const n = e, g = i - 1, o = _.__digit(t - 1), s = _JSBI.__clz30(o);\n        let l = 0 | (30 * t - s + n - 1) / n;\n        if (_.sign && l++, 268435456 < l) throw new Error(\"string too long\");\n        const r = Array(l);\n        let a = l - 1, u = 0, d = 0;\n        for (let e2 = 0; e2 < t - 1; e2++) {\n          const i2 = _.__digit(e2), t2 = (u | i2 << d) & g;\n          r[a--] = _JSBI.__kConversionChars[t2];\n          const o2 = n - d;\n          for (u = i2 >>> o2, d = 30 - o2; d >= n; ) r[a--] = _JSBI.__kConversionChars[u & g], u >>>= n, d -= n;\n        }\n        const h = (u | o << d) & g;\n        for (r[a--] = _JSBI.__kConversionChars[h], u = o >>> n - d; 0 !== u; ) r[a--] = _JSBI.__kConversionChars[u & g], u >>>= n;\n        if (_.sign && (r[a--] = \"-\"), -1 != a) throw new Error(\"implementation bug\");\n        return r.join(\"\");\n      }\n      static __toStringGeneric(_, i, t) {\n        const e = _.length;\n        if (0 === e) return \"\";\n        if (1 === e) {\n          let e2 = _.__unsignedDigit(0).toString(i);\n          return false === t && _.sign && (e2 = \"-\" + e2), e2;\n        }\n        const n = 30 * e - _JSBI.__clz30(_.__digit(e - 1)), g = _JSBI.__kMaxBitsPerChar[i], o = g - 1;\n        let s = n * _JSBI.__kBitsPerCharTableMultiplier;\n        s += o - 1, s = 0 | s / o;\n        const l = s + 1 >> 1, r = _JSBI.exponentiate(_JSBI.__oneDigit(i, false), _JSBI.__oneDigit(l, false));\n        let a, u;\n        const d = r.__unsignedDigit(0);\n        if (1 === r.length && 32767 >= d) {\n          a = new _JSBI(_.length, false), a.__initializeDigits();\n          let t2 = 0;\n          for (let e2 = 2 * _.length - 1; 0 <= e2; e2--) {\n            const i2 = t2 << 15 | _.__halfDigit(e2);\n            a.__setHalfDigit(e2, 0 | i2 / d), t2 = 0 | i2 % d;\n          }\n          u = t2.toString(i);\n        } else {\n          const t2 = _JSBI.__absoluteDivLarge(_, r, true, true);\n          a = t2.quotient;\n          const e2 = t2.remainder.__trim();\n          u = _JSBI.__toStringGeneric(e2, i, true);\n        }\n        a.__trim();\n        let h = _JSBI.__toStringGeneric(a, i, true);\n        for (; u.length < l; ) u = \"0\" + u;\n        return false === t && _.sign && (h = \"-\" + h), h + u;\n      }\n      static __unequalSign(i) {\n        return i ? -1 : 1;\n      }\n      static __absoluteGreater(i) {\n        return i ? -1 : 1;\n      }\n      static __absoluteLess(i) {\n        return i ? 1 : -1;\n      }\n      static __compareToBigInt(i, _) {\n        const t = i.sign;\n        if (t !== _.sign) return _JSBI.__unequalSign(t);\n        const e = _JSBI.__absoluteCompare(i, _);\n        return 0 < e ? _JSBI.__absoluteGreater(t) : 0 > e ? _JSBI.__absoluteLess(t) : 0;\n      }\n      static __compareToNumber(i, _) {\n        if (_JSBI.__isOneDigitInt(_)) {\n          const t = i.sign, e = 0 > _;\n          if (t !== e) return _JSBI.__unequalSign(t);\n          if (0 === i.length) {\n            if (e) throw new Error(\"implementation bug\");\n            return 0 === _ ? 0 : -1;\n          }\n          if (1 < i.length) return _JSBI.__absoluteGreater(t);\n          const n = Math.abs(_), g = i.__unsignedDigit(0);\n          return g > n ? _JSBI.__absoluteGreater(t) : g < n ? _JSBI.__absoluteLess(t) : 0;\n        }\n        return _JSBI.__compareToDouble(i, _);\n      }\n      static __compareToDouble(i, _) {\n        if (_ !== _) return _;\n        if (_ === 1 / 0) return -1;\n        if (_ === -Infinity) return 1;\n        const t = i.sign;\n        if (t !== 0 > _) return _JSBI.__unequalSign(t);\n        if (0 === _) throw new Error(\"implementation bug: should be handled elsewhere\");\n        if (0 === i.length) return -1;\n        _JSBI.__kBitConversionDouble[0] = _;\n        const e = 2047 & _JSBI.__kBitConversionInts[1] >>> 20;\n        if (2047 == e) throw new Error(\"implementation bug: handled elsewhere\");\n        const n = e - 1023;\n        if (0 > n) return _JSBI.__absoluteGreater(t);\n        const g = i.length;\n        let o = i.__digit(g - 1);\n        const s = _JSBI.__clz30(o), l = 30 * g - s, r = n + 1;\n        if (l < r) return _JSBI.__absoluteLess(t);\n        if (l > r) return _JSBI.__absoluteGreater(t);\n        let a = 1048576 | 1048575 & _JSBI.__kBitConversionInts[1], u = _JSBI.__kBitConversionInts[0];\n        const d = 20, h = 29 - s;\n        if (h !== (0 | (l - 1) % 30)) throw new Error(\"implementation bug\");\n        let m, b = 0;\n        if (20 > h) {\n          const i2 = d - h;\n          b = i2 + 32, m = a >>> i2, a = a << 32 - i2 | u >>> i2, u <<= 32 - i2;\n        } else if (20 === h) b = 32, m = a, a = u, u = 0;\n        else {\n          const i2 = h - d;\n          b = 32 - i2, m = a << i2 | u >>> 32 - i2, a = u << i2, u = 0;\n        }\n        if (o >>>= 0, m >>>= 0, o > m) return _JSBI.__absoluteGreater(t);\n        if (o < m) return _JSBI.__absoluteLess(t);\n        for (let e2 = g - 2; 0 <= e2; e2--) {\n          0 < b ? (b -= 30, m = a >>> 2, a = a << 30 | u >>> 2, u <<= 30) : m = 0;\n          const _2 = i.__unsignedDigit(e2);\n          if (_2 > m) return _JSBI.__absoluteGreater(t);\n          if (_2 < m) return _JSBI.__absoluteLess(t);\n        }\n        if (0 !== a || 0 !== u) {\n          if (0 === b) throw new Error(\"implementation bug\");\n          return _JSBI.__absoluteLess(t);\n        }\n        return 0;\n      }\n      static __equalToNumber(i, _) {\n        var t = Math.abs;\n        return _JSBI.__isOneDigitInt(_) ? 0 === _ ? 0 === i.length : 1 === i.length && i.sign === 0 > _ && i.__unsignedDigit(0) === t(_) : 0 === _JSBI.__compareToDouble(i, _);\n      }\n      static __comparisonResultToBool(i, _) {\n        return 0 === _ ? 0 > i : 1 === _ ? 0 >= i : 2 === _ ? 0 < i : 3 === _ ? 0 <= i : void 0;\n      }\n      static __compare(i, _, t) {\n        if (i = _JSBI.__toPrimitive(i), _ = _JSBI.__toPrimitive(_), \"string\" == typeof i && \"string\" == typeof _) switch (t) {\n          case 0:\n            return i < _;\n          case 1:\n            return i <= _;\n          case 2:\n            return i > _;\n          case 3:\n            return i >= _;\n        }\n        if (_JSBI.__isBigInt(i) && \"string\" == typeof _) return _ = _JSBI.__fromString(_), null !== _ && _JSBI.__comparisonResultToBool(_JSBI.__compareToBigInt(i, _), t);\n        if (\"string\" == typeof i && _JSBI.__isBigInt(_)) return i = _JSBI.__fromString(i), null !== i && _JSBI.__comparisonResultToBool(_JSBI.__compareToBigInt(i, _), t);\n        if (i = _JSBI.__toNumeric(i), _ = _JSBI.__toNumeric(_), _JSBI.__isBigInt(i)) {\n          if (_JSBI.__isBigInt(_)) return _JSBI.__comparisonResultToBool(_JSBI.__compareToBigInt(i, _), t);\n          if (\"number\" != typeof _) throw new Error(\"implementation bug\");\n          return _JSBI.__comparisonResultToBool(_JSBI.__compareToNumber(i, _), t);\n        }\n        if (\"number\" != typeof i) throw new Error(\"implementation bug\");\n        if (_JSBI.__isBigInt(_)) return _JSBI.__comparisonResultToBool(_JSBI.__compareToNumber(_, i), 2 ^ t);\n        if (\"number\" != typeof _) throw new Error(\"implementation bug\");\n        return 0 === t ? i < _ : 1 === t ? i <= _ : 2 === t ? i > _ : 3 === t ? i >= _ : void 0;\n      }\n      __clzmsd() {\n        return _JSBI.__clz30(this.__digit(this.length - 1));\n      }\n      static __absoluteAdd(_, t, e) {\n        if (_.length < t.length) return _JSBI.__absoluteAdd(t, _, e);\n        if (0 === _.length) return _;\n        if (0 === t.length) return _.sign === e ? _ : _JSBI.unaryMinus(_);\n        let n = _.length;\n        (0 === _.__clzmsd() || t.length === _.length && 0 === t.__clzmsd()) && n++;\n        const g = new _JSBI(n, e);\n        let o = 0, s = 0;\n        for (; s < t.length; s++) {\n          const i = _.__digit(s) + t.__digit(s) + o;\n          o = i >>> 30, g.__setDigit(s, 1073741823 & i);\n        }\n        for (; s < _.length; s++) {\n          const i = _.__digit(s) + o;\n          o = i >>> 30, g.__setDigit(s, 1073741823 & i);\n        }\n        return s < g.length && g.__setDigit(s, o), g.__trim();\n      }\n      static __absoluteSub(_, t, e) {\n        if (0 === _.length) return _;\n        if (0 === t.length) return _.sign === e ? _ : _JSBI.unaryMinus(_);\n        const n = new _JSBI(_.length, e);\n        let g = 0, o = 0;\n        for (; o < t.length; o++) {\n          const i = _.__digit(o) - t.__digit(o) - g;\n          g = 1 & i >>> 30, n.__setDigit(o, 1073741823 & i);\n        }\n        for (; o < _.length; o++) {\n          const i = _.__digit(o) - g;\n          g = 1 & i >>> 30, n.__setDigit(o, 1073741823 & i);\n        }\n        return n.__trim();\n      }\n      static __absoluteAddOne(_, i, t = null) {\n        const e = _.length;\n        null === t ? t = new _JSBI(e, i) : t.sign = i;\n        let n = 1;\n        for (let g = 0; g < e; g++) {\n          const i2 = _.__digit(g) + n;\n          n = i2 >>> 30, t.__setDigit(g, 1073741823 & i2);\n        }\n        return 0 != n && t.__setDigitGrow(e, 1), t;\n      }\n      static __absoluteSubOne(_, t) {\n        const e = _.length;\n        t = t || e;\n        const n = new _JSBI(t, false);\n        let g = 1;\n        for (let o = 0; o < e; o++) {\n          const i = _.__digit(o) - g;\n          g = 1 & i >>> 30, n.__setDigit(o, 1073741823 & i);\n        }\n        if (0 != g) throw new Error(\"implementation bug\");\n        for (let g2 = e; g2 < t; g2++) n.__setDigit(g2, 0);\n        return n;\n      }\n      static __absoluteAnd(_, t, e = null) {\n        let n = _.length, g = t.length, o = g;\n        if (n < g) {\n          o = n;\n          const i = _, e2 = n;\n          _ = t, n = g, t = i, g = e2;\n        }\n        let s = o;\n        null === e ? e = new _JSBI(s, false) : s = e.length;\n        let l = 0;\n        for (; l < o; l++) e.__setDigit(l, _.__digit(l) & t.__digit(l));\n        for (; l < s; l++) e.__setDigit(l, 0);\n        return e;\n      }\n      static __absoluteAndNot(_, t, e = null) {\n        const n = _.length, g = t.length;\n        let o = g;\n        n < g && (o = n);\n        let s = n;\n        null === e ? e = new _JSBI(s, false) : s = e.length;\n        let l = 0;\n        for (; l < o; l++) e.__setDigit(l, _.__digit(l) & ~t.__digit(l));\n        for (; l < n; l++) e.__setDigit(l, _.__digit(l));\n        for (; l < s; l++) e.__setDigit(l, 0);\n        return e;\n      }\n      static __absoluteOr(_, t, e = null) {\n        let n = _.length, g = t.length, o = g;\n        if (n < g) {\n          o = n;\n          const i = _, e2 = n;\n          _ = t, n = g, t = i, g = e2;\n        }\n        let s = n;\n        null === e ? e = new _JSBI(s, false) : s = e.length;\n        let l = 0;\n        for (; l < o; l++) e.__setDigit(l, _.__digit(l) | t.__digit(l));\n        for (; l < n; l++) e.__setDigit(l, _.__digit(l));\n        for (; l < s; l++) e.__setDigit(l, 0);\n        return e;\n      }\n      static __absoluteXor(_, t, e = null) {\n        let n = _.length, g = t.length, o = g;\n        if (n < g) {\n          o = n;\n          const i = _, e2 = n;\n          _ = t, n = g, t = i, g = e2;\n        }\n        let s = n;\n        null === e ? e = new _JSBI(s, false) : s = e.length;\n        let l = 0;\n        for (; l < o; l++) e.__setDigit(l, _.__digit(l) ^ t.__digit(l));\n        for (; l < n; l++) e.__setDigit(l, _.__digit(l));\n        for (; l < s; l++) e.__setDigit(l, 0);\n        return e;\n      }\n      static __absoluteCompare(_, t) {\n        const e = _.length - t.length;\n        if (0 != e) return e;\n        let n = _.length - 1;\n        for (; 0 <= n && _.__digit(n) === t.__digit(n); ) n--;\n        return 0 > n ? 0 : _.__unsignedDigit(n) > t.__unsignedDigit(n) ? 1 : -1;\n      }\n      static __multiplyAccumulate(_, t, e, n) {\n        if (0 === t) return;\n        const g = 32767 & t, o = t >>> 15;\n        let s = 0, l = 0;\n        for (let r, a = 0; a < _.length; a++, n++) {\n          r = e.__digit(n);\n          const i = _.__digit(a), t2 = 32767 & i, u = i >>> 15, d = _JSBI.__imul(t2, g), h = _JSBI.__imul(t2, o), m = _JSBI.__imul(u, g), b = _JSBI.__imul(u, o);\n          r += l + d + s, s = r >>> 30, r &= 1073741823, r += ((32767 & h) << 15) + ((32767 & m) << 15), s += r >>> 30, l = b + (h >>> 15) + (m >>> 15), e.__setDigit(n, 1073741823 & r);\n        }\n        for (; 0 != s || 0 !== l; n++) {\n          let i = e.__digit(n);\n          i += s + l, l = 0, s = i >>> 30, e.__setDigit(n, 1073741823 & i);\n        }\n      }\n      static __internalMultiplyAdd(_, t, e, g, o) {\n        let s = e, l = 0;\n        for (let n = 0; n < g; n++) {\n          const i = _.__digit(n), e2 = _JSBI.__imul(32767 & i, t), g2 = _JSBI.__imul(i >>> 15, t), a = e2 + ((32767 & g2) << 15) + l + s;\n          s = a >>> 30, l = g2 >>> 15, o.__setDigit(n, 1073741823 & a);\n        }\n        if (o.length > g) for (o.__setDigit(g++, s + l); g < o.length; ) o.__setDigit(g++, 0);\n        else if (0 !== s + l) throw new Error(\"implementation bug\");\n      }\n      __inplaceMultiplyAdd(i, _, t) {\n        t > this.length && (t = this.length);\n        const e = 32767 & i, n = i >>> 15;\n        let g = 0, o = _;\n        for (let s = 0; s < t; s++) {\n          const i2 = this.__digit(s), _2 = 32767 & i2, t2 = i2 >>> 15, l = _JSBI.__imul(_2, e), r = _JSBI.__imul(_2, n), a = _JSBI.__imul(t2, e), u = _JSBI.__imul(t2, n);\n          let d = o + l + g;\n          g = d >>> 30, d &= 1073741823, d += ((32767 & r) << 15) + ((32767 & a) << 15), g += d >>> 30, o = u + (r >>> 15) + (a >>> 15), this.__setDigit(s, 1073741823 & d);\n        }\n        if (0 != g || 0 !== o) throw new Error(\"implementation bug\");\n      }\n      static __absoluteDivSmall(_, t, e = null) {\n        null === e && (e = new _JSBI(_.length, false));\n        let n = 0;\n        for (let g, o = 2 * _.length - 1; 0 <= o; o -= 2) {\n          g = (n << 15 | _.__halfDigit(o)) >>> 0;\n          const i = 0 | g / t;\n          n = 0 | g % t, g = (n << 15 | _.__halfDigit(o - 1)) >>> 0;\n          const s = 0 | g / t;\n          n = 0 | g % t, e.__setDigit(o >>> 1, i << 15 | s);\n        }\n        return e;\n      }\n      static __absoluteModSmall(_, t) {\n        let e = 0;\n        for (let n = 2 * _.length - 1; 0 <= n; n--) {\n          const i = (e << 15 | _.__halfDigit(n)) >>> 0;\n          e = 0 | i % t;\n        }\n        return e;\n      }\n      static __absoluteDivLarge(i, _, t, e) {\n        const g = _.__halfDigitLength(), n = _.length, o = i.__halfDigitLength() - g;\n        let s = null;\n        t && (s = new _JSBI(o + 2 >>> 1, false), s.__initializeDigits());\n        const l = new _JSBI(g + 2 >>> 1, false);\n        l.__initializeDigits();\n        const r = _JSBI.__clz15(_.__halfDigit(g - 1));\n        0 < r && (_ = _JSBI.__specialLeftShift(_, r, 0));\n        const a = _JSBI.__specialLeftShift(i, r, 1), u = _.__halfDigit(g - 1);\n        let d = 0;\n        for (let r2, h = o; 0 <= h; h--) {\n          r2 = 32767;\n          const i2 = a.__halfDigit(h + g);\n          if (i2 !== u) {\n            const t2 = (i2 << 15 | a.__halfDigit(h + g - 1)) >>> 0;\n            r2 = 0 | t2 / u;\n            let e3 = 0 | t2 % u;\n            const n2 = _.__halfDigit(g - 2), o2 = a.__halfDigit(h + g - 2);\n            for (; _JSBI.__imul(r2, n2) >>> 0 > (e3 << 16 | o2) >>> 0 && (r2--, e3 += u, !(32767 < e3)); ) ;\n          }\n          _JSBI.__internalMultiplyAdd(_, r2, 0, n, l);\n          let e2 = a.__inplaceSub(l, h, g + 1);\n          0 !== e2 && (e2 = a.__inplaceAdd(_, h, g), a.__setHalfDigit(h + g, 32767 & a.__halfDigit(h + g) + e2), r2--), t && (1 & h ? d = r2 << 15 : s.__setDigit(h >>> 1, d | r2));\n        }\n        if (e) return a.__inplaceRightShift(r), t ? { quotient: s, remainder: a } : a;\n        if (t) return s;\n        throw new Error(\"unreachable\");\n      }\n      static __clz15(i) {\n        return _JSBI.__clz30(i) - 15;\n      }\n      __inplaceAdd(_, t, e) {\n        let n = 0;\n        for (let g = 0; g < e; g++) {\n          const i = this.__halfDigit(t + g) + _.__halfDigit(g) + n;\n          n = i >>> 15, this.__setHalfDigit(t + g, 32767 & i);\n        }\n        return n;\n      }\n      __inplaceSub(_, t, e) {\n        let n = 0;\n        if (1 & t) {\n          t >>= 1;\n          let g = this.__digit(t), o = 32767 & g, s = 0;\n          for (; s < e - 1 >>> 1; s++) {\n            const i2 = _.__digit(s), e2 = (g >>> 15) - (32767 & i2) - n;\n            n = 1 & e2 >>> 15, this.__setDigit(t + s, (32767 & e2) << 15 | 32767 & o), g = this.__digit(t + s + 1), o = (32767 & g) - (i2 >>> 15) - n, n = 1 & o >>> 15;\n          }\n          const i = _.__digit(s), l = (g >>> 15) - (32767 & i) - n;\n          n = 1 & l >>> 15, this.__setDigit(t + s, (32767 & l) << 15 | 32767 & o);\n          if (t + s + 1 >= this.length) throw new RangeError(\"out of bounds\");\n          0 == (1 & e) && (g = this.__digit(t + s + 1), o = (32767 & g) - (i >>> 15) - n, n = 1 & o >>> 15, this.__setDigit(t + _.length, 1073709056 & g | 32767 & o));\n        } else {\n          t >>= 1;\n          let g = 0;\n          for (; g < _.length - 1; g++) {\n            const i2 = this.__digit(t + g), e2 = _.__digit(g), o2 = (32767 & i2) - (32767 & e2) - n;\n            n = 1 & o2 >>> 15;\n            const s2 = (i2 >>> 15) - (e2 >>> 15) - n;\n            n = 1 & s2 >>> 15, this.__setDigit(t + g, (32767 & s2) << 15 | 32767 & o2);\n          }\n          const i = this.__digit(t + g), o = _.__digit(g), s = (32767 & i) - (32767 & o) - n;\n          n = 1 & s >>> 15;\n          let l = 0;\n          0 == (1 & e) && (l = (i >>> 15) - (o >>> 15) - n, n = 1 & l >>> 15), this.__setDigit(t + g, (32767 & l) << 15 | 32767 & s);\n        }\n        return n;\n      }\n      __inplaceRightShift(_) {\n        if (0 === _) return;\n        let t = this.__digit(0) >>> _;\n        const e = this.length - 1;\n        for (let n = 0; n < e; n++) {\n          const i = this.__digit(n + 1);\n          this.__setDigit(n, 1073741823 & i << 30 - _ | t), t = i >>> _;\n        }\n        this.__setDigit(e, t);\n      }\n      static __specialLeftShift(_, t, e) {\n        const g = _.length, n = new _JSBI(g + e, false);\n        if (0 === t) {\n          for (let t2 = 0; t2 < g; t2++) n.__setDigit(t2, _.__digit(t2));\n          return 0 < e && n.__setDigit(g, 0), n;\n        }\n        let o = 0;\n        for (let s = 0; s < g; s++) {\n          const i = _.__digit(s);\n          n.__setDigit(s, 1073741823 & i << t | o), o = i >>> 30 - t;\n        }\n        return 0 < e && n.__setDigit(g, o), n;\n      }\n      static __leftShiftByAbsolute(_, i) {\n        const t = _JSBI.__toShiftAmount(i);\n        if (0 > t) throw new RangeError(\"BigInt too big\");\n        const e = 0 | t / 30, n = t % 30, g = _.length, o = 0 !== n && 0 != _.__digit(g - 1) >>> 30 - n, s = g + e + (o ? 1 : 0), l = new _JSBI(s, _.sign);\n        if (0 === n) {\n          let t2 = 0;\n          for (; t2 < e; t2++) l.__setDigit(t2, 0);\n          for (; t2 < s; t2++) l.__setDigit(t2, _.__digit(t2 - e));\n        } else {\n          let t2 = 0;\n          for (let _2 = 0; _2 < e; _2++) l.__setDigit(_2, 0);\n          for (let o2 = 0; o2 < g; o2++) {\n            const i2 = _.__digit(o2);\n            l.__setDigit(o2 + e, 1073741823 & i2 << n | t2), t2 = i2 >>> 30 - n;\n          }\n          if (o) l.__setDigit(g + e, t2);\n          else if (0 !== t2) throw new Error(\"implementation bug\");\n        }\n        return l.__trim();\n      }\n      static __rightShiftByAbsolute(_, i) {\n        const t = _.length, e = _.sign, n = _JSBI.__toShiftAmount(i);\n        if (0 > n) return _JSBI.__rightShiftByMaximum(e);\n        const g = 0 | n / 30, o = n % 30;\n        let s = t - g;\n        if (0 >= s) return _JSBI.__rightShiftByMaximum(e);\n        let l = false;\n        if (e) {\n          if (0 != (_.__digit(g) & (1 << o) - 1)) l = true;\n          else for (let t2 = 0; t2 < g; t2++) if (0 !== _.__digit(t2)) {\n            l = true;\n            break;\n          }\n        }\n        if (l && 0 === o) {\n          const i2 = _.__digit(t - 1);\n          0 == ~i2 && s++;\n        }\n        let r = new _JSBI(s, e);\n        if (0 === o) {\n          r.__setDigit(s - 1, 0);\n          for (let e2 = g; e2 < t; e2++) r.__setDigit(e2 - g, _.__digit(e2));\n        } else {\n          let e2 = _.__digit(g) >>> o;\n          const n2 = t - g - 1;\n          for (let t2 = 0; t2 < n2; t2++) {\n            const i2 = _.__digit(t2 + g + 1);\n            r.__setDigit(t2, 1073741823 & i2 << 30 - o | e2), e2 = i2 >>> o;\n          }\n          r.__setDigit(n2, e2);\n        }\n        return l && (r = _JSBI.__absoluteAddOne(r, true, r)), r.__trim();\n      }\n      static __rightShiftByMaximum(i) {\n        return i ? _JSBI.__oneDigit(1, true) : _JSBI.__zero();\n      }\n      static __toShiftAmount(i) {\n        if (1 < i.length) return -1;\n        const _ = i.__unsignedDigit(0);\n        return _ > _JSBI.__kMaxLengthBits ? -1 : _;\n      }\n      static __toPrimitive(i, _ = \"default\") {\n        if (\"object\" != typeof i) return i;\n        if (i.constructor === _JSBI) return i;\n        if (\"undefined\" != typeof Symbol && \"symbol\" == typeof Symbol.toPrimitive) {\n          const t2 = i[Symbol.toPrimitive];\n          if (t2) {\n            const i2 = t2(_);\n            if (\"object\" != typeof i2) return i2;\n            throw new TypeError(\"Cannot convert object to primitive value\");\n          }\n        }\n        const t = i.valueOf;\n        if (t) {\n          const _2 = t.call(i);\n          if (\"object\" != typeof _2) return _2;\n        }\n        const e = i.toString;\n        if (e) {\n          const _2 = e.call(i);\n          if (\"object\" != typeof _2) return _2;\n        }\n        throw new TypeError(\"Cannot convert object to primitive value\");\n      }\n      static __toNumeric(i) {\n        return _JSBI.__isBigInt(i) ? i : +i;\n      }\n      static __isBigInt(i) {\n        return \"object\" == typeof i && null !== i && i.constructor === _JSBI;\n      }\n      static __truncateToNBits(i, _) {\n        const t = 0 | (i + 29) / 30, e = new _JSBI(t, _.sign), n = t - 1;\n        for (let t2 = 0; t2 < n; t2++) e.__setDigit(t2, _.__digit(t2));\n        let g = _.__digit(n);\n        if (0 != i % 30) {\n          const _2 = 32 - i % 30;\n          g = g << _2 >>> _2;\n        }\n        return e.__setDigit(n, g), e.__trim();\n      }\n      static __truncateAndSubFromPowerOfTwo(_, t, e) {\n        var n = Math.min;\n        const g = 0 | (_ + 29) / 30, o = new _JSBI(g, e);\n        let s = 0;\n        const l = g - 1;\n        let a = 0;\n        for (const i = n(l, t.length); s < i; s++) {\n          const i2 = 0 - t.__digit(s) - a;\n          a = 1 & i2 >>> 30, o.__setDigit(s, 1073741823 & i2);\n        }\n        for (; s < l; s++) o.__setDigit(s, 0 | 1073741823 & -a);\n        let u = l < t.length ? t.__digit(l) : 0;\n        const d = _ % 30;\n        let h;\n        if (0 == d) h = 0 - u - a, h &= 1073741823;\n        else {\n          const i = 32 - d;\n          u = u << i >>> i;\n          const _2 = 1 << 32 - i;\n          h = _2 - u - a, h &= _2 - 1;\n        }\n        return o.__setDigit(l, h), o.__trim();\n      }\n      __digit(_) {\n        return this[_];\n      }\n      __unsignedDigit(_) {\n        return this[_] >>> 0;\n      }\n      __setDigit(_, i) {\n        this[_] = 0 | i;\n      }\n      __setDigitGrow(_, i) {\n        this[_] = 0 | i;\n      }\n      __halfDigitLength() {\n        const i = this.length;\n        return 32767 >= this.__unsignedDigit(i - 1) ? 2 * i - 1 : 2 * i;\n      }\n      __halfDigit(_) {\n        return 32767 & this[_ >>> 1] >>> 15 * (1 & _);\n      }\n      __setHalfDigit(_, i) {\n        const t = _ >>> 1, e = this.__digit(t), n = 1 & _ ? 32767 & e | i << 15 : 1073709056 & e | 32767 & i;\n        this.__setDigit(t, n);\n      }\n      static __digitPow(i, _) {\n        let t = 1;\n        for (; 0 < _; ) 1 & _ && (t *= i), _ >>>= 1, i *= i;\n        return t;\n      }\n      static __isOneDigitInt(i) {\n        return (1073741823 & i) === i;\n      }\n    };\n    JSBI3.__kMaxLength = 33554432, JSBI3.__kMaxLengthBits = JSBI3.__kMaxLength << 5, JSBI3.__kMaxBitsPerChar = [0, 0, 32, 51, 64, 75, 83, 90, 96, 102, 107, 111, 115, 119, 122, 126, 128, 131, 134, 136, 139, 141, 143, 145, 147, 149, 151, 153, 154, 156, 158, 159, 160, 162, 163, 165, 166], JSBI3.__kBitsPerCharTableShift = 5, JSBI3.__kBitsPerCharTableMultiplier = 1 << JSBI3.__kBitsPerCharTableShift, JSBI3.__kConversionChars = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\"], JSBI3.__kBitConversionBuffer = new ArrayBuffer(8), JSBI3.__kBitConversionDouble = new Float64Array(JSBI3.__kBitConversionBuffer), JSBI3.__kBitConversionInts = new Int32Array(JSBI3.__kBitConversionBuffer), JSBI3.__clz30 = Math.clz32 ? function(i) {\n      return Math.clz32(i) - 2;\n    } : function(i) {\n      return 0 === i ? 30 : 0 | 29 - (0 | Math.log(i >>> 0) / Math.LN2);\n    }, JSBI3.__imul = Math.imul || function(i, _) {\n      return 0 | i * _;\n    }, module2.exports = JSBI3;\n  }\n});\n\n// node_modules/decimal.js/decimal.js\nvar require_decimal = __commonJS({\n  \"node_modules/decimal.js/decimal.js\"(exports2, module2) {\n    (function(globalScope) {\n      \"use strict\";\n      var EXP_LIMIT = 9e15, MAX_DIGITS = 1e9, NUMERALS = \"0123456789abcdef\", LN10 = \"2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058\", PI = \"3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789\", DEFAULTS = {\n        // These values must be integers within the stated ranges (inclusive).\n        // Most of these values can be changed at run-time using the `Decimal.config` method.\n        // The maximum number of significant digits of the result of a calculation or base conversion.\n        // E.g. `Decimal.config({ precision: 20 });`\n        precision: 20,\n        // 1 to MAX_DIGITS\n        // The rounding mode used when rounding to `precision`.\n        //\n        // ROUND_UP         0 Away from zero.\n        // ROUND_DOWN       1 Towards zero.\n        // ROUND_CEIL       2 Towards +Infinity.\n        // ROUND_FLOOR      3 Towards -Infinity.\n        // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.\n        // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\n        // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\n        // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\n        // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\n        //\n        // E.g.\n        // `Decimal.rounding = 4;`\n        // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\n        rounding: 4,\n        // 0 to 8\n        // The modulo mode used when calculating the modulus: a mod n.\n        // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\n        // The remainder (r) is calculated as: r = a - n * q.\n        //\n        // UP         0 The remainder is positive if the dividend is negative, else is negative.\n        // DOWN       1 The remainder has the same sign as the dividend (JavaScript %).\n        // FLOOR      3 The remainder has the same sign as the divisor (Python %).\n        // HALF_EVEN  6 The IEEE 754 remainder function.\n        // EUCLID     9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\n        //\n        // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\n        // division (9) are commonly used for the modulus operation. The other rounding modes can also\n        // be used, but they may not give useful results.\n        modulo: 1,\n        // 0 to 9\n        // The exponent value at and beneath which `toString` returns exponential notation.\n        // JavaScript numbers: -7\n        toExpNeg: -7,\n        // 0 to -EXP_LIMIT\n        // The exponent value at and above which `toString` returns exponential notation.\n        // JavaScript numbers: 21\n        toExpPos: 21,\n        // 0 to EXP_LIMIT\n        // The minimum exponent value, beneath which underflow to zero occurs.\n        // JavaScript numbers: -324  (5e-324)\n        minE: -EXP_LIMIT,\n        // -1 to -EXP_LIMIT\n        // The maximum exponent value, above which overflow to Infinity occurs.\n        // JavaScript numbers: 308  (1.7976931348623157e+308)\n        maxE: EXP_LIMIT,\n        // 1 to EXP_LIMIT\n        // Whether to use cryptographically-secure random number generation, if available.\n        crypto: false\n        // true/false\n      }, Decimal2, inexact, noConflict, quadrant, external = true, decimalError = \"[DecimalError] \", invalidArgument = decimalError + \"Invalid argument: \", precisionLimitExceeded = decimalError + \"Precision limit exceeded\", cryptoUnavailable = decimalError + \"crypto unavailable\", tag = \"[object Decimal]\", mathfloor = Math.floor, mathpow = Math.pow, isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i, isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i, isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i, isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i, BASE = 1e7, LOG_BASE = 7, MAX_SAFE_INTEGER = 9007199254740991, LN10_PRECISION = LN10.length - 1, PI_PRECISION = PI.length - 1, P = { toStringTag: tag };\n      P.absoluteValue = P.abs = function() {\n        var x = new this.constructor(this);\n        if (x.s < 0) x.s = 1;\n        return finalise(x);\n      };\n      P.ceil = function() {\n        return finalise(new this.constructor(this), this.e + 1, 2);\n      };\n      P.clampedTo = P.clamp = function(min2, max2) {\n        var k, x = this, Ctor = x.constructor;\n        min2 = new Ctor(min2);\n        max2 = new Ctor(max2);\n        if (!min2.s || !max2.s) return new Ctor(NaN);\n        if (min2.gt(max2)) throw Error(invalidArgument + max2);\n        k = x.cmp(min2);\n        return k < 0 ? min2 : x.cmp(max2) > 0 ? max2 : new Ctor(x);\n      };\n      P.comparedTo = P.cmp = function(y) {\n        var i, j, xdL, ydL, x = this, xd = x.d, yd = (y = new x.constructor(y)).d, xs = x.s, ys = y.s;\n        if (!xd || !yd) {\n          return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\n        }\n        if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\n        if (xs !== ys) return xs;\n        if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\n        xdL = xd.length;\n        ydL = yd.length;\n        for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\n          if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\n        }\n        return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\n      };\n      P.cosine = P.cos = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.d) return new Ctor(NaN);\n        if (!x.d[0]) return new Ctor(1);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\n        Ctor.rounding = 1;\n        x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\n      };\n      P.cubeRoot = P.cbrt = function() {\n        var e, m, n, r, rep, s, sd, t, t3, t3plusx, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        external = false;\n        s = x.s * mathpow(x.s * x, 1 / 3);\n        if (!s || Math.abs(s) == 1 / 0) {\n          n = digitsToString(x.d);\n          e = x.e;\n          if (s = (e - n.length + 1) % 3) n += s == 1 || s == -2 ? \"0\" : \"00\";\n          s = mathpow(n, 1 / 3);\n          e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\n          if (s == 1 / 0) {\n            n = \"5e\" + e;\n          } else {\n            n = s.toExponential();\n            n = n.slice(0, n.indexOf(\"e\") + 1) + e;\n          }\n          r = new Ctor(n);\n          r.s = x.s;\n        } else {\n          r = new Ctor(s.toString());\n        }\n        sd = (e = Ctor.precision) + 3;\n        for (; ; ) {\n          t = r;\n          t3 = t.times(t).times(t);\n          t3plusx = t3.plus(x);\n          r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\n          if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\n            n = n.slice(sd - 3, sd + 1);\n            if (n == \"9999\" || !rep && n == \"4999\") {\n              if (!rep) {\n                finalise(t, e + 1, 0);\n                if (t.times(t).times(t).eq(x)) {\n                  r = t;\n                  break;\n                }\n              }\n              sd += 4;\n              rep = 1;\n            } else {\n              if (!+n || !+n.slice(1) && n.charAt(0) == \"5\") {\n                finalise(r, e + 1, 1);\n                m = !r.times(r).times(r).eq(x);\n              }\n              break;\n            }\n          }\n        }\n        external = true;\n        return finalise(r, e, Ctor.rounding, m);\n      };\n      P.decimalPlaces = P.dp = function() {\n        var w, d = this.d, n = NaN;\n        if (d) {\n          w = d.length - 1;\n          n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\n          w = d[w];\n          if (w) for (; w % 10 == 0; w /= 10) n--;\n          if (n < 0) n = 0;\n        }\n        return n;\n      };\n      P.dividedBy = P.div = function(y) {\n        return divide(this, new this.constructor(y));\n      };\n      P.dividedToIntegerBy = P.divToInt = function(y) {\n        var x = this, Ctor = x.constructor;\n        return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\n      };\n      P.equals = P.eq = function(y) {\n        return this.cmp(y) === 0;\n      };\n      P.floor = function() {\n        return finalise(new this.constructor(this), this.e + 1, 3);\n      };\n      P.greaterThan = P.gt = function(y) {\n        return this.cmp(y) > 0;\n      };\n      P.greaterThanOrEqualTo = P.gte = function(y) {\n        var k = this.cmp(y);\n        return k == 1 || k === 0;\n      };\n      P.hyperbolicCosine = P.cosh = function() {\n        var k, n, pr, rm, len, x = this, Ctor = x.constructor, one = new Ctor(1);\n        if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\n        if (x.isZero()) return one;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\n        Ctor.rounding = 1;\n        len = x.d.length;\n        if (len < 32) {\n          k = Math.ceil(len / 3);\n          n = (1 / tinyPow(4, k)).toString();\n        } else {\n          k = 16;\n          n = \"2.3283064365386962890625e-10\";\n        }\n        x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\n        var cosh2_x, i = k, d8 = new Ctor(8);\n        for (; i--; ) {\n          cosh2_x = x.times(x);\n          x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\n        }\n        return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\n      };\n      P.hyperbolicSine = P.sinh = function() {\n        var k, pr, rm, len, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\n        Ctor.rounding = 1;\n        len = x.d.length;\n        if (len < 3) {\n          x = taylorSeries(Ctor, 2, x, x, true);\n        } else {\n          k = 1.4 * Math.sqrt(len);\n          k = k > 16 ? 16 : k | 0;\n          x = x.times(1 / tinyPow(5, k));\n          x = taylorSeries(Ctor, 2, x, x, true);\n          var sinh2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20);\n          for (; k--; ) {\n            sinh2_x = x.times(x);\n            x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\n          }\n        }\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(x, pr, rm, true);\n      };\n      P.hyperbolicTangent = P.tanh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(x.s);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 7;\n        Ctor.rounding = 1;\n        return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\n      };\n      P.inverseCosine = P.acos = function() {\n        var halfPi, x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding;\n        if (k !== -1) {\n          return k === 0 ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) : new Ctor(NaN);\n        }\n        if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\n        Ctor.precision = pr + 6;\n        Ctor.rounding = 1;\n        x = x.asin();\n        halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return halfPi.minus(x);\n      };\n      P.inverseHyperbolicCosine = P.acosh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\n        if (!x.isFinite()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\n        Ctor.rounding = 1;\n        external = false;\n        x = x.times(x).minus(1).sqrt().plus(x);\n        external = true;\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.ln();\n      };\n      P.inverseHyperbolicSine = P.asinh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\n        Ctor.rounding = 1;\n        external = false;\n        x = x.times(x).plus(1).sqrt().plus(x);\n        external = true;\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.ln();\n      };\n      P.inverseHyperbolicTangent = P.atanh = function() {\n        var pr, rm, wpr, xsd, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        xsd = x.sd();\n        if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\n        Ctor.precision = wpr = xsd - x.e;\n        x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\n        Ctor.precision = pr + 4;\n        Ctor.rounding = 1;\n        x = x.ln();\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.times(0.5);\n      };\n      P.inverseSine = P.asin = function() {\n        var halfPi, k, pr, rm, x = this, Ctor = x.constructor;\n        if (x.isZero()) return new Ctor(x);\n        k = x.abs().cmp(1);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (k !== -1) {\n          if (k === 0) {\n            halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\n            halfPi.s = x.s;\n            return halfPi;\n          }\n          return new Ctor(NaN);\n        }\n        Ctor.precision = pr + 6;\n        Ctor.rounding = 1;\n        x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.times(2);\n      };\n      P.inverseTangent = P.atan = function() {\n        var i, j, k, n, px, t, r, wpr, x2, x = this, Ctor = x.constructor, pr = Ctor.precision, rm = Ctor.rounding;\n        if (!x.isFinite()) {\n          if (!x.s) return new Ctor(NaN);\n          if (pr + 4 <= PI_PRECISION) {\n            r = getPi(Ctor, pr + 4, rm).times(0.5);\n            r.s = x.s;\n            return r;\n          }\n        } else if (x.isZero()) {\n          return new Ctor(x);\n        } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\n          r = getPi(Ctor, pr + 4, rm).times(0.25);\n          r.s = x.s;\n          return r;\n        }\n        Ctor.precision = wpr = pr + 10;\n        Ctor.rounding = 1;\n        k = Math.min(28, wpr / LOG_BASE + 2 | 0);\n        for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\n        external = false;\n        j = Math.ceil(wpr / LOG_BASE);\n        n = 1;\n        x2 = x.times(x);\n        r = new Ctor(x);\n        px = x;\n        for (; i !== -1; ) {\n          px = px.times(x2);\n          t = r.minus(px.div(n += 2));\n          px = px.times(x2);\n          r = t.plus(px.div(n += 2));\n          if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--; ) ;\n        }\n        if (k) r = r.times(2 << k - 1);\n        external = true;\n        return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\n      };\n      P.isFinite = function() {\n        return !!this.d;\n      };\n      P.isInteger = P.isInt = function() {\n        return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\n      };\n      P.isNaN = function() {\n        return !this.s;\n      };\n      P.isNegative = P.isNeg = function() {\n        return this.s < 0;\n      };\n      P.isPositive = P.isPos = function() {\n        return this.s > 0;\n      };\n      P.isZero = function() {\n        return !!this.d && this.d[0] === 0;\n      };\n      P.lessThan = P.lt = function(y) {\n        return this.cmp(y) < 0;\n      };\n      P.lessThanOrEqualTo = P.lte = function(y) {\n        return this.cmp(y) < 1;\n      };\n      P.logarithm = P.log = function(base) {\n        var isBase10, d, denominator, k, inf, num, sd, r, arg = this, Ctor = arg.constructor, pr = Ctor.precision, rm = Ctor.rounding, guard = 5;\n        if (base == null) {\n          base = new Ctor(10);\n          isBase10 = true;\n        } else {\n          base = new Ctor(base);\n          d = base.d;\n          if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\n          isBase10 = base.eq(10);\n        }\n        d = arg.d;\n        if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\n          return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\n        }\n        if (isBase10) {\n          if (d.length > 1) {\n            inf = true;\n          } else {\n            for (k = d[0]; k % 10 === 0; ) k /= 10;\n            inf = k !== 1;\n          }\n        }\n        external = false;\n        sd = pr + guard;\n        num = naturalLogarithm(arg, sd);\n        denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\n        r = divide(num, denominator, sd, 1);\n        if (checkRoundingDigits(r.d, k = pr, rm)) {\n          do {\n            sd += 10;\n            num = naturalLogarithm(arg, sd);\n            denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\n            r = divide(num, denominator, sd, 1);\n            if (!inf) {\n              if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\n                r = finalise(r, pr + 1, 0);\n              }\n              break;\n            }\n          } while (checkRoundingDigits(r.d, k += 10, rm));\n        }\n        external = true;\n        return finalise(r, pr, rm);\n      };\n      P.minus = P.sub = function(y) {\n        var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.d) {\n          if (!x.s || !y.s) y = new Ctor(NaN);\n          else if (x.d) y.s = -y.s;\n          else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\n          return y;\n        }\n        if (x.s != y.s) {\n          y.s = -y.s;\n          return x.plus(y);\n        }\n        xd = x.d;\n        yd = y.d;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (!xd[0] || !yd[0]) {\n          if (yd[0]) y.s = -y.s;\n          else if (xd[0]) y = new Ctor(x);\n          else return new Ctor(rm === 3 ? -0 : 0);\n          return external ? finalise(y, pr, rm) : y;\n        }\n        e = mathfloor(y.e / LOG_BASE);\n        xe = mathfloor(x.e / LOG_BASE);\n        xd = xd.slice();\n        k = xe - e;\n        if (k) {\n          xLTy = k < 0;\n          if (xLTy) {\n            d = xd;\n            k = -k;\n            len = yd.length;\n          } else {\n            d = yd;\n            e = xe;\n            len = xd.length;\n          }\n          i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\n          if (k > i) {\n            k = i;\n            d.length = 1;\n          }\n          d.reverse();\n          for (i = k; i--; ) d.push(0);\n          d.reverse();\n        } else {\n          i = xd.length;\n          len = yd.length;\n          xLTy = i < len;\n          if (xLTy) len = i;\n          for (i = 0; i < len; i++) {\n            if (xd[i] != yd[i]) {\n              xLTy = xd[i] < yd[i];\n              break;\n            }\n          }\n          k = 0;\n        }\n        if (xLTy) {\n          d = xd;\n          xd = yd;\n          yd = d;\n          y.s = -y.s;\n        }\n        len = xd.length;\n        for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\n        for (i = yd.length; i > k; ) {\n          if (xd[--i] < yd[i]) {\n            for (j = i; j && xd[--j] === 0; ) xd[j] = BASE - 1;\n            --xd[j];\n            xd[i] += BASE;\n          }\n          xd[i] -= yd[i];\n        }\n        for (; xd[--len] === 0; ) xd.pop();\n        for (; xd[0] === 0; xd.shift()) --e;\n        if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\n        y.d = xd;\n        y.e = getBase10Exponent(xd, e);\n        return external ? finalise(y, pr, rm) : y;\n      };\n      P.modulo = P.mod = function(y) {\n        var q, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\n        if (!y.d || x.d && !x.d[0]) {\n          return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\n        }\n        external = false;\n        if (Ctor.modulo == 9) {\n          q = divide(x, y.abs(), 0, 3, 1);\n          q.s *= y.s;\n        } else {\n          q = divide(x, y, 0, Ctor.modulo, 1);\n        }\n        q = q.times(y);\n        external = true;\n        return x.minus(q);\n      };\n      P.naturalExponential = P.exp = function() {\n        return naturalExponential(this);\n      };\n      P.naturalLogarithm = P.ln = function() {\n        return naturalLogarithm(this);\n      };\n      P.negated = P.neg = function() {\n        var x = new this.constructor(this);\n        x.s = -x.s;\n        return finalise(x);\n      };\n      P.plus = P.add = function(y) {\n        var carry, d, e, i, k, len, pr, rm, xd, yd, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.d) {\n          if (!x.s || !y.s) y = new Ctor(NaN);\n          else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\n          return y;\n        }\n        if (x.s != y.s) {\n          y.s = -y.s;\n          return x.minus(y);\n        }\n        xd = x.d;\n        yd = y.d;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (!xd[0] || !yd[0]) {\n          if (!yd[0]) y = new Ctor(x);\n          return external ? finalise(y, pr, rm) : y;\n        }\n        k = mathfloor(x.e / LOG_BASE);\n        e = mathfloor(y.e / LOG_BASE);\n        xd = xd.slice();\n        i = k - e;\n        if (i) {\n          if (i < 0) {\n            d = xd;\n            i = -i;\n            len = yd.length;\n          } else {\n            d = yd;\n            e = k;\n            len = xd.length;\n          }\n          k = Math.ceil(pr / LOG_BASE);\n          len = k > len ? k + 1 : len + 1;\n          if (i > len) {\n            i = len;\n            d.length = 1;\n          }\n          d.reverse();\n          for (; i--; ) d.push(0);\n          d.reverse();\n        }\n        len = xd.length;\n        i = yd.length;\n        if (len - i < 0) {\n          i = len;\n          d = yd;\n          yd = xd;\n          xd = d;\n        }\n        for (carry = 0; i; ) {\n          carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\n          xd[i] %= BASE;\n        }\n        if (carry) {\n          xd.unshift(carry);\n          ++e;\n        }\n        for (len = xd.length; xd[--len] == 0; ) xd.pop();\n        y.d = xd;\n        y.e = getBase10Exponent(xd, e);\n        return external ? finalise(y, pr, rm) : y;\n      };\n      P.precision = P.sd = function(z) {\n        var k, x = this;\n        if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\n        if (x.d) {\n          k = getPrecision(x.d);\n          if (z && x.e + 1 > k) k = x.e + 1;\n        } else {\n          k = NaN;\n        }\n        return k;\n      };\n      P.round = function() {\n        var x = this, Ctor = x.constructor;\n        return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\n      };\n      P.sine = P.sin = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\n        Ctor.rounding = 1;\n        x = sine(Ctor, toLessThanHalfPi(Ctor, x));\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\n      };\n      P.squareRoot = P.sqrt = function() {\n        var m, n, sd, r, rep, t, x = this, d = x.d, e = x.e, s = x.s, Ctor = x.constructor;\n        if (s !== 1 || !d || !d[0]) {\n          return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\n        }\n        external = false;\n        s = Math.sqrt(+x);\n        if (s == 0 || s == 1 / 0) {\n          n = digitsToString(d);\n          if ((n.length + e) % 2 == 0) n += \"0\";\n          s = Math.sqrt(n);\n          e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\n          if (s == 1 / 0) {\n            n = \"5e\" + e;\n          } else {\n            n = s.toExponential();\n            n = n.slice(0, n.indexOf(\"e\") + 1) + e;\n          }\n          r = new Ctor(n);\n        } else {\n          r = new Ctor(s.toString());\n        }\n        sd = (e = Ctor.precision) + 3;\n        for (; ; ) {\n          t = r;\n          r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\n          if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\n            n = n.slice(sd - 3, sd + 1);\n            if (n == \"9999\" || !rep && n == \"4999\") {\n              if (!rep) {\n                finalise(t, e + 1, 0);\n                if (t.times(t).eq(x)) {\n                  r = t;\n                  break;\n                }\n              }\n              sd += 4;\n              rep = 1;\n            } else {\n              if (!+n || !+n.slice(1) && n.charAt(0) == \"5\") {\n                finalise(r, e + 1, 1);\n                m = !r.times(r).eq(x);\n              }\n              break;\n            }\n          }\n        }\n        external = true;\n        return finalise(r, e, Ctor.rounding, m);\n      };\n      P.tangent = P.tan = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 10;\n        Ctor.rounding = 1;\n        x = x.sin();\n        x.s = 1;\n        x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\n      };\n      P.times = P.mul = function(y) {\n        var carry, e, i, k, r, rL, t, xdL, ydL, x = this, Ctor = x.constructor, xd = x.d, yd = (y = new Ctor(y)).d;\n        y.s *= x.s;\n        if (!xd || !xd[0] || !yd || !yd[0]) {\n          return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd ? NaN : !xd || !yd ? y.s / 0 : y.s * 0);\n        }\n        e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\n        xdL = xd.length;\n        ydL = yd.length;\n        if (xdL < ydL) {\n          r = xd;\n          xd = yd;\n          yd = r;\n          rL = xdL;\n          xdL = ydL;\n          ydL = rL;\n        }\n        r = [];\n        rL = xdL + ydL;\n        for (i = rL; i--; ) r.push(0);\n        for (i = ydL; --i >= 0; ) {\n          carry = 0;\n          for (k = xdL + i; k > i; ) {\n            t = r[k] + yd[i] * xd[k - i - 1] + carry;\n            r[k--] = t % BASE | 0;\n            carry = t / BASE | 0;\n          }\n          r[k] = (r[k] + carry) % BASE | 0;\n        }\n        for (; !r[--rL]; ) r.pop();\n        if (carry) ++e;\n        else r.shift();\n        y.d = r;\n        y.e = getBase10Exponent(r, e);\n        return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\n      };\n      P.toBinary = function(sd, rm) {\n        return toStringBinary(this, 2, sd, rm);\n      };\n      P.toDecimalPlaces = P.toDP = function(dp, rm) {\n        var x = this, Ctor = x.constructor;\n        x = new Ctor(x);\n        if (dp === void 0) return x;\n        checkInt32(dp, 0, MAX_DIGITS);\n        if (rm === void 0) rm = Ctor.rounding;\n        else checkInt32(rm, 0, 8);\n        return finalise(x, dp + x.e + 1, rm);\n      };\n      P.toExponential = function(dp, rm) {\n        var str, x = this, Ctor = x.constructor;\n        if (dp === void 0) {\n          str = finiteToString(x, true);\n        } else {\n          checkInt32(dp, 0, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          x = finalise(new Ctor(x), dp + 1, rm);\n          str = finiteToString(x, true, dp + 1);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toFixed = function(dp, rm) {\n        var str, y, x = this, Ctor = x.constructor;\n        if (dp === void 0) {\n          str = finiteToString(x);\n        } else {\n          checkInt32(dp, 0, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          y = finalise(new Ctor(x), dp + x.e + 1, rm);\n          str = finiteToString(y, false, dp + y.e + 1);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toFraction = function(maxD) {\n        var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, x = this, xd = x.d, Ctor = x.constructor;\n        if (!xd) return new Ctor(x);\n        n1 = d0 = new Ctor(1);\n        d1 = n0 = new Ctor(0);\n        d = new Ctor(d1);\n        e = d.e = getPrecision(xd) - x.e - 1;\n        k = e % LOG_BASE;\n        d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\n        if (maxD == null) {\n          maxD = e > 0 ? d : n1;\n        } else {\n          n = new Ctor(maxD);\n          if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\n          maxD = n.gt(d) ? e > 0 ? d : n1 : n;\n        }\n        external = false;\n        n = new Ctor(digitsToString(xd));\n        pr = Ctor.precision;\n        Ctor.precision = e = xd.length * LOG_BASE * 2;\n        for (; ; ) {\n          q = divide(n, d, 0, 1, 1);\n          d2 = d0.plus(q.times(d1));\n          if (d2.cmp(maxD) == 1) break;\n          d0 = d1;\n          d1 = d2;\n          d2 = n1;\n          n1 = n0.plus(q.times(d2));\n          n0 = d2;\n          d2 = d;\n          d = n.minus(q.times(d2));\n          n = d2;\n        }\n        d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\n        n0 = n0.plus(d2.times(n1));\n        d0 = d0.plus(d2.times(d1));\n        n0.s = n1.s = x.s;\n        r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\n        Ctor.precision = pr;\n        external = true;\n        return r;\n      };\n      P.toHexadecimal = P.toHex = function(sd, rm) {\n        return toStringBinary(this, 16, sd, rm);\n      };\n      P.toNearest = function(y, rm) {\n        var x = this, Ctor = x.constructor;\n        x = new Ctor(x);\n        if (y == null) {\n          if (!x.d) return x;\n          y = new Ctor(1);\n          rm = Ctor.rounding;\n        } else {\n          y = new Ctor(y);\n          if (rm === void 0) {\n            rm = Ctor.rounding;\n          } else {\n            checkInt32(rm, 0, 8);\n          }\n          if (!x.d) return y.s ? x : y;\n          if (!y.d) {\n            if (y.s) y.s = x.s;\n            return y;\n          }\n        }\n        if (y.d[0]) {\n          external = false;\n          x = divide(x, y, 0, rm, 1).times(y);\n          external = true;\n          finalise(x);\n        } else {\n          y.s = x.s;\n          x = y;\n        }\n        return x;\n      };\n      P.toNumber = function() {\n        return +this;\n      };\n      P.toOctal = function(sd, rm) {\n        return toStringBinary(this, 8, sd, rm);\n      };\n      P.toPower = P.pow = function(y) {\n        var e, k, pr, r, rm, s, x = this, Ctor = x.constructor, yn = +(y = new Ctor(y));\n        if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\n        x = new Ctor(x);\n        if (x.eq(1)) return x;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (y.eq(1)) return finalise(x, pr, rm);\n        e = mathfloor(y.e / LOG_BASE);\n        if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\n          r = intPow(Ctor, x, k, pr);\n          return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\n        }\n        s = x.s;\n        if (s < 0) {\n          if (e < y.d.length - 1) return new Ctor(NaN);\n          if ((y.d[e] & 1) == 0) s = 1;\n          if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\n            x.s = s;\n            return x;\n          }\n        }\n        k = mathpow(+x, yn);\n        e = k == 0 || !isFinite(k) ? mathfloor(yn * (Math.log(\"0.\" + digitsToString(x.d)) / Math.LN10 + x.e + 1)) : new Ctor(k + \"\").e;\n        if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\n        external = false;\n        Ctor.rounding = x.s = 1;\n        k = Math.min(12, (e + \"\").length);\n        r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\n        if (r.d) {\n          r = finalise(r, pr + 5, 1);\n          if (checkRoundingDigits(r.d, pr, rm)) {\n            e = pr + 10;\n            r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\n            if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\n              r = finalise(r, pr + 1, 0);\n            }\n          }\n        }\n        r.s = s;\n        external = true;\n        Ctor.rounding = rm;\n        return finalise(r, pr, rm);\n      };\n      P.toPrecision = function(sd, rm) {\n        var str, x = this, Ctor = x.constructor;\n        if (sd === void 0) {\n          str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        } else {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          x = finalise(new Ctor(x), sd, rm);\n          str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toSignificantDigits = P.toSD = function(sd, rm) {\n        var x = this, Ctor = x.constructor;\n        if (sd === void 0) {\n          sd = Ctor.precision;\n          rm = Ctor.rounding;\n        } else {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n        }\n        return finalise(new Ctor(x), sd, rm);\n      };\n      P.toString = function() {\n        var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.truncated = P.trunc = function() {\n        return finalise(new this.constructor(this), this.e + 1, 1);\n      };\n      P.valueOf = P.toJSON = function() {\n        var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        return x.isNeg() ? \"-\" + str : str;\n      };\n      function digitsToString(d) {\n        var i, k, ws, indexOfLastWord = d.length - 1, str = \"\", w = d[0];\n        if (indexOfLastWord > 0) {\n          str += w;\n          for (i = 1; i < indexOfLastWord; i++) {\n            ws = d[i] + \"\";\n            k = LOG_BASE - ws.length;\n            if (k) str += getZeroString(k);\n            str += ws;\n          }\n          w = d[i];\n          ws = w + \"\";\n          k = LOG_BASE - ws.length;\n          if (k) str += getZeroString(k);\n        } else if (w === 0) {\n          return \"0\";\n        }\n        for (; w % 10 === 0; ) w /= 10;\n        return str + w;\n      }\n      function checkInt32(i, min2, max2) {\n        if (i !== ~~i || i < min2 || i > max2) {\n          throw Error(invalidArgument + i);\n        }\n      }\n      function checkRoundingDigits(d, i, rm, repeating) {\n        var di, k, r, rd;\n        for (k = d[0]; k >= 10; k /= 10) --i;\n        if (--i < 0) {\n          i += LOG_BASE;\n          di = 0;\n        } else {\n          di = Math.ceil((i + 1) / LOG_BASE);\n          i %= LOG_BASE;\n        }\n        k = mathpow(10, LOG_BASE - i);\n        rd = d[di] % k | 0;\n        if (repeating == null) {\n          if (i < 3) {\n            if (i == 0) rd = rd / 100 | 0;\n            else if (i == 1) rd = rd / 10 | 0;\n            r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 5e4 || rd == 0;\n          } else {\n            r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\n          }\n        } else {\n          if (i < 4) {\n            if (i == 0) rd = rd / 1e3 | 0;\n            else if (i == 1) rd = rd / 100 | 0;\n            else if (i == 2) rd = rd / 10 | 0;\n            r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\n          } else {\n            r = ((repeating || rm < 4) && rd + 1 == k || !repeating && rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 1e3 | 0) == mathpow(10, i - 3) - 1;\n          }\n        }\n        return r;\n      }\n      function convertBase(str, baseIn, baseOut) {\n        var j, arr = [0], arrL, i = 0, strL = str.length;\n        for (; i < strL; ) {\n          for (arrL = arr.length; arrL--; ) arr[arrL] *= baseIn;\n          arr[0] += NUMERALS.indexOf(str.charAt(i++));\n          for (j = 0; j < arr.length; j++) {\n            if (arr[j] > baseOut - 1) {\n              if (arr[j + 1] === void 0) arr[j + 1] = 0;\n              arr[j + 1] += arr[j] / baseOut | 0;\n              arr[j] %= baseOut;\n            }\n          }\n        }\n        return arr.reverse();\n      }\n      function cosine(Ctor, x) {\n        var k, len, y;\n        if (x.isZero()) return x;\n        len = x.d.length;\n        if (len < 32) {\n          k = Math.ceil(len / 3);\n          y = (1 / tinyPow(4, k)).toString();\n        } else {\n          k = 16;\n          y = \"2.3283064365386962890625e-10\";\n        }\n        Ctor.precision += k;\n        x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\n        for (var i = k; i--; ) {\n          var cos2x = x.times(x);\n          x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\n        }\n        Ctor.precision -= k;\n        return x;\n      }\n      var divide = /* @__PURE__ */ function() {\n        function multiplyInteger(x, k, base) {\n          var temp, carry = 0, i = x.length;\n          for (x = x.slice(); i--; ) {\n            temp = x[i] * k + carry;\n            x[i] = temp % base | 0;\n            carry = temp / base | 0;\n          }\n          if (carry) x.unshift(carry);\n          return x;\n        }\n        function compare(a, b, aL, bL) {\n          var i, r;\n          if (aL != bL) {\n            r = aL > bL ? 1 : -1;\n          } else {\n            for (i = r = 0; i < aL; i++) {\n              if (a[i] != b[i]) {\n                r = a[i] > b[i] ? 1 : -1;\n                break;\n              }\n            }\n          }\n          return r;\n        }\n        function subtract(a, b, aL, base) {\n          var i = 0;\n          for (; aL--; ) {\n            a[aL] -= i;\n            i = a[aL] < b[aL] ? 1 : 0;\n            a[aL] = i * base + a[aL] - b[aL];\n          }\n          for (; !a[0] && a.length > 1; ) a.shift();\n        }\n        return function(x, y, pr, rm, dp, base) {\n          var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz, Ctor = x.constructor, sign2 = x.s == y.s ? 1 : -1, xd = x.d, yd = y.d;\n          if (!xd || !xd[0] || !yd || !yd[0]) {\n            return new Ctor(\n              // Return NaN if either NaN, or both Infinity or 0.\n              !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : (\n                // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\n                xd && xd[0] == 0 || !yd ? sign2 * 0 : sign2 / 0\n              )\n            );\n          }\n          if (base) {\n            logBase = 1;\n            e = x.e - y.e;\n          } else {\n            base = BASE;\n            logBase = LOG_BASE;\n            e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\n          }\n          yL = yd.length;\n          xL = xd.length;\n          q = new Ctor(sign2);\n          qd = q.d = [];\n          for (i = 0; yd[i] == (xd[i] || 0); i++) ;\n          if (yd[i] > (xd[i] || 0)) e--;\n          if (pr == null) {\n            sd = pr = Ctor.precision;\n            rm = Ctor.rounding;\n          } else if (dp) {\n            sd = pr + (x.e - y.e) + 1;\n          } else {\n            sd = pr;\n          }\n          if (sd < 0) {\n            qd.push(1);\n            more = true;\n          } else {\n            sd = sd / logBase + 2 | 0;\n            i = 0;\n            if (yL == 1) {\n              k = 0;\n              yd = yd[0];\n              sd++;\n              for (; (i < xL || k) && sd--; i++) {\n                t = k * base + (xd[i] || 0);\n                qd[i] = t / yd | 0;\n                k = t % yd | 0;\n              }\n              more = k || i < xL;\n            } else {\n              k = base / (yd[0] + 1) | 0;\n              if (k > 1) {\n                yd = multiplyInteger(yd, k, base);\n                xd = multiplyInteger(xd, k, base);\n                yL = yd.length;\n                xL = xd.length;\n              }\n              xi = yL;\n              rem = xd.slice(0, yL);\n              remL = rem.length;\n              for (; remL < yL; ) rem[remL++] = 0;\n              yz = yd.slice();\n              yz.unshift(0);\n              yd0 = yd[0];\n              if (yd[1] >= base / 2) ++yd0;\n              do {\n                k = 0;\n                cmp = compare(yd, rem, yL, remL);\n                if (cmp < 0) {\n                  rem0 = rem[0];\n                  if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\n                  k = rem0 / yd0 | 0;\n                  if (k > 1) {\n                    if (k >= base) k = base - 1;\n                    prod = multiplyInteger(yd, k, base);\n                    prodL = prod.length;\n                    remL = rem.length;\n                    cmp = compare(prod, rem, prodL, remL);\n                    if (cmp == 1) {\n                      k--;\n                      subtract(prod, yL < prodL ? yz : yd, prodL, base);\n                    }\n                  } else {\n                    if (k == 0) cmp = k = 1;\n                    prod = yd.slice();\n                  }\n                  prodL = prod.length;\n                  if (prodL < remL) prod.unshift(0);\n                  subtract(rem, prod, remL, base);\n                  if (cmp == -1) {\n                    remL = rem.length;\n                    cmp = compare(yd, rem, yL, remL);\n                    if (cmp < 1) {\n                      k++;\n                      subtract(rem, yL < remL ? yz : yd, remL, base);\n                    }\n                  }\n                  remL = rem.length;\n                } else if (cmp === 0) {\n                  k++;\n                  rem = [0];\n                }\n                qd[i++] = k;\n                if (cmp && rem[0]) {\n                  rem[remL++] = xd[xi] || 0;\n                } else {\n                  rem = [xd[xi]];\n                  remL = 1;\n                }\n              } while ((xi++ < xL || rem[0] !== void 0) && sd--);\n              more = rem[0] !== void 0;\n            }\n            if (!qd[0]) qd.shift();\n          }\n          if (logBase == 1) {\n            q.e = e;\n            inexact = more;\n          } else {\n            for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\n            q.e = i + e * logBase - 1;\n            finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\n          }\n          return q;\n        };\n      }();\n      function finalise(x, sd, rm, isTruncated) {\n        var digits, i, j, k, rd, roundUp, w, xd, xdi, Ctor = x.constructor;\n        out: if (sd != null) {\n          xd = x.d;\n          if (!xd) return x;\n          for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\n          i = sd - digits;\n          if (i < 0) {\n            i += LOG_BASE;\n            j = sd;\n            w = xd[xdi = 0];\n            rd = w / mathpow(10, digits - j - 1) % 10 | 0;\n          } else {\n            xdi = Math.ceil((i + 1) / LOG_BASE);\n            k = xd.length;\n            if (xdi >= k) {\n              if (isTruncated) {\n                for (; k++ <= xdi; ) xd.push(0);\n                w = rd = 0;\n                digits = 1;\n                i %= LOG_BASE;\n                j = i - LOG_BASE + 1;\n              } else {\n                break out;\n              }\n            } else {\n              w = k = xd[xdi];\n              for (digits = 1; k >= 10; k /= 10) digits++;\n              i %= LOG_BASE;\n              j = i - LOG_BASE + digits;\n              rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\n            }\n          }\n          isTruncated = isTruncated || sd < 0 || xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\n          roundUp = rm < 4 ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && // Check whether the digit to the left of the rounding digit is odd.\n          (i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7));\n          if (sd < 1 || !xd[0]) {\n            xd.length = 0;\n            if (roundUp) {\n              sd -= x.e + 1;\n              xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\n              x.e = -sd || 0;\n            } else {\n              xd[0] = x.e = 0;\n            }\n            return x;\n          }\n          if (i == 0) {\n            xd.length = xdi;\n            k = 1;\n            xdi--;\n          } else {\n            xd.length = xdi + 1;\n            k = mathpow(10, LOG_BASE - i);\n            xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\n          }\n          if (roundUp) {\n            for (; ; ) {\n              if (xdi == 0) {\n                for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\n                j = xd[0] += k;\n                for (k = 1; j >= 10; j /= 10) k++;\n                if (i != k) {\n                  x.e++;\n                  if (xd[0] == BASE) xd[0] = 1;\n                }\n                break;\n              } else {\n                xd[xdi] += k;\n                if (xd[xdi] != BASE) break;\n                xd[xdi--] = 0;\n                k = 1;\n              }\n            }\n          }\n          for (i = xd.length; xd[--i] === 0; ) xd.pop();\n        }\n        if (external) {\n          if (x.e > Ctor.maxE) {\n            x.d = null;\n            x.e = NaN;\n          } else if (x.e < Ctor.minE) {\n            x.e = 0;\n            x.d = [0];\n          }\n        }\n        return x;\n      }\n      function finiteToString(x, isExp, sd) {\n        if (!x.isFinite()) return nonFiniteToString(x);\n        var k, e = x.e, str = digitsToString(x.d), len = str.length;\n        if (isExp) {\n          if (sd && (k = sd - len) > 0) {\n            str = str.charAt(0) + \".\" + str.slice(1) + getZeroString(k);\n          } else if (len > 1) {\n            str = str.charAt(0) + \".\" + str.slice(1);\n          }\n          str = str + (x.e < 0 ? \"e\" : \"e+\") + x.e;\n        } else if (e < 0) {\n          str = \"0.\" + getZeroString(-e - 1) + str;\n          if (sd && (k = sd - len) > 0) str += getZeroString(k);\n        } else if (e >= len) {\n          str += getZeroString(e + 1 - len);\n          if (sd && (k = sd - e - 1) > 0) str = str + \".\" + getZeroString(k);\n        } else {\n          if ((k = e + 1) < len) str = str.slice(0, k) + \".\" + str.slice(k);\n          if (sd && (k = sd - len) > 0) {\n            if (e + 1 === len) str += \".\";\n            str += getZeroString(k);\n          }\n        }\n        return str;\n      }\n      function getBase10Exponent(digits, e) {\n        var w = digits[0];\n        for (e *= LOG_BASE; w >= 10; w /= 10) e++;\n        return e;\n      }\n      function getLn10(Ctor, sd, pr) {\n        if (sd > LN10_PRECISION) {\n          external = true;\n          if (pr) Ctor.precision = pr;\n          throw Error(precisionLimitExceeded);\n        }\n        return finalise(new Ctor(LN10), sd, 1, true);\n      }\n      function getPi(Ctor, sd, rm) {\n        if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\n        return finalise(new Ctor(PI), sd, rm, true);\n      }\n      function getPrecision(digits) {\n        var w = digits.length - 1, len = w * LOG_BASE + 1;\n        w = digits[w];\n        if (w) {\n          for (; w % 10 == 0; w /= 10) len--;\n          for (w = digits[0]; w >= 10; w /= 10) len++;\n        }\n        return len;\n      }\n      function getZeroString(k) {\n        var zs = \"\";\n        for (; k--; ) zs += \"0\";\n        return zs;\n      }\n      function intPow(Ctor, x, n, pr) {\n        var isTruncated, r = new Ctor(1), k = Math.ceil(pr / LOG_BASE + 4);\n        external = false;\n        for (; ; ) {\n          if (n % 2) {\n            r = r.times(x);\n            if (truncate(r.d, k)) isTruncated = true;\n          }\n          n = mathfloor(n / 2);\n          if (n === 0) {\n            n = r.d.length - 1;\n            if (isTruncated && r.d[n] === 0) ++r.d[n];\n            break;\n          }\n          x = x.times(x);\n          truncate(x.d, k);\n        }\n        external = true;\n        return r;\n      }\n      function isOdd(n) {\n        return n.d[n.d.length - 1] & 1;\n      }\n      function maxOrMin(Ctor, args, ltgt) {\n        var y, x = new Ctor(args[0]), i = 0;\n        for (; ++i < args.length; ) {\n          y = new Ctor(args[i]);\n          if (!y.s) {\n            x = y;\n            break;\n          } else if (x[ltgt](y)) {\n            x = y;\n          }\n        }\n        return x;\n      }\n      function naturalExponential(x, sd) {\n        var denominator, guard, j, pow2, sum2, t, wpr, rep = 0, i = 0, k = 0, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision;\n        if (!x.d || !x.d[0] || x.e > 17) {\n          return new Ctor(x.d ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 : x.s ? x.s < 0 ? 0 : x : 0 / 0);\n        }\n        if (sd == null) {\n          external = false;\n          wpr = pr;\n        } else {\n          wpr = sd;\n        }\n        t = new Ctor(0.03125);\n        while (x.e > -2) {\n          x = x.times(t);\n          k += 5;\n        }\n        guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\n        wpr += guard;\n        denominator = pow2 = sum2 = new Ctor(1);\n        Ctor.precision = wpr;\n        for (; ; ) {\n          pow2 = finalise(pow2.times(x), wpr, 1);\n          denominator = denominator.times(++i);\n          t = sum2.plus(divide(pow2, denominator, wpr, 1));\n          if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) {\n            j = k;\n            while (j--) sum2 = finalise(sum2.times(sum2), wpr, 1);\n            if (sd == null) {\n              if (rep < 3 && checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) {\n                Ctor.precision = wpr += 10;\n                denominator = pow2 = t = new Ctor(1);\n                i = 0;\n                rep++;\n              } else {\n                return finalise(sum2, Ctor.precision = pr, rm, external = true);\n              }\n            } else {\n              Ctor.precision = pr;\n              return sum2;\n            }\n          }\n          sum2 = t;\n        }\n      }\n      function naturalLogarithm(y, sd) {\n        var c, c0, denominator, e, numerator, rep, sum2, t, wpr, x1, x2, n = 1, guard = 10, x = y, xd = x.d, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision;\n        if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\n          return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\n        }\n        if (sd == null) {\n          external = false;\n          wpr = pr;\n        } else {\n          wpr = sd;\n        }\n        Ctor.precision = wpr += guard;\n        c = digitsToString(xd);\n        c0 = c.charAt(0);\n        if (Math.abs(e = x.e) < 15e14) {\n          while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\n            x = x.times(y);\n            c = digitsToString(x.d);\n            c0 = c.charAt(0);\n            n++;\n          }\n          e = x.e;\n          if (c0 > 1) {\n            x = new Ctor(\"0.\" + c);\n            e++;\n          } else {\n            x = new Ctor(c0 + \".\" + c.slice(1));\n          }\n        } else {\n          t = getLn10(Ctor, wpr + 2, pr).times(e + \"\");\n          x = naturalLogarithm(new Ctor(c0 + \".\" + c.slice(1)), wpr - guard).plus(t);\n          Ctor.precision = pr;\n          return sd == null ? finalise(x, pr, rm, external = true) : x;\n        }\n        x1 = x;\n        sum2 = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\n        x2 = finalise(x.times(x), wpr, 1);\n        denominator = 3;\n        for (; ; ) {\n          numerator = finalise(numerator.times(x2), wpr, 1);\n          t = sum2.plus(divide(numerator, new Ctor(denominator), wpr, 1));\n          if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) {\n            sum2 = sum2.times(2);\n            if (e !== 0) sum2 = sum2.plus(getLn10(Ctor, wpr + 2, pr).times(e + \"\"));\n            sum2 = divide(sum2, new Ctor(n), wpr, 1);\n            if (sd == null) {\n              if (checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) {\n                Ctor.precision = wpr += guard;\n                t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\n                x2 = finalise(x.times(x), wpr, 1);\n                denominator = rep = 1;\n              } else {\n                return finalise(sum2, Ctor.precision = pr, rm, external = true);\n              }\n            } else {\n              Ctor.precision = pr;\n              return sum2;\n            }\n          }\n          sum2 = t;\n          denominator += 2;\n        }\n      }\n      function nonFiniteToString(x) {\n        return String(x.s * x.s / 0);\n      }\n      function parseDecimal(x, str) {\n        var e, i, len;\n        if ((e = str.indexOf(\".\")) > -1) str = str.replace(\".\", \"\");\n        if ((i = str.search(/e/i)) > 0) {\n          if (e < 0) e = i;\n          e += +str.slice(i + 1);\n          str = str.substring(0, i);\n        } else if (e < 0) {\n          e = str.length;\n        }\n        for (i = 0; str.charCodeAt(i) === 48; i++) ;\n        for (len = str.length; str.charCodeAt(len - 1) === 48; --len) ;\n        str = str.slice(i, len);\n        if (str) {\n          len -= i;\n          x.e = e = e - i - 1;\n          x.d = [];\n          i = (e + 1) % LOG_BASE;\n          if (e < 0) i += LOG_BASE;\n          if (i < len) {\n            if (i) x.d.push(+str.slice(0, i));\n            for (len -= LOG_BASE; i < len; ) x.d.push(+str.slice(i, i += LOG_BASE));\n            str = str.slice(i);\n            i = LOG_BASE - str.length;\n          } else {\n            i -= len;\n          }\n          for (; i--; ) str += \"0\";\n          x.d.push(+str);\n          if (external) {\n            if (x.e > x.constructor.maxE) {\n              x.d = null;\n              x.e = NaN;\n            } else if (x.e < x.constructor.minE) {\n              x.e = 0;\n              x.d = [0];\n            }\n          }\n        } else {\n          x.e = 0;\n          x.d = [0];\n        }\n        return x;\n      }\n      function parseOther(x, str) {\n        var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\n        if (str.indexOf(\"_\") > -1) {\n          str = str.replace(/(\\d)_(?=\\d)/g, \"$1\");\n          if (isDecimal.test(str)) return parseDecimal(x, str);\n        } else if (str === \"Infinity\" || str === \"NaN\") {\n          if (!+str) x.s = NaN;\n          x.e = NaN;\n          x.d = null;\n          return x;\n        }\n        if (isHex.test(str)) {\n          base = 16;\n          str = str.toLowerCase();\n        } else if (isBinary.test(str)) {\n          base = 2;\n        } else if (isOctal.test(str)) {\n          base = 8;\n        } else {\n          throw Error(invalidArgument + str);\n        }\n        i = str.search(/p/i);\n        if (i > 0) {\n          p = +str.slice(i + 1);\n          str = str.substring(2, i);\n        } else {\n          str = str.slice(2);\n        }\n        i = str.indexOf(\".\");\n        isFloat = i >= 0;\n        Ctor = x.constructor;\n        if (isFloat) {\n          str = str.replace(\".\", \"\");\n          len = str.length;\n          i = len - i;\n          divisor = intPow(Ctor, new Ctor(base), i, i * 2);\n        }\n        xd = convertBase(str, base, BASE);\n        xe = xd.length - 1;\n        for (i = xe; xd[i] === 0; --i) xd.pop();\n        if (i < 0) return new Ctor(x.s * 0);\n        x.e = getBase10Exponent(xd, xe);\n        x.d = xd;\n        external = false;\n        if (isFloat) x = divide(x, divisor, len * 4);\n        if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal2.pow(2, p));\n        external = true;\n        return x;\n      }\n      function sine(Ctor, x) {\n        var k, len = x.d.length;\n        if (len < 3) {\n          return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\n        }\n        k = 1.4 * Math.sqrt(len);\n        k = k > 16 ? 16 : k | 0;\n        x = x.times(1 / tinyPow(5, k));\n        x = taylorSeries(Ctor, 2, x, x);\n        var sin2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20);\n        for (; k--; ) {\n          sin2_x = x.times(x);\n          x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\n        }\n        return x;\n      }\n      function taylorSeries(Ctor, n, x, y, isHyperbolic) {\n        var j, t, u, x2, i = 1, pr = Ctor.precision, k = Math.ceil(pr / LOG_BASE);\n        external = false;\n        x2 = x.times(x);\n        u = new Ctor(y);\n        for (; ; ) {\n          t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\n          u = isHyperbolic ? y.plus(t) : y.minus(t);\n          y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\n          t = u.plus(y);\n          if (t.d[k] !== void 0) {\n            for (j = k; t.d[j] === u.d[j] && j--; ) ;\n            if (j == -1) break;\n          }\n          j = u;\n          u = y;\n          y = t;\n          t = j;\n          i++;\n        }\n        external = true;\n        t.d.length = k + 1;\n        return t;\n      }\n      function tinyPow(b, e) {\n        var n = b;\n        while (--e) n *= b;\n        return n;\n      }\n      function toLessThanHalfPi(Ctor, x) {\n        var t, isNeg = x.s < 0, pi = getPi(Ctor, Ctor.precision, 1), halfPi = pi.times(0.5);\n        x = x.abs();\n        if (x.lte(halfPi)) {\n          quadrant = isNeg ? 4 : 1;\n          return x;\n        }\n        t = x.divToInt(pi);\n        if (t.isZero()) {\n          quadrant = isNeg ? 3 : 2;\n        } else {\n          x = x.minus(t.times(pi));\n          if (x.lte(halfPi)) {\n            quadrant = isOdd(t) ? isNeg ? 2 : 3 : isNeg ? 4 : 1;\n            return x;\n          }\n          quadrant = isOdd(t) ? isNeg ? 1 : 4 : isNeg ? 3 : 2;\n        }\n        return x.minus(pi).abs();\n      }\n      function toStringBinary(x, baseOut, sd, rm) {\n        var base, e, i, k, len, roundUp, str, xd, y, Ctor = x.constructor, isExp = sd !== void 0;\n        if (isExp) {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n        } else {\n          sd = Ctor.precision;\n          rm = Ctor.rounding;\n        }\n        if (!x.isFinite()) {\n          str = nonFiniteToString(x);\n        } else {\n          str = finiteToString(x);\n          i = str.indexOf(\".\");\n          if (isExp) {\n            base = 2;\n            if (baseOut == 16) {\n              sd = sd * 4 - 3;\n            } else if (baseOut == 8) {\n              sd = sd * 3 - 2;\n            }\n          } else {\n            base = baseOut;\n          }\n          if (i >= 0) {\n            str = str.replace(\".\", \"\");\n            y = new Ctor(1);\n            y.e = str.length - i;\n            y.d = convertBase(finiteToString(y), 10, base);\n            y.e = y.d.length;\n          }\n          xd = convertBase(str, 10, base);\n          e = len = xd.length;\n          for (; xd[--len] == 0; ) xd.pop();\n          if (!xd[0]) {\n            str = isExp ? \"0p+0\" : \"0\";\n          } else {\n            if (i < 0) {\n              e--;\n            } else {\n              x = new Ctor(x);\n              x.d = xd;\n              x.e = e;\n              x = divide(x, y, sd, rm, 0, base);\n              xd = x.d;\n              e = x.e;\n              roundUp = inexact;\n            }\n            i = xd[sd];\n            k = base / 2;\n            roundUp = roundUp || xd[sd + 1] !== void 0;\n            roundUp = rm < 4 ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || rm === (x.s < 0 ? 8 : 7));\n            xd.length = sd;\n            if (roundUp) {\n              for (; ++xd[--sd] > base - 1; ) {\n                xd[sd] = 0;\n                if (!sd) {\n                  ++e;\n                  xd.unshift(1);\n                }\n              }\n            }\n            for (len = xd.length; !xd[len - 1]; --len) ;\n            for (i = 0, str = \"\"; i < len; i++) str += NUMERALS.charAt(xd[i]);\n            if (isExp) {\n              if (len > 1) {\n                if (baseOut == 16 || baseOut == 8) {\n                  i = baseOut == 16 ? 4 : 3;\n                  for (--len; len % i; len++) str += \"0\";\n                  xd = convertBase(str, base, baseOut);\n                  for (len = xd.length; !xd[len - 1]; --len) ;\n                  for (i = 1, str = \"1.\"; i < len; i++) str += NUMERALS.charAt(xd[i]);\n                } else {\n                  str = str.charAt(0) + \".\" + str.slice(1);\n                }\n              }\n              str = str + (e < 0 ? \"p\" : \"p+\") + e;\n            } else if (e < 0) {\n              for (; ++e; ) str = \"0\" + str;\n              str = \"0.\" + str;\n            } else {\n              if (++e > len) for (e -= len; e--; ) str += \"0\";\n              else if (e < len) str = str.slice(0, e) + \".\" + str.slice(e);\n            }\n          }\n          str = (baseOut == 16 ? \"0x\" : baseOut == 2 ? \"0b\" : baseOut == 8 ? \"0o\" : \"\") + str;\n        }\n        return x.s < 0 ? \"-\" + str : str;\n      }\n      function truncate(arr, len) {\n        if (arr.length > len) {\n          arr.length = len;\n          return true;\n        }\n      }\n      function abs(x) {\n        return new this(x).abs();\n      }\n      function acos(x) {\n        return new this(x).acos();\n      }\n      function acosh(x) {\n        return new this(x).acosh();\n      }\n      function add(x, y) {\n        return new this(x).plus(y);\n      }\n      function asin(x) {\n        return new this(x).asin();\n      }\n      function asinh(x) {\n        return new this(x).asinh();\n      }\n      function atan(x) {\n        return new this(x).atan();\n      }\n      function atanh(x) {\n        return new this(x).atanh();\n      }\n      function atan2(y, x) {\n        y = new this(y);\n        x = new this(x);\n        var r, pr = this.precision, rm = this.rounding, wpr = pr + 4;\n        if (!y.s || !x.s) {\n          r = new this(NaN);\n        } else if (!y.d && !x.d) {\n          r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\n          r.s = y.s;\n        } else if (!x.d || y.isZero()) {\n          r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\n          r.s = y.s;\n        } else if (!y.d || x.isZero()) {\n          r = getPi(this, wpr, 1).times(0.5);\n          r.s = y.s;\n        } else if (x.s < 0) {\n          this.precision = wpr;\n          this.rounding = 1;\n          r = this.atan(divide(y, x, wpr, 1));\n          x = getPi(this, wpr, 1);\n          this.precision = pr;\n          this.rounding = rm;\n          r = y.s < 0 ? r.minus(x) : r.plus(x);\n        } else {\n          r = this.atan(divide(y, x, wpr, 1));\n        }\n        return r;\n      }\n      function cbrt(x) {\n        return new this(x).cbrt();\n      }\n      function ceil(x) {\n        return finalise(x = new this(x), x.e + 1, 2);\n      }\n      function clamp(x, min2, max2) {\n        return new this(x).clamp(min2, max2);\n      }\n      function config(obj) {\n        if (!obj || typeof obj !== \"object\") throw Error(decimalError + \"Object expected\");\n        var i, p, v, useDefaults = obj.defaults === true, ps = [\n          \"precision\",\n          1,\n          MAX_DIGITS,\n          \"rounding\",\n          0,\n          8,\n          \"toExpNeg\",\n          -EXP_LIMIT,\n          0,\n          \"toExpPos\",\n          0,\n          EXP_LIMIT,\n          \"maxE\",\n          0,\n          EXP_LIMIT,\n          \"minE\",\n          -EXP_LIMIT,\n          0,\n          \"modulo\",\n          0,\n          9\n        ];\n        for (i = 0; i < ps.length; i += 3) {\n          if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\n          if ((v = obj[p]) !== void 0) {\n            if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\n            else throw Error(invalidArgument + p + \": \" + v);\n          }\n        }\n        if (p = \"crypto\", useDefaults) this[p] = DEFAULTS[p];\n        if ((v = obj[p]) !== void 0) {\n          if (v === true || v === false || v === 0 || v === 1) {\n            if (v) {\n              if (typeof crypto != \"undefined\" && crypto && (crypto.getRandomValues || crypto.randomBytes)) {\n                this[p] = true;\n              } else {\n                throw Error(cryptoUnavailable);\n              }\n            } else {\n              this[p] = false;\n            }\n          } else {\n            throw Error(invalidArgument + p + \": \" + v);\n          }\n        }\n        return this;\n      }\n      function cos(x) {\n        return new this(x).cos();\n      }\n      function cosh(x) {\n        return new this(x).cosh();\n      }\n      function clone(obj) {\n        var i, p, ps;\n        function Decimal3(v) {\n          var e, i2, t, x = this;\n          if (!(x instanceof Decimal3)) return new Decimal3(v);\n          x.constructor = Decimal3;\n          if (isDecimalInstance(v)) {\n            x.s = v.s;\n            if (external) {\n              if (!v.d || v.e > Decimal3.maxE) {\n                x.e = NaN;\n                x.d = null;\n              } else if (v.e < Decimal3.minE) {\n                x.e = 0;\n                x.d = [0];\n              } else {\n                x.e = v.e;\n                x.d = v.d.slice();\n              }\n            } else {\n              x.e = v.e;\n              x.d = v.d ? v.d.slice() : v.d;\n            }\n            return;\n          }\n          t = typeof v;\n          if (t === \"number\") {\n            if (v === 0) {\n              x.s = 1 / v < 0 ? -1 : 1;\n              x.e = 0;\n              x.d = [0];\n              return;\n            }\n            if (v < 0) {\n              v = -v;\n              x.s = -1;\n            } else {\n              x.s = 1;\n            }\n            if (v === ~~v && v < 1e7) {\n              for (e = 0, i2 = v; i2 >= 10; i2 /= 10) e++;\n              if (external) {\n                if (e > Decimal3.maxE) {\n                  x.e = NaN;\n                  x.d = null;\n                } else if (e < Decimal3.minE) {\n                  x.e = 0;\n                  x.d = [0];\n                } else {\n                  x.e = e;\n                  x.d = [v];\n                }\n              } else {\n                x.e = e;\n                x.d = [v];\n              }\n              return;\n            } else if (v * 0 !== 0) {\n              if (!v) x.s = NaN;\n              x.e = NaN;\n              x.d = null;\n              return;\n            }\n            return parseDecimal(x, v.toString());\n          } else if (t !== \"string\") {\n            throw Error(invalidArgument + v);\n          }\n          if ((i2 = v.charCodeAt(0)) === 45) {\n            v = v.slice(1);\n            x.s = -1;\n          } else {\n            if (i2 === 43) v = v.slice(1);\n            x.s = 1;\n          }\n          return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\n        }\n        Decimal3.prototype = P;\n        Decimal3.ROUND_UP = 0;\n        Decimal3.ROUND_DOWN = 1;\n        Decimal3.ROUND_CEIL = 2;\n        Decimal3.ROUND_FLOOR = 3;\n        Decimal3.ROUND_HALF_UP = 4;\n        Decimal3.ROUND_HALF_DOWN = 5;\n        Decimal3.ROUND_HALF_EVEN = 6;\n        Decimal3.ROUND_HALF_CEIL = 7;\n        Decimal3.ROUND_HALF_FLOOR = 8;\n        Decimal3.EUCLID = 9;\n        Decimal3.config = Decimal3.set = config;\n        Decimal3.clone = clone;\n        Decimal3.isDecimal = isDecimalInstance;\n        Decimal3.abs = abs;\n        Decimal3.acos = acos;\n        Decimal3.acosh = acosh;\n        Decimal3.add = add;\n        Decimal3.asin = asin;\n        Decimal3.asinh = asinh;\n        Decimal3.atan = atan;\n        Decimal3.atanh = atanh;\n        Decimal3.atan2 = atan2;\n        Decimal3.cbrt = cbrt;\n        Decimal3.ceil = ceil;\n        Decimal3.clamp = clamp;\n        Decimal3.cos = cos;\n        Decimal3.cosh = cosh;\n        Decimal3.div = div;\n        Decimal3.exp = exp;\n        Decimal3.floor = floor;\n        Decimal3.hypot = hypot;\n        Decimal3.ln = ln;\n        Decimal3.log = log;\n        Decimal3.log10 = log10;\n        Decimal3.log2 = log2;\n        Decimal3.max = max;\n        Decimal3.min = min;\n        Decimal3.mod = mod;\n        Decimal3.mul = mul;\n        Decimal3.pow = pow;\n        Decimal3.random = random;\n        Decimal3.round = round;\n        Decimal3.sign = sign;\n        Decimal3.sin = sin;\n        Decimal3.sinh = sinh;\n        Decimal3.sqrt = sqrt;\n        Decimal3.sub = sub;\n        Decimal3.sum = sum;\n        Decimal3.tan = tan;\n        Decimal3.tanh = tanh;\n        Decimal3.trunc = trunc;\n        if (obj === void 0) obj = {};\n        if (obj) {\n          if (obj.defaults !== true) {\n            ps = [\"precision\", \"rounding\", \"toExpNeg\", \"toExpPos\", \"maxE\", \"minE\", \"modulo\", \"crypto\"];\n            for (i = 0; i < ps.length; ) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\n          }\n        }\n        Decimal3.config(obj);\n        return Decimal3;\n      }\n      function div(x, y) {\n        return new this(x).div(y);\n      }\n      function exp(x) {\n        return new this(x).exp();\n      }\n      function floor(x) {\n        return finalise(x = new this(x), x.e + 1, 3);\n      }\n      function hypot() {\n        var i, n, t = new this(0);\n        external = false;\n        for (i = 0; i < arguments.length; ) {\n          n = new this(arguments[i++]);\n          if (!n.d) {\n            if (n.s) {\n              external = true;\n              return new this(1 / 0);\n            }\n            t = n;\n          } else if (t.d) {\n            t = t.plus(n.times(n));\n          }\n        }\n        external = true;\n        return t.sqrt();\n      }\n      function isDecimalInstance(obj) {\n        return obj instanceof Decimal2 || obj && obj.toStringTag === tag || false;\n      }\n      function ln(x) {\n        return new this(x).ln();\n      }\n      function log(x, y) {\n        return new this(x).log(y);\n      }\n      function log2(x) {\n        return new this(x).log(2);\n      }\n      function log10(x) {\n        return new this(x).log(10);\n      }\n      function max() {\n        return maxOrMin(this, arguments, \"lt\");\n      }\n      function min() {\n        return maxOrMin(this, arguments, \"gt\");\n      }\n      function mod(x, y) {\n        return new this(x).mod(y);\n      }\n      function mul(x, y) {\n        return new this(x).mul(y);\n      }\n      function pow(x, y) {\n        return new this(x).pow(y);\n      }\n      function random(sd) {\n        var d, e, k, n, i = 0, r = new this(1), rd = [];\n        if (sd === void 0) sd = this.precision;\n        else checkInt32(sd, 1, MAX_DIGITS);\n        k = Math.ceil(sd / LOG_BASE);\n        if (!this.crypto) {\n          for (; i < k; ) rd[i++] = Math.random() * 1e7 | 0;\n        } else if (crypto.getRandomValues) {\n          d = crypto.getRandomValues(new Uint32Array(k));\n          for (; i < k; ) {\n            n = d[i];\n            if (n >= 429e7) {\n              d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\n            } else {\n              rd[i++] = n % 1e7;\n            }\n          }\n        } else if (crypto.randomBytes) {\n          d = crypto.randomBytes(k *= 4);\n          for (; i < k; ) {\n            n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 127) << 24);\n            if (n >= 214e7) {\n              crypto.randomBytes(4).copy(d, i);\n            } else {\n              rd.push(n % 1e7);\n              i += 4;\n            }\n          }\n          i = k / 4;\n        } else {\n          throw Error(cryptoUnavailable);\n        }\n        k = rd[--i];\n        sd %= LOG_BASE;\n        if (k && sd) {\n          n = mathpow(10, LOG_BASE - sd);\n          rd[i] = (k / n | 0) * n;\n        }\n        for (; rd[i] === 0; i--) rd.pop();\n        if (i < 0) {\n          e = 0;\n          rd = [0];\n        } else {\n          e = -1;\n          for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\n          for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\n          if (k < LOG_BASE) e -= LOG_BASE - k;\n        }\n        r.e = e;\n        r.d = rd;\n        return r;\n      }\n      function round(x) {\n        return finalise(x = new this(x), x.e + 1, this.rounding);\n      }\n      function sign(x) {\n        x = new this(x);\n        return x.d ? x.d[0] ? x.s : 0 * x.s : x.s || NaN;\n      }\n      function sin(x) {\n        return new this(x).sin();\n      }\n      function sinh(x) {\n        return new this(x).sinh();\n      }\n      function sqrt(x) {\n        return new this(x).sqrt();\n      }\n      function sub(x, y) {\n        return new this(x).sub(y);\n      }\n      function sum() {\n        var i = 0, args = arguments, x = new this(args[i]);\n        external = false;\n        for (; x.s && ++i < args.length; ) x = x.plus(args[i]);\n        external = true;\n        return finalise(x, this.precision, this.rounding);\n      }\n      function tan(x) {\n        return new this(x).tan();\n      }\n      function tanh(x) {\n        return new this(x).tanh();\n      }\n      function trunc(x) {\n        return finalise(x = new this(x), x.e + 1, 1);\n      }\n      Decimal2 = clone(DEFAULTS);\n      Decimal2.prototype.constructor = Decimal2;\n      Decimal2[\"default\"] = Decimal2.Decimal = Decimal2;\n      LN10 = new Decimal2(LN10);\n      PI = new Decimal2(PI);\n      if (typeof define == \"function\" && define.amd) {\n        define(function() {\n          return Decimal2;\n        });\n      } else if (typeof module2 != \"undefined\" && module2.exports) {\n        if (typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\") {\n          P[Symbol[\"for\"](\"nodejs.util.inspect.custom\")] = P.toString;\n          P[Symbol.toStringTag] = \"Decimal\";\n        }\n        module2.exports = Decimal2;\n      } else {\n        if (!globalScope) {\n          globalScope = typeof self != \"undefined\" && self && self.self == self ? self : window;\n        }\n        noConflict = globalScope.Decimal;\n        Decimal2.noConflict = function() {\n          globalScope.Decimal = noConflict;\n          return Decimal2;\n        };\n        globalScope.Decimal = Decimal2;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/tiny-invariant/dist/tiny-invariant.cjs.js\nvar require_tiny_invariant_cjs = __commonJS({\n  \"node_modules/tiny-invariant/dist/tiny-invariant.cjs.js\"(exports2, module2) {\n    \"use strict\";\n    var isProduction = process.env.NODE_ENV === \"production\";\n    var prefix = \"Invariant failed\";\n    function invariant(condition, message) {\n      if (condition) {\n        return;\n      }\n      if (isProduction) {\n        throw new Error(prefix);\n      }\n      var provided = typeof message === \"function\" ? message() : message;\n      var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n      throw new Error(value);\n    }\n    module2.exports = invariant;\n  }\n});\n\n// node_modules/decimal.js-light/decimal.js\nvar require_decimal2 = __commonJS({\n  \"node_modules/decimal.js-light/decimal.js\"(exports2, module2) {\n    (function(globalScope) {\n      \"use strict\";\n      var MAX_DIGITS = 1e9, Decimal2 = {\n        // These values must be integers within the stated ranges (inclusive).\n        // Most of these values can be changed during run-time using `Decimal.config`.\n        // The maximum number of significant digits of the result of a calculation or base conversion.\n        // E.g. `Decimal.config({ precision: 20 });`\n        precision: 20,\n        // 1 to MAX_DIGITS\n        // The rounding mode used by default by `toInteger`, `toDecimalPlaces`, `toExponential`,\n        // `toFixed`, `toPrecision` and `toSignificantDigits`.\n        //\n        // ROUND_UP         0 Away from zero.\n        // ROUND_DOWN       1 Towards zero.\n        // ROUND_CEIL       2 Towards +Infinity.\n        // ROUND_FLOOR      3 Towards -Infinity.\n        // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.\n        // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\n        // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\n        // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\n        // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\n        //\n        // E.g.\n        // `Decimal.rounding = 4;`\n        // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\n        rounding: 4,\n        // 0 to 8\n        // The exponent value at and beneath which `toString` returns exponential notation.\n        // JavaScript numbers: -7\n        toExpNeg: -7,\n        // 0 to -MAX_E\n        // The exponent value at and above which `toString` returns exponential notation.\n        // JavaScript numbers: 21\n        toExpPos: 21,\n        // 0 to MAX_E\n        // The natural logarithm of 10.\n        // 115 digits\n        LN10: \"2.302585092994045684017991454684364207601101488628772976033327900967572609677352480235997205089598298341967784042286\"\n      }, external = true, decimalError = \"[DecimalError] \", invalidArgument = decimalError + \"Invalid argument: \", exponentOutOfRange = decimalError + \"Exponent out of range: \", mathfloor = Math.floor, mathpow = Math.pow, isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i, ONE, BASE = 1e7, LOG_BASE = 7, MAX_SAFE_INTEGER = 9007199254740991, MAX_E = mathfloor(MAX_SAFE_INTEGER / LOG_BASE), P = {};\n      P.absoluteValue = P.abs = function() {\n        var x = new this.constructor(this);\n        if (x.s) x.s = 1;\n        return x;\n      };\n      P.comparedTo = P.cmp = function(y) {\n        var i, j, xdL, ydL, x = this;\n        y = new x.constructor(y);\n        if (x.s !== y.s) return x.s || -y.s;\n        if (x.e !== y.e) return x.e > y.e ^ x.s < 0 ? 1 : -1;\n        xdL = x.d.length;\n        ydL = y.d.length;\n        for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\n          if (x.d[i] !== y.d[i]) return x.d[i] > y.d[i] ^ x.s < 0 ? 1 : -1;\n        }\n        return xdL === ydL ? 0 : xdL > ydL ^ x.s < 0 ? 1 : -1;\n      };\n      P.decimalPlaces = P.dp = function() {\n        var x = this, w = x.d.length - 1, dp = (w - x.e) * LOG_BASE;\n        w = x.d[w];\n        if (w) for (; w % 10 == 0; w /= 10) dp--;\n        return dp < 0 ? 0 : dp;\n      };\n      P.dividedBy = P.div = function(y) {\n        return divide(this, new this.constructor(y));\n      };\n      P.dividedToIntegerBy = P.idiv = function(y) {\n        var x = this, Ctor = x.constructor;\n        return round(divide(x, new Ctor(y), 0, 1), Ctor.precision);\n      };\n      P.equals = P.eq = function(y) {\n        return !this.cmp(y);\n      };\n      P.exponent = function() {\n        return getBase10Exponent(this);\n      };\n      P.greaterThan = P.gt = function(y) {\n        return this.cmp(y) > 0;\n      };\n      P.greaterThanOrEqualTo = P.gte = function(y) {\n        return this.cmp(y) >= 0;\n      };\n      P.isInteger = P.isint = function() {\n        return this.e > this.d.length - 2;\n      };\n      P.isNegative = P.isneg = function() {\n        return this.s < 0;\n      };\n      P.isPositive = P.ispos = function() {\n        return this.s > 0;\n      };\n      P.isZero = function() {\n        return this.s === 0;\n      };\n      P.lessThan = P.lt = function(y) {\n        return this.cmp(y) < 0;\n      };\n      P.lessThanOrEqualTo = P.lte = function(y) {\n        return this.cmp(y) < 1;\n      };\n      P.logarithm = P.log = function(base) {\n        var r, x = this, Ctor = x.constructor, pr = Ctor.precision, wpr = pr + 5;\n        if (base === void 0) {\n          base = new Ctor(10);\n        } else {\n          base = new Ctor(base);\n          if (base.s < 1 || base.eq(ONE)) throw Error(decimalError + \"NaN\");\n        }\n        if (x.s < 1) throw Error(decimalError + (x.s ? \"NaN\" : \"-Infinity\"));\n        if (x.eq(ONE)) return new Ctor(0);\n        external = false;\n        r = divide(ln(x, wpr), ln(base, wpr), wpr);\n        external = true;\n        return round(r, pr);\n      };\n      P.minus = P.sub = function(y) {\n        var x = this;\n        y = new x.constructor(y);\n        return x.s == y.s ? subtract(x, y) : add(x, (y.s = -y.s, y));\n      };\n      P.modulo = P.mod = function(y) {\n        var q, x = this, Ctor = x.constructor, pr = Ctor.precision;\n        y = new Ctor(y);\n        if (!y.s) throw Error(decimalError + \"NaN\");\n        if (!x.s) return round(new Ctor(x), pr);\n        external = false;\n        q = divide(x, y, 0, 1).times(y);\n        external = true;\n        return x.minus(q);\n      };\n      P.naturalExponential = P.exp = function() {\n        return exp(this);\n      };\n      P.naturalLogarithm = P.ln = function() {\n        return ln(this);\n      };\n      P.negated = P.neg = function() {\n        var x = new this.constructor(this);\n        x.s = -x.s || 0;\n        return x;\n      };\n      P.plus = P.add = function(y) {\n        var x = this;\n        y = new x.constructor(y);\n        return x.s == y.s ? add(x, y) : subtract(x, (y.s = -y.s, y));\n      };\n      P.precision = P.sd = function(z) {\n        var e, sd, w, x = this;\n        if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\n        e = getBase10Exponent(x) + 1;\n        w = x.d.length - 1;\n        sd = w * LOG_BASE + 1;\n        w = x.d[w];\n        if (w) {\n          for (; w % 10 == 0; w /= 10) sd--;\n          for (w = x.d[0]; w >= 10; w /= 10) sd++;\n        }\n        return z && e > sd ? e : sd;\n      };\n      P.squareRoot = P.sqrt = function() {\n        var e, n, pr, r, s, t, wpr, x = this, Ctor = x.constructor;\n        if (x.s < 1) {\n          if (!x.s) return new Ctor(0);\n          throw Error(decimalError + \"NaN\");\n        }\n        e = getBase10Exponent(x);\n        external = false;\n        s = Math.sqrt(+x);\n        if (s == 0 || s == 1 / 0) {\n          n = digitsToString(x.d);\n          if ((n.length + e) % 2 == 0) n += \"0\";\n          s = Math.sqrt(n);\n          e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\n          if (s == 1 / 0) {\n            n = \"5e\" + e;\n          } else {\n            n = s.toExponential();\n            n = n.slice(0, n.indexOf(\"e\") + 1) + e;\n          }\n          r = new Ctor(n);\n        } else {\n          r = new Ctor(s.toString());\n        }\n        pr = Ctor.precision;\n        s = wpr = pr + 3;\n        for (; ; ) {\n          t = r;\n          r = t.plus(divide(x, t, wpr + 2)).times(0.5);\n          if (digitsToString(t.d).slice(0, wpr) === (n = digitsToString(r.d)).slice(0, wpr)) {\n            n = n.slice(wpr - 3, wpr + 1);\n            if (s == wpr && n == \"4999\") {\n              round(t, pr + 1, 0);\n              if (t.times(t).eq(x)) {\n                r = t;\n                break;\n              }\n            } else if (n != \"9999\") {\n              break;\n            }\n            wpr += 4;\n          }\n        }\n        external = true;\n        return round(r, pr);\n      };\n      P.times = P.mul = function(y) {\n        var carry, e, i, k, r, rL, t, xdL, ydL, x = this, Ctor = x.constructor, xd = x.d, yd = (y = new Ctor(y)).d;\n        if (!x.s || !y.s) return new Ctor(0);\n        y.s *= x.s;\n        e = x.e + y.e;\n        xdL = xd.length;\n        ydL = yd.length;\n        if (xdL < ydL) {\n          r = xd;\n          xd = yd;\n          yd = r;\n          rL = xdL;\n          xdL = ydL;\n          ydL = rL;\n        }\n        r = [];\n        rL = xdL + ydL;\n        for (i = rL; i--; ) r.push(0);\n        for (i = ydL; --i >= 0; ) {\n          carry = 0;\n          for (k = xdL + i; k > i; ) {\n            t = r[k] + yd[i] * xd[k - i - 1] + carry;\n            r[k--] = t % BASE | 0;\n            carry = t / BASE | 0;\n          }\n          r[k] = (r[k] + carry) % BASE | 0;\n        }\n        for (; !r[--rL]; ) r.pop();\n        if (carry) ++e;\n        else r.shift();\n        y.d = r;\n        y.e = e;\n        return external ? round(y, Ctor.precision) : y;\n      };\n      P.toDecimalPlaces = P.todp = function(dp, rm) {\n        var x = this, Ctor = x.constructor;\n        x = new Ctor(x);\n        if (dp === void 0) return x;\n        checkInt32(dp, 0, MAX_DIGITS);\n        if (rm === void 0) rm = Ctor.rounding;\n        else checkInt32(rm, 0, 8);\n        return round(x, dp + getBase10Exponent(x) + 1, rm);\n      };\n      P.toExponential = function(dp, rm) {\n        var str, x = this, Ctor = x.constructor;\n        if (dp === void 0) {\n          str = toString(x, true);\n        } else {\n          checkInt32(dp, 0, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          x = round(new Ctor(x), dp + 1, rm);\n          str = toString(x, true, dp + 1);\n        }\n        return str;\n      };\n      P.toFixed = function(dp, rm) {\n        var str, y, x = this, Ctor = x.constructor;\n        if (dp === void 0) return toString(x);\n        checkInt32(dp, 0, MAX_DIGITS);\n        if (rm === void 0) rm = Ctor.rounding;\n        else checkInt32(rm, 0, 8);\n        y = round(new Ctor(x), dp + getBase10Exponent(x) + 1, rm);\n        str = toString(y.abs(), false, dp + getBase10Exponent(y) + 1);\n        return x.isneg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toInteger = P.toint = function() {\n        var x = this, Ctor = x.constructor;\n        return round(new Ctor(x), getBase10Exponent(x) + 1, Ctor.rounding);\n      };\n      P.toNumber = function() {\n        return +this;\n      };\n      P.toPower = P.pow = function(y) {\n        var e, k, pr, r, sign, yIsInt, x = this, Ctor = x.constructor, guard = 12, yn = +(y = new Ctor(y));\n        if (!y.s) return new Ctor(ONE);\n        x = new Ctor(x);\n        if (!x.s) {\n          if (y.s < 1) throw Error(decimalError + \"Infinity\");\n          return x;\n        }\n        if (x.eq(ONE)) return x;\n        pr = Ctor.precision;\n        if (y.eq(ONE)) return round(x, pr);\n        e = y.e;\n        k = y.d.length - 1;\n        yIsInt = e >= k;\n        sign = x.s;\n        if (!yIsInt) {\n          if (sign < 0) throw Error(decimalError + \"NaN\");\n        } else if ((k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\n          r = new Ctor(ONE);\n          e = Math.ceil(pr / LOG_BASE + 4);\n          external = false;\n          for (; ; ) {\n            if (k % 2) {\n              r = r.times(x);\n              truncate(r.d, e);\n            }\n            k = mathfloor(k / 2);\n            if (k === 0) break;\n            x = x.times(x);\n            truncate(x.d, e);\n          }\n          external = true;\n          return y.s < 0 ? new Ctor(ONE).div(r) : round(r, pr);\n        }\n        sign = sign < 0 && y.d[Math.max(e, k)] & 1 ? -1 : 1;\n        x.s = 1;\n        external = false;\n        r = y.times(ln(x, pr + guard));\n        external = true;\n        r = exp(r);\n        r.s = sign;\n        return r;\n      };\n      P.toPrecision = function(sd, rm) {\n        var e, str, x = this, Ctor = x.constructor;\n        if (sd === void 0) {\n          e = getBase10Exponent(x);\n          str = toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\n        } else {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          x = round(new Ctor(x), sd, rm);\n          e = getBase10Exponent(x);\n          str = toString(x, sd <= e || e <= Ctor.toExpNeg, sd);\n        }\n        return str;\n      };\n      P.toSignificantDigits = P.tosd = function(sd, rm) {\n        var x = this, Ctor = x.constructor;\n        if (sd === void 0) {\n          sd = Ctor.precision;\n          rm = Ctor.rounding;\n        } else {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n        }\n        return round(new Ctor(x), sd, rm);\n      };\n      P.toString = P.valueOf = P.val = P.toJSON = function() {\n        var x = this, e = getBase10Exponent(x), Ctor = x.constructor;\n        return toString(x, e <= Ctor.toExpNeg || e >= Ctor.toExpPos);\n      };\n      function add(x, y) {\n        var carry, d, e, i, k, len, xd, yd, Ctor = x.constructor, pr = Ctor.precision;\n        if (!x.s || !y.s) {\n          if (!y.s) y = new Ctor(x);\n          return external ? round(y, pr) : y;\n        }\n        xd = x.d;\n        yd = y.d;\n        k = x.e;\n        e = y.e;\n        xd = xd.slice();\n        i = k - e;\n        if (i) {\n          if (i < 0) {\n            d = xd;\n            i = -i;\n            len = yd.length;\n          } else {\n            d = yd;\n            e = k;\n            len = xd.length;\n          }\n          k = Math.ceil(pr / LOG_BASE);\n          len = k > len ? k + 1 : len + 1;\n          if (i > len) {\n            i = len;\n            d.length = 1;\n          }\n          d.reverse();\n          for (; i--; ) d.push(0);\n          d.reverse();\n        }\n        len = xd.length;\n        i = yd.length;\n        if (len - i < 0) {\n          i = len;\n          d = yd;\n          yd = xd;\n          xd = d;\n        }\n        for (carry = 0; i; ) {\n          carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\n          xd[i] %= BASE;\n        }\n        if (carry) {\n          xd.unshift(carry);\n          ++e;\n        }\n        for (len = xd.length; xd[--len] == 0; ) xd.pop();\n        y.d = xd;\n        y.e = e;\n        return external ? round(y, pr) : y;\n      }\n      function checkInt32(i, min, max) {\n        if (i !== ~~i || i < min || i > max) {\n          throw Error(invalidArgument + i);\n        }\n      }\n      function digitsToString(d) {\n        var i, k, ws, indexOfLastWord = d.length - 1, str = \"\", w = d[0];\n        if (indexOfLastWord > 0) {\n          str += w;\n          for (i = 1; i < indexOfLastWord; i++) {\n            ws = d[i] + \"\";\n            k = LOG_BASE - ws.length;\n            if (k) str += getZeroString(k);\n            str += ws;\n          }\n          w = d[i];\n          ws = w + \"\";\n          k = LOG_BASE - ws.length;\n          if (k) str += getZeroString(k);\n        } else if (w === 0) {\n          return \"0\";\n        }\n        for (; w % 10 === 0; ) w /= 10;\n        return str + w;\n      }\n      var divide = /* @__PURE__ */ function() {\n        function multiplyInteger(x, k) {\n          var temp, carry = 0, i = x.length;\n          for (x = x.slice(); i--; ) {\n            temp = x[i] * k + carry;\n            x[i] = temp % BASE | 0;\n            carry = temp / BASE | 0;\n          }\n          if (carry) x.unshift(carry);\n          return x;\n        }\n        function compare(a, b, aL, bL) {\n          var i, r;\n          if (aL != bL) {\n            r = aL > bL ? 1 : -1;\n          } else {\n            for (i = r = 0; i < aL; i++) {\n              if (a[i] != b[i]) {\n                r = a[i] > b[i] ? 1 : -1;\n                break;\n              }\n            }\n          }\n          return r;\n        }\n        function subtract2(a, b, aL) {\n          var i = 0;\n          for (; aL--; ) {\n            a[aL] -= i;\n            i = a[aL] < b[aL] ? 1 : 0;\n            a[aL] = i * BASE + a[aL] - b[aL];\n          }\n          for (; !a[0] && a.length > 1; ) a.shift();\n        }\n        return function(x, y, pr, dp) {\n          var cmp, e, i, k, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz, Ctor = x.constructor, sign = x.s == y.s ? 1 : -1, xd = x.d, yd = y.d;\n          if (!x.s) return new Ctor(x);\n          if (!y.s) throw Error(decimalError + \"Division by zero\");\n          e = x.e - y.e;\n          yL = yd.length;\n          xL = xd.length;\n          q = new Ctor(sign);\n          qd = q.d = [];\n          for (i = 0; yd[i] == (xd[i] || 0); ) ++i;\n          if (yd[i] > (xd[i] || 0)) --e;\n          if (pr == null) {\n            sd = pr = Ctor.precision;\n          } else if (dp) {\n            sd = pr + (getBase10Exponent(x) - getBase10Exponent(y)) + 1;\n          } else {\n            sd = pr;\n          }\n          if (sd < 0) return new Ctor(0);\n          sd = sd / LOG_BASE + 2 | 0;\n          i = 0;\n          if (yL == 1) {\n            k = 0;\n            yd = yd[0];\n            sd++;\n            for (; (i < xL || k) && sd--; i++) {\n              t = k * BASE + (xd[i] || 0);\n              qd[i] = t / yd | 0;\n              k = t % yd | 0;\n            }\n          } else {\n            k = BASE / (yd[0] + 1) | 0;\n            if (k > 1) {\n              yd = multiplyInteger(yd, k);\n              xd = multiplyInteger(xd, k);\n              yL = yd.length;\n              xL = xd.length;\n            }\n            xi = yL;\n            rem = xd.slice(0, yL);\n            remL = rem.length;\n            for (; remL < yL; ) rem[remL++] = 0;\n            yz = yd.slice();\n            yz.unshift(0);\n            yd0 = yd[0];\n            if (yd[1] >= BASE / 2) ++yd0;\n            do {\n              k = 0;\n              cmp = compare(yd, rem, yL, remL);\n              if (cmp < 0) {\n                rem0 = rem[0];\n                if (yL != remL) rem0 = rem0 * BASE + (rem[1] || 0);\n                k = rem0 / yd0 | 0;\n                if (k > 1) {\n                  if (k >= BASE) k = BASE - 1;\n                  prod = multiplyInteger(yd, k);\n                  prodL = prod.length;\n                  remL = rem.length;\n                  cmp = compare(prod, rem, prodL, remL);\n                  if (cmp == 1) {\n                    k--;\n                    subtract2(prod, yL < prodL ? yz : yd, prodL);\n                  }\n                } else {\n                  if (k == 0) cmp = k = 1;\n                  prod = yd.slice();\n                }\n                prodL = prod.length;\n                if (prodL < remL) prod.unshift(0);\n                subtract2(rem, prod, remL);\n                if (cmp == -1) {\n                  remL = rem.length;\n                  cmp = compare(yd, rem, yL, remL);\n                  if (cmp < 1) {\n                    k++;\n                    subtract2(rem, yL < remL ? yz : yd, remL);\n                  }\n                }\n                remL = rem.length;\n              } else if (cmp === 0) {\n                k++;\n                rem = [0];\n              }\n              qd[i++] = k;\n              if (cmp && rem[0]) {\n                rem[remL++] = xd[xi] || 0;\n              } else {\n                rem = [xd[xi]];\n                remL = 1;\n              }\n            } while ((xi++ < xL || rem[0] !== void 0) && sd--);\n          }\n          if (!qd[0]) qd.shift();\n          q.e = e;\n          return round(q, dp ? pr + getBase10Exponent(q) + 1 : pr);\n        };\n      }();\n      function exp(x, sd) {\n        var denominator, guard, pow, sum, t, wpr, i = 0, k = 0, Ctor = x.constructor, pr = Ctor.precision;\n        if (getBase10Exponent(x) > 16) throw Error(exponentOutOfRange + getBase10Exponent(x));\n        if (!x.s) return new Ctor(ONE);\n        if (sd == null) {\n          external = false;\n          wpr = pr;\n        } else {\n          wpr = sd;\n        }\n        t = new Ctor(0.03125);\n        while (x.abs().gte(0.1)) {\n          x = x.times(t);\n          k += 5;\n        }\n        guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\n        wpr += guard;\n        denominator = pow = sum = new Ctor(ONE);\n        Ctor.precision = wpr;\n        for (; ; ) {\n          pow = round(pow.times(x), wpr);\n          denominator = denominator.times(++i);\n          t = sum.plus(divide(pow, denominator, wpr));\n          if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\n            while (k--) sum = round(sum.times(sum), wpr);\n            Ctor.precision = pr;\n            return sd == null ? (external = true, round(sum, pr)) : sum;\n          }\n          sum = t;\n        }\n      }\n      function getBase10Exponent(x) {\n        var e = x.e * LOG_BASE, w = x.d[0];\n        for (; w >= 10; w /= 10) e++;\n        return e;\n      }\n      function getLn10(Ctor, sd, pr) {\n        if (sd > Ctor.LN10.sd()) {\n          external = true;\n          if (pr) Ctor.precision = pr;\n          throw Error(decimalError + \"LN10 precision limit exceeded\");\n        }\n        return round(new Ctor(Ctor.LN10), sd);\n      }\n      function getZeroString(k) {\n        var zs = \"\";\n        for (; k--; ) zs += \"0\";\n        return zs;\n      }\n      function ln(y, sd) {\n        var c, c0, denominator, e, numerator, sum, t, wpr, x2, n = 1, guard = 10, x = y, xd = x.d, Ctor = x.constructor, pr = Ctor.precision;\n        if (x.s < 1) throw Error(decimalError + (x.s ? \"NaN\" : \"-Infinity\"));\n        if (x.eq(ONE)) return new Ctor(0);\n        if (sd == null) {\n          external = false;\n          wpr = pr;\n        } else {\n          wpr = sd;\n        }\n        if (x.eq(10)) {\n          if (sd == null) external = true;\n          return getLn10(Ctor, wpr);\n        }\n        wpr += guard;\n        Ctor.precision = wpr;\n        c = digitsToString(xd);\n        c0 = c.charAt(0);\n        e = getBase10Exponent(x);\n        if (Math.abs(e) < 15e14) {\n          while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\n            x = x.times(y);\n            c = digitsToString(x.d);\n            c0 = c.charAt(0);\n            n++;\n          }\n          e = getBase10Exponent(x);\n          if (c0 > 1) {\n            x = new Ctor(\"0.\" + c);\n            e++;\n          } else {\n            x = new Ctor(c0 + \".\" + c.slice(1));\n          }\n        } else {\n          t = getLn10(Ctor, wpr + 2, pr).times(e + \"\");\n          x = ln(new Ctor(c0 + \".\" + c.slice(1)), wpr - guard).plus(t);\n          Ctor.precision = pr;\n          return sd == null ? (external = true, round(x, pr)) : x;\n        }\n        sum = numerator = x = divide(x.minus(ONE), x.plus(ONE), wpr);\n        x2 = round(x.times(x), wpr);\n        denominator = 3;\n        for (; ; ) {\n          numerator = round(numerator.times(x2), wpr);\n          t = sum.plus(divide(numerator, new Ctor(denominator), wpr));\n          if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {\n            sum = sum.times(2);\n            if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + \"\"));\n            sum = divide(sum, new Ctor(n), wpr);\n            Ctor.precision = pr;\n            return sd == null ? (external = true, round(sum, pr)) : sum;\n          }\n          sum = t;\n          denominator += 2;\n        }\n      }\n      function parseDecimal(x, str) {\n        var e, i, len;\n        if ((e = str.indexOf(\".\")) > -1) str = str.replace(\".\", \"\");\n        if ((i = str.search(/e/i)) > 0) {\n          if (e < 0) e = i;\n          e += +str.slice(i + 1);\n          str = str.substring(0, i);\n        } else if (e < 0) {\n          e = str.length;\n        }\n        for (i = 0; str.charCodeAt(i) === 48; ) ++i;\n        for (len = str.length; str.charCodeAt(len - 1) === 48; ) --len;\n        str = str.slice(i, len);\n        if (str) {\n          len -= i;\n          e = e - i - 1;\n          x.e = mathfloor(e / LOG_BASE);\n          x.d = [];\n          i = (e + 1) % LOG_BASE;\n          if (e < 0) i += LOG_BASE;\n          if (i < len) {\n            if (i) x.d.push(+str.slice(0, i));\n            for (len -= LOG_BASE; i < len; ) x.d.push(+str.slice(i, i += LOG_BASE));\n            str = str.slice(i);\n            i = LOG_BASE - str.length;\n          } else {\n            i -= len;\n          }\n          for (; i--; ) str += \"0\";\n          x.d.push(+str);\n          if (external && (x.e > MAX_E || x.e < -MAX_E)) throw Error(exponentOutOfRange + e);\n        } else {\n          x.s = 0;\n          x.e = 0;\n          x.d = [0];\n        }\n        return x;\n      }\n      function round(x, sd, rm) {\n        var i, j, k, n, rd, doRound, w, xdi, xd = x.d;\n        for (n = 1, k = xd[0]; k >= 10; k /= 10) n++;\n        i = sd - n;\n        if (i < 0) {\n          i += LOG_BASE;\n          j = sd;\n          w = xd[xdi = 0];\n        } else {\n          xdi = Math.ceil((i + 1) / LOG_BASE);\n          k = xd.length;\n          if (xdi >= k) return x;\n          w = k = xd[xdi];\n          for (n = 1; k >= 10; k /= 10) n++;\n          i %= LOG_BASE;\n          j = i - LOG_BASE + n;\n        }\n        if (rm !== void 0) {\n          k = mathpow(10, n - j - 1);\n          rd = w / k % 10 | 0;\n          doRound = sd < 0 || xd[xdi + 1] !== void 0 || w % k;\n          doRound = rm < 4 ? (rd || doRound) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || doRound || rm == 6 && // Check whether the digit to the left of the rounding digit is odd.\n          (i > 0 ? j > 0 ? w / mathpow(10, n - j) : 0 : xd[xdi - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7));\n        }\n        if (sd < 1 || !xd[0]) {\n          if (doRound) {\n            k = getBase10Exponent(x);\n            xd.length = 1;\n            sd = sd - k - 1;\n            xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\n            x.e = mathfloor(-sd / LOG_BASE) || 0;\n          } else {\n            xd.length = 1;\n            xd[0] = x.e = x.s = 0;\n          }\n          return x;\n        }\n        if (i == 0) {\n          xd.length = xdi;\n          k = 1;\n          xdi--;\n        } else {\n          xd.length = xdi + 1;\n          k = mathpow(10, LOG_BASE - i);\n          xd[xdi] = j > 0 ? (w / mathpow(10, n - j) % mathpow(10, j) | 0) * k : 0;\n        }\n        if (doRound) {\n          for (; ; ) {\n            if (xdi == 0) {\n              if ((xd[0] += k) == BASE) {\n                xd[0] = 1;\n                ++x.e;\n              }\n              break;\n            } else {\n              xd[xdi] += k;\n              if (xd[xdi] != BASE) break;\n              xd[xdi--] = 0;\n              k = 1;\n            }\n          }\n        }\n        for (i = xd.length; xd[--i] === 0; ) xd.pop();\n        if (external && (x.e > MAX_E || x.e < -MAX_E)) {\n          throw Error(exponentOutOfRange + getBase10Exponent(x));\n        }\n        return x;\n      }\n      function subtract(x, y) {\n        var d, e, i, j, k, len, xd, xe, xLTy, yd, Ctor = x.constructor, pr = Ctor.precision;\n        if (!x.s || !y.s) {\n          if (y.s) y.s = -y.s;\n          else y = new Ctor(x);\n          return external ? round(y, pr) : y;\n        }\n        xd = x.d;\n        yd = y.d;\n        e = y.e;\n        xe = x.e;\n        xd = xd.slice();\n        k = xe - e;\n        if (k) {\n          xLTy = k < 0;\n          if (xLTy) {\n            d = xd;\n            k = -k;\n            len = yd.length;\n          } else {\n            d = yd;\n            e = xe;\n            len = xd.length;\n          }\n          i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\n          if (k > i) {\n            k = i;\n            d.length = 1;\n          }\n          d.reverse();\n          for (i = k; i--; ) d.push(0);\n          d.reverse();\n        } else {\n          i = xd.length;\n          len = yd.length;\n          xLTy = i < len;\n          if (xLTy) len = i;\n          for (i = 0; i < len; i++) {\n            if (xd[i] != yd[i]) {\n              xLTy = xd[i] < yd[i];\n              break;\n            }\n          }\n          k = 0;\n        }\n        if (xLTy) {\n          d = xd;\n          xd = yd;\n          yd = d;\n          y.s = -y.s;\n        }\n        len = xd.length;\n        for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\n        for (i = yd.length; i > k; ) {\n          if (xd[--i] < yd[i]) {\n            for (j = i; j && xd[--j] === 0; ) xd[j] = BASE - 1;\n            --xd[j];\n            xd[i] += BASE;\n          }\n          xd[i] -= yd[i];\n        }\n        for (; xd[--len] === 0; ) xd.pop();\n        for (; xd[0] === 0; xd.shift()) --e;\n        if (!xd[0]) return new Ctor(0);\n        y.d = xd;\n        y.e = e;\n        return external ? round(y, pr) : y;\n      }\n      function toString(x, isExp, sd) {\n        var k, e = getBase10Exponent(x), str = digitsToString(x.d), len = str.length;\n        if (isExp) {\n          if (sd && (k = sd - len) > 0) {\n            str = str.charAt(0) + \".\" + str.slice(1) + getZeroString(k);\n          } else if (len > 1) {\n            str = str.charAt(0) + \".\" + str.slice(1);\n          }\n          str = str + (e < 0 ? \"e\" : \"e+\") + e;\n        } else if (e < 0) {\n          str = \"0.\" + getZeroString(-e - 1) + str;\n          if (sd && (k = sd - len) > 0) str += getZeroString(k);\n        } else if (e >= len) {\n          str += getZeroString(e + 1 - len);\n          if (sd && (k = sd - e - 1) > 0) str = str + \".\" + getZeroString(k);\n        } else {\n          if ((k = e + 1) < len) str = str.slice(0, k) + \".\" + str.slice(k);\n          if (sd && (k = sd - len) > 0) {\n            if (e + 1 === len) str += \".\";\n            str += getZeroString(k);\n          }\n        }\n        return x.s < 0 ? \"-\" + str : str;\n      }\n      function truncate(arr, len) {\n        if (arr.length > len) {\n          arr.length = len;\n          return true;\n        }\n      }\n      function clone(obj) {\n        var i, p, ps;\n        function Decimal3(value) {\n          var x = this;\n          if (!(x instanceof Decimal3)) return new Decimal3(value);\n          x.constructor = Decimal3;\n          if (value instanceof Decimal3) {\n            x.s = value.s;\n            x.e = value.e;\n            x.d = (value = value.d) ? value.slice() : value;\n            return;\n          }\n          if (typeof value === \"number\") {\n            if (value * 0 !== 0) {\n              throw Error(invalidArgument + value);\n            }\n            if (value > 0) {\n              x.s = 1;\n            } else if (value < 0) {\n              value = -value;\n              x.s = -1;\n            } else {\n              x.s = 0;\n              x.e = 0;\n              x.d = [0];\n              return;\n            }\n            if (value === ~~value && value < 1e7) {\n              x.e = 0;\n              x.d = [value];\n              return;\n            }\n            return parseDecimal(x, value.toString());\n          } else if (typeof value !== \"string\") {\n            throw Error(invalidArgument + value);\n          }\n          if (value.charCodeAt(0) === 45) {\n            value = value.slice(1);\n            x.s = -1;\n          } else {\n            x.s = 1;\n          }\n          if (isDecimal.test(value)) parseDecimal(x, value);\n          else throw Error(invalidArgument + value);\n        }\n        Decimal3.prototype = P;\n        Decimal3.ROUND_UP = 0;\n        Decimal3.ROUND_DOWN = 1;\n        Decimal3.ROUND_CEIL = 2;\n        Decimal3.ROUND_FLOOR = 3;\n        Decimal3.ROUND_HALF_UP = 4;\n        Decimal3.ROUND_HALF_DOWN = 5;\n        Decimal3.ROUND_HALF_EVEN = 6;\n        Decimal3.ROUND_HALF_CEIL = 7;\n        Decimal3.ROUND_HALF_FLOOR = 8;\n        Decimal3.clone = clone;\n        Decimal3.config = Decimal3.set = config;\n        if (obj === void 0) obj = {};\n        if (obj) {\n          ps = [\"precision\", \"rounding\", \"toExpNeg\", \"toExpPos\", \"LN10\"];\n          for (i = 0; i < ps.length; ) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\n        }\n        Decimal3.config(obj);\n        return Decimal3;\n      }\n      function config(obj) {\n        if (!obj || typeof obj !== \"object\") {\n          throw Error(decimalError + \"Object expected\");\n        }\n        var i, p, v, ps = [\n          \"precision\",\n          1,\n          MAX_DIGITS,\n          \"rounding\",\n          0,\n          8,\n          \"toExpNeg\",\n          -1 / 0,\n          0,\n          \"toExpPos\",\n          0,\n          1 / 0\n        ];\n        for (i = 0; i < ps.length; i += 3) {\n          if ((v = obj[p = ps[i]]) !== void 0) {\n            if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\n            else throw Error(invalidArgument + p + \": \" + v);\n          }\n        }\n        if ((v = obj[p = \"LN10\"]) !== void 0) {\n          if (v == Math.LN10) this[p] = new this(v);\n          else throw Error(invalidArgument + p + \": \" + v);\n        }\n        return this;\n      }\n      Decimal2 = clone(Decimal2);\n      Decimal2[\"default\"] = Decimal2.Decimal = Decimal2;\n      ONE = new Decimal2(1);\n      if (typeof define == \"function\" && define.amd) {\n        define(function() {\n          return Decimal2;\n        });\n      } else if (typeof module2 != \"undefined\" && module2.exports) {\n        module2.exports = Decimal2;\n      } else {\n        if (!globalScope) {\n          globalScope = typeof self != \"undefined\" && self && self.self == self ? self : Function(\"return this\")();\n        }\n        globalScope.Decimal = Decimal2;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/big.js/big.js\nvar require_big = __commonJS({\n  \"node_modules/big.js/big.js\"(exports2, module2) {\n    (function(GLOBAL) {\n      \"use strict\";\n      var Big, DP = 20, RM = 1, MAX_DP = 1e6, MAX_POWER = 1e6, NE = -7, PE = 21, NAME = \"[big.js] \", INVALID = NAME + \"Invalid \", INVALID_DP = INVALID + \"decimal places\", INVALID_RM = INVALID + \"rounding mode\", DIV_BY_ZERO = NAME + \"Division by zero\", P = {}, UNDEFINED = void 0, NUMERIC = /^-?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i;\n      function _Big_() {\n        function Big2(n) {\n          var x = this;\n          if (!(x instanceof Big2)) return n === UNDEFINED ? _Big_() : new Big2(n);\n          if (n instanceof Big2) {\n            x.s = n.s;\n            x.e = n.e;\n            x.c = n.c.slice();\n          } else {\n            parse(x, n);\n          }\n          x.constructor = Big2;\n        }\n        Big2.prototype = P;\n        Big2.DP = DP;\n        Big2.RM = RM;\n        Big2.NE = NE;\n        Big2.PE = PE;\n        Big2.version = \"5.2.2\";\n        return Big2;\n      }\n      function parse(x, n) {\n        var e, i, nl;\n        if (n === 0 && 1 / n < 0) n = \"-0\";\n        else if (!NUMERIC.test(n += \"\")) throw Error(INVALID + \"number\");\n        x.s = n.charAt(0) == \"-\" ? (n = n.slice(1), -1) : 1;\n        if ((e = n.indexOf(\".\")) > -1) n = n.replace(\".\", \"\");\n        if ((i = n.search(/e/i)) > 0) {\n          if (e < 0) e = i;\n          e += +n.slice(i + 1);\n          n = n.substring(0, i);\n        } else if (e < 0) {\n          e = n.length;\n        }\n        nl = n.length;\n        for (i = 0; i < nl && n.charAt(i) == \"0\"; ) ++i;\n        if (i == nl) {\n          x.c = [x.e = 0];\n        } else {\n          for (; nl > 0 && n.charAt(--nl) == \"0\"; ) ;\n          x.e = e - i - 1;\n          x.c = [];\n          for (e = 0; i <= nl; ) x.c[e++] = +n.charAt(i++);\n        }\n        return x;\n      }\n      function round(x, dp, rm, more) {\n        var xc = x.c, i = x.e + dp + 1;\n        if (i < xc.length) {\n          if (rm === 1) {\n            more = xc[i] >= 5;\n          } else if (rm === 2) {\n            more = xc[i] > 5 || xc[i] == 5 && (more || i < 0 || xc[i + 1] !== UNDEFINED || xc[i - 1] & 1);\n          } else if (rm === 3) {\n            more = more || !!xc[0];\n          } else {\n            more = false;\n            if (rm !== 0) throw Error(INVALID_RM);\n          }\n          if (i < 1) {\n            xc.length = 1;\n            if (more) {\n              x.e = -dp;\n              xc[0] = 1;\n            } else {\n              xc[0] = x.e = 0;\n            }\n          } else {\n            xc.length = i--;\n            if (more) {\n              for (; ++xc[i] > 9; ) {\n                xc[i] = 0;\n                if (!i--) {\n                  ++x.e;\n                  xc.unshift(1);\n                }\n              }\n            }\n            for (i = xc.length; !xc[--i]; ) xc.pop();\n          }\n        } else if (rm < 0 || rm > 3 || rm !== ~~rm) {\n          throw Error(INVALID_RM);\n        }\n        return x;\n      }\n      function stringify(x, id, n, k) {\n        var e, s, Big2 = x.constructor, z = !x.c[0];\n        if (n !== UNDEFINED) {\n          if (n !== ~~n || n < (id == 3) || n > MAX_DP) {\n            throw Error(id == 3 ? INVALID + \"precision\" : INVALID_DP);\n          }\n          x = new Big2(x);\n          n = k - x.e;\n          if (x.c.length > ++k) round(x, n, Big2.RM);\n          if (id == 2) k = x.e + n + 1;\n          for (; x.c.length < k; ) x.c.push(0);\n        }\n        e = x.e;\n        s = x.c.join(\"\");\n        n = s.length;\n        if (id != 2 && (id == 1 || id == 3 && k <= e || e <= Big2.NE || e >= Big2.PE)) {\n          s = s.charAt(0) + (n > 1 ? \".\" + s.slice(1) : \"\") + (e < 0 ? \"e\" : \"e+\") + e;\n        } else if (e < 0) {\n          for (; ++e; ) s = \"0\" + s;\n          s = \"0.\" + s;\n        } else if (e > 0) {\n          if (++e > n) for (e -= n; e--; ) s += \"0\";\n          else if (e < n) s = s.slice(0, e) + \".\" + s.slice(e);\n        } else if (n > 1) {\n          s = s.charAt(0) + \".\" + s.slice(1);\n        }\n        return x.s < 0 && (!z || id == 4) ? \"-\" + s : s;\n      }\n      P.abs = function() {\n        var x = new this.constructor(this);\n        x.s = 1;\n        return x;\n      };\n      P.cmp = function(y) {\n        var isneg, x = this, xc = x.c, yc = (y = new x.constructor(y)).c, i = x.s, j = y.s, k = x.e, l = y.e;\n        if (!xc[0] || !yc[0]) return !xc[0] ? !yc[0] ? 0 : -j : i;\n        if (i != j) return i;\n        isneg = i < 0;\n        if (k != l) return k > l ^ isneg ? 1 : -1;\n        j = (k = xc.length) < (l = yc.length) ? k : l;\n        for (i = -1; ++i < j; ) {\n          if (xc[i] != yc[i]) return xc[i] > yc[i] ^ isneg ? 1 : -1;\n        }\n        return k == l ? 0 : k > l ^ isneg ? 1 : -1;\n      };\n      P.div = function(y) {\n        var x = this, Big2 = x.constructor, a = x.c, b = (y = new Big2(y)).c, k = x.s == y.s ? 1 : -1, dp = Big2.DP;\n        if (dp !== ~~dp || dp < 0 || dp > MAX_DP) throw Error(INVALID_DP);\n        if (!b[0]) throw Error(DIV_BY_ZERO);\n        if (!a[0]) return new Big2(k * 0);\n        var bl, bt, n, cmp, ri, bz = b.slice(), ai = bl = b.length, al = a.length, r = a.slice(0, bl), rl = r.length, q = y, qc = q.c = [], qi = 0, d = dp + (q.e = x.e - y.e) + 1;\n        q.s = k;\n        k = d < 0 ? 0 : d;\n        bz.unshift(0);\n        for (; rl++ < bl; ) r.push(0);\n        do {\n          for (n = 0; n < 10; n++) {\n            if (bl != (rl = r.length)) {\n              cmp = bl > rl ? 1 : -1;\n            } else {\n              for (ri = -1, cmp = 0; ++ri < bl; ) {\n                if (b[ri] != r[ri]) {\n                  cmp = b[ri] > r[ri] ? 1 : -1;\n                  break;\n                }\n              }\n            }\n            if (cmp < 0) {\n              for (bt = rl == bl ? b : bz; rl; ) {\n                if (r[--rl] < bt[rl]) {\n                  ri = rl;\n                  for (; ri && !r[--ri]; ) r[ri] = 9;\n                  --r[ri];\n                  r[rl] += 10;\n                }\n                r[rl] -= bt[rl];\n              }\n              for (; !r[0]; ) r.shift();\n            } else {\n              break;\n            }\n          }\n          qc[qi++] = cmp ? n : ++n;\n          if (r[0] && cmp) r[rl] = a[ai] || 0;\n          else r = [a[ai]];\n        } while ((ai++ < al || r[0] !== UNDEFINED) && k--);\n        if (!qc[0] && qi != 1) {\n          qc.shift();\n          q.e--;\n        }\n        if (qi > d) round(q, dp, Big2.RM, r[0] !== UNDEFINED);\n        return q;\n      };\n      P.eq = function(y) {\n        return !this.cmp(y);\n      };\n      P.gt = function(y) {\n        return this.cmp(y) > 0;\n      };\n      P.gte = function(y) {\n        return this.cmp(y) > -1;\n      };\n      P.lt = function(y) {\n        return this.cmp(y) < 0;\n      };\n      P.lte = function(y) {\n        return this.cmp(y) < 1;\n      };\n      P.minus = P.sub = function(y) {\n        var i, j, t, xlty, x = this, Big2 = x.constructor, a = x.s, b = (y = new Big2(y)).s;\n        if (a != b) {\n          y.s = -b;\n          return x.plus(y);\n        }\n        var xc = x.c.slice(), xe = x.e, yc = y.c, ye = y.e;\n        if (!xc[0] || !yc[0]) {\n          return yc[0] ? (y.s = -b, y) : new Big2(xc[0] ? x : 0);\n        }\n        if (a = xe - ye) {\n          if (xlty = a < 0) {\n            a = -a;\n            t = xc;\n          } else {\n            ye = xe;\n            t = yc;\n          }\n          t.reverse();\n          for (b = a; b--; ) t.push(0);\n          t.reverse();\n        } else {\n          j = ((xlty = xc.length < yc.length) ? xc : yc).length;\n          for (a = b = 0; b < j; b++) {\n            if (xc[b] != yc[b]) {\n              xlty = xc[b] < yc[b];\n              break;\n            }\n          }\n        }\n        if (xlty) {\n          t = xc;\n          xc = yc;\n          yc = t;\n          y.s = -y.s;\n        }\n        if ((b = (j = yc.length) - (i = xc.length)) > 0) for (; b--; ) xc[i++] = 0;\n        for (b = i; j > a; ) {\n          if (xc[--j] < yc[j]) {\n            for (i = j; i && !xc[--i]; ) xc[i] = 9;\n            --xc[i];\n            xc[j] += 10;\n          }\n          xc[j] -= yc[j];\n        }\n        for (; xc[--b] === 0; ) xc.pop();\n        for (; xc[0] === 0; ) {\n          xc.shift();\n          --ye;\n        }\n        if (!xc[0]) {\n          y.s = 1;\n          xc = [ye = 0];\n        }\n        y.c = xc;\n        y.e = ye;\n        return y;\n      };\n      P.mod = function(y) {\n        var ygtx, x = this, Big2 = x.constructor, a = x.s, b = (y = new Big2(y)).s;\n        if (!y.c[0]) throw Error(DIV_BY_ZERO);\n        x.s = y.s = 1;\n        ygtx = y.cmp(x) == 1;\n        x.s = a;\n        y.s = b;\n        if (ygtx) return new Big2(x);\n        a = Big2.DP;\n        b = Big2.RM;\n        Big2.DP = Big2.RM = 0;\n        x = x.div(y);\n        Big2.DP = a;\n        Big2.RM = b;\n        return this.minus(x.times(y));\n      };\n      P.plus = P.add = function(y) {\n        var t, x = this, Big2 = x.constructor, a = x.s, b = (y = new Big2(y)).s;\n        if (a != b) {\n          y.s = -b;\n          return x.minus(y);\n        }\n        var xe = x.e, xc = x.c, ye = y.e, yc = y.c;\n        if (!xc[0] || !yc[0]) return yc[0] ? y : new Big2(xc[0] ? x : a * 0);\n        xc = xc.slice();\n        if (a = xe - ye) {\n          if (a > 0) {\n            ye = xe;\n            t = yc;\n          } else {\n            a = -a;\n            t = xc;\n          }\n          t.reverse();\n          for (; a--; ) t.push(0);\n          t.reverse();\n        }\n        if (xc.length - yc.length < 0) {\n          t = yc;\n          yc = xc;\n          xc = t;\n        }\n        a = yc.length;\n        for (b = 0; a; xc[a] %= 10) b = (xc[--a] = xc[a] + yc[a] + b) / 10 | 0;\n        if (b) {\n          xc.unshift(b);\n          ++ye;\n        }\n        for (a = xc.length; xc[--a] === 0; ) xc.pop();\n        y.c = xc;\n        y.e = ye;\n        return y;\n      };\n      P.pow = function(n) {\n        var x = this, one = new x.constructor(1), y = one, isneg = n < 0;\n        if (n !== ~~n || n < -MAX_POWER || n > MAX_POWER) throw Error(INVALID + \"exponent\");\n        if (isneg) n = -n;\n        for (; ; ) {\n          if (n & 1) y = y.times(x);\n          n >>= 1;\n          if (!n) break;\n          x = x.times(x);\n        }\n        return isneg ? one.div(y) : y;\n      };\n      P.round = function(dp, rm) {\n        var Big2 = this.constructor;\n        if (dp === UNDEFINED) dp = 0;\n        else if (dp !== ~~dp || dp < -MAX_DP || dp > MAX_DP) throw Error(INVALID_DP);\n        return round(new Big2(this), dp, rm === UNDEFINED ? Big2.RM : rm);\n      };\n      P.sqrt = function() {\n        var r, c, t, x = this, Big2 = x.constructor, s = x.s, e = x.e, half = new Big2(0.5);\n        if (!x.c[0]) return new Big2(x);\n        if (s < 0) throw Error(NAME + \"No square root\");\n        s = Math.sqrt(x + \"\");\n        if (s === 0 || s === 1 / 0) {\n          c = x.c.join(\"\");\n          if (!(c.length + e & 1)) c += \"0\";\n          s = Math.sqrt(c);\n          e = ((e + 1) / 2 | 0) - (e < 0 || e & 1);\n          r = new Big2((s == 1 / 0 ? \"1e\" : (s = s.toExponential()).slice(0, s.indexOf(\"e\") + 1)) + e);\n        } else {\n          r = new Big2(s);\n        }\n        e = r.e + (Big2.DP += 4);\n        do {\n          t = r;\n          r = half.times(t.plus(x.div(t)));\n        } while (t.c.slice(0, e).join(\"\") !== r.c.slice(0, e).join(\"\"));\n        return round(r, Big2.DP -= 4, Big2.RM);\n      };\n      P.times = P.mul = function(y) {\n        var c, x = this, Big2 = x.constructor, xc = x.c, yc = (y = new Big2(y)).c, a = xc.length, b = yc.length, i = x.e, j = y.e;\n        y.s = x.s == y.s ? 1 : -1;\n        if (!xc[0] || !yc[0]) return new Big2(y.s * 0);\n        y.e = i + j;\n        if (a < b) {\n          c = xc;\n          xc = yc;\n          yc = c;\n          j = a;\n          a = b;\n          b = j;\n        }\n        for (c = new Array(j = a + b); j--; ) c[j] = 0;\n        for (i = b; i--; ) {\n          b = 0;\n          for (j = a + i; j > i; ) {\n            b = c[j] + yc[i] * xc[j - i - 1] + b;\n            c[j--] = b % 10;\n            b = b / 10 | 0;\n          }\n          c[j] = (c[j] + b) % 10;\n        }\n        if (b) ++y.e;\n        else c.shift();\n        for (i = c.length; !c[--i]; ) c.pop();\n        y.c = c;\n        return y;\n      };\n      P.toExponential = function(dp) {\n        return stringify(this, 1, dp, dp);\n      };\n      P.toFixed = function(dp) {\n        return stringify(this, 2, dp, this.e + dp);\n      };\n      P.toPrecision = function(sd) {\n        return stringify(this, 3, sd, sd - 1);\n      };\n      P.toString = function() {\n        return stringify(this);\n      };\n      P.valueOf = P.toJSON = function() {\n        return stringify(this, 4);\n      };\n      Big = _Big_();\n      Big[\"default\"] = Big.Big = Big;\n      if (typeof define === \"function\" && define.amd) {\n        define(function() {\n          return Big;\n        });\n      } else if (typeof module2 !== \"undefined\" && module2.exports) {\n        module2.exports = Big;\n      } else {\n        GLOBAL.Big = Big;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/toformat/toFormat.js\nvar require_toFormat = __commonJS({\n  \"node_modules/toformat/toFormat.js\"(exports2, module2) {\n    function toFormat(Ctor) {\n      \"use strict\";\n      Ctor.prototype.toFormat = function toFormat2(dp, rm, fmt) {\n        if (!this.e && this.e !== 0) return this.toString();\n        var arr, g1, g2, i, u, nd, intd, intp, fracp, dsep, gsep, gsize, sgsize, fgsep, fgsize, tfmt = this.format || {}, cfmt = this.constructor.format || {};\n        if (dp != u) {\n          if (typeof dp == \"object\") {\n            fmt = dp;\n            dp = u;\n          } else if (rm != u) {\n            if (typeof rm == \"object\") {\n              fmt = rm;\n              rm = u;\n            } else if (typeof fmt != \"object\") {\n              fmt = {};\n            }\n          } else {\n            fmt = {};\n          }\n        } else {\n          fmt = {};\n        }\n        arr = this.toFixed(dp, rm).split(\".\");\n        intp = arr[0];\n        fracp = arr[1];\n        intd = this.s < 0 ? intp.slice(1) : intp;\n        nd = intd.length;\n        dsep = fmt.decimalSeparator;\n        if (dsep == u) {\n          dsep = tfmt.decimalSeparator;\n          if (dsep == u) {\n            dsep = cfmt.decimalSeparator;\n            if (dsep == u) dsep = \".\";\n          }\n        }\n        gsep = fmt.groupSeparator;\n        if (gsep == u) {\n          gsep = tfmt.groupSeparator;\n          if (gsep == u) gsep = cfmt.groupSeparator;\n        }\n        if (gsep) {\n          gsize = fmt.groupSize;\n          if (gsize == u) {\n            gsize = tfmt.groupSize;\n            if (gsize == u) {\n              gsize = cfmt.groupSize;\n              if (gsize == u) gsize = 0;\n            }\n          }\n          sgsize = fmt.secondaryGroupSize;\n          if (sgsize == u) {\n            sgsize = tfmt.secondaryGroupSize;\n            if (sgsize == u) {\n              sgsize = cfmt.secondaryGroupSize;\n              if (sgsize == u) sgsize = 0;\n            }\n          }\n          if (sgsize) {\n            g1 = +sgsize;\n            g2 = +gsize;\n            nd -= g2;\n          } else {\n            g1 = +gsize;\n            g2 = +sgsize;\n          }\n          if (g1 > 0 && nd > 0) {\n            i = nd % g1 || g1;\n            intp = intd.substr(0, i);\n            for (; i < nd; i += g1) intp += gsep + intd.substr(i, g1);\n            if (g2 > 0) intp += gsep + intd.slice(i);\n            if (this.s < 0) intp = \"-\" + intp;\n          }\n        }\n        if (fracp) {\n          fgsep = fmt.fractionGroupSeparator;\n          if (fgsep == u) {\n            fgsep = tfmt.fractionGroupSeparator;\n            if (fgsep == u) fgsep = cfmt.fractionGroupSeparator;\n          }\n          if (fgsep) {\n            fgsize = fmt.fractionGroupSize;\n            if (fgsize == u) {\n              fgsize = tfmt.fractionGroupSize;\n              if (fgsize == u) {\n                fgsize = cfmt.fractionGroupSize;\n                if (fgsize == u) fgsize = 0;\n              }\n            }\n            fgsize = +fgsize;\n            if (fgsize) {\n              fracp = fracp.replace(new RegExp(\"\\\\d{\" + fgsize + \"}\\\\B\", \"g\"), \"$&\" + fgsep);\n            }\n          }\n          return intp + dsep + fracp;\n        } else {\n          return intp;\n        }\n      };\n      Ctor.format = {\n        decimalSeparator: \".\",\n        groupSeparator: \",\",\n        groupSize: 3,\n        secondaryGroupSize: 0,\n        fractionGroupSeparator: \"\",\n        fractionGroupSize: 0\n      };\n      return Ctor;\n    }\n    if (typeof module2 !== \"undefined\" && module2.exports) module2.exports = toFormat;\n  }\n});\n\n// node_modules/@uniswap/sdk-core/dist/sdk-core.cjs.production.min.js\nvar require_sdk_core_cjs_production_min = __commonJS({\n  \"node_modules/@uniswap/sdk-core/dist/sdk-core.cjs.production.min.js\"(exports2) {\n    \"use strict\";\n    function e(e2) {\n      return e2 && \"object\" == typeof e2 && \"default\" in e2 ? e2.default : e2;\n    }\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    var r;\n    var t = e(require_jsbi_cjs());\n    var n = e(require_tiny_invariant_cjs());\n    var d = e(require_decimal2());\n    var o = e(require_big());\n    var a = e(require_toFormat());\n    var i = require_lib3();\n    var s = require_lib7();\n    function c(e2) {\n      var r2 = function(e3, r3) {\n        if (\"object\" != typeof e3 || !e3) return e3;\n        var t2 = e3[Symbol.toPrimitive];\n        if (void 0 !== t2) {\n          var n2 = t2.call(e3, \"string\");\n          if (\"object\" != typeof n2) return n2;\n          throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n        }\n        return String(e3);\n      }(e2);\n      return \"symbol\" == typeof r2 ? r2 : String(r2);\n    }\n    function A(e2, r2) {\n      for (var t2 = 0; t2 < r2.length; t2++) {\n        var n2 = r2[t2];\n        n2.enumerable = n2.enumerable || false, n2.configurable = true, \"value\" in n2 && (n2.writable = true), Object.defineProperty(e2, c(n2.key), n2);\n      }\n    }\n    function u(e2, r2, t2) {\n      return r2 && A(e2.prototype, r2), t2 && A(e2, t2), Object.defineProperty(e2, \"prototype\", { writable: false }), e2;\n    }\n    function f() {\n      return (f = Object.assign ? Object.assign.bind() : function(e2) {\n        for (var r2 = 1; r2 < arguments.length; r2++) {\n          var t2 = arguments[r2];\n          for (var n2 in t2) Object.prototype.hasOwnProperty.call(t2, n2) && (e2[n2] = t2[n2]);\n        }\n        return e2;\n      }).apply(this, arguments);\n    }\n    function E(e2, r2) {\n      var t2, n2;\n      e2.prototype = Object.create(r2.prototype), e2.prototype.constructor = e2, t2 = e2, n2 = r2, (Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(e3, r3) {\n        return e3.__proto__ = r3, e3;\n      })(t2, n2);\n    }\n    (r = exports2.ChainId || (exports2.ChainId = {}))[r.MAINNET = 1] = \"MAINNET\", r[r.GOERLI = 5] = \"GOERLI\", r[r.SEPOLIA = 11155111] = \"SEPOLIA\", r[r.OPTIMISM = 10] = \"OPTIMISM\", r[r.OPTIMISM_GOERLI = 420] = \"OPTIMISM_GOERLI\", r[r.OPTIMISM_SEPOLIA = 11155420] = \"OPTIMISM_SEPOLIA\", r[r.ARBITRUM_ONE = 42161] = \"ARBITRUM_ONE\", r[r.ARBITRUM_GOERLI = 421613] = \"ARBITRUM_GOERLI\", r[r.ARBITRUM_SEPOLIA = 421614] = \"ARBITRUM_SEPOLIA\", r[r.POLYGON = 137] = \"POLYGON\", r[r.POLYGON_MUMBAI = 80001] = \"POLYGON_MUMBAI\", r[r.CELO = 42220] = \"CELO\", r[r.CELO_ALFAJORES = 44787] = \"CELO_ALFAJORES\", r[r.GNOSIS = 100] = \"GNOSIS\", r[r.MOONBEAM = 1284] = \"MOONBEAM\", r[r.BNB = 56] = \"BNB\", r[r.AVALANCHE = 43114] = \"AVALANCHE\", r[r.BASE_GOERLI = 84531] = \"BASE_GOERLI\", r[r.BASE = 8453] = \"BASE\", r[r.ZORA = 7777777] = \"ZORA\", r[r.ZORA_SEPOLIA = 999999999] = \"ZORA_SEPOLIA\", r[r.ROOTSTOCK = 30] = \"ROOTSTOCK\", r[r.BLAST = 81457] = \"BLAST\";\n    var C;\n    var p;\n    var x;\n    var b;\n    var D;\n    var l;\n    var B;\n    var h;\n    var I;\n    var F = [exports2.ChainId.MAINNET, exports2.ChainId.OPTIMISM, exports2.ChainId.OPTIMISM_GOERLI, exports2.ChainId.OPTIMISM_SEPOLIA, exports2.ChainId.ARBITRUM_ONE, exports2.ChainId.ARBITRUM_GOERLI, exports2.ChainId.ARBITRUM_SEPOLIA, exports2.ChainId.POLYGON, exports2.ChainId.POLYGON_MUMBAI, exports2.ChainId.GOERLI, exports2.ChainId.SEPOLIA, exports2.ChainId.CELO_ALFAJORES, exports2.ChainId.CELO, exports2.ChainId.BNB, exports2.ChainId.AVALANCHE, exports2.ChainId.BASE, exports2.ChainId.BASE_GOERLI, exports2.ChainId.ZORA, exports2.ChainId.ZORA_SEPOLIA, exports2.ChainId.ROOTSTOCK, exports2.ChainId.BLAST];\n    (C = exports2.NativeCurrencyName || (exports2.NativeCurrencyName = {})).ETHER = \"ETH\", C.MATIC = \"MATIC\", C.CELO = \"CELO\", C.GNOSIS = \"XDAI\", C.MOONBEAM = \"GLMR\", C.BNB = \"BNB\", C.AVAX = \"AVAX\", C.ROOTSTOCK = \"RBTC\";\n    var O = [exports2.ChainId.MAINNET, exports2.ChainId.GOERLI, exports2.ChainId.SEPOLIA];\n    function m(e2, r2) {\n      return void 0 === r2 && (r2 = []), O.concat(r2).reduce(function(r3, t2) {\n        return r3[t2] = e2, r3;\n      }, {});\n    }\n    var R;\n    var S;\n    var y = m(\"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984\", [exports2.ChainId.OPTIMISM, exports2.ChainId.ARBITRUM_ONE, exports2.ChainId.POLYGON, exports2.ChainId.POLYGON_MUMBAI, exports2.ChainId.SEPOLIA]);\n    var v = ((p = {})[exports2.ChainId.MAINNET] = \"0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f\", p[exports2.ChainId.GOERLI] = \"0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f\", p[exports2.ChainId.SEPOLIA] = \"0xB7f907f7A9eBC822a80BD25E224be42Ce0A698A0\", p[exports2.ChainId.OPTIMISM] = \"0x0c3c1c532F1e39EdF36BE9Fe0bE1410313E074Bf\", p[exports2.ChainId.ARBITRUM_ONE] = \"0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9\", p[exports2.ChainId.AVALANCHE] = \"0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C\", p[exports2.ChainId.BASE] = \"0x8909dc15e40173ff4699343b6eb8132c65e18ec6\", p[exports2.ChainId.BNB] = \"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6\", p[exports2.ChainId.POLYGON] = \"0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C\", p[exports2.ChainId.CELO] = \"0x79a530c8e2fA8748B7B40dd3629C0520c2cCf03f\", p[exports2.ChainId.BLAST] = \"0x5C346464d33F90bABaf70dB6388507CC889C1070\", p);\n    var _ = ((x = {})[exports2.ChainId.MAINNET] = \"0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D\", x[exports2.ChainId.GOERLI] = \"0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D\", x[exports2.ChainId.ARBITRUM_ONE] = \"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24\", x[exports2.ChainId.OPTIMISM] = \"0x4a7b5da61326a6379179b40d00f57e5bbdc962c2\", x[exports2.ChainId.BASE] = \"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24\", x[exports2.ChainId.AVALANCHE] = \"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24\", x[exports2.ChainId.BNB] = \"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24\", x[exports2.ChainId.POLYGON] = \"0xedf6066a2b290c185783862c7f4776a2c8077ad1\", x[exports2.ChainId.BLAST] = \"0xBB66Eb1c5e875933D44DAe661dbD80e5D9B03035\", x);\n    var T = { v3CoreFactoryAddress: \"0x1F98431c8aD98523631AE4a59f267346ea31F984\", multicallAddress: \"0x1F98415757620B543A52E61c46B32eB19261F984\", quoterAddress: \"0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6\", v3MigratorAddress: \"0xA5644E29708357803b5A882D272c41cC0dF92B34\", nonfungiblePositionManagerAddress: \"0xC36442b4a4522E871399CD717aBDD847Ab11FE88\" };\n    var g = f({}, T, { mixedRouteQuoterV1Address: \"0x84E44095eeBfEC7793Cd7d5b57B7e401D7f1cA2E\" });\n    var N = f({}, T, { mixedRouteQuoterV1Address: \"0xBa60b6e6fF25488308789E6e0A65D838be34194e\" });\n    var M = T;\n    var L = f({}, T, { multicallAddress: \"0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB\", tickLensAddress: \"0xbfd8137f7d1516D3ea5cA83523914859ec47F573\" });\n    var P = T;\n    var w = { v3CoreFactoryAddress: \"0xAfE208a311B21f13EF87E33A90049fC17A7acDEc\", multicallAddress: \"0x633987602DE5C4F337e3DbF265303A1080324204\", quoterAddress: \"0x82825d0554fA07f7FC52Ab63c961F330fdEFa8E8\", v3MigratorAddress: \"0x3cFd4d48EDfDCC53D3f173F596f621064614C582\", nonfungiblePositionManagerAddress: \"0x3d79EdAaBC0EaB6F08ED885C05Fc0B014290D95A\", tickLensAddress: \"0x5f115D9113F88e0a0Db1b5033D90D4a9690AcD3D\" };\n    var U = ((b = {})[exports2.ChainId.MAINNET] = g, b[exports2.ChainId.OPTIMISM] = M, b[exports2.ChainId.ARBITRUM_ONE] = L, b[exports2.ChainId.POLYGON] = P, b[exports2.ChainId.POLYGON_MUMBAI] = P, b[exports2.ChainId.GOERLI] = N, b[exports2.ChainId.CELO] = w, b[exports2.ChainId.CELO_ALFAJORES] = w, b[exports2.ChainId.BNB] = { v3CoreFactoryAddress: \"0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7\", multicallAddress: \"0x963Df249eD09c358A4819E39d9Cd5736c3087184\", quoterAddress: \"0x78D78E420Da98ad378D7799bE8f4AF69033EB077\", v3MigratorAddress: \"0x32681814957e0C13117ddc0c2aba232b5c9e760f\", nonfungiblePositionManagerAddress: \"0x7b8A01B39D58278b5DE7e48c8449c9f4F5170613\", tickLensAddress: \"0xD9270014D396281579760619CCf4c3af0501A47C\", swapRouter02Address: \"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2\" }, b[exports2.ChainId.OPTIMISM_GOERLI] = { v3CoreFactoryAddress: \"0xB656dA17129e7EB733A557f4EBc57B76CFbB5d10\", multicallAddress: \"0x07F2D8a2a02251B62af965f22fC4744A5f96BCCd\", quoterAddress: \"0x9569CbA925c8ca2248772A9A4976A516743A246F\", v3MigratorAddress: \"0xf6c55fBe84B1C8c3283533c53F51bC32F5C7Aba8\", nonfungiblePositionManagerAddress: \"0x39Ca85Af2F383190cBf7d7c41ED9202D27426EF6\", tickLensAddress: \"0xe6140Bd164b63E8BfCfc40D5dF952f83e171758e\" }, b[exports2.ChainId.OPTIMISM_SEPOLIA] = { v3CoreFactoryAddress: \"0x8CE191193D15ea94e11d327b4c7ad8bbE520f6aF\", multicallAddress: \"0x80e4e06841bb76AA9735E0448cB8d003C0EF009a\", quoterAddress: \"0x0FBEa6cf957d95ee9313490050F6A0DA68039404\", v3MigratorAddress: \"0xE7EcbAAaA54D007A00dbb6c1d2f150066D69dA07\", nonfungiblePositionManagerAddress: \"0xdA75cEf1C93078e8b736FCA5D5a30adb97C8957d\", tickLensAddress: \"0xCb7f54747F58F8944973cea5b8f4ac2209BadDC5\", swapRouter02Address: \"0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4\" }, b[exports2.ChainId.ARBITRUM_GOERLI] = { v3CoreFactoryAddress: \"0x4893376342d5D7b3e31d4184c08b265e5aB2A3f6\", multicallAddress: \"0x8260CB40247290317a4c062F3542622367F206Ee\", quoterAddress: \"0x1dd92b83591781D0C6d98d07391eea4b9a6008FA\", v3MigratorAddress: \"0xA815919D2584Ac3F76ea9CB62E6Fd40a43BCe0C3\", nonfungiblePositionManagerAddress: \"0x622e4726a167799826d1E1D150b076A7725f5D81\", tickLensAddress: \"0xb52429333da969a0C79a60930a4Bf0020E5D1DE8\" }, b[exports2.ChainId.ARBITRUM_SEPOLIA] = { v3CoreFactoryAddress: \"0x248AB79Bbb9bC29bB72f7Cd42F17e054Fc40188e\", multicallAddress: \"0x2B718b475e385eD29F56775a66aAB1F5cC6B2A0A\", quoterAddress: \"0x2779a0CC1c3e0E44D2542EC3e79e3864Ae93Ef0B\", v3MigratorAddress: \"0x398f43ef2c67B941147157DA1c5a868E906E043D\", nonfungiblePositionManagerAddress: \"0x6b2937Bde17889EDCf8fbD8dE31C3C2a70Bc4d65\", tickLensAddress: \"0x0fd18587734e5C2dcE2dccDcC7DD1EC89ba557d9\", swapRouter02Address: \"0x101F443B4d1b059569D643917553c771E1b9663E\" }, b[exports2.ChainId.SEPOLIA] = { v3CoreFactoryAddress: \"0x0227628f3F023bb0B980b67D528571c95c6DaC1c\", multicallAddress: \"0xD7F33bCdb21b359c8ee6F0251d30E94832baAd07\", quoterAddress: \"0xEd1f6473345F45b75F8179591dd5bA1888cf2FB3\", v3MigratorAddress: \"0x729004182cF005CEC8Bd85df140094b6aCbe8b15\", nonfungiblePositionManagerAddress: \"0x1238536071E1c677A632429e3655c799b22cDA52\", tickLensAddress: \"0xd7f33bcdb21b359c8ee6f0251d30e94832baad07\", swapRouter02Address: \"0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E\" }, b[exports2.ChainId.AVALANCHE] = { v3CoreFactoryAddress: \"0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD\", multicallAddress: \"0x0139141Cd4Ee88dF3Cdb65881D411bAE271Ef0C2\", quoterAddress: \"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F\", v3MigratorAddress: \"0x44f5f1f5E452ea8d29C890E8F6e893fC0f1f0f97\", nonfungiblePositionManagerAddress: \"0x655C406EBFa14EE2006250925e54ec43AD184f8B\", tickLensAddress: \"0xEB9fFC8bf81b4fFd11fb6A63a6B0f098c6e21950\", swapRouter02Address: \"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE\" }, b[exports2.ChainId.BASE] = { v3CoreFactoryAddress: \"0x33128a8fC17869897dcE68Ed026d694621f6FDfD\", multicallAddress: \"0x091e99cb1C49331a94dD62755D168E941AbD0693\", quoterAddress: \"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a\", v3MigratorAddress: \"0x23cF10b1ee3AdfCA73B0eF17C07F7577e7ACd2d7\", nonfungiblePositionManagerAddress: \"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1\", tickLensAddress: \"0x0CdeE061c75D43c82520eD998C23ac2991c9ac6d\", swapRouter02Address: \"0x2626664c2603336E57B271c5C0b26F421741e481\", mixedRouteQuoterV1Address: \"0xe544efae946f0008ae9a8d64493efa7886b73776\" }, b[exports2.ChainId.BASE_GOERLI] = { v3CoreFactoryAddress: \"0x9323c1d6D800ed51Bd7C6B216cfBec678B7d0BC2\", multicallAddress: \"0xB206027a9E0E13F05eBEFa5D2402Bab3eA716439\", quoterAddress: \"0xedf539058e28E5937dAef3f69cEd0b25fbE66Ae9\", v3MigratorAddress: \"0x3efe5d02a04b7351D671Db7008ec6eBA9AD9e3aE\", nonfungiblePositionManagerAddress: \"0x3c61369ef0D1D2AFa70d8feC2F31C5D6Ce134F30\", tickLensAddress: \"0x1acB873Ee909D0c98adB18e4474943249F931b92\", swapRouter02Address: \"0x8357227D4eDc78991Db6FDB9bD6ADE250536dE1d\" }, b[exports2.ChainId.ZORA] = { v3CoreFactoryAddress: \"0x7145F8aeef1f6510E92164038E1B6F8cB2c42Cbb\", multicallAddress: \"0xA51c76bEE6746cB487a7e9312E43e2b8f4A37C15\", quoterAddress: \"0x11867e1b3348F3ce4FcC170BC5af3d23E07E64Df\", v3MigratorAddress: \"0x048352d8dCF13686982C799da63fA6426a9D0b60\", nonfungiblePositionManagerAddress: \"0xbC91e8DfA3fF18De43853372A3d7dfe585137D78\", tickLensAddress: \"0x209AAda09D74Ad3B8D0E92910Eaf85D2357e3044\", swapRouter02Address: \"0x7De04c96BE5159c3b5CeffC82aa176dc81281557\" }, b[exports2.ChainId.ZORA_SEPOLIA] = { v3CoreFactoryAddress: \"0x4324A677D74764f46f33ED447964252441aA8Db6\", multicallAddress: \"0xA1E7e3A69671C4494EC59Dbd442de930a93F911A\", quoterAddress: \"0xC195976fEF0985886E37036E2DF62bF371E12Df0\", v3MigratorAddress: \"0x65ef259b31bf1d977c37e9434658694267674897\", nonfungiblePositionManagerAddress: \"0xB8458EaAe43292e3c1F7994EFd016bd653d23c20\", tickLensAddress: \"0x23C0F71877a1Fc4e20A78018f9831365c85f3064\" }, b[exports2.ChainId.ROOTSTOCK] = { v3CoreFactoryAddress: \"0xaF37EC98A00FD63689CF3060BF3B6784E00caD82\", multicallAddress: \"0x996a9858cDfa45Ad68E47c9A30a7201E29c6a386\", quoterAddress: \"0xb51727c996C68E60F598A923a5006853cd2fEB31\", v3MigratorAddress: \"0x16678977CA4ec3DAD5efc7b15780295FE5f56162\", nonfungiblePositionManagerAddress: \"0x9d9386c042F194B460Ec424a1e57ACDE25f5C4b1\", tickLensAddress: \"0x55B9dF5bF68ADe972191a91980459f48ecA16afC\", swapRouter02Address: \"0x0B14ff67f0014046b4b99057Aec4509640b3947A\" }, b[exports2.ChainId.BLAST] = { v3CoreFactoryAddress: \"0x792edAdE80af5fC680d96a2eD80A44247D2Cf6Fd\", multicallAddress: \"0xdC7f370de7631cE9e2c2e1DCDA6B3B5744Cf4705\", quoterAddress: \"0x6Cdcd65e03c1CEc3730AeeCd45bc140D57A25C77\", v3MigratorAddress: \"0x15CA7043CD84C5D21Ae76Ba0A1A967d42c40ecE0\", nonfungiblePositionManagerAddress: \"0xB218e4f7cF0533d4696fDfC419A0023D33345F28\", tickLensAddress: \"0x2E95185bCdD928a3e984B7e2D6560Ab1b17d7274\", swapRouter02Address: \"0x549FEB8c9bd4c12Ad2AB27022dA12492aC452B66\" }, b);\n    var q = f({}, F.reduce(function(e2, r2) {\n      return e2[r2] = U[r2].v3CoreFactoryAddress, e2;\n    }, {}));\n    var G = f({}, F.reduce(function(e2, r2) {\n      var t2 = U[r2].v3MigratorAddress;\n      return t2 && (e2[r2] = t2), e2;\n    }, {}));\n    var W = f({}, F.reduce(function(e2, r2) {\n      return e2[r2] = U[r2].multicallAddress, e2;\n    }, {}));\n    var H = m(\"0x5e4be8Bc9637f0EAA1A755019e06A68ce081D58F\");\n    var k = ((D = {})[exports2.ChainId.MAINNET] = \"0xC4e172459f1E7939D522503B81AFAaC1014CE6F6\", D);\n    var V = ((l = {})[exports2.ChainId.MAINNET] = \"0x408ED6354d4973f66138C91495F2f2FCbd8724C3\", l);\n    var j = m(\"0x1a9C8182C09F50C8318d769245beA52c32BE35BC\");\n    var Y = ((B = {})[exports2.ChainId.MAINNET] = \"0x090D4613473dEE047c3f2706764f49E0821D256e\", B);\n    var X = ((h = {})[exports2.ChainId.MAINNET] = \"0xeca4B0bDBf7c55E9b7925919d03CbF8Dc82537E8\", h);\n    var K = f({}, F.reduce(function(e2, r2) {\n      return e2[r2] = U[r2].quoterAddress, e2;\n    }, {}));\n    var Z = f({}, F.reduce(function(e2, r2) {\n      var t2 = U[r2].nonfungiblePositionManagerAddress;\n      return t2 && (e2[r2] = t2), e2;\n    }, {}));\n    var Q = f({}, m(\"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\"));\n    var J = ((I = {})[exports2.ChainId.MAINNET] = \"0x65770b5283117639760beA3F867b69b3697a91dd\", I);\n    var $ = f({}, F.reduce(function(e2, r2) {\n      var t2 = U[r2].tickLensAddress;\n      return t2 && (e2[r2] = t2), e2;\n    }, {}));\n    var z = F.reduce(function(e2, r2) {\n      var t2 = U[r2].mixedRouteQuoterV1Address;\n      return t2 && (e2[r2] = t2), e2;\n    }, {});\n    (R = exports2.TradeType || (exports2.TradeType = {}))[R.EXACT_INPUT = 0] = \"EXACT_INPUT\", R[R.EXACT_OUTPUT = 1] = \"EXACT_OUTPUT\", (S = exports2.Rounding || (exports2.Rounding = {}))[S.ROUND_DOWN = 0] = \"ROUND_DOWN\", S[S.ROUND_HALF_UP = 1] = \"ROUND_HALF_UP\", S[S.ROUND_UP = 2] = \"ROUND_UP\";\n    var ee;\n    var re;\n    var te = t.BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    var ne = a(d);\n    var de = a(o);\n    var oe = ((ee = {})[exports2.Rounding.ROUND_DOWN] = ne.ROUND_DOWN, ee[exports2.Rounding.ROUND_HALF_UP] = ne.ROUND_HALF_UP, ee[exports2.Rounding.ROUND_UP] = ne.ROUND_UP, ee);\n    var ae = ((re = {})[exports2.Rounding.ROUND_DOWN] = 0, re[exports2.Rounding.ROUND_HALF_UP] = 1, re[exports2.Rounding.ROUND_UP] = 3, re);\n    var ie = function() {\n      function e2(e3, r3) {\n        void 0 === r3 && (r3 = t.BigInt(1)), this.numerator = t.BigInt(e3), this.denominator = t.BigInt(r3);\n      }\n      e2.tryParseFraction = function(r3) {\n        if (r3 instanceof t || \"number\" == typeof r3 || \"string\" == typeof r3) return new e2(r3);\n        if (\"numerator\" in r3 && \"denominator\" in r3) return r3;\n        throw new Error(\"Could not parse fraction\");\n      };\n      var r2 = e2.prototype;\n      return r2.invert = function() {\n        return new e2(this.denominator, this.numerator);\n      }, r2.add = function(r3) {\n        var n2 = e2.tryParseFraction(r3);\n        return t.equal(this.denominator, n2.denominator) ? new e2(t.add(this.numerator, n2.numerator), this.denominator) : new e2(t.add(t.multiply(this.numerator, n2.denominator), t.multiply(n2.numerator, this.denominator)), t.multiply(this.denominator, n2.denominator));\n      }, r2.subtract = function(r3) {\n        var n2 = e2.tryParseFraction(r3);\n        return t.equal(this.denominator, n2.denominator) ? new e2(t.subtract(this.numerator, n2.numerator), this.denominator) : new e2(t.subtract(t.multiply(this.numerator, n2.denominator), t.multiply(n2.numerator, this.denominator)), t.multiply(this.denominator, n2.denominator));\n      }, r2.lessThan = function(r3) {\n        var n2 = e2.tryParseFraction(r3);\n        return t.lessThan(t.multiply(this.numerator, n2.denominator), t.multiply(n2.numerator, this.denominator));\n      }, r2.equalTo = function(r3) {\n        var n2 = e2.tryParseFraction(r3);\n        return t.equal(t.multiply(this.numerator, n2.denominator), t.multiply(n2.numerator, this.denominator));\n      }, r2.greaterThan = function(r3) {\n        var n2 = e2.tryParseFraction(r3);\n        return t.greaterThan(t.multiply(this.numerator, n2.denominator), t.multiply(n2.numerator, this.denominator));\n      }, r2.multiply = function(r3) {\n        var n2 = e2.tryParseFraction(r3);\n        return new e2(t.multiply(this.numerator, n2.numerator), t.multiply(this.denominator, n2.denominator));\n      }, r2.divide = function(r3) {\n        var n2 = e2.tryParseFraction(r3);\n        return new e2(t.multiply(this.numerator, n2.denominator), t.multiply(this.denominator, n2.numerator));\n      }, r2.toSignificant = function(e3, r3, t2) {\n        void 0 === r3 && (r3 = { groupSeparator: \"\" }), void 0 === t2 && (t2 = exports2.Rounding.ROUND_HALF_UP), Number.isInteger(e3) || n(false), e3 > 0 || n(false), ne.set({ precision: e3 + 1, rounding: oe[t2] });\n        var d2 = new ne(this.numerator.toString()).div(this.denominator.toString()).toSignificantDigits(e3);\n        return d2.toFormat(d2.decimalPlaces(), r3);\n      }, r2.toFixed = function(e3, r3, t2) {\n        return void 0 === r3 && (r3 = { groupSeparator: \"\" }), void 0 === t2 && (t2 = exports2.Rounding.ROUND_HALF_UP), Number.isInteger(e3) || n(false), e3 >= 0 || n(false), de.DP = e3, de.RM = ae[t2], new de(this.numerator.toString()).div(this.denominator.toString()).toFormat(e3, r3);\n      }, u(e2, [{ key: \"quotient\", get: function() {\n        return t.divide(this.numerator, this.denominator);\n      } }, { key: \"remainder\", get: function() {\n        return new e2(t.remainder(this.numerator, this.denominator), this.denominator);\n      } }, { key: \"asFraction\", get: function() {\n        return new e2(this.numerator, this.denominator);\n      } }]), e2;\n    }();\n    var se = a(o);\n    var ce = function(e2) {\n      function r2(r3, d3, o2) {\n        var a2;\n        return a2 = e2.call(this, d3, o2) || this, t.lessThanOrEqual(a2.quotient, te) || n(false), a2.currency = r3, a2.decimalScale = t.exponentiate(t.BigInt(10), t.BigInt(r3.decimals)), a2;\n      }\n      E(r2, e2), r2.fromRawAmount = function(e3, t2) {\n        return new r2(e3, t2);\n      }, r2.fromFractionalAmount = function(e3, t2, n2) {\n        return new r2(e3, t2, n2);\n      };\n      var d2 = r2.prototype;\n      return d2.add = function(t2) {\n        this.currency.equals(t2.currency) || n(false);\n        var d3 = e2.prototype.add.call(this, t2);\n        return r2.fromFractionalAmount(this.currency, d3.numerator, d3.denominator);\n      }, d2.subtract = function(t2) {\n        this.currency.equals(t2.currency) || n(false);\n        var d3 = e2.prototype.subtract.call(this, t2);\n        return r2.fromFractionalAmount(this.currency, d3.numerator, d3.denominator);\n      }, d2.multiply = function(t2) {\n        var n2 = e2.prototype.multiply.call(this, t2);\n        return r2.fromFractionalAmount(this.currency, n2.numerator, n2.denominator);\n      }, d2.divide = function(t2) {\n        var n2 = e2.prototype.divide.call(this, t2);\n        return r2.fromFractionalAmount(this.currency, n2.numerator, n2.denominator);\n      }, d2.toSignificant = function(r3, t2, n2) {\n        return void 0 === r3 && (r3 = 6), void 0 === n2 && (n2 = exports2.Rounding.ROUND_DOWN), e2.prototype.divide.call(this, this.decimalScale).toSignificant(r3, t2, n2);\n      }, d2.toFixed = function(r3, t2, d3) {\n        return void 0 === r3 && (r3 = this.currency.decimals), void 0 === d3 && (d3 = exports2.Rounding.ROUND_DOWN), r3 <= this.currency.decimals || n(false), e2.prototype.divide.call(this, this.decimalScale).toFixed(r3, t2, d3);\n      }, d2.toExact = function(e3) {\n        return void 0 === e3 && (e3 = { groupSeparator: \"\" }), se.DP = this.currency.decimals, new se(this.quotient.toString()).div(this.decimalScale.toString()).toFormat(e3);\n      }, u(r2, [{ key: \"wrapped\", get: function() {\n        return this.currency.isToken ? this : r2.fromFractionalAmount(this.currency.wrapped, this.numerator, this.denominator);\n      } }]), r2;\n    }(ie);\n    var Ae = new ie(t.BigInt(100));\n    function ue(e2) {\n      return new fe(e2.numerator, e2.denominator);\n    }\n    var fe = function(e2) {\n      function r2() {\n        var r3;\n        return (r3 = e2.apply(this, arguments) || this).isPercent = true, r3;\n      }\n      E(r2, e2);\n      var t2 = r2.prototype;\n      return t2.add = function(r3) {\n        return ue(e2.prototype.add.call(this, r3));\n      }, t2.subtract = function(r3) {\n        return ue(e2.prototype.subtract.call(this, r3));\n      }, t2.multiply = function(r3) {\n        return ue(e2.prototype.multiply.call(this, r3));\n      }, t2.divide = function(r3) {\n        return ue(e2.prototype.divide.call(this, r3));\n      }, t2.toSignificant = function(r3, t3, n2) {\n        return void 0 === r3 && (r3 = 5), e2.prototype.multiply.call(this, Ae).toSignificant(r3, t3, n2);\n      }, t2.toFixed = function(r3, t3, n2) {\n        return void 0 === r3 && (r3 = 2), e2.prototype.multiply.call(this, Ae).toFixed(r3, t3, n2);\n      }, r2;\n    }(ie);\n    var Ee = function(e2) {\n      function r2() {\n        for (var r3, n2, d3, o2, a2, i2 = arguments.length, s2 = new Array(i2), c2 = 0; c2 < i2; c2++) s2[c2] = arguments[c2];\n        if (4 === s2.length) n2 = s2[0], d3 = s2[1], o2 = s2[2], a2 = s2[3];\n        else {\n          var A2 = s2[0].quoteAmount.divide(s2[0].baseAmount), u2 = [s2[0].baseAmount.currency, s2[0].quoteAmount.currency, A2.denominator, A2.numerator];\n          n2 = u2[0], d3 = u2[1], o2 = u2[2], a2 = u2[3];\n        }\n        return (r3 = e2.call(this, a2, o2) || this).baseCurrency = n2, r3.quoteCurrency = d3, r3.scalar = new ie(t.exponentiate(t.BigInt(10), t.BigInt(n2.decimals)), t.exponentiate(t.BigInt(10), t.BigInt(d3.decimals))), r3;\n      }\n      E(r2, e2);\n      var d2 = r2.prototype;\n      return d2.invert = function() {\n        return new r2(this.quoteCurrency, this.baseCurrency, this.numerator, this.denominator);\n      }, d2.multiply = function(t2) {\n        this.quoteCurrency.equals(t2.baseCurrency) || n(false);\n        var d3 = e2.prototype.multiply.call(this, t2);\n        return new r2(this.baseCurrency, t2.quoteCurrency, d3.denominator, d3.numerator);\n      }, d2.quote = function(r3) {\n        r3.currency.equals(this.baseCurrency) || n(false);\n        var t2 = e2.prototype.multiply.call(this, r3);\n        return ce.fromFractionalAmount(this.quoteCurrency, t2.numerator, t2.denominator);\n      }, d2.toSignificant = function(e3, r3, t2) {\n        return void 0 === e3 && (e3 = 6), this.adjustedForDecimals.toSignificant(e3, r3, t2);\n      }, d2.toFixed = function(e3, r3, t2) {\n        return void 0 === e3 && (e3 = 4), this.adjustedForDecimals.toFixed(e3, r3, t2);\n      }, u(r2, [{ key: \"adjustedForDecimals\", get: function() {\n        return e2.prototype.multiply.call(this, this.scalar);\n      } }]), r2;\n    }(ie);\n    var Ce = function(e2, r2, t2, d2) {\n      Number.isSafeInteger(e2) || n(false), r2 >= 0 && r2 < 255 && Number.isInteger(r2) || n(false), this.chainId = e2, this.decimals = r2, this.symbol = t2, this.name = d2;\n    };\n    var pe = function(e2) {\n      function r2() {\n        var r3;\n        return (r3 = e2.apply(this, arguments) || this).isNative = true, r3.isToken = false, r3;\n      }\n      return E(r2, e2), r2;\n    }(Ce);\n    function xe(e2) {\n      try {\n        return s.getAddress(e2);\n      } catch (r2) {\n        throw new Error(e2 + \" is not a valid address.\");\n      }\n    }\n    var be = /^0x[0-9a-fA-F]{40}$/;\n    var De = function(e2) {\n      function r2(r3, t3, d2, o2, a2, s2, c2, A2) {\n        var u2;\n        return (u2 = e2.call(this, r3, d2, o2, a2) || this).isNative = false, u2.isToken = true, u2.address = s2 ? function(e3) {\n          if (be.test(e3)) return e3;\n          throw new Error(e3 + \" is not a valid address.\");\n        }(t3) : xe(t3), c2 && (c2.gte(i.BigNumber.from(0)) || n(false)), A2 && (A2.gte(i.BigNumber.from(0)) || n(false)), u2.buyFeeBps = c2, u2.sellFeeBps = A2, u2;\n      }\n      E(r2, e2);\n      var t2 = r2.prototype;\n      return t2.equals = function(e3) {\n        return e3.isToken && this.chainId === e3.chainId && this.address.toLowerCase() === e3.address.toLowerCase();\n      }, t2.sortsBefore = function(e3) {\n        return this.chainId !== e3.chainId && n(false), this.address.toLowerCase() === e3.address.toLowerCase() && n(false), this.address.toLowerCase() < e3.address.toLowerCase();\n      }, u(r2, [{ key: \"wrapped\", get: function() {\n        return this;\n      } }]), r2;\n    }(Ce);\n    var le = { 1: new De(1, \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\", 18, \"WETH\", \"Wrapped Ether\"), 3: new De(3, \"0xc778417E063141139Fce010982780140Aa0cD5Ab\", 18, \"WETH\", \"Wrapped Ether\"), 4: new De(4, \"0xc778417E063141139Fce010982780140Aa0cD5Ab\", 18, \"WETH\", \"Wrapped Ether\"), 5: new De(5, \"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6\", 18, \"WETH\", \"Wrapped Ether\"), 42: new De(42, \"0xd0A1E359811322d97991E03f863a0C30C2cF029C\", 18, \"WETH\", \"Wrapped Ether\"), 10: new De(10, \"0x4200000000000000000000000000000000000006\", 18, \"WETH\", \"Wrapped Ether\"), 69: new De(69, \"0x4200000000000000000000000000000000000006\", 18, \"WETH\", \"Wrapped Ether\"), 11155420: new De(11155420, \"0x4200000000000000000000000000000000000006\", 18, \"WETH\", \"Wrapped Ether\"), 42161: new De(42161, \"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1\", 18, \"WETH\", \"Wrapped Ether\"), 421611: new De(421611, \"0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681\", 18, \"WETH\", \"Wrapped Ether\"), 421614: new De(421614, \"0x980B62Da83eFf3D4576C647993b0c1D7faf17c73\", 18, \"WETH\", \"Wrapped Ether\"), 8453: new De(8453, \"0x4200000000000000000000000000000000000006\", 18, \"WETH\", \"Wrapped Ether\"), 56: new De(56, \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\", 18, \"WBNB\", \"Wrapped BNB\"), 137: new De(137, \"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270\", 18, \"WMATIC\", \"Wrapped MATIC\"), 43114: new De(43114, \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\", 18, \"WAVAX\", \"Wrapped AVAX\") };\n    var Be = function(e2) {\n      function r2(r3) {\n        return e2.call(this, r3, 18, \"ETH\", \"Ether\") || this;\n      }\n      return E(r2, e2), r2.onChain = function(e3) {\n        var t2;\n        return null != (t2 = this._etherCache[e3]) ? t2 : this._etherCache[e3] = new r2(e3);\n      }, r2.prototype.equals = function(e3) {\n        return e3.isNative && e3.chainId === this.chainId;\n      }, u(r2, [{ key: \"wrapped\", get: function() {\n        var e3 = le[this.chainId];\n        return e3 || n(false), e3;\n      } }]), r2;\n    }(pe);\n    Be._etherCache = {};\n    var he = t.BigInt(Number.MAX_SAFE_INTEGER);\n    var Ie = t.BigInt(0);\n    var Fe = t.BigInt(1);\n    var Oe = t.BigInt(2);\n    exports2.ARGENT_WALLET_DETECTOR_ADDRESS = X, exports2.CHAIN_TO_ADDRESSES_MAP = U, exports2.CurrencyAmount = ce, exports2.ENS_REGISTRAR_ADDRESSES = Q, exports2.Ether = Be, exports2.Fraction = ie, exports2.GOVERNANCE_ALPHA_V0_ADDRESSES = H, exports2.GOVERNANCE_ALPHA_V1_ADDRESSES = k, exports2.GOVERNANCE_BRAVO_ADDRESSES = V, exports2.MERKLE_DISTRIBUTOR_ADDRESS = Y, exports2.MIXED_ROUTE_QUOTER_V1_ADDRESSES = z, exports2.MULTICALL_ADDRESSES = W, exports2.MaxUint256 = te, exports2.NONFUNGIBLE_POSITION_MANAGER_ADDRESSES = Z, exports2.NativeCurrency = pe, exports2.Percent = fe, exports2.Price = Ee, exports2.QUOTER_ADDRESSES = K, exports2.SOCKS_CONTROLLER_ADDRESSES = J, exports2.SUPPORTED_CHAINS = F, exports2.SWAP_ROUTER_02_ADDRESSES = function(e2) {\n      var r2;\n      return F.includes(e2) ? null != (r2 = U[e2].swapRouter02Address) ? r2 : \"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45\" : \"\";\n    }, exports2.TICK_LENS_ADDRESSES = $, exports2.TIMELOCK_ADDRESSES = j, exports2.Token = De, exports2.UNISWAP_NFT_AIRDROP_CLAIM_ADDRESS = \"0x8B799381ac40b838BBA4131ffB26197C432AFe78\", exports2.UNI_ADDRESSES = y, exports2.V2_FACTORY_ADDRESS = \"0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f\", exports2.V2_FACTORY_ADDRESSES = v, exports2.V2_ROUTER_ADDRESS = \"0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D\", exports2.V2_ROUTER_ADDRESSES = _, exports2.V3_CORE_FACTORY_ADDRESSES = q, exports2.V3_MIGRATOR_ADDRESSES = G, exports2.WETH9 = le, exports2.computePriceImpact = function(e2, r2, t2) {\n      var n2 = e2.quote(r2), d2 = n2.subtract(t2).divide(n2);\n      return new fe(d2.numerator, d2.denominator);\n    }, exports2.sortedInsert = function(e2, r2, t2, d2) {\n      if (t2 > 0 || n(false), e2.length <= t2 || n(false), 0 === e2.length) return e2.push(r2), null;\n      var o2 = e2.length === t2;\n      if (o2 && d2(e2[e2.length - 1], r2) <= 0) return r2;\n      for (var a2 = 0, i2 = e2.length; a2 < i2; ) {\n        var s2 = a2 + i2 >>> 1;\n        d2(e2[s2], r2) <= 0 ? a2 = s2 + 1 : i2 = s2;\n      }\n      return e2.splice(a2, 0, r2), o2 ? e2.pop() : null;\n    }, exports2.sqrt = function(e2) {\n      if (t.greaterThanOrEqual(e2, Ie) || n(false), t.lessThan(e2, he)) return t.BigInt(Math.floor(Math.sqrt(t.toNumber(e2))));\n      var r2, d2;\n      for (r2 = e2, d2 = t.add(t.divide(e2, Oe), Fe); t.lessThan(d2, r2); ) r2 = d2, d2 = t.divide(t.add(t.divide(e2, d2), d2), Oe);\n      return r2;\n    }, exports2.validateAndParseAddress = xe;\n  }\n});\n\n// node_modules/@uniswap/sdk-core/dist/sdk-core.cjs.development.js\nvar require_sdk_core_cjs_development = __commonJS({\n  \"node_modules/@uniswap/sdk-core/dist/sdk-core.cjs.development.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    function _interopDefault(ex) {\n      return ex && typeof ex === \"object\" && \"default\" in ex ? ex[\"default\"] : ex;\n    }\n    var JSBI3 = _interopDefault(require_jsbi_cjs());\n    var invariant = _interopDefault(require_tiny_invariant_cjs());\n    var _Decimal = _interopDefault(require_decimal2());\n    var _Big = _interopDefault(require_big());\n    var toFormat = _interopDefault(require_toFormat());\n    var bignumber = require_lib3();\n    var address = require_lib7();\n    function _toPrimitive(t, r) {\n      if (\"object\" != typeof t || !t) return t;\n      var e = t[Symbol.toPrimitive];\n      if (void 0 !== e) {\n        var i = e.call(t, r || \"default\");\n        if (\"object\" != typeof i) return i;\n        throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n      }\n      return (\"string\" === r ? String : Number)(t);\n    }\n    function _toPropertyKey(t) {\n      var i = _toPrimitive(t, \"string\");\n      return \"symbol\" == typeof i ? i : String(i);\n    }\n    function _defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n      }\n    }\n    function _createClass(Constructor, protoProps, staticProps) {\n      if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) _defineProperties(Constructor, staticProps);\n      Object.defineProperty(Constructor, \"prototype\", {\n        writable: false\n      });\n      return Constructor;\n    }\n    function _extends() {\n      _extends = Object.assign ? Object.assign.bind() : function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n          var source = arguments[i];\n          for (var key in source) {\n            if (Object.prototype.hasOwnProperty.call(source, key)) {\n              target[key] = source[key];\n            }\n          }\n        }\n        return target;\n      };\n      return _extends.apply(this, arguments);\n    }\n    function _inheritsLoose(subClass, superClass) {\n      subClass.prototype = Object.create(superClass.prototype);\n      subClass.prototype.constructor = subClass;\n      _setPrototypeOf(subClass, superClass);\n    }\n    function _setPrototypeOf(o, p) {\n      _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf2(o2, p2) {\n        o2.__proto__ = p2;\n        return o2;\n      };\n      return _setPrototypeOf(o, p);\n    }\n    (function(ChainId) {\n      ChainId[ChainId[\"MAINNET\"] = 1] = \"MAINNET\";\n      ChainId[ChainId[\"GOERLI\"] = 5] = \"GOERLI\";\n      ChainId[ChainId[\"SEPOLIA\"] = 11155111] = \"SEPOLIA\";\n      ChainId[ChainId[\"OPTIMISM\"] = 10] = \"OPTIMISM\";\n      ChainId[ChainId[\"OPTIMISM_GOERLI\"] = 420] = \"OPTIMISM_GOERLI\";\n      ChainId[ChainId[\"OPTIMISM_SEPOLIA\"] = 11155420] = \"OPTIMISM_SEPOLIA\";\n      ChainId[ChainId[\"ARBITRUM_ONE\"] = 42161] = \"ARBITRUM_ONE\";\n      ChainId[ChainId[\"ARBITRUM_GOERLI\"] = 421613] = \"ARBITRUM_GOERLI\";\n      ChainId[ChainId[\"ARBITRUM_SEPOLIA\"] = 421614] = \"ARBITRUM_SEPOLIA\";\n      ChainId[ChainId[\"POLYGON\"] = 137] = \"POLYGON\";\n      ChainId[ChainId[\"POLYGON_MUMBAI\"] = 80001] = \"POLYGON_MUMBAI\";\n      ChainId[ChainId[\"CELO\"] = 42220] = \"CELO\";\n      ChainId[ChainId[\"CELO_ALFAJORES\"] = 44787] = \"CELO_ALFAJORES\";\n      ChainId[ChainId[\"GNOSIS\"] = 100] = \"GNOSIS\";\n      ChainId[ChainId[\"MOONBEAM\"] = 1284] = \"MOONBEAM\";\n      ChainId[ChainId[\"BNB\"] = 56] = \"BNB\";\n      ChainId[ChainId[\"AVALANCHE\"] = 43114] = \"AVALANCHE\";\n      ChainId[ChainId[\"BASE_GOERLI\"] = 84531] = \"BASE_GOERLI\";\n      ChainId[ChainId[\"BASE\"] = 8453] = \"BASE\";\n      ChainId[ChainId[\"ZORA\"] = 7777777] = \"ZORA\";\n      ChainId[ChainId[\"ZORA_SEPOLIA\"] = 999999999] = \"ZORA_SEPOLIA\";\n      ChainId[ChainId[\"ROOTSTOCK\"] = 30] = \"ROOTSTOCK\";\n      ChainId[ChainId[\"BLAST\"] = 81457] = \"BLAST\";\n    })(exports2.ChainId || (exports2.ChainId = {}));\n    var SUPPORTED_CHAINS = [exports2.ChainId.MAINNET, exports2.ChainId.OPTIMISM, exports2.ChainId.OPTIMISM_GOERLI, exports2.ChainId.OPTIMISM_SEPOLIA, exports2.ChainId.ARBITRUM_ONE, exports2.ChainId.ARBITRUM_GOERLI, exports2.ChainId.ARBITRUM_SEPOLIA, exports2.ChainId.POLYGON, exports2.ChainId.POLYGON_MUMBAI, exports2.ChainId.GOERLI, exports2.ChainId.SEPOLIA, exports2.ChainId.CELO_ALFAJORES, exports2.ChainId.CELO, exports2.ChainId.BNB, exports2.ChainId.AVALANCHE, exports2.ChainId.BASE, exports2.ChainId.BASE_GOERLI, exports2.ChainId.ZORA, exports2.ChainId.ZORA_SEPOLIA, exports2.ChainId.ROOTSTOCK, exports2.ChainId.BLAST];\n    (function(NativeCurrencyName) {\n      NativeCurrencyName[\"ETHER\"] = \"ETH\";\n      NativeCurrencyName[\"MATIC\"] = \"MATIC\";\n      NativeCurrencyName[\"CELO\"] = \"CELO\";\n      NativeCurrencyName[\"GNOSIS\"] = \"XDAI\";\n      NativeCurrencyName[\"MOONBEAM\"] = \"GLMR\";\n      NativeCurrencyName[\"BNB\"] = \"BNB\";\n      NativeCurrencyName[\"AVAX\"] = \"AVAX\";\n      NativeCurrencyName[\"ROOTSTOCK\"] = \"RBTC\";\n    })(exports2.NativeCurrencyName || (exports2.NativeCurrencyName = {}));\n    var _V2_FACTORY_ADDRESSES;\n    var _V2_ROUTER_ADDRESSES;\n    var _CHAIN_TO_ADDRESSES_M;\n    var _GOVERNANCE_ALPHA_V1_;\n    var _GOVERNANCE_BRAVO_ADD;\n    var _MERKLE_DISTRIBUTOR_A;\n    var _ARGENT_WALLET_DETECT;\n    var _SOCKS_CONTROLLER_ADD;\n    var DEFAULT_NETWORKS = [exports2.ChainId.MAINNET, exports2.ChainId.GOERLI, exports2.ChainId.SEPOLIA];\n    function constructSameAddressMap(address2, additionalNetworks) {\n      if (additionalNetworks === void 0) {\n        additionalNetworks = [];\n      }\n      return DEFAULT_NETWORKS.concat(additionalNetworks).reduce(function(memo, chainId) {\n        memo[chainId] = address2;\n        return memo;\n      }, {});\n    }\n    var UNI_ADDRESSES = /* @__PURE__ */ constructSameAddressMap(\"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984\", [exports2.ChainId.OPTIMISM, exports2.ChainId.ARBITRUM_ONE, exports2.ChainId.POLYGON, exports2.ChainId.POLYGON_MUMBAI, exports2.ChainId.SEPOLIA]);\n    var UNISWAP_NFT_AIRDROP_CLAIM_ADDRESS = \"0x8B799381ac40b838BBA4131ffB26197C432AFe78\";\n    var V2_FACTORY_ADDRESS = \"0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f\";\n    var V2_FACTORY_ADDRESSES = (_V2_FACTORY_ADDRESSES = {}, _V2_FACTORY_ADDRESSES[exports2.ChainId.MAINNET] = \"0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f\", _V2_FACTORY_ADDRESSES[exports2.ChainId.GOERLI] = \"0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f\", _V2_FACTORY_ADDRESSES[exports2.ChainId.SEPOLIA] = \"0xB7f907f7A9eBC822a80BD25E224be42Ce0A698A0\", _V2_FACTORY_ADDRESSES[exports2.ChainId.OPTIMISM] = \"0x0c3c1c532F1e39EdF36BE9Fe0bE1410313E074Bf\", _V2_FACTORY_ADDRESSES[exports2.ChainId.ARBITRUM_ONE] = \"0xf1D7CC64Fb4452F05c498126312eBE29f30Fbcf9\", _V2_FACTORY_ADDRESSES[exports2.ChainId.AVALANCHE] = \"0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C\", _V2_FACTORY_ADDRESSES[exports2.ChainId.BASE] = \"0x8909dc15e40173ff4699343b6eb8132c65e18ec6\", _V2_FACTORY_ADDRESSES[exports2.ChainId.BNB] = \"0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6\", _V2_FACTORY_ADDRESSES[exports2.ChainId.POLYGON] = \"0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C\", _V2_FACTORY_ADDRESSES[exports2.ChainId.CELO] = \"0x79a530c8e2fA8748B7B40dd3629C0520c2cCf03f\", _V2_FACTORY_ADDRESSES[exports2.ChainId.BLAST] = \"0x5C346464d33F90bABaf70dB6388507CC889C1070\", _V2_FACTORY_ADDRESSES);\n    var V2_ROUTER_ADDRESS = \"0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D\";\n    var V2_ROUTER_ADDRESSES = (_V2_ROUTER_ADDRESSES = {}, _V2_ROUTER_ADDRESSES[exports2.ChainId.MAINNET] = \"0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D\", _V2_ROUTER_ADDRESSES[exports2.ChainId.GOERLI] = \"0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D\", _V2_ROUTER_ADDRESSES[exports2.ChainId.ARBITRUM_ONE] = \"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24\", _V2_ROUTER_ADDRESSES[exports2.ChainId.OPTIMISM] = \"0x4a7b5da61326a6379179b40d00f57e5bbdc962c2\", _V2_ROUTER_ADDRESSES[exports2.ChainId.BASE] = \"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24\", _V2_ROUTER_ADDRESSES[exports2.ChainId.AVALANCHE] = \"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24\", _V2_ROUTER_ADDRESSES[exports2.ChainId.BNB] = \"0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24\", _V2_ROUTER_ADDRESSES[exports2.ChainId.POLYGON] = \"0xedf6066a2b290c185783862c7f4776a2c8077ad1\", _V2_ROUTER_ADDRESSES[exports2.ChainId.BLAST] = \"0xBB66Eb1c5e875933D44DAe661dbD80e5D9B03035\", _V2_ROUTER_ADDRESSES);\n    var DEFAULT_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x1F98431c8aD98523631AE4a59f267346ea31F984\",\n      multicallAddress: \"0x1F98415757620B543A52E61c46B32eB19261F984\",\n      quoterAddress: \"0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6\",\n      v3MigratorAddress: \"0xA5644E29708357803b5A882D272c41cC0dF92B34\",\n      nonfungiblePositionManagerAddress: \"0xC36442b4a4522E871399CD717aBDD847Ab11FE88\"\n    };\n    var MAINNET_ADDRESSES = /* @__PURE__ */ _extends({}, DEFAULT_ADDRESSES, {\n      mixedRouteQuoterV1Address: \"0x84E44095eeBfEC7793Cd7d5b57B7e401D7f1cA2E\"\n    });\n    var GOERLI_ADDRESSES = /* @__PURE__ */ _extends({}, DEFAULT_ADDRESSES, {\n      mixedRouteQuoterV1Address: \"0xBa60b6e6fF25488308789E6e0A65D838be34194e\"\n    });\n    var OPTIMISM_ADDRESSES = DEFAULT_ADDRESSES;\n    var ARBITRUM_ONE_ADDRESSES = /* @__PURE__ */ _extends({}, DEFAULT_ADDRESSES, {\n      multicallAddress: \"0xadF885960B47eA2CD9B55E6DAc6B42b7Cb2806dB\",\n      tickLensAddress: \"0xbfd8137f7d1516D3ea5cA83523914859ec47F573\"\n    });\n    var POLYGON_ADDRESSES = DEFAULT_ADDRESSES;\n    var CELO_ADDRESSES = {\n      v3CoreFactoryAddress: \"0xAfE208a311B21f13EF87E33A90049fC17A7acDEc\",\n      multicallAddress: \"0x633987602DE5C4F337e3DbF265303A1080324204\",\n      quoterAddress: \"0x82825d0554fA07f7FC52Ab63c961F330fdEFa8E8\",\n      v3MigratorAddress: \"0x3cFd4d48EDfDCC53D3f173F596f621064614C582\",\n      nonfungiblePositionManagerAddress: \"0x3d79EdAaBC0EaB6F08ED885C05Fc0B014290D95A\",\n      tickLensAddress: \"0x5f115D9113F88e0a0Db1b5033D90D4a9690AcD3D\"\n    };\n    var BNB_ADDRESSES = {\n      v3CoreFactoryAddress: \"0xdB1d10011AD0Ff90774D0C6Bb92e5C5c8b4461F7\",\n      multicallAddress: \"0x963Df249eD09c358A4819E39d9Cd5736c3087184\",\n      quoterAddress: \"0x78D78E420Da98ad378D7799bE8f4AF69033EB077\",\n      v3MigratorAddress: \"0x32681814957e0C13117ddc0c2aba232b5c9e760f\",\n      nonfungiblePositionManagerAddress: \"0x7b8A01B39D58278b5DE7e48c8449c9f4F5170613\",\n      tickLensAddress: \"0xD9270014D396281579760619CCf4c3af0501A47C\",\n      swapRouter02Address: \"0xB971eF87ede563556b2ED4b1C0b0019111Dd85d2\"\n    };\n    var OPTIMISM_GOERLI_ADDRESSES = {\n      v3CoreFactoryAddress: \"0xB656dA17129e7EB733A557f4EBc57B76CFbB5d10\",\n      multicallAddress: \"0x07F2D8a2a02251B62af965f22fC4744A5f96BCCd\",\n      quoterAddress: \"0x9569CbA925c8ca2248772A9A4976A516743A246F\",\n      v3MigratorAddress: \"0xf6c55fBe84B1C8c3283533c53F51bC32F5C7Aba8\",\n      nonfungiblePositionManagerAddress: \"0x39Ca85Af2F383190cBf7d7c41ED9202D27426EF6\",\n      tickLensAddress: \"0xe6140Bd164b63E8BfCfc40D5dF952f83e171758e\"\n    };\n    var OPTIMISM_SEPOLIA_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x8CE191193D15ea94e11d327b4c7ad8bbE520f6aF\",\n      multicallAddress: \"0x80e4e06841bb76AA9735E0448cB8d003C0EF009a\",\n      quoterAddress: \"0x0FBEa6cf957d95ee9313490050F6A0DA68039404\",\n      v3MigratorAddress: \"0xE7EcbAAaA54D007A00dbb6c1d2f150066D69dA07\",\n      nonfungiblePositionManagerAddress: \"0xdA75cEf1C93078e8b736FCA5D5a30adb97C8957d\",\n      tickLensAddress: \"0xCb7f54747F58F8944973cea5b8f4ac2209BadDC5\",\n      swapRouter02Address: \"0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4\"\n    };\n    var ARBITRUM_GOERLI_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x4893376342d5D7b3e31d4184c08b265e5aB2A3f6\",\n      multicallAddress: \"0x8260CB40247290317a4c062F3542622367F206Ee\",\n      quoterAddress: \"0x1dd92b83591781D0C6d98d07391eea4b9a6008FA\",\n      v3MigratorAddress: \"0xA815919D2584Ac3F76ea9CB62E6Fd40a43BCe0C3\",\n      nonfungiblePositionManagerAddress: \"0x622e4726a167799826d1E1D150b076A7725f5D81\",\n      tickLensAddress: \"0xb52429333da969a0C79a60930a4Bf0020E5D1DE8\"\n    };\n    var ARBITRUM_SEPOLIA_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x248AB79Bbb9bC29bB72f7Cd42F17e054Fc40188e\",\n      multicallAddress: \"0x2B718b475e385eD29F56775a66aAB1F5cC6B2A0A\",\n      quoterAddress: \"0x2779a0CC1c3e0E44D2542EC3e79e3864Ae93Ef0B\",\n      v3MigratorAddress: \"0x398f43ef2c67B941147157DA1c5a868E906E043D\",\n      nonfungiblePositionManagerAddress: \"0x6b2937Bde17889EDCf8fbD8dE31C3C2a70Bc4d65\",\n      tickLensAddress: \"0x0fd18587734e5C2dcE2dccDcC7DD1EC89ba557d9\",\n      swapRouter02Address: \"0x101F443B4d1b059569D643917553c771E1b9663E\"\n    };\n    var SEPOLIA_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x0227628f3F023bb0B980b67D528571c95c6DaC1c\",\n      multicallAddress: \"0xD7F33bCdb21b359c8ee6F0251d30E94832baAd07\",\n      quoterAddress: \"0xEd1f6473345F45b75F8179591dd5bA1888cf2FB3\",\n      v3MigratorAddress: \"0x729004182cF005CEC8Bd85df140094b6aCbe8b15\",\n      nonfungiblePositionManagerAddress: \"0x1238536071E1c677A632429e3655c799b22cDA52\",\n      tickLensAddress: \"0xd7f33bcdb21b359c8ee6f0251d30e94832baad07\",\n      swapRouter02Address: \"0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E\"\n    };\n    var AVALANCHE_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD\",\n      multicallAddress: \"0x0139141Cd4Ee88dF3Cdb65881D411bAE271Ef0C2\",\n      quoterAddress: \"0xbe0F5544EC67e9B3b2D979aaA43f18Fd87E6257F\",\n      v3MigratorAddress: \"0x44f5f1f5E452ea8d29C890E8F6e893fC0f1f0f97\",\n      nonfungiblePositionManagerAddress: \"0x655C406EBFa14EE2006250925e54ec43AD184f8B\",\n      tickLensAddress: \"0xEB9fFC8bf81b4fFd11fb6A63a6B0f098c6e21950\",\n      swapRouter02Address: \"0xbb00FF08d01D300023C629E8fFfFcb65A5a578cE\"\n    };\n    var BASE_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x33128a8fC17869897dcE68Ed026d694621f6FDfD\",\n      multicallAddress: \"0x091e99cb1C49331a94dD62755D168E941AbD0693\",\n      quoterAddress: \"0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a\",\n      v3MigratorAddress: \"0x23cF10b1ee3AdfCA73B0eF17C07F7577e7ACd2d7\",\n      nonfungiblePositionManagerAddress: \"0x03a520b32C04BF3bEEf7BEb72E919cf822Ed34f1\",\n      tickLensAddress: \"0x0CdeE061c75D43c82520eD998C23ac2991c9ac6d\",\n      swapRouter02Address: \"0x2626664c2603336E57B271c5C0b26F421741e481\",\n      mixedRouteQuoterV1Address: \"0xe544efae946f0008ae9a8d64493efa7886b73776\"\n    };\n    var BASE_GOERLI_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x9323c1d6D800ed51Bd7C6B216cfBec678B7d0BC2\",\n      multicallAddress: \"0xB206027a9E0E13F05eBEFa5D2402Bab3eA716439\",\n      quoterAddress: \"0xedf539058e28E5937dAef3f69cEd0b25fbE66Ae9\",\n      v3MigratorAddress: \"0x3efe5d02a04b7351D671Db7008ec6eBA9AD9e3aE\",\n      nonfungiblePositionManagerAddress: \"0x3c61369ef0D1D2AFa70d8feC2F31C5D6Ce134F30\",\n      tickLensAddress: \"0x1acB873Ee909D0c98adB18e4474943249F931b92\",\n      swapRouter02Address: \"0x8357227D4eDc78991Db6FDB9bD6ADE250536dE1d\"\n    };\n    var ZORA_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x7145F8aeef1f6510E92164038E1B6F8cB2c42Cbb\",\n      multicallAddress: \"0xA51c76bEE6746cB487a7e9312E43e2b8f4A37C15\",\n      quoterAddress: \"0x11867e1b3348F3ce4FcC170BC5af3d23E07E64Df\",\n      v3MigratorAddress: \"0x048352d8dCF13686982C799da63fA6426a9D0b60\",\n      nonfungiblePositionManagerAddress: \"0xbC91e8DfA3fF18De43853372A3d7dfe585137D78\",\n      tickLensAddress: \"0x209AAda09D74Ad3B8D0E92910Eaf85D2357e3044\",\n      swapRouter02Address: \"0x7De04c96BE5159c3b5CeffC82aa176dc81281557\"\n    };\n    var ZORA_SEPOLIA_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x4324A677D74764f46f33ED447964252441aA8Db6\",\n      multicallAddress: \"0xA1E7e3A69671C4494EC59Dbd442de930a93F911A\",\n      quoterAddress: \"0xC195976fEF0985886E37036E2DF62bF371E12Df0\",\n      v3MigratorAddress: \"0x65ef259b31bf1d977c37e9434658694267674897\",\n      nonfungiblePositionManagerAddress: \"0xB8458EaAe43292e3c1F7994EFd016bd653d23c20\",\n      tickLensAddress: \"0x23C0F71877a1Fc4e20A78018f9831365c85f3064\"\n    };\n    var ROOTSTOCK_ADDRESSES = {\n      v3CoreFactoryAddress: \"0xaF37EC98A00FD63689CF3060BF3B6784E00caD82\",\n      multicallAddress: \"0x996a9858cDfa45Ad68E47c9A30a7201E29c6a386\",\n      quoterAddress: \"0xb51727c996C68E60F598A923a5006853cd2fEB31\",\n      v3MigratorAddress: \"0x16678977CA4ec3DAD5efc7b15780295FE5f56162\",\n      nonfungiblePositionManagerAddress: \"0x9d9386c042F194B460Ec424a1e57ACDE25f5C4b1\",\n      tickLensAddress: \"0x55B9dF5bF68ADe972191a91980459f48ecA16afC\",\n      swapRouter02Address: \"0x0B14ff67f0014046b4b99057Aec4509640b3947A\"\n    };\n    var BLAST_ADDRESSES = {\n      v3CoreFactoryAddress: \"0x792edAdE80af5fC680d96a2eD80A44247D2Cf6Fd\",\n      multicallAddress: \"0xdC7f370de7631cE9e2c2e1DCDA6B3B5744Cf4705\",\n      quoterAddress: \"0x6Cdcd65e03c1CEc3730AeeCd45bc140D57A25C77\",\n      v3MigratorAddress: \"0x15CA7043CD84C5D21Ae76Ba0A1A967d42c40ecE0\",\n      nonfungiblePositionManagerAddress: \"0xB218e4f7cF0533d4696fDfC419A0023D33345F28\",\n      tickLensAddress: \"0x2E95185bCdD928a3e984B7e2D6560Ab1b17d7274\",\n      swapRouter02Address: \"0x549FEB8c9bd4c12Ad2AB27022dA12492aC452B66\"\n    };\n    var CHAIN_TO_ADDRESSES_MAP = (_CHAIN_TO_ADDRESSES_M = {}, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.MAINNET] = MAINNET_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.OPTIMISM] = OPTIMISM_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.ARBITRUM_ONE] = ARBITRUM_ONE_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.POLYGON] = POLYGON_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.POLYGON_MUMBAI] = POLYGON_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.GOERLI] = GOERLI_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.CELO] = CELO_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.CELO_ALFAJORES] = CELO_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.BNB] = BNB_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.OPTIMISM_GOERLI] = OPTIMISM_GOERLI_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.OPTIMISM_SEPOLIA] = OPTIMISM_SEPOLIA_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.ARBITRUM_GOERLI] = ARBITRUM_GOERLI_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.ARBITRUM_SEPOLIA] = ARBITRUM_SEPOLIA_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.SEPOLIA] = SEPOLIA_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.AVALANCHE] = AVALANCHE_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.BASE] = BASE_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.BASE_GOERLI] = BASE_GOERLI_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.ZORA] = ZORA_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.ZORA_SEPOLIA] = ZORA_SEPOLIA_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.ROOTSTOCK] = ROOTSTOCK_ADDRESSES, _CHAIN_TO_ADDRESSES_M[exports2.ChainId.BLAST] = BLAST_ADDRESSES, _CHAIN_TO_ADDRESSES_M);\n    var V3_CORE_FACTORY_ADDRESSES = /* @__PURE__ */ _extends({}, /* @__PURE__ */ SUPPORTED_CHAINS.reduce(function(memo, chainId) {\n      memo[chainId] = CHAIN_TO_ADDRESSES_MAP[chainId].v3CoreFactoryAddress;\n      return memo;\n    }, {}));\n    var V3_MIGRATOR_ADDRESSES = /* @__PURE__ */ _extends({}, /* @__PURE__ */ SUPPORTED_CHAINS.reduce(function(memo, chainId) {\n      var v3MigratorAddress = CHAIN_TO_ADDRESSES_MAP[chainId].v3MigratorAddress;\n      if (v3MigratorAddress) {\n        memo[chainId] = v3MigratorAddress;\n      }\n      return memo;\n    }, {}));\n    var MULTICALL_ADDRESSES = /* @__PURE__ */ _extends({}, /* @__PURE__ */ SUPPORTED_CHAINS.reduce(function(memo, chainId) {\n      memo[chainId] = CHAIN_TO_ADDRESSES_MAP[chainId].multicallAddress;\n      return memo;\n    }, {}));\n    var GOVERNANCE_ALPHA_V0_ADDRESSES = /* @__PURE__ */ constructSameAddressMap(\"0x5e4be8Bc9637f0EAA1A755019e06A68ce081D58F\");\n    var GOVERNANCE_ALPHA_V1_ADDRESSES = (_GOVERNANCE_ALPHA_V1_ = {}, _GOVERNANCE_ALPHA_V1_[exports2.ChainId.MAINNET] = \"0xC4e172459f1E7939D522503B81AFAaC1014CE6F6\", _GOVERNANCE_ALPHA_V1_);\n    var GOVERNANCE_BRAVO_ADDRESSES = (_GOVERNANCE_BRAVO_ADD = {}, _GOVERNANCE_BRAVO_ADD[exports2.ChainId.MAINNET] = \"0x408ED6354d4973f66138C91495F2f2FCbd8724C3\", _GOVERNANCE_BRAVO_ADD);\n    var TIMELOCK_ADDRESSES = /* @__PURE__ */ constructSameAddressMap(\"0x1a9C8182C09F50C8318d769245beA52c32BE35BC\");\n    var MERKLE_DISTRIBUTOR_ADDRESS = (_MERKLE_DISTRIBUTOR_A = {}, _MERKLE_DISTRIBUTOR_A[exports2.ChainId.MAINNET] = \"0x090D4613473dEE047c3f2706764f49E0821D256e\", _MERKLE_DISTRIBUTOR_A);\n    var ARGENT_WALLET_DETECTOR_ADDRESS = (_ARGENT_WALLET_DETECT = {}, _ARGENT_WALLET_DETECT[exports2.ChainId.MAINNET] = \"0xeca4B0bDBf7c55E9b7925919d03CbF8Dc82537E8\", _ARGENT_WALLET_DETECT);\n    var QUOTER_ADDRESSES = /* @__PURE__ */ _extends({}, /* @__PURE__ */ SUPPORTED_CHAINS.reduce(function(memo, chainId) {\n      memo[chainId] = CHAIN_TO_ADDRESSES_MAP[chainId].quoterAddress;\n      return memo;\n    }, {}));\n    var NONFUNGIBLE_POSITION_MANAGER_ADDRESSES = /* @__PURE__ */ _extends({}, /* @__PURE__ */ SUPPORTED_CHAINS.reduce(function(memo, chainId) {\n      var nonfungiblePositionManagerAddress = CHAIN_TO_ADDRESSES_MAP[chainId].nonfungiblePositionManagerAddress;\n      if (nonfungiblePositionManagerAddress) {\n        memo[chainId] = nonfungiblePositionManagerAddress;\n      }\n      return memo;\n    }, {}));\n    var ENS_REGISTRAR_ADDRESSES = /* @__PURE__ */ _extends({}, /* @__PURE__ */ constructSameAddressMap(\"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\"));\n    var SOCKS_CONTROLLER_ADDRESSES = (_SOCKS_CONTROLLER_ADD = {}, _SOCKS_CONTROLLER_ADD[exports2.ChainId.MAINNET] = \"0x65770b5283117639760beA3F867b69b3697a91dd\", _SOCKS_CONTROLLER_ADD);\n    var TICK_LENS_ADDRESSES = /* @__PURE__ */ _extends({}, /* @__PURE__ */ SUPPORTED_CHAINS.reduce(function(memo, chainId) {\n      var tickLensAddress = CHAIN_TO_ADDRESSES_MAP[chainId].tickLensAddress;\n      if (tickLensAddress) {\n        memo[chainId] = tickLensAddress;\n      }\n      return memo;\n    }, {}));\n    var MIXED_ROUTE_QUOTER_V1_ADDRESSES = /* @__PURE__ */ SUPPORTED_CHAINS.reduce(function(memo, chainId) {\n      var mixedRouteQuoterV1Address = CHAIN_TO_ADDRESSES_MAP[chainId].mixedRouteQuoterV1Address;\n      if (mixedRouteQuoterV1Address) {\n        memo[chainId] = mixedRouteQuoterV1Address;\n      }\n      return memo;\n    }, {});\n    var SWAP_ROUTER_02_ADDRESSES = function SWAP_ROUTER_02_ADDRESSES2(chainId) {\n      if (SUPPORTED_CHAINS.includes(chainId)) {\n        var _CHAIN_TO_ADDRESSES_M2;\n        var id = chainId;\n        return (_CHAIN_TO_ADDRESSES_M2 = CHAIN_TO_ADDRESSES_MAP[id].swapRouter02Address) != null ? _CHAIN_TO_ADDRESSES_M2 : \"0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45\";\n      }\n      return \"\";\n    };\n    (function(TradeType) {\n      TradeType[TradeType[\"EXACT_INPUT\"] = 0] = \"EXACT_INPUT\";\n      TradeType[TradeType[\"EXACT_OUTPUT\"] = 1] = \"EXACT_OUTPUT\";\n    })(exports2.TradeType || (exports2.TradeType = {}));\n    (function(Rounding) {\n      Rounding[Rounding[\"ROUND_DOWN\"] = 0] = \"ROUND_DOWN\";\n      Rounding[Rounding[\"ROUND_HALF_UP\"] = 1] = \"ROUND_HALF_UP\";\n      Rounding[Rounding[\"ROUND_UP\"] = 2] = \"ROUND_UP\";\n    })(exports2.Rounding || (exports2.Rounding = {}));\n    var MaxUint256 = /* @__PURE__ */ JSBI3.BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    var _toSignificantRoundin;\n    var _toFixedRounding;\n    var Decimal2 = /* @__PURE__ */ toFormat(_Decimal);\n    var Big = /* @__PURE__ */ toFormat(_Big);\n    var toSignificantRounding = (_toSignificantRoundin = {}, _toSignificantRoundin[exports2.Rounding.ROUND_DOWN] = Decimal2.ROUND_DOWN, _toSignificantRoundin[exports2.Rounding.ROUND_HALF_UP] = Decimal2.ROUND_HALF_UP, _toSignificantRoundin[exports2.Rounding.ROUND_UP] = Decimal2.ROUND_UP, _toSignificantRoundin);\n    var toFixedRounding = (_toFixedRounding = {}, _toFixedRounding[exports2.Rounding.ROUND_DOWN] = 0, _toFixedRounding[exports2.Rounding.ROUND_HALF_UP] = 1, _toFixedRounding[exports2.Rounding.ROUND_UP] = 3, _toFixedRounding);\n    var Fraction = /* @__PURE__ */ function() {\n      function Fraction2(numerator, denominator) {\n        if (denominator === void 0) {\n          denominator = JSBI3.BigInt(1);\n        }\n        this.numerator = JSBI3.BigInt(numerator);\n        this.denominator = JSBI3.BigInt(denominator);\n      }\n      Fraction2.tryParseFraction = function tryParseFraction(fractionish) {\n        if (fractionish instanceof JSBI3 || typeof fractionish === \"number\" || typeof fractionish === \"string\") return new Fraction2(fractionish);\n        if (\"numerator\" in fractionish && \"denominator\" in fractionish) return fractionish;\n        throw new Error(\"Could not parse fraction\");\n      };\n      var _proto = Fraction2.prototype;\n      _proto.invert = function invert() {\n        return new Fraction2(this.denominator, this.numerator);\n      };\n      _proto.add = function add(other) {\n        var otherParsed = Fraction2.tryParseFraction(other);\n        if (JSBI3.equal(this.denominator, otherParsed.denominator)) {\n          return new Fraction2(JSBI3.add(this.numerator, otherParsed.numerator), this.denominator);\n        }\n        return new Fraction2(JSBI3.add(JSBI3.multiply(this.numerator, otherParsed.denominator), JSBI3.multiply(otherParsed.numerator, this.denominator)), JSBI3.multiply(this.denominator, otherParsed.denominator));\n      };\n      _proto.subtract = function subtract(other) {\n        var otherParsed = Fraction2.tryParseFraction(other);\n        if (JSBI3.equal(this.denominator, otherParsed.denominator)) {\n          return new Fraction2(JSBI3.subtract(this.numerator, otherParsed.numerator), this.denominator);\n        }\n        return new Fraction2(JSBI3.subtract(JSBI3.multiply(this.numerator, otherParsed.denominator), JSBI3.multiply(otherParsed.numerator, this.denominator)), JSBI3.multiply(this.denominator, otherParsed.denominator));\n      };\n      _proto.lessThan = function lessThan(other) {\n        var otherParsed = Fraction2.tryParseFraction(other);\n        return JSBI3.lessThan(JSBI3.multiply(this.numerator, otherParsed.denominator), JSBI3.multiply(otherParsed.numerator, this.denominator));\n      };\n      _proto.equalTo = function equalTo(other) {\n        var otherParsed = Fraction2.tryParseFraction(other);\n        return JSBI3.equal(JSBI3.multiply(this.numerator, otherParsed.denominator), JSBI3.multiply(otherParsed.numerator, this.denominator));\n      };\n      _proto.greaterThan = function greaterThan(other) {\n        var otherParsed = Fraction2.tryParseFraction(other);\n        return JSBI3.greaterThan(JSBI3.multiply(this.numerator, otherParsed.denominator), JSBI3.multiply(otherParsed.numerator, this.denominator));\n      };\n      _proto.multiply = function multiply(other) {\n        var otherParsed = Fraction2.tryParseFraction(other);\n        return new Fraction2(JSBI3.multiply(this.numerator, otherParsed.numerator), JSBI3.multiply(this.denominator, otherParsed.denominator));\n      };\n      _proto.divide = function divide(other) {\n        var otherParsed = Fraction2.tryParseFraction(other);\n        return new Fraction2(JSBI3.multiply(this.numerator, otherParsed.denominator), JSBI3.multiply(this.denominator, otherParsed.numerator));\n      };\n      _proto.toSignificant = function toSignificant(significantDigits, format, rounding) {\n        if (format === void 0) {\n          format = {\n            groupSeparator: \"\"\n          };\n        }\n        if (rounding === void 0) {\n          rounding = exports2.Rounding.ROUND_HALF_UP;\n        }\n        !Number.isInteger(significantDigits) ? invariant(false, significantDigits + \" is not an integer.\") : void 0;\n        !(significantDigits > 0) ? invariant(false, significantDigits + \" is not positive.\") : void 0;\n        Decimal2.set({\n          precision: significantDigits + 1,\n          rounding: toSignificantRounding[rounding]\n        });\n        var quotient = new Decimal2(this.numerator.toString()).div(this.denominator.toString()).toSignificantDigits(significantDigits);\n        return quotient.toFormat(quotient.decimalPlaces(), format);\n      };\n      _proto.toFixed = function toFixed(decimalPlaces, format, rounding) {\n        if (format === void 0) {\n          format = {\n            groupSeparator: \"\"\n          };\n        }\n        if (rounding === void 0) {\n          rounding = exports2.Rounding.ROUND_HALF_UP;\n        }\n        !Number.isInteger(decimalPlaces) ? invariant(false, decimalPlaces + \" is not an integer.\") : void 0;\n        !(decimalPlaces >= 0) ? invariant(false, decimalPlaces + \" is negative.\") : void 0;\n        Big.DP = decimalPlaces;\n        Big.RM = toFixedRounding[rounding];\n        return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(decimalPlaces, format);\n      };\n      _createClass(Fraction2, [{\n        key: \"quotient\",\n        get: function get() {\n          return JSBI3.divide(this.numerator, this.denominator);\n        }\n        // remainder after floor division\n      }, {\n        key: \"remainder\",\n        get: function get() {\n          return new Fraction2(JSBI3.remainder(this.numerator, this.denominator), this.denominator);\n        }\n      }, {\n        key: \"asFraction\",\n        get: function get() {\n          return new Fraction2(this.numerator, this.denominator);\n        }\n      }]);\n      return Fraction2;\n    }();\n    var Big$1 = /* @__PURE__ */ toFormat(_Big);\n    var CurrencyAmount = /* @__PURE__ */ function(_Fraction) {\n      _inheritsLoose(CurrencyAmount2, _Fraction);\n      function CurrencyAmount2(currency, numerator, denominator) {\n        var _this;\n        _this = _Fraction.call(this, numerator, denominator) || this;\n        !JSBI3.lessThanOrEqual(_this.quotient, MaxUint256) ? invariant(false, \"AMOUNT\") : void 0;\n        _this.currency = currency;\n        _this.decimalScale = JSBI3.exponentiate(JSBI3.BigInt(10), JSBI3.BigInt(currency.decimals));\n        return _this;\n      }\n      CurrencyAmount2.fromRawAmount = function fromRawAmount(currency, rawAmount) {\n        return new CurrencyAmount2(currency, rawAmount);\n      };\n      CurrencyAmount2.fromFractionalAmount = function fromFractionalAmount(currency, numerator, denominator) {\n        return new CurrencyAmount2(currency, numerator, denominator);\n      };\n      var _proto = CurrencyAmount2.prototype;\n      _proto.add = function add(other) {\n        !this.currency.equals(other.currency) ? invariant(false, \"CURRENCY\") : void 0;\n        var added = _Fraction.prototype.add.call(this, other);\n        return CurrencyAmount2.fromFractionalAmount(this.currency, added.numerator, added.denominator);\n      };\n      _proto.subtract = function subtract(other) {\n        !this.currency.equals(other.currency) ? invariant(false, \"CURRENCY\") : void 0;\n        var subtracted = _Fraction.prototype.subtract.call(this, other);\n        return CurrencyAmount2.fromFractionalAmount(this.currency, subtracted.numerator, subtracted.denominator);\n      };\n      _proto.multiply = function multiply(other) {\n        var multiplied = _Fraction.prototype.multiply.call(this, other);\n        return CurrencyAmount2.fromFractionalAmount(this.currency, multiplied.numerator, multiplied.denominator);\n      };\n      _proto.divide = function divide(other) {\n        var divided = _Fraction.prototype.divide.call(this, other);\n        return CurrencyAmount2.fromFractionalAmount(this.currency, divided.numerator, divided.denominator);\n      };\n      _proto.toSignificant = function toSignificant(significantDigits, format, rounding) {\n        if (significantDigits === void 0) {\n          significantDigits = 6;\n        }\n        if (rounding === void 0) {\n          rounding = exports2.Rounding.ROUND_DOWN;\n        }\n        return _Fraction.prototype.divide.call(this, this.decimalScale).toSignificant(significantDigits, format, rounding);\n      };\n      _proto.toFixed = function toFixed(decimalPlaces, format, rounding) {\n        if (decimalPlaces === void 0) {\n          decimalPlaces = this.currency.decimals;\n        }\n        if (rounding === void 0) {\n          rounding = exports2.Rounding.ROUND_DOWN;\n        }\n        !(decimalPlaces <= this.currency.decimals) ? invariant(false, \"DECIMALS\") : void 0;\n        return _Fraction.prototype.divide.call(this, this.decimalScale).toFixed(decimalPlaces, format, rounding);\n      };\n      _proto.toExact = function toExact(format) {\n        if (format === void 0) {\n          format = {\n            groupSeparator: \"\"\n          };\n        }\n        Big$1.DP = this.currency.decimals;\n        return new Big$1(this.quotient.toString()).div(this.decimalScale.toString()).toFormat(format);\n      };\n      _createClass(CurrencyAmount2, [{\n        key: \"wrapped\",\n        get: function get() {\n          if (this.currency.isToken) return this;\n          return CurrencyAmount2.fromFractionalAmount(this.currency.wrapped, this.numerator, this.denominator);\n        }\n      }]);\n      return CurrencyAmount2;\n    }(Fraction);\n    var ONE_HUNDRED = /* @__PURE__ */ new Fraction(/* @__PURE__ */ JSBI3.BigInt(100));\n    function toPercent(fraction) {\n      return new Percent(fraction.numerator, fraction.denominator);\n    }\n    var Percent = /* @__PURE__ */ function(_Fraction) {\n      _inheritsLoose(Percent2, _Fraction);\n      function Percent2() {\n        var _this;\n        _this = _Fraction.apply(this, arguments) || this;\n        _this.isPercent = true;\n        return _this;\n      }\n      var _proto = Percent2.prototype;\n      _proto.add = function add(other) {\n        return toPercent(_Fraction.prototype.add.call(this, other));\n      };\n      _proto.subtract = function subtract(other) {\n        return toPercent(_Fraction.prototype.subtract.call(this, other));\n      };\n      _proto.multiply = function multiply(other) {\n        return toPercent(_Fraction.prototype.multiply.call(this, other));\n      };\n      _proto.divide = function divide(other) {\n        return toPercent(_Fraction.prototype.divide.call(this, other));\n      };\n      _proto.toSignificant = function toSignificant(significantDigits, format, rounding) {\n        if (significantDigits === void 0) {\n          significantDigits = 5;\n        }\n        return _Fraction.prototype.multiply.call(this, ONE_HUNDRED).toSignificant(significantDigits, format, rounding);\n      };\n      _proto.toFixed = function toFixed(decimalPlaces, format, rounding) {\n        if (decimalPlaces === void 0) {\n          decimalPlaces = 2;\n        }\n        return _Fraction.prototype.multiply.call(this, ONE_HUNDRED).toFixed(decimalPlaces, format, rounding);\n      };\n      return Percent2;\n    }(Fraction);\n    var Price = /* @__PURE__ */ function(_Fraction) {\n      _inheritsLoose(Price2, _Fraction);\n      function Price2() {\n        var _this;\n        var baseCurrency, quoteCurrency, denominator, numerator;\n        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n          args[_key] = arguments[_key];\n        }\n        if (args.length === 4) {\n          baseCurrency = args[0];\n          quoteCurrency = args[1];\n          denominator = args[2];\n          numerator = args[3];\n        } else {\n          var result2 = args[0].quoteAmount.divide(args[0].baseAmount);\n          var _ref = [args[0].baseAmount.currency, args[0].quoteAmount.currency, result2.denominator, result2.numerator];\n          baseCurrency = _ref[0];\n          quoteCurrency = _ref[1];\n          denominator = _ref[2];\n          numerator = _ref[3];\n        }\n        _this = _Fraction.call(this, numerator, denominator) || this;\n        _this.baseCurrency = baseCurrency;\n        _this.quoteCurrency = quoteCurrency;\n        _this.scalar = new Fraction(JSBI3.exponentiate(JSBI3.BigInt(10), JSBI3.BigInt(baseCurrency.decimals)), JSBI3.exponentiate(JSBI3.BigInt(10), JSBI3.BigInt(quoteCurrency.decimals)));\n        return _this;\n      }\n      var _proto = Price2.prototype;\n      _proto.invert = function invert() {\n        return new Price2(this.quoteCurrency, this.baseCurrency, this.numerator, this.denominator);\n      };\n      _proto.multiply = function multiply(other) {\n        !this.quoteCurrency.equals(other.baseCurrency) ? invariant(false, \"TOKEN\") : void 0;\n        var fraction = _Fraction.prototype.multiply.call(this, other);\n        return new Price2(this.baseCurrency, other.quoteCurrency, fraction.denominator, fraction.numerator);\n      };\n      _proto.quote = function quote(currencyAmount) {\n        !currencyAmount.currency.equals(this.baseCurrency) ? invariant(false, \"TOKEN\") : void 0;\n        var result2 = _Fraction.prototype.multiply.call(this, currencyAmount);\n        return CurrencyAmount.fromFractionalAmount(this.quoteCurrency, result2.numerator, result2.denominator);\n      };\n      _proto.toSignificant = function toSignificant(significantDigits, format, rounding) {\n        if (significantDigits === void 0) {\n          significantDigits = 6;\n        }\n        return this.adjustedForDecimals.toSignificant(significantDigits, format, rounding);\n      };\n      _proto.toFixed = function toFixed(decimalPlaces, format, rounding) {\n        if (decimalPlaces === void 0) {\n          decimalPlaces = 4;\n        }\n        return this.adjustedForDecimals.toFixed(decimalPlaces, format, rounding);\n      };\n      _createClass(Price2, [{\n        key: \"adjustedForDecimals\",\n        get: function get() {\n          return _Fraction.prototype.multiply.call(this, this.scalar);\n        }\n      }]);\n      return Price2;\n    }(Fraction);\n    var BaseCurrency = (\n      /**\n       * Constructs an instance of the base class `BaseCurrency`.\n       * @param chainId the chain ID on which this currency resides\n       * @param decimals decimals of the currency\n       * @param symbol symbol of the currency\n       * @param name of the currency\n       */\n      function BaseCurrency2(chainId, decimals, symbol, name2) {\n        !Number.isSafeInteger(chainId) ? invariant(false, \"CHAIN_ID\") : void 0;\n        !(decimals >= 0 && decimals < 255 && Number.isInteger(decimals)) ? invariant(false, \"DECIMALS\") : void 0;\n        this.chainId = chainId;\n        this.decimals = decimals;\n        this.symbol = symbol;\n        this.name = name2;\n      }\n    );\n    var NativeCurrency = /* @__PURE__ */ function(_BaseCurrency) {\n      _inheritsLoose(NativeCurrency2, _BaseCurrency);\n      function NativeCurrency2() {\n        var _this;\n        _this = _BaseCurrency.apply(this, arguments) || this;\n        _this.isNative = true;\n        _this.isToken = false;\n        return _this;\n      }\n      return NativeCurrency2;\n    }(BaseCurrency);\n    function validateAndParseAddress(address$1) {\n      try {\n        return address.getAddress(address$1);\n      } catch (error) {\n        throw new Error(address$1 + \" is not a valid address.\");\n      }\n    }\n    var startsWith0xLen42HexRegex = /^0x[0-9a-fA-F]{40}$/;\n    function checkValidAddress(address2) {\n      if (startsWith0xLen42HexRegex.test(address2)) {\n        return address2;\n      }\n      throw new Error(address2 + \" is not a valid address.\");\n    }\n    var Token = /* @__PURE__ */ function(_BaseCurrency) {\n      _inheritsLoose(Token2, _BaseCurrency);\n      function Token2(chainId, address2, decimals, symbol, name2, bypassChecksum, buyFeeBps, sellFeeBps) {\n        var _this;\n        _this = _BaseCurrency.call(this, chainId, decimals, symbol, name2) || this;\n        _this.isNative = false;\n        _this.isToken = true;\n        if (bypassChecksum) {\n          _this.address = checkValidAddress(address2);\n        } else {\n          _this.address = validateAndParseAddress(address2);\n        }\n        if (buyFeeBps) {\n          !buyFeeBps.gte(bignumber.BigNumber.from(0)) ? invariant(false, \"NON-NEGATIVE FOT FEES\") : void 0;\n        }\n        if (sellFeeBps) {\n          !sellFeeBps.gte(bignumber.BigNumber.from(0)) ? invariant(false, \"NON-NEGATIVE FOT FEES\") : void 0;\n        }\n        _this.buyFeeBps = buyFeeBps;\n        _this.sellFeeBps = sellFeeBps;\n        return _this;\n      }\n      var _proto = Token2.prototype;\n      _proto.equals = function equals(other) {\n        return other.isToken && this.chainId === other.chainId && this.address.toLowerCase() === other.address.toLowerCase();\n      };\n      _proto.sortsBefore = function sortsBefore(other) {\n        !(this.chainId === other.chainId) ? invariant(false, \"CHAIN_IDS\") : void 0;\n        !(this.address.toLowerCase() !== other.address.toLowerCase()) ? invariant(false, \"ADDRESSES\") : void 0;\n        return this.address.toLowerCase() < other.address.toLowerCase();\n      };\n      _createClass(Token2, [{\n        key: \"wrapped\",\n        get: function get() {\n          return this;\n        }\n      }]);\n      return Token2;\n    }(BaseCurrency);\n    var WETH9 = {\n      1: /* @__PURE__ */ new Token(1, \"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\", 18, \"WETH\", \"Wrapped Ether\"),\n      3: /* @__PURE__ */ new Token(3, \"0xc778417E063141139Fce010982780140Aa0cD5Ab\", 18, \"WETH\", \"Wrapped Ether\"),\n      4: /* @__PURE__ */ new Token(4, \"0xc778417E063141139Fce010982780140Aa0cD5Ab\", 18, \"WETH\", \"Wrapped Ether\"),\n      5: /* @__PURE__ */ new Token(5, \"0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6\", 18, \"WETH\", \"Wrapped Ether\"),\n      42: /* @__PURE__ */ new Token(42, \"0xd0A1E359811322d97991E03f863a0C30C2cF029C\", 18, \"WETH\", \"Wrapped Ether\"),\n      10: /* @__PURE__ */ new Token(10, \"0x4200000000000000000000000000000000000006\", 18, \"WETH\", \"Wrapped Ether\"),\n      69: /* @__PURE__ */ new Token(69, \"0x4200000000000000000000000000000000000006\", 18, \"WETH\", \"Wrapped Ether\"),\n      11155420: /* @__PURE__ */ new Token(11155420, \"0x4200000000000000000000000000000000000006\", 18, \"WETH\", \"Wrapped Ether\"),\n      42161: /* @__PURE__ */ new Token(42161, \"0x82aF49447D8a07e3bd95BD0d56f35241523fBab1\", 18, \"WETH\", \"Wrapped Ether\"),\n      421611: /* @__PURE__ */ new Token(421611, \"0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681\", 18, \"WETH\", \"Wrapped Ether\"),\n      421614: /* @__PURE__ */ new Token(421614, \"0x980B62Da83eFf3D4576C647993b0c1D7faf17c73\", 18, \"WETH\", \"Wrapped Ether\"),\n      8453: /* @__PURE__ */ new Token(8453, \"0x4200000000000000000000000000000000000006\", 18, \"WETH\", \"Wrapped Ether\"),\n      56: /* @__PURE__ */ new Token(56, \"0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c\", 18, \"WBNB\", \"Wrapped BNB\"),\n      137: /* @__PURE__ */ new Token(137, \"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270\", 18, \"WMATIC\", \"Wrapped MATIC\"),\n      43114: /* @__PURE__ */ new Token(43114, \"0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7\", 18, \"WAVAX\", \"Wrapped AVAX\")\n    };\n    var Ether = /* @__PURE__ */ function(_NativeCurrency) {\n      _inheritsLoose(Ether2, _NativeCurrency);\n      function Ether2(chainId) {\n        return _NativeCurrency.call(this, chainId, 18, \"ETH\", \"Ether\") || this;\n      }\n      Ether2.onChain = function onChain(chainId) {\n        var _this$_etherCache$cha;\n        return (_this$_etherCache$cha = this._etherCache[chainId]) != null ? _this$_etherCache$cha : this._etherCache[chainId] = new Ether2(chainId);\n      };\n      var _proto = Ether2.prototype;\n      _proto.equals = function equals(other) {\n        return other.isNative && other.chainId === this.chainId;\n      };\n      _createClass(Ether2, [{\n        key: \"wrapped\",\n        get: function get() {\n          var weth9 = WETH9[this.chainId];\n          !!!weth9 ? invariant(false, \"WRAPPED\") : void 0;\n          return weth9;\n        }\n      }]);\n      return Ether2;\n    }(NativeCurrency);\n    Ether._etherCache = {};\n    function computePriceImpact(midPrice, inputAmount, outputAmount) {\n      var quotedOutputAmount = midPrice.quote(inputAmount);\n      var priceImpact = quotedOutputAmount.subtract(outputAmount).divide(quotedOutputAmount);\n      return new Percent(priceImpact.numerator, priceImpact.denominator);\n    }\n    function sortedInsert(items, add, maxSize, comparator) {\n      !(maxSize > 0) ? invariant(false, \"MAX_SIZE_ZERO\") : void 0;\n      !(items.length <= maxSize) ? invariant(false, \"ITEMS_SIZE\") : void 0;\n      if (items.length === 0) {\n        items.push(add);\n        return null;\n      } else {\n        var isFull = items.length === maxSize;\n        if (isFull && comparator(items[items.length - 1], add) <= 0) {\n          return add;\n        }\n        var lo = 0, hi = items.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (comparator(items[mid], add) <= 0) {\n            lo = mid + 1;\n          } else {\n            hi = mid;\n          }\n        }\n        items.splice(lo, 0, add);\n        return isFull ? items.pop() : null;\n      }\n    }\n    var MAX_SAFE_INTEGER = /* @__PURE__ */ JSBI3.BigInt(Number.MAX_SAFE_INTEGER);\n    var ZERO = /* @__PURE__ */ JSBI3.BigInt(0);\n    var ONE = /* @__PURE__ */ JSBI3.BigInt(1);\n    var TWO = /* @__PURE__ */ JSBI3.BigInt(2);\n    function sqrt(value) {\n      !JSBI3.greaterThanOrEqual(value, ZERO) ? invariant(false, \"NEGATIVE\") : void 0;\n      if (JSBI3.lessThan(value, MAX_SAFE_INTEGER)) {\n        return JSBI3.BigInt(Math.floor(Math.sqrt(JSBI3.toNumber(value))));\n      }\n      var z;\n      var x;\n      z = value;\n      x = JSBI3.add(JSBI3.divide(value, TWO), ONE);\n      while (JSBI3.lessThan(x, z)) {\n        z = x;\n        x = JSBI3.divide(JSBI3.add(JSBI3.divide(value, x), x), TWO);\n      }\n      return z;\n    }\n    exports2.ARGENT_WALLET_DETECTOR_ADDRESS = ARGENT_WALLET_DETECTOR_ADDRESS;\n    exports2.CHAIN_TO_ADDRESSES_MAP = CHAIN_TO_ADDRESSES_MAP;\n    exports2.CurrencyAmount = CurrencyAmount;\n    exports2.ENS_REGISTRAR_ADDRESSES = ENS_REGISTRAR_ADDRESSES;\n    exports2.Ether = Ether;\n    exports2.Fraction = Fraction;\n    exports2.GOVERNANCE_ALPHA_V0_ADDRESSES = GOVERNANCE_ALPHA_V0_ADDRESSES;\n    exports2.GOVERNANCE_ALPHA_V1_ADDRESSES = GOVERNANCE_ALPHA_V1_ADDRESSES;\n    exports2.GOVERNANCE_BRAVO_ADDRESSES = GOVERNANCE_BRAVO_ADDRESSES;\n    exports2.MERKLE_DISTRIBUTOR_ADDRESS = MERKLE_DISTRIBUTOR_ADDRESS;\n    exports2.MIXED_ROUTE_QUOTER_V1_ADDRESSES = MIXED_ROUTE_QUOTER_V1_ADDRESSES;\n    exports2.MULTICALL_ADDRESSES = MULTICALL_ADDRESSES;\n    exports2.MaxUint256 = MaxUint256;\n    exports2.NONFUNGIBLE_POSITION_MANAGER_ADDRESSES = NONFUNGIBLE_POSITION_MANAGER_ADDRESSES;\n    exports2.NativeCurrency = NativeCurrency;\n    exports2.Percent = Percent;\n    exports2.Price = Price;\n    exports2.QUOTER_ADDRESSES = QUOTER_ADDRESSES;\n    exports2.SOCKS_CONTROLLER_ADDRESSES = SOCKS_CONTROLLER_ADDRESSES;\n    exports2.SUPPORTED_CHAINS = SUPPORTED_CHAINS;\n    exports2.SWAP_ROUTER_02_ADDRESSES = SWAP_ROUTER_02_ADDRESSES;\n    exports2.TICK_LENS_ADDRESSES = TICK_LENS_ADDRESSES;\n    exports2.TIMELOCK_ADDRESSES = TIMELOCK_ADDRESSES;\n    exports2.Token = Token;\n    exports2.UNISWAP_NFT_AIRDROP_CLAIM_ADDRESS = UNISWAP_NFT_AIRDROP_CLAIM_ADDRESS;\n    exports2.UNI_ADDRESSES = UNI_ADDRESSES;\n    exports2.V2_FACTORY_ADDRESS = V2_FACTORY_ADDRESS;\n    exports2.V2_FACTORY_ADDRESSES = V2_FACTORY_ADDRESSES;\n    exports2.V2_ROUTER_ADDRESS = V2_ROUTER_ADDRESS;\n    exports2.V2_ROUTER_ADDRESSES = V2_ROUTER_ADDRESSES;\n    exports2.V3_CORE_FACTORY_ADDRESSES = V3_CORE_FACTORY_ADDRESSES;\n    exports2.V3_MIGRATOR_ADDRESSES = V3_MIGRATOR_ADDRESSES;\n    exports2.WETH9 = WETH9;\n    exports2.computePriceImpact = computePriceImpact;\n    exports2.sortedInsert = sortedInsert;\n    exports2.sqrt = sqrt;\n    exports2.validateAndParseAddress = validateAndParseAddress;\n  }\n});\n\n// node_modules/@uniswap/sdk-core/dist/index.js\nvar require_dist = __commonJS({\n  \"node_modules/@uniswap/sdk-core/dist/index.js\"(exports2, module2) {\n    \"use strict\";\n    if (process.env.NODE_ENV === \"production\") {\n      module2.exports = require_sdk_core_cjs_production_min();\n    } else {\n      module2.exports = require_sdk_core_cjs_development();\n    }\n  }\n});\n\n// node_modules/@uniswap/v3-periphery/artifacts/contracts/interfaces/IMulticall.sol/IMulticall.json\nvar require_IMulticall = __commonJS({\n  \"node_modules/@uniswap/v3-periphery/artifacts/contracts/interfaces/IMulticall.sol/IMulticall.json\"(exports2, module2) {\n    module2.exports = {\n      _format: \"hh-sol-artifact-1\",\n      contractName: \"IMulticall\",\n      sourceName: \"contracts/interfaces/IMulticall.sol\",\n      abi: [\n        {\n          inputs: [\n            {\n              internalType: \"bytes[]\",\n              name: \"data\",\n              type: \"bytes[]\"\n            }\n          ],\n          name: \"multicall\",\n          outputs: [\n            {\n              internalType: \"bytes[]\",\n              name: \"results\",\n              type: \"bytes[]\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        }\n      ],\n      bytecode: \"0x\",\n      deployedBytecode: \"0x\",\n      linkReferences: {},\n      deployedLinkReferences: {}\n    };\n  }\n});\n\n// node_modules/@uniswap/v3-periphery/artifacts/contracts/NonfungiblePositionManager.sol/NonfungiblePositionManager.json\nvar require_NonfungiblePositionManager = __commonJS({\n  \"node_modules/@uniswap/v3-periphery/artifacts/contracts/NonfungiblePositionManager.sol/NonfungiblePositionManager.json\"(exports2, module2) {\n    module2.exports = {\n      _format: \"hh-sol-artifact-1\",\n      contractName: \"NonfungiblePositionManager\",\n      sourceName: \"contracts/NonfungiblePositionManager.sol\",\n      abi: [\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"_factory\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"_WETH9\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"_tokenDescriptor_\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"constructor\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"owner\",\n              type: \"address\"\n            },\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"approved\",\n              type: \"address\"\n            },\n            {\n              indexed: true,\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"Approval\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"owner\",\n              type: \"address\"\n            },\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"operator\",\n              type: \"address\"\n            },\n            {\n              indexed: false,\n              internalType: \"bool\",\n              name: \"approved\",\n              type: \"bool\"\n            }\n          ],\n          name: \"ApprovalForAll\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              indexed: false,\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"amount0\",\n              type: \"uint256\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"amount1\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"Collect\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint128\",\n              name: \"liquidity\",\n              type: \"uint128\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"amount0\",\n              type: \"uint256\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"amount1\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"DecreaseLiquidity\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint128\",\n              name: \"liquidity\",\n              type: \"uint128\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"amount0\",\n              type: \"uint256\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"amount1\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"IncreaseLiquidity\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"from\",\n              type: \"address\"\n            },\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            },\n            {\n              indexed: true,\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"Transfer\",\n          type: \"event\"\n        },\n        {\n          inputs: [],\n          name: \"DOMAIN_SEPARATOR\",\n          outputs: [\n            {\n              internalType: \"bytes32\",\n              name: \"\",\n              type: \"bytes32\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"PERMIT_TYPEHASH\",\n          outputs: [\n            {\n              internalType: \"bytes32\",\n              name: \"\",\n              type: \"bytes32\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"WETH9\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"approve\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"owner\",\n              type: \"address\"\n            }\n          ],\n          name: \"balanceOf\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"baseURI\",\n          outputs: [\n            {\n              internalType: \"string\",\n              name: \"\",\n              type: \"string\"\n            }\n          ],\n          stateMutability: \"pure\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"burn\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"uint256\",\n                  name: \"tokenId\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"recipient\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint128\",\n                  name: \"amount0Max\",\n                  type: \"uint128\"\n                },\n                {\n                  internalType: \"uint128\",\n                  name: \"amount1Max\",\n                  type: \"uint128\"\n                }\n              ],\n              internalType: \"struct INonfungiblePositionManager.CollectParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"collect\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amount0\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amount1\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token0\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"token1\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint24\",\n              name: \"fee\",\n              type: \"uint24\"\n            },\n            {\n              internalType: \"uint160\",\n              name: \"sqrtPriceX96\",\n              type: \"uint160\"\n            }\n          ],\n          name: \"createAndInitializePoolIfNecessary\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"pool\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"uint256\",\n                  name: \"tokenId\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint128\",\n                  name: \"liquidity\",\n                  type: \"uint128\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount0Min\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount1Min\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"deadline\",\n                  type: \"uint256\"\n                }\n              ],\n              internalType: \"struct INonfungiblePositionManager.DecreaseLiquidityParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"decreaseLiquidity\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amount0\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amount1\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"factory\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"getApproved\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"uint256\",\n                  name: \"tokenId\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount0Desired\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount1Desired\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount0Min\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount1Min\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"deadline\",\n                  type: \"uint256\"\n                }\n              ],\n              internalType: \"struct INonfungiblePositionManager.IncreaseLiquidityParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"increaseLiquidity\",\n          outputs: [\n            {\n              internalType: \"uint128\",\n              name: \"liquidity\",\n              type: \"uint128\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amount0\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amount1\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"owner\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"operator\",\n              type: \"address\"\n            }\n          ],\n          name: \"isApprovedForAll\",\n          outputs: [\n            {\n              internalType: \"bool\",\n              name: \"\",\n              type: \"bool\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"address\",\n                  name: \"token0\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"token1\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint24\",\n                  name: \"fee\",\n                  type: \"uint24\"\n                },\n                {\n                  internalType: \"int24\",\n                  name: \"tickLower\",\n                  type: \"int24\"\n                },\n                {\n                  internalType: \"int24\",\n                  name: \"tickUpper\",\n                  type: \"int24\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount0Desired\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount1Desired\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount0Min\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount1Min\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"recipient\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"deadline\",\n                  type: \"uint256\"\n                }\n              ],\n              internalType: \"struct INonfungiblePositionManager.MintParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"mint\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint128\",\n              name: \"liquidity\",\n              type: \"uint128\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amount0\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amount1\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes[]\",\n              name: \"data\",\n              type: \"bytes[]\"\n            }\n          ],\n          name: \"multicall\",\n          outputs: [\n            {\n              internalType: \"bytes[]\",\n              name: \"results\",\n              type: \"bytes[]\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"name\",\n          outputs: [\n            {\n              internalType: \"string\",\n              name: \"\",\n              type: \"string\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"ownerOf\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"spender\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"deadline\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"permit\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"positions\",\n          outputs: [\n            {\n              internalType: \"uint96\",\n              name: \"nonce\",\n              type: \"uint96\"\n            },\n            {\n              internalType: \"address\",\n              name: \"operator\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"token0\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"token1\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint24\",\n              name: \"fee\",\n              type: \"uint24\"\n            },\n            {\n              internalType: \"int24\",\n              name: \"tickLower\",\n              type: \"int24\"\n            },\n            {\n              internalType: \"int24\",\n              name: \"tickUpper\",\n              type: \"int24\"\n            },\n            {\n              internalType: \"uint128\",\n              name: \"liquidity\",\n              type: \"uint128\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"feeGrowthInside0LastX128\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"feeGrowthInside1LastX128\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint128\",\n              name: \"tokensOwed0\",\n              type: \"uint128\"\n            },\n            {\n              internalType: \"uint128\",\n              name: \"tokensOwed1\",\n              type: \"uint128\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"refundETH\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"from\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"safeTransferFrom\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"from\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"bytes\",\n              name: \"_data\",\n              type: \"bytes\"\n            }\n          ],\n          name: \"safeTransferFrom\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"value\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"deadline\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermit\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"nonce\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"expiry\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitAllowed\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"nonce\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"expiry\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitAllowedIfNecessary\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"value\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"deadline\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitIfNecessary\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"operator\",\n              type: \"address\"\n            },\n            {\n              internalType: \"bool\",\n              name: \"approved\",\n              type: \"bool\"\n            }\n          ],\n          name: \"setApprovalForAll\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes4\",\n              name: \"interfaceId\",\n              type: \"bytes4\"\n            }\n          ],\n          name: \"supportsInterface\",\n          outputs: [\n            {\n              internalType: \"bool\",\n              name: \"\",\n              type: \"bool\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"sweepToken\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"symbol\",\n          outputs: [\n            {\n              internalType: \"string\",\n              name: \"\",\n              type: \"string\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"index\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"tokenByIndex\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"owner\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"index\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"tokenOfOwnerByIndex\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"tokenURI\",\n          outputs: [\n            {\n              internalType: \"string\",\n              name: \"\",\n              type: \"string\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"totalSupply\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"from\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"transferFrom\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amount0Owed\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amount1Owed\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"bytes\",\n              name: \"data\",\n              type: \"bytes\"\n            }\n          ],\n          name: \"uniswapV3MintCallback\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"unwrapWETH9\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          stateMutability: \"payable\",\n          type: \"receive\"\n        }\n      ],\n      bytecode: \"0x610120604052600d80546001600160b01b0319166001176001600160b01b0316600160b01b1790553480156200003457600080fd5b50604051620062e9380380620062e98339810160408190526200005791620002db565b82826040518060400160405280601b81526020017f556e697377617020563320506f736974696f6e73204e46542d563100000000008152506040518060400160405280600a815260200169554e492d56332d504f5360b01b815250604051806040016040528060018152602001603160f81b8152508282620000e66301ffc9a760e01b6200018d60201b60201c565b8151620000fb90600690602085019062000212565b5080516200011190600790602084019062000212565b50620001246380ac58cd60e01b6200018d565b62000136635b5e139f60e01b6200018d565b6200014863780e9d6360e01b6200018d565b50508251602093840120608052805192019190912060a052506001600160601b0319606092831b811660c05290821b811660e05291901b166101005250620003249050565b6001600160e01b03198082161415620001ed576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200024a576000855562000295565b82601f106200026557805160ff191683800117855562000295565b8280016001018555821562000295579182015b828111156200029557825182559160200191906001019062000278565b50620002a3929150620002a7565b5090565b5b80821115620002a35760008155600101620002a8565b80516001600160a01b0381168114620002d657600080fd5b919050565b600080600060608486031215620002f0578283fd5b620002fb84620002be565b92506200030b60208501620002be565b91506200031b60408501620002be565b90509250925092565b60805160a05160c05160601c60e05160601c6101005160601c615f40620003a960003980612a835250806102995280611718528061180e52806118965280613e5d5280613ea35280613f17525080610aa75280610dde5280610ea55280612a1d5280612b235280612e4452806136e15250806114ff5250806114de5250615f406000f3fe6080604052600436106102895760003560e01c80636352211e11610153578063ac9650d8116100cb578063d34879971161007f578063e985e9c511610064578063e985e9c5146106f5578063f3995c6714610715578063fc6f7865146107285761030d565b8063d3487997146106c2578063df2ab5bb146106e25761030d565b8063c2e3140a116100b0578063c2e3140a1461067a578063c45a01551461068d578063c87b56dd146106a25761030d565b8063ac9650d81461063a578063b88d4fde1461065a5761030d565b8063883164561161012257806399fbab881161010757806399fbab88146105cf578063a22cb46514610607578063a4a78f0c146106275761030d565b8063883164561461059757806395d89b41146105ba5761030d565b80636352211e1461052f5780636c0360eb1461054f57806370a08231146105645780637ac2ff7b146105845761030d565b806323b872dd1161020157806342966c68116101b557806349404b7c1161019a57806349404b7c146104e75780634aa4a4fc146104fa5780634f6ccce71461050f5761030d565b806342966c68146104c15780634659a494146104d45761030d565b806330adf81f116101e657806330adf81f146104775780633644e5151461048c57806342842e0e146104a15761030d565b806323b872dd146104375780632f745c59146104575761030d565b80630c49ccbe1161025857806313ead5621161023d57806313ead562146103e057806318160ddd146103f3578063219f5d17146104155761030d565b80630c49ccbe146103b757806312210e8a146103d85761030d565b806301ffc9a71461031257806306fdde0314610348578063081812fc1461036a578063095ea7b3146103975761030d565b3661030d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461030b576040805162461bcd60e51b815260206004820152600960248201527f4e6f742057455448390000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b34801561031e57600080fd5b5061033261032d3660046153a6565b61073b565b60405161033f919061591e565b60405180910390f35b34801561035457600080fd5b5061035d610776565b60405161033f9190615971565b34801561037657600080fd5b5061038a6103853660046156b8565b61080c565b60405161033f91906157e2565b3480156103a357600080fd5b5061030b6103b2366004615270565b610868565b6103ca6103c5366004615483565b61093e565b60405161033f929190615b42565b61030b610daa565b61038a6103ee366004615103565b610dbc565b3480156103ff57600080fd5b506104086110c9565b60405161033f9190615929565b610428610423366004615494565b6110da565b60405161033f93929190615afd565b34801561044357600080fd5b5061030b61045236600461515c565b611413565b34801561046357600080fd5b50610408610472366004615270565b61146a565b34801561048357600080fd5b50610408611495565b34801561049857600080fd5b506104086114b9565b3480156104ad57600080fd5b5061030b6104bc36600461515c565b611577565b61030b6104cf3660046156b8565b611592565b61030b6104e23660046152dc565b611661565b61030b6104f53660046156d0565b611714565b34801561050657600080fd5b5061038a611894565b34801561051b57600080fd5b5061040861052a3660046156b8565b6118b8565b34801561053b57600080fd5b5061038a61054a3660046156b8565b6118ce565b34801561055b57600080fd5b5061035d6118f6565b34801561057057600080fd5b5061040861057f3660046150af565b6118fb565b61030b6105923660046152dc565b611963565b6105aa6105a5366004615550565b611e0f565b60405161033f9493929190615b1e565b3480156105c657600080fd5b5061035d612370565b3480156105db57600080fd5b506105ef6105ea3660046156b8565b6123d1565b60405161033f9c9b9a99989796959493929190615b50565b34801561061357600080fd5b5061030b610622366004615243565b612600565b61030b6106353660046152dc565b612723565b61064d610648366004615337565b6127d5565b60405161033f91906158a0565b34801561066657600080fd5b5061030b61067536600461519c565b612915565b61030b6106883660046152dc565b612973565b34801561069957600080fd5b5061038a612a1b565b3480156106ae57600080fd5b5061035d6106bd3660046156b8565b612a3f565b3480156106ce57600080fd5b5061030b6106dd366004615717565b612b0e565b61030b6106f036600461529b565b612b8c565b34801561070157600080fd5b506103326107103660046150cb565b612c6f565b61030b6107233660046152dc565b612c9d565b6103ca61073636600461546c565b612d28565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108025780601f106107d757610100808354040283529160200191610802565b820191906000526020600020905b8154815290600101906020018083116107e557829003601f168201915b5050505050905090565b600061081782613246565b61083c5760405162461bcd60e51b8152600401610833906159bb565b60405180910390fd5b506000908152600c60205260409020546c0100000000000000000000000090046001600160a01b031690565b6000610873826118ce565b9050806001600160a01b0316836001600160a01b031614156108c65760405162461bcd60e51b8152600401808060200182810382526021815260200180615ee26021913960400191505060405180910390fd5b806001600160a01b03166108d8613253565b6001600160a01b031614806108f457506108f481610710613253565b61092f5760405162461bcd60e51b8152600401808060200182810382526038815260200180615e0c6038913960400191505060405180910390fd5b6109398383613257565b505050565b600080823561094d33826132db565b6109695760405162461bcd60e51b815260040161083390615984565b836080013580610977613377565b11156109ca576040805162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b60006109dc6040870160208801615562565b6001600160801b0316116109ef57600080fd5b84356000908152600c602090815260409182902060018101549092600160801b9091046001600160801b031691610a2a918901908901615562565b6001600160801b0316816001600160801b03161015610a4857600080fd5b60018281015469ffffffffffffffffffff166000908152600b60209081526040808320815160608101835281546001600160a01b039081168252919095015490811692850192909252600160a01b90910462ffffff1690830152610acc7f00000000000000000000000000000000000000000000000000000000000000008361337b565b60018501549091506001600160a01b0382169063a34123a7906a01000000000000000000008104600290810b91600160681b9004900b610b1260408e0160208f01615562565b6040518463ffffffff1660e01b8152600401610b309392919061594b565b6040805180830381600087803b158015610b4957600080fd5b505af1158015610b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8191906156f4565b909850965060408901358810801590610b9e575088606001358710155b610bba5760405162461bcd60e51b815260040161083390615a18565b6001840154600090610bea9030906a01000000000000000000008104600290810b91600160681b9004900b613477565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b8152600401610c1b9190615929565b60a06040518083038186803b158015610c3357600080fd5b505afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b91906155ac565b50509250925050610c9087600201548303876001600160801b0316600160801b6134d1565b6004880180546fffffffffffffffffffffffffffffffff198116928e016001600160801b039182160181169290921790556003880154610cda91908303908816600160801b6134d1565b6004880180546001600160801b03808216938e01600160801b9283900482160116029190911790556002870182905560038701819055610d2060408d0160208e01615562565b86038760010160106101000a8154816001600160801b0302191690836001600160801b031602179055508b600001357f26f6a048ee9138f2c0ce266f322cb99228e8d619ae2bff30c67f8dcf9d2377b48d6020016020810190610d839190615562565b8d8d604051610d9493929190615afd565b60405180910390a2505050505050505050915091565b4715610dba57610dba3347613580565b565b6000836001600160a01b0316856001600160a01b031610610ddc57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018262ffffff168152602001935050505060206040518083038186803b158015610e6757600080fd5b505afa158015610e7b573d6000803e3d6000fd5b505050506040513d6020811015610e9157600080fd5b505190506001600160a01b038116610fe0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a16712958686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018262ffffff1681526020019350505050602060405180830381600087803b158015610f3057600080fd5b505af1158015610f44573d6000803e3d6000fd5b505050506040513d6020811015610f5a57600080fd5b5051604080517ff637731d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015291519293509083169163f637731d9160248082019260009290919082900301818387803b158015610fc357600080fd5b505af1158015610fd7573d6000803e3d6000fd5b505050506110c1565b6000816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561101b57600080fd5b505afa15801561102f573d6000803e3d6000fd5b505050506040513d60e081101561104557600080fd5b505190506001600160a01b0381166110bf57816001600160a01b031663f637731d846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156110a657600080fd5b505af11580156110ba573d6000803e3d6000fd5b505050505b505b949350505050565b60006110d56002613689565b905090565b60008060008360a00135806110ed613377565b1115611140576040805162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b84356000908152600c6020908152604080832060018082015469ffffffffffffffffffff81168652600b855283862084516060808201875282546001600160a01b039081168352929094015480831682890190815262ffffff600160a01b9092048216838901908152885161014081018a528451861681529151909416818a01529251168287015230828501526a01000000000000000000008304600290810b810b608080850191909152600160681b909404810b900b60a0830152958c013560c0820152938b013560e0850152908a0135610100840152890135610120830152929061122c90613694565b6001870154939a50919850965091506000906112669030906a01000000000000000000008104600290810b91600160681b9004900b613477565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b81526004016112979190615929565b60a06040518083038186803b1580156112af57600080fd5b505afa1580156112c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e791906155ac565b50509250925050611323866002015483038760010160109054906101000a90046001600160801b03166001600160801b0316600160801b6134d1565b6004870180546001600160801b0380821690930183166fffffffffffffffffffffffffffffffff19909116179055600387015460018801546113739291840391600160801b9182900416906134d1565b6004870180546001600160801b03600160801b80830482169094018116840291811691909117909155600288018490556003880183905560018801805483810483168e018316909302929091169190911790556040518b35907f3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f906113fd908d908d908d90615afd565b60405180910390a2505050505050509193909250565b61142461141e613253565b826132db565b61145f5760405162461bcd60e51b8152600401808060200182810382526031815260200180615f036031913960400191505060405180910390fd5b6109398383836138cf565b6001600160a01b038216600090815260016020526040812061148c9083613a1b565b90505b92915050565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad81565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611526613a27565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b61093983838360405180602001604052806000815250612915565b8061159d33826132db565b6115b95760405162461bcd60e51b815260040161083390615984565b6000828152600c602052604090206001810154600160801b90046001600160801b03161580156115f4575060048101546001600160801b0316155b801561161257506004810154600160801b90046001600160801b0316155b61162e5760405162461bcd60e51b815260040161083390615a86565b6000838152600c602052604081208181556001810182905560028101829055600381018290556004015561093983613a2b565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e4810183905290516001600160a01b03881691638fcbaf0c9161010480830192600092919082900301818387803b1580156116f457600080fd5b505af1158015611708573d6000803e3d6000fd5b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561178357600080fd5b505afa158015611797573d6000803e3d6000fd5b505050506040513d60208110156117ad57600080fd5b5051905082811015611806576040805162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b8015610939577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561187257600080fd5b505af1158015611886573d6000803e3d6000fd5b505050506109398282613580565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806118c6600284613af8565b509392505050565b600061148f82604051806060016040528060298152602001615e6e6029913960029190613b16565b606090565b60006001600160a01b0382166119425760405162461bcd60e51b815260040180806020018281038252602a815260200180615e44602a913960400191505060405180910390fd5b6001600160a01b038216600090815260016020526040902061148f90613689565b8361196c613377565b11156119bf576040805162461bcd60e51b815260206004820152600e60248201527f5065726d69742065787069726564000000000000000000000000000000000000604482015290519081900360640190fd5b60006119c96114b9565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad88886119f581613b23565b604080516020808201969096526001600160a01b03909416848201526060840192909252608083015260a08083018a90528151808403909101815260c0830182528051908401207f190100000000000000000000000000000000000000000000000000000000000060e084015260e283019490945261010280830194909452805180830390940184526101229091019052815191012090506000611a98876118ce565b9050806001600160a01b0316886001600160a01b03161415611aeb5760405162461bcd60e51b8152600401808060200182810382526027815260200180615d6f6027913960400191505060405180910390fd5b611af481613b62565b15611ccf576040805160208082018790528183018690527fff0000000000000000000000000000000000000000000000000000000000000060f889901b16606083015282516041818403018152606183018085527f1626ba7e0000000000000000000000000000000000000000000000000000000090526065830186815260858401948552815160a585015281516001600160a01b03871695631626ba7e958995919260c59091019185019080838360005b83811015611bbe578181015183820152602001611ba6565b50505050905090810190601f168015611beb5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611c0957600080fd5b505afa158015611c1d573d6000803e3d6000fd5b505050506040513d6020811015611c3357600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014611cca576040805162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b611dfb565b600060018387878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611d2b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611d93576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b816001600160a01b0316816001600160a01b031614611df9576040805162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b505b611e058888613257565b5050505050505050565b60008060008084610140013580611e24613377565b1115611e77576040805162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b604080516101408101909152600090611f439080611e9860208b018b6150af565b6001600160a01b03168152602001896020016020810190611eb991906150af565b6001600160a01b03168152602001611ed760608b0160408c0161569e565b62ffffff168152306020820152604001611ef760808b0160608c016153e6565b60020b8152602001611f0f60a08b0160808c016153e6565b60020b81526020018960a0013581526020018960c0013581526020018960e001358152602001896101000135815250613694565b92975090955093509050611fb7611f6261014089016101208a016150af565b600d80547fffffffffffffffffffff000000000000000000000000000000000000000000008116600175ffffffffffffffffffffffffffffffffffffffffffff92831690810190921617909155975087613b68565b6000611fe230611fcd60808b0160608c016153e6565b611fdd60a08c0160808d016153e6565b613477565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b81526004016120139190615929565b60a06040518083038186803b15801561202b57600080fd5b505afa15801561203f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206391906155ac565b5050925092505060006120dc8560405180606001604052808e600001602081019061208e91906150af565b6001600160a01b031681526020018e60200160208101906120af91906150af565b6001600160a01b031681526020018e60400160208101906120d0919061569e565b62ffffff169052613c96565b905060405180610140016040528060006bffffffffffffffffffffffff16815260200160006001600160a01b031681526020018269ffffffffffffffffffff1681526020018c606001602081019061213491906153e6565b60020b815260200161214c60a08e0160808f016153e6565b60020b81526020018a6001600160801b0316815260200184815260200183815260200160006001600160801b0316815260200160006001600160801b0316815250600c60008c815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550606082015181600101600a6101000a81548162ffffff021916908360020b62ffffff160217905550608082015181600101600d6101000a81548162ffffff021916908360020b62ffffff16021790555060a08201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060c0820151816002015560e082015181600301556101008201518160040160006101000a8154816001600160801b0302191690836001600160801b031602179055506101208201518160040160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050897f3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f8a8a8a60405161235b93929190615afd565b60405180910390a25050505050509193509193565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108025780601f106107d757610100808354040283529160200191610802565b6000818152600c6020908152604080832081516101408101835281546bffffffffffffffffffffffff811682526001600160a01b036c010000000000000000000000009091041693810193909352600181015469ffffffffffffffffffff81169284018390526a01000000000000000000008104600290810b810b810b6060860152600160681b8204810b810b810b60808601526001600160801b03600160801b92839004811660a08701529083015460c0860152600383015460e0860152600490920154808316610100860152041661012083015282918291829182918291829182918291829182918291906124da5760405162461bcd60e51b815260040161083390615a4f565b6000600b6000836040015169ffffffffffffffffffff1669ffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905081600001518260200151826000015183602001518460400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001519d509d509d509d509d509d509d509d509d509d509d509d50505091939597999b5091939597999b565b612608613253565b6001600160a01b0316826001600160a01b0316141561266e576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b806005600061267b613253565b6001600160a01b0390811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091556126dd613253565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600019916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b15801561278d57600080fd5b505afa1580156127a1573d6000803e3d6000fd5b505050506040513d60208110156127b757600080fd5b505110156127cd576127cd868686868686611661565b505050505050565b60608167ffffffffffffffff811180156127ee57600080fd5b5060405190808252806020026020018201604052801561282257816020015b606081526020019060019003908161280d5790505b50905060005b8281101561290e576000803086868581811061284057fe5b90506020028101906128529190615bef565b6040516128609291906157d2565b600060405180830381855af49150503d806000811461289b576040519150601f19603f3d011682016040523d82523d6000602084013e6128a0565b606091505b5091509150816128ec576044815110156128b957600080fd5b600481019050808060200190518101906128d39190615402565b60405162461bcd60e51b81526004016108339190615971565b808484815181106128f957fe5b60209081029190910101525050600101612828565b5092915050565b612926612920613253565b836132db565b6129615760405162461bcd60e51b8152600401808060200182810382526031815260200180615f036031913960400191505060405180910390fd5b61296d84848484613de6565b50505050565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152905186916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b1580156129db57600080fd5b505afa1580156129ef573d6000803e3d6000fd5b505050506040513d6020811015612a0557600080fd5b505110156127cd576127cd868686868686612c9d565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060612a4a82613246565b612a5357600080fd5b6040517fe9dc63750000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e9dc637590612aba9030908690600401615932565b60006040518083038186803b158015612ad257600080fd5b505afa158015612ae6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261148f9190810190615402565b6000612b1c828401846154a5565b9050612b4c7f00000000000000000000000000000000000000000000000000000000000000008260000151613e38565b508415612b67578051516020820151612b6791903388613e5b565b8315612b8557612b8581600001516020015182602001513387613e5b565b5050505050565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bdb57600080fd5b505afa158015612bef573d6000803e3d6000fd5b505050506040513d6020811015612c0557600080fd5b5051905082811015612c5e576040805162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b801561296d5761296d848383613feb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c4810183905290516001600160a01b0388169163d505accf9160e480830192600092919082900301818387803b1580156116f457600080fd5b6000808235612d3733826132db565b612d535760405162461bcd60e51b815260040161083390615984565b6000612d656060860160408701615562565b6001600160801b03161180612d9257506000612d876080860160608701615562565b6001600160801b0316115b612d9b57600080fd5b600080612dae60408701602088016150af565b6001600160a01b031614612dd157612dcc60408601602087016150af565b612dd3565b305b85356000908152600c6020908152604080832060018082015469ffffffffffffffffffff168552600b8452828520835160608101855281546001600160a01b039081168252919092015490811694820194909452600160a01b90930462ffffff169183019190915292935090612e697f00000000000000000000000000000000000000000000000000000000000000008361337b565b600484015460018501549192506001600160801b0380821692600160801b92839004821692900416156130865760018501546040517fa34123a70000000000000000000000000000000000000000000000000000000081526001600160a01b0385169163a34123a791612f00916a01000000000000000000008104600290810b92600160681b909204900b9060009060040161594b565b6040805180830381600087803b158015612f1957600080fd5b505af1158015612f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5191906156f4565b5050600185015460009081906001600160a01b0386169063514ea4bf90612f969030906a01000000000000000000008104600290810b91600160681b9004900b613477565b6040518263ffffffff1660e01b8152600401612fb29190615929565b60a06040518083038186803b158015612fca57600080fd5b505afa158015612fde573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300291906155ac565b5050925092505061303e876002015483038860010160109054906101000a90046001600160801b03166001600160801b0316600160801b6134d1565b84019350613077876003015482038860010160109054906101000a90046001600160801b03166001600160801b0316600160801b6134d1565b60028801929092556003870155015b6000806001600160801b0384166130a360608e0160408f01615562565b6001600160801b0316116130c6576130c160608d0160408e01615562565b6130c8565b835b836001600160801b03168d60600160208101906130e59190615562565b6001600160801b0316116131085761310360808e0160608f01615562565b61310a565b835b60018901546040517f4f1eb3d80000000000000000000000000000000000000000000000000000000081529294509092506001600160a01b03871691634f1eb3d89161317d918c916a01000000000000000000008104600290810b92600160681b909204900b9088908890600401615839565b6040805180830381600087803b15801561319657600080fd5b505af11580156131aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ce919061557e565b6004890180546fffffffffffffffffffffffffffffffff196001600160801b03918216600160801b878a0384160217168689038216179091556040519281169d50169a508c35907f40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f0190610d94908b9086908690615876565b600061148f60028361417b565b3390565b6000818152600c6020526040902080546bffffffffffffffffffffffff166c010000000000000000000000006001600160a01b0385169081029190911790915581906132a2826118ce565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006132e682613246565b6133215760405162461bcd60e51b815260040180806020018281038252602c815260200180615de0602c913960400191505060405180910390fd5b600061332c836118ce565b9050806001600160a01b0316846001600160a01b031614806133675750836001600160a01b031661335c8461080c565b6001600160a01b0316145b806110c157506110c18185612c6f565b4290565b600081602001516001600160a01b031682600001516001600160a01b0316106133a357600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b6bffffffffffffffffffffffff191660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152600285810b60e890811b60348501529085900b901b60378301528251601a818403018152603a90920190925280519101205b9392505050565b600080806000198587098686029250828110908390030390508061350757600084116134fc57600080fd5b5082900490506134ca565b80841161351357600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106135cc5780518252601f1990920191602091820191016135ad565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461362e576040519150601f19603f3d011682016040523d82523d6000602084013e613633565b606091505b5050905080610939576040805162461bcd60e51b815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600061148f82614187565b6000806000806000604051806060016040528087600001516001600160a01b0316815260200187602001516001600160a01b03168152602001876040015162ffffff1681525090506137067f00000000000000000000000000000000000000000000000000000000000000008261337b565b91506000826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561374357600080fd5b505afa158015613757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377b919061560d565b50505050505090506000613792886080015161418b565b905060006137a38960a0015161418b565b90506137ba8383838c60c001518d60e001516144d9565b9750505050816001600160a01b0316633c8a7d8d876060015188608001518960a00151896040518060400160405280888152602001336001600160a01b031681525060405160200161380c9190615abd565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161383b9594939291906157f6565b6040805180830381600087803b15801561385457600080fd5b505af1158015613868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388c91906156f4565b610100880151919550935084108015906138ab57508561012001518310155b6138c75760405162461bcd60e51b815260040161083390615a18565b509193509193565b826001600160a01b03166138e2826118ce565b6001600160a01b0316146139275760405162461bcd60e51b8152600401808060200182810382526029815260200180615eb96029913960400191505060405180910390fd5b6001600160a01b03821661396c5760405162461bcd60e51b8152600401808060200182810382526024815260200180615d966024913960400191505060405180910390fd5b613977838383610939565b613982600082613257565b6001600160a01b03831660009081526001602052604090206139a4908261459d565b506001600160a01b03821660009081526001602052604090206139c790826145a9565b506139d4600282846145b5565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061148c83836145cb565b4690565b6000613a36826118ce565b9050613a4481600084610939565b613a4f600083613257565b6000828152600860205260409020546002600019610100600184161502019091160415613a8d576000828152600860205260408120613a8d9161501f565b6001600160a01b0381166000908152600160205260409020613aaf908361459d565b50613abb60028361462f565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080613b07868661463b565b909450925050505b9250929050565b60006110c18484846146b6565b6000908152600c6020526040902080546bffffffffffffffffffffffff19811660016bffffffffffffffffffffffff9283169081019092161790915590565b3b151590565b6001600160a01b038216613bc3576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b613bcc81613246565b15613c1e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b613c2a60008383610939565b6001600160a01b0382166000908152600160205260409020613c4c90826145a9565b50613c59600282846145b5565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0382166000908152600a602052604090205469ffffffffffffffffffff168061148f5750600d8054600169ffffffffffffffffffff76010000000000000000000000000000000000000000000080840482168381019092160275ffffffffffffffffffffffffffffffffffffffffffff909316929092179092556001600160a01b038085166000908152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001686179055848352600b825291829020865181549085167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617825591870151950180549287015162ffffff16600160a01b027fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff969094169290911691909117939093161790915592915050565b613df18484846138cf565b613dfd84848484614780565b61296d5760405162461bcd60e51b8152600401808060200182810382526032815260200180615d3d6032913960400191505060405180910390fd5b6000613e44838361337b565b9050336001600160a01b0382161461148f57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316148015613e9c5750804710155b15613fbe577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015613efc57600080fd5b505af1158015613f10573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613f8c57600080fd5b505af1158015613fa0573d6000803e3d6000fd5b505050506040513d6020811015613fb657600080fd5b5061296d9050565b6001600160a01b038316301415613fdf57613fda848383613feb565b61296d565b61296d8484848461495c565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b602083106140955780518252601f199092019160209182019101614076565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146140f7576040519150601f19603f3d011682016040523d82523d6000602084013e6140fc565b606091505b509150915081801561412a57508051158061412a575080806020019051602081101561412757600080fd5b50515b612b85576040805162461bcd60e51b815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600061148c8383614af4565b5490565b60008060008360020b126141a2578260020b6141aa565b8260020b6000035b9050620d89e8811115614204576040805162461bcd60e51b815260206004820152600160248201527f5400000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60006001821661421857600160801b61422a565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600282161561425e576ffff97272373d413259a46990580e213a0260801c5b600482161561427d576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b600882161561429c576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156142bb576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156142da576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156142f9576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615614318576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615614338576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615614358576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615614378576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615614398576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156143b8576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156143d8576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156143f8576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615614418576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615614439576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614459576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615614478576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615614495576b048a170391f7dc42444e8fa20260801c5b60008460020b13156144b05780600019816144ac57fe5b0490505b6401000000008106156144c45760016144c7565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b031611156144f9579293925b846001600160a01b0316866001600160a01b0316116145245761451d858585614b0c565b9050614594565b836001600160a01b0316866001600160a01b0316101561458657600061454b878686614b0c565b9050600061455a878986614b78565b9050806001600160801b0316826001600160801b03161061457b578061457d565b815b92505050614594565b614591858584614b78565b90505b95945050505050565b600061148c8383614bbe565b600061148c8383614c84565b60006110c184846001600160a01b038516614cce565b8154600090821061460d5760405162461bcd60e51b8152600401808060200182810382526022815260200180615d1b6022913960400191505060405180910390fd5b82600001828154811061461c57fe5b9060005260206000200154905092915050565b600061148c8383614d65565b81546000908190831061467f5760405162461bcd60e51b8152600401808060200182810382526022815260200180615e976022913960400191505060405180910390fd5b600084600001848154811061469057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816147515760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156147165781810151838201526020016146fe565b50505050905090810190601f1680156147435780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061476457fe5b9060005260206000209060020201600101549150509392505050565b6000614794846001600160a01b0316613b62565b6147a0575060016110c1565b60006148f17f150b7a02000000000000000000000000000000000000000000000000000000006147ce613253565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561483557818101518382015260200161481d565b50505050905090810190601f1680156148625780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615d3d603291396001600160a01b0388169190614e39565b9050600081806020019051602081101561490a57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001492505050949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b60208310614a0e5780518252601f1990920191602091820191016149ef565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614a70576040519150601f19603f3d011682016040523d82523d6000602084013e614a75565b606091505b5091509150818015614aa3575080511580614aa35750808060200190516020811015614aa057600080fd5b50515b6127cd576040805162461bcd60e51b815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60009081526001919091016020526040902054151590565b6000826001600160a01b0316846001600160a01b03161115614b2c579192915b6000614b58856001600160a01b0316856001600160a01b03166c010000000000000000000000006134d1565b9050614594614b7384838888036001600160a01b03166134d1565b614e48565b6000826001600160a01b0316846001600160a01b03161115614b98579192915b6110c1614b73836c010000000000000000000000008787036001600160a01b03166134d1565b60008181526001830160205260408120548015614c7a5783546000198083019190810190600090879083908110614bf157fe5b9060005260206000200154905080876000018481548110614c0e57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080614c3e57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061148f565b600091505061148f565b6000614c908383614af4565b614cc65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561148f565b50600061148f565b600082815260018401602052604081205480614d335750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556134ca565b82856000016001830381548110614d4657fe5b90600052602060002090600202016001018190555060009150506134ca565b60008181526001830160205260408120548015614c7a5783546000198083019190810190600090879083908110614d9857fe5b9060005260206000209060020201905080876000018481548110614db857fe5b600091825260208083208454600290930201918255600193840154918401919091558354825289830190526040902090840190558654879080614df757fe5b600082815260208082206002600019909401938402018281556001908101839055929093558881528982019092526040822091909155945061148f9350505050565b60606110c18484600085614e5e565b806001600160801b038116811461077157600080fd5b606082471015614e9f5760405162461bcd60e51b8152600401808060200182810382526026815260200180615dba6026913960400191505060405180910390fd5b614ea885613b62565b614ef9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310614f375780518252601f199092019160209182019101614f18565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614f99576040519150601f19603f3d011682016040523d82523d6000602084013e614f9e565b606091505b5091509150614fae828286614fb9565b979650505050505050565b60608315614fc85750816134ca565b825115614fd85782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156147165781810151838201526020016146fe565b50805460018160011615610100020316600290046000825580601f106150455750615063565b601f0160209004906000526020600020908101906150639190615066565b50565b5b8082111561507b5760008155600101615067565b5090565b803561077181615cc4565b805161ffff8116811461077157600080fd5b803562ffffff8116811461077157600080fd5b6000602082840312156150c0578081fd5b81356134ca81615cc4565b600080604083850312156150dd578081fd5b82356150e881615cc4565b915060208301356150f881615cc4565b809150509250929050565b60008060008060808587031215615118578182fd5b843561512381615cc4565b9350602085013561513381615cc4565b92506151416040860161509c565b9150606085013561515181615cc4565b939692955090935050565b600080600060608486031215615170578081fd5b833561517b81615cc4565b9250602084013561518b81615cc4565b929592945050506040919091013590565b600080600080608085870312156151b1578182fd5b84356151bc81615cc4565b935060208501356151cc81615cc4565b925060408501359150606085013567ffffffffffffffff8111156151ee578182fd5b8501601f810187136151fe578182fd5b803561521161520c82615c76565b615c52565b818152886020838501011115615225578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215615255578182fd5b823561526081615cc4565b915060208301356150f881615cd9565b60008060408385031215615282578182fd5b823561528d81615cc4565b946020939093013593505050565b6000806000606084860312156152af578081fd5b83356152ba81615cc4565b92506020840135915060408401356152d181615cc4565b809150509250925092565b60008060008060008060c087890312156152f4578384fd5b86356152ff81615cc4565b95506020870135945060408701359350606087013561531d81615d0b565b9598949750929560808101359460a0909101359350915050565b60008060208385031215615349578182fd5b823567ffffffffffffffff80821115615360578384fd5b818501915085601f830112615373578384fd5b813581811115615381578485fd5b8660208083028501011115615394578485fd5b60209290920196919550909350505050565b6000602082840312156153b7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146134ca578182fd5b6000602082840312156153f7578081fd5b81356134ca81615ce7565b600060208284031215615413578081fd5b815167ffffffffffffffff811115615429578182fd5b8201601f81018413615439578182fd5b805161544761520c82615c76565b81815285602083850101111561545b578384fd5b614594826020830160208601615c98565b60006080828403121561547d578081fd5b50919050565b600060a0828403121561547d578081fd5b600060c0828403121561547d578081fd5b600081830360808112156154b7578182fd5b6040516040810167ffffffffffffffff82821081831117156154d557fe5b8160405260608412156154e6578485fd5b60a08301935081841081851117156154fa57fe5b50826040528435925061550c83615cc4565b91825260208401359161551e83615cc4565b8260608301526155306040860161509c565b608083015281526155436060850161507f565b6020820152949350505050565b6000610160828403121561547d578081fd5b600060208284031215615573578081fd5b81356134ca81615cf6565b60008060408385031215615590578182fd5b825161559b81615cf6565b60208401519092506150f881615cf6565b600080600080600060a086880312156155c3578283fd5b85516155ce81615cf6565b80955050602086015193506040860151925060608601516155ee81615cf6565b60808701519092506155ff81615cf6565b809150509295509295909350565b600080600080600080600060e0888a031215615627578485fd5b875161563281615cc4565b602089015190975061564381615ce7565b95506156516040890161508a565b945061565f6060890161508a565b935061566d6080890161508a565b925060a088015161567d81615d0b565b60c089015190925061568e81615cd9565b8091505092959891949750929550565b6000602082840312156156af578081fd5b61148c8261509c565b6000602082840312156156c9578081fd5b5035919050565b600080604083850312156156e2578182fd5b8235915060208301356150f881615cc4565b60008060408385031215615706578182fd5b505080516020909101519092909150565b6000806000806060858703121561572c578182fd5b8435935060208501359250604085013567ffffffffffffffff80821115615751578384fd5b818701915087601f830112615764578384fd5b813581811115615772578485fd5b886020828501011115615783578485fd5b95989497505060200194505050565b600081518084526157aa816020860160208601615c98565b601f01601f19169290920160200192915050565b60020b9052565b6001600160801b03169052565b6000828483379101908152919050565b6001600160a01b0391909116815260200190565b60006001600160a01b03871682528560020b60208301528460020b60408301526001600160801b038416606083015260a06080830152614fae60a0830184615792565b6001600160a01b03959095168552600293840b60208601529190920b60408401526001600160801b03918216606084015216608082015260a00190565b6001600160a01b039390931683526001600160801b03918216602084015216604082015260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015615911577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526158ff858351615792565b945092850192908501906001016158c5565b5092979650505050505050565b901515815260200190565b90815260200190565b6001600160a01b03929092168252602082015260400190565b600293840b81529190920b60208201526001600160801b03909116604082015260600190565b60006020825261148c6020830184615792565b6020808252600c908201527f4e6f7420617070726f7665640000000000000000000000000000000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f507269636520736c69707061676520636865636b000000000000000000000000604082015260600190565b60208082526010908201527f496e76616c696420746f6b656e20494400000000000000000000000000000000604082015260600190565b6020808252600b908201527f4e6f7420636c6561726564000000000000000000000000000000000000000000604082015260600190565b815180516001600160a01b03908116835260208083015182168185015260409283015162ffffff1692840192909252920151909116606082015260800190565b6001600160801b039390931683526020830191909152604082015260600190565b9384526001600160801b039290921660208401526040830152606082015260800190565b918252602082015260400190565b6bffffffffffffffffffffffff8d1681526001600160a01b038c811660208301528b811660408301528a16606082015262ffffff89166080820152600288900b60a08201526101808101615ba760c08301896157be565b615bb460e08301886157c5565b8561010083015284610120830152615bd06101408301856157c5565b615bde6101608301846157c5565b9d9c50505050505050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615c23578283fd5b83018035915067ffffffffffffffff821115615c3d578283fd5b602001915036819003821315613b0f57600080fd5b60405181810167ffffffffffffffff81118282101715615c6e57fe5b604052919050565b600067ffffffffffffffff821115615c8a57fe5b50601f01601f191660200190565b60005b83811015615cb3578181015183820152602001615c9b565b8381111561296d5750506000910152565b6001600160a01b038116811461506357600080fd5b801515811461506357600080fd5b8060020b811461506357600080fd5b6001600160801b038116811461506357600080fd5b60ff8116811461506357600080fdfe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732315065726d69743a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a164736f6c6343000706000a\",\n      deployedBytecode: \"0x6080604052600436106102895760003560e01c80636352211e11610153578063ac9650d8116100cb578063d34879971161007f578063e985e9c511610064578063e985e9c5146106f5578063f3995c6714610715578063fc6f7865146107285761030d565b8063d3487997146106c2578063df2ab5bb146106e25761030d565b8063c2e3140a116100b0578063c2e3140a1461067a578063c45a01551461068d578063c87b56dd146106a25761030d565b8063ac9650d81461063a578063b88d4fde1461065a5761030d565b8063883164561161012257806399fbab881161010757806399fbab88146105cf578063a22cb46514610607578063a4a78f0c146106275761030d565b8063883164561461059757806395d89b41146105ba5761030d565b80636352211e1461052f5780636c0360eb1461054f57806370a08231146105645780637ac2ff7b146105845761030d565b806323b872dd1161020157806342966c68116101b557806349404b7c1161019a57806349404b7c146104e75780634aa4a4fc146104fa5780634f6ccce71461050f5761030d565b806342966c68146104c15780634659a494146104d45761030d565b806330adf81f116101e657806330adf81f146104775780633644e5151461048c57806342842e0e146104a15761030d565b806323b872dd146104375780632f745c59146104575761030d565b80630c49ccbe1161025857806313ead5621161023d57806313ead562146103e057806318160ddd146103f3578063219f5d17146104155761030d565b80630c49ccbe146103b757806312210e8a146103d85761030d565b806301ffc9a71461031257806306fdde0314610348578063081812fc1461036a578063095ea7b3146103975761030d565b3661030d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461030b576040805162461bcd60e51b815260206004820152600960248201527f4e6f742057455448390000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b34801561031e57600080fd5b5061033261032d3660046153a6565b61073b565b60405161033f919061591e565b60405180910390f35b34801561035457600080fd5b5061035d610776565b60405161033f9190615971565b34801561037657600080fd5b5061038a6103853660046156b8565b61080c565b60405161033f91906157e2565b3480156103a357600080fd5b5061030b6103b2366004615270565b610868565b6103ca6103c5366004615483565b61093e565b60405161033f929190615b42565b61030b610daa565b61038a6103ee366004615103565b610dbc565b3480156103ff57600080fd5b506104086110c9565b60405161033f9190615929565b610428610423366004615494565b6110da565b60405161033f93929190615afd565b34801561044357600080fd5b5061030b61045236600461515c565b611413565b34801561046357600080fd5b50610408610472366004615270565b61146a565b34801561048357600080fd5b50610408611495565b34801561049857600080fd5b506104086114b9565b3480156104ad57600080fd5b5061030b6104bc36600461515c565b611577565b61030b6104cf3660046156b8565b611592565b61030b6104e23660046152dc565b611661565b61030b6104f53660046156d0565b611714565b34801561050657600080fd5b5061038a611894565b34801561051b57600080fd5b5061040861052a3660046156b8565b6118b8565b34801561053b57600080fd5b5061038a61054a3660046156b8565b6118ce565b34801561055b57600080fd5b5061035d6118f6565b34801561057057600080fd5b5061040861057f3660046150af565b6118fb565b61030b6105923660046152dc565b611963565b6105aa6105a5366004615550565b611e0f565b60405161033f9493929190615b1e565b3480156105c657600080fd5b5061035d612370565b3480156105db57600080fd5b506105ef6105ea3660046156b8565b6123d1565b60405161033f9c9b9a99989796959493929190615b50565b34801561061357600080fd5b5061030b610622366004615243565b612600565b61030b6106353660046152dc565b612723565b61064d610648366004615337565b6127d5565b60405161033f91906158a0565b34801561066657600080fd5b5061030b61067536600461519c565b612915565b61030b6106883660046152dc565b612973565b34801561069957600080fd5b5061038a612a1b565b3480156106ae57600080fd5b5061035d6106bd3660046156b8565b612a3f565b3480156106ce57600080fd5b5061030b6106dd366004615717565b612b0e565b61030b6106f036600461529b565b612b8c565b34801561070157600080fd5b506103326107103660046150cb565b612c6f565b61030b6107233660046152dc565b612c9d565b6103ca61073636600461546c565b612d28565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108025780601f106107d757610100808354040283529160200191610802565b820191906000526020600020905b8154815290600101906020018083116107e557829003601f168201915b5050505050905090565b600061081782613246565b61083c5760405162461bcd60e51b8152600401610833906159bb565b60405180910390fd5b506000908152600c60205260409020546c0100000000000000000000000090046001600160a01b031690565b6000610873826118ce565b9050806001600160a01b0316836001600160a01b031614156108c65760405162461bcd60e51b8152600401808060200182810382526021815260200180615ee26021913960400191505060405180910390fd5b806001600160a01b03166108d8613253565b6001600160a01b031614806108f457506108f481610710613253565b61092f5760405162461bcd60e51b8152600401808060200182810382526038815260200180615e0c6038913960400191505060405180910390fd5b6109398383613257565b505050565b600080823561094d33826132db565b6109695760405162461bcd60e51b815260040161083390615984565b836080013580610977613377565b11156109ca576040805162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b60006109dc6040870160208801615562565b6001600160801b0316116109ef57600080fd5b84356000908152600c602090815260409182902060018101549092600160801b9091046001600160801b031691610a2a918901908901615562565b6001600160801b0316816001600160801b03161015610a4857600080fd5b60018281015469ffffffffffffffffffff166000908152600b60209081526040808320815160608101835281546001600160a01b039081168252919095015490811692850192909252600160a01b90910462ffffff1690830152610acc7f00000000000000000000000000000000000000000000000000000000000000008361337b565b60018501549091506001600160a01b0382169063a34123a7906a01000000000000000000008104600290810b91600160681b9004900b610b1260408e0160208f01615562565b6040518463ffffffff1660e01b8152600401610b309392919061594b565b6040805180830381600087803b158015610b4957600080fd5b505af1158015610b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8191906156f4565b909850965060408901358810801590610b9e575088606001358710155b610bba5760405162461bcd60e51b815260040161083390615a18565b6001840154600090610bea9030906a01000000000000000000008104600290810b91600160681b9004900b613477565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b8152600401610c1b9190615929565b60a06040518083038186803b158015610c3357600080fd5b505afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b91906155ac565b50509250925050610c9087600201548303876001600160801b0316600160801b6134d1565b6004880180546fffffffffffffffffffffffffffffffff198116928e016001600160801b039182160181169290921790556003880154610cda91908303908816600160801b6134d1565b6004880180546001600160801b03808216938e01600160801b9283900482160116029190911790556002870182905560038701819055610d2060408d0160208e01615562565b86038760010160106101000a8154816001600160801b0302191690836001600160801b031602179055508b600001357f26f6a048ee9138f2c0ce266f322cb99228e8d619ae2bff30c67f8dcf9d2377b48d6020016020810190610d839190615562565b8d8d604051610d9493929190615afd565b60405180910390a2505050505050505050915091565b4715610dba57610dba3347613580565b565b6000836001600160a01b0316856001600160a01b031610610ddc57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018262ffffff168152602001935050505060206040518083038186803b158015610e6757600080fd5b505afa158015610e7b573d6000803e3d6000fd5b505050506040513d6020811015610e9157600080fd5b505190506001600160a01b038116610fe0577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a16712958686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018262ffffff1681526020019350505050602060405180830381600087803b158015610f3057600080fd5b505af1158015610f44573d6000803e3d6000fd5b505050506040513d6020811015610f5a57600080fd5b5051604080517ff637731d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015291519293509083169163f637731d9160248082019260009290919082900301818387803b158015610fc357600080fd5b505af1158015610fd7573d6000803e3d6000fd5b505050506110c1565b6000816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561101b57600080fd5b505afa15801561102f573d6000803e3d6000fd5b505050506040513d60e081101561104557600080fd5b505190506001600160a01b0381166110bf57816001600160a01b031663f637731d846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156110a657600080fd5b505af11580156110ba573d6000803e3d6000fd5b505050505b505b949350505050565b60006110d56002613689565b905090565b60008060008360a00135806110ed613377565b1115611140576040805162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b84356000908152600c6020908152604080832060018082015469ffffffffffffffffffff81168652600b855283862084516060808201875282546001600160a01b039081168352929094015480831682890190815262ffffff600160a01b9092048216838901908152885161014081018a528451861681529151909416818a01529251168287015230828501526a01000000000000000000008304600290810b810b608080850191909152600160681b909404810b900b60a0830152958c013560c0820152938b013560e0850152908a0135610100840152890135610120830152929061122c90613694565b6001870154939a50919850965091506000906112669030906a01000000000000000000008104600290810b91600160681b9004900b613477565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b81526004016112979190615929565b60a06040518083038186803b1580156112af57600080fd5b505afa1580156112c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e791906155ac565b50509250925050611323866002015483038760010160109054906101000a90046001600160801b03166001600160801b0316600160801b6134d1565b6004870180546001600160801b0380821690930183166fffffffffffffffffffffffffffffffff19909116179055600387015460018801546113739291840391600160801b9182900416906134d1565b6004870180546001600160801b03600160801b80830482169094018116840291811691909117909155600288018490556003880183905560018801805483810483168e018316909302929091169190911790556040518b35907f3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f906113fd908d908d908d90615afd565b60405180910390a2505050505050509193909250565b61142461141e613253565b826132db565b61145f5760405162461bcd60e51b8152600401808060200182810382526031815260200180615f036031913960400191505060405180910390fd5b6109398383836138cf565b6001600160a01b038216600090815260016020526040812061148c9083613a1b565b90505b92915050565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad81565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611526613a27565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b61093983838360405180602001604052806000815250612915565b8061159d33826132db565b6115b95760405162461bcd60e51b815260040161083390615984565b6000828152600c602052604090206001810154600160801b90046001600160801b03161580156115f4575060048101546001600160801b0316155b801561161257506004810154600160801b90046001600160801b0316155b61162e5760405162461bcd60e51b815260040161083390615a86565b6000838152600c602052604081208181556001810182905560028101829055600381018290556004015561093983613a2b565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e4810183905290516001600160a01b03881691638fcbaf0c9161010480830192600092919082900301818387803b1580156116f457600080fd5b505af1158015611708573d6000803e3d6000fd5b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561178357600080fd5b505afa158015611797573d6000803e3d6000fd5b505050506040513d60208110156117ad57600080fd5b5051905082811015611806576040805162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b8015610939577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561187257600080fd5b505af1158015611886573d6000803e3d6000fd5b505050506109398282613580565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806118c6600284613af8565b509392505050565b600061148f82604051806060016040528060298152602001615e6e6029913960029190613b16565b606090565b60006001600160a01b0382166119425760405162461bcd60e51b815260040180806020018281038252602a815260200180615e44602a913960400191505060405180910390fd5b6001600160a01b038216600090815260016020526040902061148f90613689565b8361196c613377565b11156119bf576040805162461bcd60e51b815260206004820152600e60248201527f5065726d69742065787069726564000000000000000000000000000000000000604482015290519081900360640190fd5b60006119c96114b9565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad88886119f581613b23565b604080516020808201969096526001600160a01b03909416848201526060840192909252608083015260a08083018a90528151808403909101815260c0830182528051908401207f190100000000000000000000000000000000000000000000000000000000000060e084015260e283019490945261010280830194909452805180830390940184526101229091019052815191012090506000611a98876118ce565b9050806001600160a01b0316886001600160a01b03161415611aeb5760405162461bcd60e51b8152600401808060200182810382526027815260200180615d6f6027913960400191505060405180910390fd5b611af481613b62565b15611ccf576040805160208082018790528183018690527fff0000000000000000000000000000000000000000000000000000000000000060f889901b16606083015282516041818403018152606183018085527f1626ba7e0000000000000000000000000000000000000000000000000000000090526065830186815260858401948552815160a585015281516001600160a01b03871695631626ba7e958995919260c59091019185019080838360005b83811015611bbe578181015183820152602001611ba6565b50505050905090810190601f168015611beb5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611c0957600080fd5b505afa158015611c1d573d6000803e3d6000fd5b505050506040513d6020811015611c3357600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014611cca576040805162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b611dfb565b600060018387878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611d2b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611d93576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b816001600160a01b0316816001600160a01b031614611df9576040805162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b505b611e058888613257565b5050505050505050565b60008060008084610140013580611e24613377565b1115611e77576040805162461bcd60e51b815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b604080516101408101909152600090611f439080611e9860208b018b6150af565b6001600160a01b03168152602001896020016020810190611eb991906150af565b6001600160a01b03168152602001611ed760608b0160408c0161569e565b62ffffff168152306020820152604001611ef760808b0160608c016153e6565b60020b8152602001611f0f60a08b0160808c016153e6565b60020b81526020018960a0013581526020018960c0013581526020018960e001358152602001896101000135815250613694565b92975090955093509050611fb7611f6261014089016101208a016150af565b600d80547fffffffffffffffffffff000000000000000000000000000000000000000000008116600175ffffffffffffffffffffffffffffffffffffffffffff92831690810190921617909155975087613b68565b6000611fe230611fcd60808b0160608c016153e6565b611fdd60a08c0160808d016153e6565b613477565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b81526004016120139190615929565b60a06040518083038186803b15801561202b57600080fd5b505afa15801561203f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206391906155ac565b5050925092505060006120dc8560405180606001604052808e600001602081019061208e91906150af565b6001600160a01b031681526020018e60200160208101906120af91906150af565b6001600160a01b031681526020018e60400160208101906120d0919061569e565b62ffffff169052613c96565b905060405180610140016040528060006bffffffffffffffffffffffff16815260200160006001600160a01b031681526020018269ffffffffffffffffffff1681526020018c606001602081019061213491906153e6565b60020b815260200161214c60a08e0160808f016153e6565b60020b81526020018a6001600160801b0316815260200184815260200183815260200160006001600160801b0316815260200160006001600160801b0316815250600c60008c815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a81548169ffffffffffffffffffff021916908369ffffffffffffffffffff160217905550606082015181600101600a6101000a81548162ffffff021916908360020b62ffffff160217905550608082015181600101600d6101000a81548162ffffff021916908360020b62ffffff16021790555060a08201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060c0820151816002015560e082015181600301556101008201518160040160006101000a8154816001600160801b0302191690836001600160801b031602179055506101208201518160040160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050897f3067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f8a8a8a60405161235b93929190615afd565b60405180910390a25050505050509193509193565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108025780601f106107d757610100808354040283529160200191610802565b6000818152600c6020908152604080832081516101408101835281546bffffffffffffffffffffffff811682526001600160a01b036c010000000000000000000000009091041693810193909352600181015469ffffffffffffffffffff81169284018390526a01000000000000000000008104600290810b810b810b6060860152600160681b8204810b810b810b60808601526001600160801b03600160801b92839004811660a08701529083015460c0860152600383015460e0860152600490920154808316610100860152041661012083015282918291829182918291829182918291829182918291906124da5760405162461bcd60e51b815260040161083390615a4f565b6000600b6000836040015169ffffffffffffffffffff1669ffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905081600001518260200151826000015183602001518460400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001519d509d509d509d509d509d509d509d509d509d509d509d50505091939597999b5091939597999b565b612608613253565b6001600160a01b0316826001600160a01b0316141561266e576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b806005600061267b613253565b6001600160a01b0390811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091556126dd613253565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600019916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b15801561278d57600080fd5b505afa1580156127a1573d6000803e3d6000fd5b505050506040513d60208110156127b757600080fd5b505110156127cd576127cd868686868686611661565b505050505050565b60608167ffffffffffffffff811180156127ee57600080fd5b5060405190808252806020026020018201604052801561282257816020015b606081526020019060019003908161280d5790505b50905060005b8281101561290e576000803086868581811061284057fe5b90506020028101906128529190615bef565b6040516128609291906157d2565b600060405180830381855af49150503d806000811461289b576040519150601f19603f3d011682016040523d82523d6000602084013e6128a0565b606091505b5091509150816128ec576044815110156128b957600080fd5b600481019050808060200190518101906128d39190615402565b60405162461bcd60e51b81526004016108339190615971565b808484815181106128f957fe5b60209081029190910101525050600101612828565b5092915050565b612926612920613253565b836132db565b6129615760405162461bcd60e51b8152600401808060200182810382526031815260200180615f036031913960400191505060405180910390fd5b61296d84848484613de6565b50505050565b604080517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152905186916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b1580156129db57600080fd5b505afa1580156129ef573d6000803e3d6000fd5b505050506040513d6020811015612a0557600080fd5b505110156127cd576127cd868686868686612c9d565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060612a4a82613246565b612a5357600080fd5b6040517fe9dc63750000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e9dc637590612aba9030908690600401615932565b60006040518083038186803b158015612ad257600080fd5b505afa158015612ae6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261148f9190810190615402565b6000612b1c828401846154a5565b9050612b4c7f00000000000000000000000000000000000000000000000000000000000000008260000151613e38565b508415612b67578051516020820151612b6791903388613e5b565b8315612b8557612b8581600001516020015182602001513387613e5b565b5050505050565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612bdb57600080fd5b505afa158015612bef573d6000803e3d6000fd5b505050506040513d6020811015612c0557600080fd5b5051905082811015612c5e576040805162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b801561296d5761296d848383613feb565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c4810183905290516001600160a01b0388169163d505accf9160e480830192600092919082900301818387803b1580156116f457600080fd5b6000808235612d3733826132db565b612d535760405162461bcd60e51b815260040161083390615984565b6000612d656060860160408701615562565b6001600160801b03161180612d9257506000612d876080860160608701615562565b6001600160801b0316115b612d9b57600080fd5b600080612dae60408701602088016150af565b6001600160a01b031614612dd157612dcc60408601602087016150af565b612dd3565b305b85356000908152600c6020908152604080832060018082015469ffffffffffffffffffff168552600b8452828520835160608101855281546001600160a01b039081168252919092015490811694820194909452600160a01b90930462ffffff169183019190915292935090612e697f00000000000000000000000000000000000000000000000000000000000000008361337b565b600484015460018501549192506001600160801b0380821692600160801b92839004821692900416156130865760018501546040517fa34123a70000000000000000000000000000000000000000000000000000000081526001600160a01b0385169163a34123a791612f00916a01000000000000000000008104600290810b92600160681b909204900b9060009060040161594b565b6040805180830381600087803b158015612f1957600080fd5b505af1158015612f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5191906156f4565b5050600185015460009081906001600160a01b0386169063514ea4bf90612f969030906a01000000000000000000008104600290810b91600160681b9004900b613477565b6040518263ffffffff1660e01b8152600401612fb29190615929565b60a06040518083038186803b158015612fca57600080fd5b505afa158015612fde573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300291906155ac565b5050925092505061303e876002015483038860010160109054906101000a90046001600160801b03166001600160801b0316600160801b6134d1565b84019350613077876003015482038860010160109054906101000a90046001600160801b03166001600160801b0316600160801b6134d1565b60028801929092556003870155015b6000806001600160801b0384166130a360608e0160408f01615562565b6001600160801b0316116130c6576130c160608d0160408e01615562565b6130c8565b835b836001600160801b03168d60600160208101906130e59190615562565b6001600160801b0316116131085761310360808e0160608f01615562565b61310a565b835b60018901546040517f4f1eb3d80000000000000000000000000000000000000000000000000000000081529294509092506001600160a01b03871691634f1eb3d89161317d918c916a01000000000000000000008104600290810b92600160681b909204900b9088908890600401615839565b6040805180830381600087803b15801561319657600080fd5b505af11580156131aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ce919061557e565b6004890180546fffffffffffffffffffffffffffffffff196001600160801b03918216600160801b878a0384160217168689038216179091556040519281169d50169a508c35907f40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f0190610d94908b9086908690615876565b600061148f60028361417b565b3390565b6000818152600c6020526040902080546bffffffffffffffffffffffff166c010000000000000000000000006001600160a01b0385169081029190911790915581906132a2826118ce565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006132e682613246565b6133215760405162461bcd60e51b815260040180806020018281038252602c815260200180615de0602c913960400191505060405180910390fd5b600061332c836118ce565b9050806001600160a01b0316846001600160a01b031614806133675750836001600160a01b031661335c8461080c565b6001600160a01b0316145b806110c157506110c18185612c6f565b4290565b600081602001516001600160a01b031682600001516001600160a01b0316106133a357600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b6bffffffffffffffffffffffff191660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b604080516bffffffffffffffffffffffff19606086901b16602080830191909152600285810b60e890811b60348501529085900b901b60378301528251601a818403018152603a90920190925280519101205b9392505050565b600080806000198587098686029250828110908390030390508061350757600084116134fc57600080fd5b5082900490506134ca565b80841161351357600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106135cc5780518252601f1990920191602091820191016135ad565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461362e576040519150601f19603f3d011682016040523d82523d6000602084013e613633565b606091505b5050905080610939576040805162461bcd60e51b815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600061148f82614187565b6000806000806000604051806060016040528087600001516001600160a01b0316815260200187602001516001600160a01b03168152602001876040015162ffffff1681525090506137067f00000000000000000000000000000000000000000000000000000000000000008261337b565b91506000826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561374357600080fd5b505afa158015613757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061377b919061560d565b50505050505090506000613792886080015161418b565b905060006137a38960a0015161418b565b90506137ba8383838c60c001518d60e001516144d9565b9750505050816001600160a01b0316633c8a7d8d876060015188608001518960a00151896040518060400160405280888152602001336001600160a01b031681525060405160200161380c9190615abd565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161383b9594939291906157f6565b6040805180830381600087803b15801561385457600080fd5b505af1158015613868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388c91906156f4565b610100880151919550935084108015906138ab57508561012001518310155b6138c75760405162461bcd60e51b815260040161083390615a18565b509193509193565b826001600160a01b03166138e2826118ce565b6001600160a01b0316146139275760405162461bcd60e51b8152600401808060200182810382526029815260200180615eb96029913960400191505060405180910390fd5b6001600160a01b03821661396c5760405162461bcd60e51b8152600401808060200182810382526024815260200180615d966024913960400191505060405180910390fd5b613977838383610939565b613982600082613257565b6001600160a01b03831660009081526001602052604090206139a4908261459d565b506001600160a01b03821660009081526001602052604090206139c790826145a9565b506139d4600282846145b5565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061148c83836145cb565b4690565b6000613a36826118ce565b9050613a4481600084610939565b613a4f600083613257565b6000828152600860205260409020546002600019610100600184161502019091160415613a8d576000828152600860205260408120613a8d9161501f565b6001600160a01b0381166000908152600160205260409020613aaf908361459d565b50613abb60028361462f565b5060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000808080613b07868661463b565b909450925050505b9250929050565b60006110c18484846146b6565b6000908152600c6020526040902080546bffffffffffffffffffffffff19811660016bffffffffffffffffffffffff9283169081019092161790915590565b3b151590565b6001600160a01b038216613bc3576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b613bcc81613246565b15613c1e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b613c2a60008383610939565b6001600160a01b0382166000908152600160205260409020613c4c90826145a9565b50613c59600282846145b5565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0382166000908152600a602052604090205469ffffffffffffffffffff168061148f5750600d8054600169ffffffffffffffffffff76010000000000000000000000000000000000000000000080840482168381019092160275ffffffffffffffffffffffffffffffffffffffffffff909316929092179092556001600160a01b038085166000908152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001686179055848352600b825291829020865181549085167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617825591870151950180549287015162ffffff16600160a01b027fffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffff969094169290911691909117939093161790915592915050565b613df18484846138cf565b613dfd84848484614780565b61296d5760405162461bcd60e51b8152600401808060200182810382526032815260200180615d3d6032913960400191505060405180910390fd5b6000613e44838361337b565b9050336001600160a01b0382161461148f57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316148015613e9c5750804710155b15613fbe577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015613efc57600080fd5b505af1158015613f10573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613f8c57600080fd5b505af1158015613fa0573d6000803e3d6000fd5b505050506040513d6020811015613fb657600080fd5b5061296d9050565b6001600160a01b038316301415613fdf57613fda848383613feb565b61296d565b61296d8484848461495c565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b602083106140955780518252601f199092019160209182019101614076565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146140f7576040519150601f19603f3d011682016040523d82523d6000602084013e6140fc565b606091505b509150915081801561412a57508051158061412a575080806020019051602081101561412757600080fd5b50515b612b85576040805162461bcd60e51b815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600061148c8383614af4565b5490565b60008060008360020b126141a2578260020b6141aa565b8260020b6000035b9050620d89e8811115614204576040805162461bcd60e51b815260206004820152600160248201527f5400000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60006001821661421857600160801b61422a565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600282161561425e576ffff97272373d413259a46990580e213a0260801c5b600482161561427d576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b600882161561429c576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156142bb576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156142da576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156142f9576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615614318576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615614338576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615614358576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615614378576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615614398576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156143b8576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156143d8576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156143f8576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615614418576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615614439576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614459576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615614478576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615614495576b048a170391f7dc42444e8fa20260801c5b60008460020b13156144b05780600019816144ac57fe5b0490505b6401000000008106156144c45760016144c7565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b031611156144f9579293925b846001600160a01b0316866001600160a01b0316116145245761451d858585614b0c565b9050614594565b836001600160a01b0316866001600160a01b0316101561458657600061454b878686614b0c565b9050600061455a878986614b78565b9050806001600160801b0316826001600160801b03161061457b578061457d565b815b92505050614594565b614591858584614b78565b90505b95945050505050565b600061148c8383614bbe565b600061148c8383614c84565b60006110c184846001600160a01b038516614cce565b8154600090821061460d5760405162461bcd60e51b8152600401808060200182810382526022815260200180615d1b6022913960400191505060405180910390fd5b82600001828154811061461c57fe5b9060005260206000200154905092915050565b600061148c8383614d65565b81546000908190831061467f5760405162461bcd60e51b8152600401808060200182810382526022815260200180615e976022913960400191505060405180910390fd5b600084600001848154811061469057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816147515760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156147165781810151838201526020016146fe565b50505050905090810190601f1680156147435780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061476457fe5b9060005260206000209060020201600101549150509392505050565b6000614794846001600160a01b0316613b62565b6147a0575060016110c1565b60006148f17f150b7a02000000000000000000000000000000000000000000000000000000006147ce613253565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561483557818101518382015260200161481d565b50505050905090810190601f1680156148625780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001615d3d603291396001600160a01b0388169190614e39565b9050600081806020019051602081101561490a57600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001492505050949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b60208310614a0e5780518252601f1990920191602091820191016149ef565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614a70576040519150601f19603f3d011682016040523d82523d6000602084013e614a75565b606091505b5091509150818015614aa3575080511580614aa35750808060200190516020811015614aa057600080fd5b50515b6127cd576040805162461bcd60e51b815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60009081526001919091016020526040902054151590565b6000826001600160a01b0316846001600160a01b03161115614b2c579192915b6000614b58856001600160a01b0316856001600160a01b03166c010000000000000000000000006134d1565b9050614594614b7384838888036001600160a01b03166134d1565b614e48565b6000826001600160a01b0316846001600160a01b03161115614b98579192915b6110c1614b73836c010000000000000000000000008787036001600160a01b03166134d1565b60008181526001830160205260408120548015614c7a5783546000198083019190810190600090879083908110614bf157fe5b9060005260206000200154905080876000018481548110614c0e57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080614c3e57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061148f565b600091505061148f565b6000614c908383614af4565b614cc65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561148f565b50600061148f565b600082815260018401602052604081205480614d335750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556134ca565b82856000016001830381548110614d4657fe5b90600052602060002090600202016001018190555060009150506134ca565b60008181526001830160205260408120548015614c7a5783546000198083019190810190600090879083908110614d9857fe5b9060005260206000209060020201905080876000018481548110614db857fe5b600091825260208083208454600290930201918255600193840154918401919091558354825289830190526040902090840190558654879080614df757fe5b600082815260208082206002600019909401938402018281556001908101839055929093558881528982019092526040822091909155945061148f9350505050565b60606110c18484600085614e5e565b806001600160801b038116811461077157600080fd5b606082471015614e9f5760405162461bcd60e51b8152600401808060200182810382526026815260200180615dba6026913960400191505060405180910390fd5b614ea885613b62565b614ef9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b60208310614f375780518252601f199092019160209182019101614f18565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614f99576040519150601f19603f3d011682016040523d82523d6000602084013e614f9e565b606091505b5091509150614fae828286614fb9565b979650505050505050565b60608315614fc85750816134ca565b825115614fd85782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156147165781810151838201526020016146fe565b50805460018160011615610100020316600290046000825580601f106150455750615063565b601f0160209004906000526020600020908101906150639190615066565b50565b5b8082111561507b5760008155600101615067565b5090565b803561077181615cc4565b805161ffff8116811461077157600080fd5b803562ffffff8116811461077157600080fd5b6000602082840312156150c0578081fd5b81356134ca81615cc4565b600080604083850312156150dd578081fd5b82356150e881615cc4565b915060208301356150f881615cc4565b809150509250929050565b60008060008060808587031215615118578182fd5b843561512381615cc4565b9350602085013561513381615cc4565b92506151416040860161509c565b9150606085013561515181615cc4565b939692955090935050565b600080600060608486031215615170578081fd5b833561517b81615cc4565b9250602084013561518b81615cc4565b929592945050506040919091013590565b600080600080608085870312156151b1578182fd5b84356151bc81615cc4565b935060208501356151cc81615cc4565b925060408501359150606085013567ffffffffffffffff8111156151ee578182fd5b8501601f810187136151fe578182fd5b803561521161520c82615c76565b615c52565b818152886020838501011115615225578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215615255578182fd5b823561526081615cc4565b915060208301356150f881615cd9565b60008060408385031215615282578182fd5b823561528d81615cc4565b946020939093013593505050565b6000806000606084860312156152af578081fd5b83356152ba81615cc4565b92506020840135915060408401356152d181615cc4565b809150509250925092565b60008060008060008060c087890312156152f4578384fd5b86356152ff81615cc4565b95506020870135945060408701359350606087013561531d81615d0b565b9598949750929560808101359460a0909101359350915050565b60008060208385031215615349578182fd5b823567ffffffffffffffff80821115615360578384fd5b818501915085601f830112615373578384fd5b813581811115615381578485fd5b8660208083028501011115615394578485fd5b60209290920196919550909350505050565b6000602082840312156153b7578081fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146134ca578182fd5b6000602082840312156153f7578081fd5b81356134ca81615ce7565b600060208284031215615413578081fd5b815167ffffffffffffffff811115615429578182fd5b8201601f81018413615439578182fd5b805161544761520c82615c76565b81815285602083850101111561545b578384fd5b614594826020830160208601615c98565b60006080828403121561547d578081fd5b50919050565b600060a0828403121561547d578081fd5b600060c0828403121561547d578081fd5b600081830360808112156154b7578182fd5b6040516040810167ffffffffffffffff82821081831117156154d557fe5b8160405260608412156154e6578485fd5b60a08301935081841081851117156154fa57fe5b50826040528435925061550c83615cc4565b91825260208401359161551e83615cc4565b8260608301526155306040860161509c565b608083015281526155436060850161507f565b6020820152949350505050565b6000610160828403121561547d578081fd5b600060208284031215615573578081fd5b81356134ca81615cf6565b60008060408385031215615590578182fd5b825161559b81615cf6565b60208401519092506150f881615cf6565b600080600080600060a086880312156155c3578283fd5b85516155ce81615cf6565b80955050602086015193506040860151925060608601516155ee81615cf6565b60808701519092506155ff81615cf6565b809150509295509295909350565b600080600080600080600060e0888a031215615627578485fd5b875161563281615cc4565b602089015190975061564381615ce7565b95506156516040890161508a565b945061565f6060890161508a565b935061566d6080890161508a565b925060a088015161567d81615d0b565b60c089015190925061568e81615cd9565b8091505092959891949750929550565b6000602082840312156156af578081fd5b61148c8261509c565b6000602082840312156156c9578081fd5b5035919050565b600080604083850312156156e2578182fd5b8235915060208301356150f881615cc4565b60008060408385031215615706578182fd5b505080516020909101519092909150565b6000806000806060858703121561572c578182fd5b8435935060208501359250604085013567ffffffffffffffff80821115615751578384fd5b818701915087601f830112615764578384fd5b813581811115615772578485fd5b886020828501011115615783578485fd5b95989497505060200194505050565b600081518084526157aa816020860160208601615c98565b601f01601f19169290920160200192915050565b60020b9052565b6001600160801b03169052565b6000828483379101908152919050565b6001600160a01b0391909116815260200190565b60006001600160a01b03871682528560020b60208301528460020b60408301526001600160801b038416606083015260a06080830152614fae60a0830184615792565b6001600160a01b03959095168552600293840b60208601529190920b60408401526001600160801b03918216606084015216608082015260a00190565b6001600160a01b039390931683526001600160801b03918216602084015216604082015260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015615911577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526158ff858351615792565b945092850192908501906001016158c5565b5092979650505050505050565b901515815260200190565b90815260200190565b6001600160a01b03929092168252602082015260400190565b600293840b81529190920b60208201526001600160801b03909116604082015260600190565b60006020825261148c6020830184615792565b6020808252600c908201527f4e6f7420617070726f7665640000000000000000000000000000000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f507269636520736c69707061676520636865636b000000000000000000000000604082015260600190565b60208082526010908201527f496e76616c696420746f6b656e20494400000000000000000000000000000000604082015260600190565b6020808252600b908201527f4e6f7420636c6561726564000000000000000000000000000000000000000000604082015260600190565b815180516001600160a01b03908116835260208083015182168185015260409283015162ffffff1692840192909252920151909116606082015260800190565b6001600160801b039390931683526020830191909152604082015260600190565b9384526001600160801b039290921660208401526040830152606082015260800190565b918252602082015260400190565b6bffffffffffffffffffffffff8d1681526001600160a01b038c811660208301528b811660408301528a16606082015262ffffff89166080820152600288900b60a08201526101808101615ba760c08301896157be565b615bb460e08301886157c5565b8561010083015284610120830152615bd06101408301856157c5565b615bde6101608301846157c5565b9d9c50505050505050505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615c23578283fd5b83018035915067ffffffffffffffff821115615c3d578283fd5b602001915036819003821315613b0f57600080fd5b60405181810167ffffffffffffffff81118282101715615c6e57fe5b604052919050565b600067ffffffffffffffff821115615c8a57fe5b50601f01601f191660200190565b60005b83811015615cb3578181015183820152602001615c9b565b8381111561296d5750506000910152565b6001600160a01b038116811461506357600080fd5b801515811461506357600080fd5b8060020b811461506357600080fd5b6001600160801b038116811461506357600080fd5b60ff8116811461506357600080fdfe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732315065726d69743a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64734552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a164736f6c6343000706000a\",\n      linkReferences: {},\n      deployedLinkReferences: {}\n    };\n  }\n});\n\n// node_modules/@uniswap/v3-periphery/artifacts/contracts/interfaces/ISelfPermit.sol/ISelfPermit.json\nvar require_ISelfPermit = __commonJS({\n  \"node_modules/@uniswap/v3-periphery/artifacts/contracts/interfaces/ISelfPermit.sol/ISelfPermit.json\"(exports2, module2) {\n    module2.exports = {\n      _format: \"hh-sol-artifact-1\",\n      contractName: \"ISelfPermit\",\n      sourceName: \"contracts/interfaces/ISelfPermit.sol\",\n      abi: [\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"value\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"deadline\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermit\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"nonce\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"expiry\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitAllowed\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"nonce\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"expiry\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitAllowedIfNecessary\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"value\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"deadline\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitIfNecessary\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        }\n      ],\n      bytecode: \"0x\",\n      deployedBytecode: \"0x\",\n      linkReferences: {},\n      deployedLinkReferences: {}\n    };\n  }\n});\n\n// node_modules/@uniswap/v3-periphery/artifacts/contracts/interfaces/IPeripheryPaymentsWithFee.sol/IPeripheryPaymentsWithFee.json\nvar require_IPeripheryPaymentsWithFee = __commonJS({\n  \"node_modules/@uniswap/v3-periphery/artifacts/contracts/interfaces/IPeripheryPaymentsWithFee.sol/IPeripheryPaymentsWithFee.json\"(exports2, module2) {\n    module2.exports = {\n      _format: \"hh-sol-artifact-1\",\n      contractName: \"IPeripheryPaymentsWithFee\",\n      sourceName: \"contracts/interfaces/IPeripheryPaymentsWithFee.sol\",\n      abi: [\n        {\n          inputs: [],\n          name: \"refundETH\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"sweepToken\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"feeBips\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"feeRecipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"sweepTokenWithFee\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"unwrapWETH9\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"feeBips\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"feeRecipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"unwrapWETH9WithFee\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        }\n      ],\n      bytecode: \"0x\",\n      deployedBytecode: \"0x\",\n      linkReferences: {},\n      deployedLinkReferences: {}\n    };\n  }\n});\n\n// node_modules/@uniswap/v3-periphery/artifacts/contracts/lens/Quoter.sol/Quoter.json\nvar require_Quoter = __commonJS({\n  \"node_modules/@uniswap/v3-periphery/artifacts/contracts/lens/Quoter.sol/Quoter.json\"(exports2, module2) {\n    module2.exports = {\n      _format: \"hh-sol-artifact-1\",\n      contractName: \"Quoter\",\n      sourceName: \"contracts/lens/Quoter.sol\",\n      abi: [\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"_factory\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"_WETH9\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"constructor\"\n        },\n        {\n          inputs: [],\n          name: \"WETH9\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"factory\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes\",\n              name: \"path\",\n              type: \"bytes\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"quoteExactInput\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"tokenIn\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"tokenOut\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint24\",\n              name: \"fee\",\n              type: \"uint24\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint160\",\n              name: \"sqrtPriceLimitX96\",\n              type: \"uint160\"\n            }\n          ],\n          name: \"quoteExactInputSingle\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes\",\n              name: \"path\",\n              type: \"bytes\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"quoteExactOutput\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"tokenIn\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"tokenOut\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint24\",\n              name: \"fee\",\n              type: \"uint24\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint160\",\n              name: \"sqrtPriceLimitX96\",\n              type: \"uint160\"\n            }\n          ],\n          name: \"quoteExactOutputSingle\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"int256\",\n              name: \"amount0Delta\",\n              type: \"int256\"\n            },\n            {\n              internalType: \"int256\",\n              name: \"amount1Delta\",\n              type: \"int256\"\n            },\n            {\n              internalType: \"bytes\",\n              name: \"path\",\n              type: \"bytes\"\n            }\n          ],\n          name: \"uniswapV3SwapCallback\",\n          outputs: [],\n          stateMutability: \"view\",\n          type: \"function\"\n        }\n      ],\n      bytecode: \"0x60c060405234801561001057600080fd5b506040516112e53803806112e583398101604081905261002f91610069565b6001600160601b0319606092831b8116608052911b1660a05261009b565b80516001600160a01b038116811461006457600080fd5b919050565b6000806040838503121561007b578182fd5b6100848361004d565b91506100926020840161004d565b90509250929050565b60805160601c60a05160601c6112176100ce60003980610342525080610366528061058652806106d552506112176000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c45a01551161005b578063c45a0155146100d3578063cdca1753146100db578063f7729d43146100ee578063fa461e33146101015761007d565b80632f80bb1d1461008257806330d07f21146100ab5780634aa4a4fc146100be575b600080fd5b610095610090366004610e9e565b610116565b6040516100a29190611148565b60405180910390f35b6100956100b9366004610e30565b61017b565b6100c6610340565b6040516100a29190611084565b6100c6610364565b6100956100e9366004610e9e565b610388565b6100956100fc366004610e30565b6103d6565b61011461010f366004610f04565b610555565b005b60005b600061012484610660565b9050600080600061013487610668565b92509250925061014882848389600061017b565b955083156101605761015987610699565b965061016c565b85945050505050610175565b50505050610119565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff808616878216109083166101a65760008490555b6101b18787876106ce565b73ffffffffffffffffffffffffffffffffffffffff1663128acb0830836101d78861070c565b60000373ffffffffffffffffffffffffffffffffffffffff8816156101fc5787610222565b8561021b5773fffd8963efd1fc6a506488495d951d5263988d25610222565b6401000276a45b8b8b8e6040516020016102379392919061101e565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016102669594939291906110a5565b6040805180830381600087803b15801561027f57600080fd5b505af19250505080156102cd575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526102ca91810190610ee1565b60015b610333573d8080156102fb576040519150601f19603f3d011682016040523d82523d6000602084013e610300565b606091505b5073ffffffffffffffffffffffffffffffffffffffff841661032157600080555b61032a8161073e565b92505050610337565b5050505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005b600061039684610660565b905060008060006103a687610668565b9250925092506103ba8383838960006103d6565b95508315610160576103cb87610699565b96505050505061038b565b600073ffffffffffffffffffffffffffffffffffffffff808616908716106103ff8787876106ce565b73ffffffffffffffffffffffffffffffffffffffff1663128acb0830836104258861070c565b73ffffffffffffffffffffffffffffffffffffffff881615610447578761046d565b856104665773fffd8963efd1fc6a506488495d951d5263988d2561046d565b6401000276a45b8c8b8d6040516020016104829392919061101e565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016104b19594939291906110a5565b6040805180830381600087803b1580156104ca57600080fd5b505af1925050508015610518575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261051591810190610ee1565b60015b610333573d808015610546576040519150601f19603f3d011682016040523d82523d6000602084013e61054b565b606091505b5061032a8161073e565b60008313806105645750600082135b61056d57600080fd5b600080600061057b84610668565b9250925092506105ad7f00000000000000000000000000000000000000000000000000000000000000008484846107ef565b5060008060008089136105f3578573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1610888a600003610628565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161089896000035b925092509250821561063f57604051818152602081fd5b6000541561065557600054811461065557600080fd5b604051828152602081fd5b516042111590565b600080806106768482610805565b9250610683846014610905565b9050610690846017610805565b91509193909250565b80516060906101759083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9016109f5565b60006107047f00000000000000000000000000000000000000000000000000000000000000006106ff868686610bdc565b610c59565b949350505050565b60007f8000000000000000000000000000000000000000000000000000000000000000821061073a57600080fd5b5090565b600081516020146107db5760448251101561078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078590611111565b60405180910390fd5b600482019150818060200190518101906107a89190610f52565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078591906110f7565b818060200190518101906101759190610fbc565b600061033785610800868686610bdc565b610d8f565b60008182601401101561087957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b81601401835110156108ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b60008182600301101561097957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b81600301835110156109ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b60608182601f011015610a6957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b828284011015610ada57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b81830184511015610b4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b606082158015610b6b5760405191506000825260208201604052610bd3565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610ba4578051835260209283019201610b8c565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b610be4610dbf565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161115610c1c579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1610610c9b57600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b6000610d9b8383610c59565b90503373ffffffffffffffffffffffffffffffffffffffff82161461017557600080fd5b604080516060810182526000808252602082018190529181019190915290565b600082601f830112610def578081fd5b8135610e02610dfd82611175565b611151565b818152846020838601011115610e16578283fd5b816020850160208301379081016020019190915292915050565b600080600080600060a08688031215610e47578081fd5b8535610e52816111e5565b94506020860135610e62816111e5565b9350604086013562ffffff81168114610e79578182fd5b9250606086013591506080860135610e90816111e5565b809150509295509295909350565b60008060408385031215610eb0578182fd5b823567ffffffffffffffff811115610ec6578283fd5b610ed285828601610ddf565b95602094909401359450505050565b60008060408385031215610ef3578182fd5b505080516020909101519092909150565b600080600060608486031215610f18578283fd5b8335925060208401359150604084013567ffffffffffffffff811115610f3c578182fd5b610f4886828701610ddf565b9150509250925092565b600060208284031215610f63578081fd5b815167ffffffffffffffff811115610f79578182fd5b8201601f81018413610f89578182fd5b8051610f97610dfd82611175565b818152856020838501011115610fab578384fd5b6103378260208301602086016111b5565b600060208284031215610fcd578081fd5b5051919050565b60008151808452610fec8160208601602086016111b5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526110ec60a0830184610fd4565b979650505050505050565b60006020825261110a6020830184610fd4565b9392505050565b60208082526010908201527f556e6578706563746564206572726f7200000000000000000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561116d57fe5b604052919050565b600067ffffffffffffffff82111561118957fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156111d05781810151838201526020016111b8565b838111156111df576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461120757600080fd5b5056fea164736f6c6343000706000a\",\n      deployedBytecode: \"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c45a01551161005b578063c45a0155146100d3578063cdca1753146100db578063f7729d43146100ee578063fa461e33146101015761007d565b80632f80bb1d1461008257806330d07f21146100ab5780634aa4a4fc146100be575b600080fd5b610095610090366004610e9e565b610116565b6040516100a29190611148565b60405180910390f35b6100956100b9366004610e30565b61017b565b6100c6610340565b6040516100a29190611084565b6100c6610364565b6100956100e9366004610e9e565b610388565b6100956100fc366004610e30565b6103d6565b61011461010f366004610f04565b610555565b005b60005b600061012484610660565b9050600080600061013487610668565b92509250925061014882848389600061017b565b955083156101605761015987610699565b965061016c565b85945050505050610175565b50505050610119565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff808616878216109083166101a65760008490555b6101b18787876106ce565b73ffffffffffffffffffffffffffffffffffffffff1663128acb0830836101d78861070c565b60000373ffffffffffffffffffffffffffffffffffffffff8816156101fc5787610222565b8561021b5773fffd8963efd1fc6a506488495d951d5263988d25610222565b6401000276a45b8b8b8e6040516020016102379392919061101e565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016102669594939291906110a5565b6040805180830381600087803b15801561027f57600080fd5b505af19250505080156102cd575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526102ca91810190610ee1565b60015b610333573d8080156102fb576040519150601f19603f3d011682016040523d82523d6000602084013e610300565b606091505b5073ffffffffffffffffffffffffffffffffffffffff841661032157600080555b61032a8161073e565b92505050610337565b5050505b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005b600061039684610660565b905060008060006103a687610668565b9250925092506103ba8383838960006103d6565b95508315610160576103cb87610699565b96505050505061038b565b600073ffffffffffffffffffffffffffffffffffffffff808616908716106103ff8787876106ce565b73ffffffffffffffffffffffffffffffffffffffff1663128acb0830836104258861070c565b73ffffffffffffffffffffffffffffffffffffffff881615610447578761046d565b856104665773fffd8963efd1fc6a506488495d951d5263988d2561046d565b6401000276a45b8c8b8d6040516020016104829392919061101e565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016104b19594939291906110a5565b6040805180830381600087803b1580156104ca57600080fd5b505af1925050508015610518575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261051591810190610ee1565b60015b610333573d808015610546576040519150601f19603f3d011682016040523d82523d6000602084013e61054b565b606091505b5061032a8161073e565b60008313806105645750600082135b61056d57600080fd5b600080600061057b84610668565b9250925092506105ad7f00000000000000000000000000000000000000000000000000000000000000008484846107ef565b5060008060008089136105f3578573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1610888a600003610628565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161089896000035b925092509250821561063f57604051818152602081fd5b6000541561065557600054811461065557600080fd5b604051828152602081fd5b516042111590565b600080806106768482610805565b9250610683846014610905565b9050610690846017610805565b91509193909250565b80516060906101759083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9016109f5565b60006107047f00000000000000000000000000000000000000000000000000000000000000006106ff868686610bdc565b610c59565b949350505050565b60007f8000000000000000000000000000000000000000000000000000000000000000821061073a57600080fd5b5090565b600081516020146107db5760448251101561078e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078590611111565b60405180910390fd5b600482019150818060200190518101906107a89190610f52565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078591906110f7565b818060200190518101906101759190610fbc565b600061033785610800868686610bdc565b610d8f565b60008182601401101561087957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b81601401835110156108ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b60008182600301101561097957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b81600301835110156109ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b60608182601f011015610a6957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b828284011015610ada57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b81830184511015610b4c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b606082158015610b6b5760405191506000825260208201604052610bd3565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610ba4578051835260209283019201610b8c565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b610be4610dbf565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161115610c1c579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1610610c9b57600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b6000610d9b8383610c59565b90503373ffffffffffffffffffffffffffffffffffffffff82161461017557600080fd5b604080516060810182526000808252602082018190529181019190915290565b600082601f830112610def578081fd5b8135610e02610dfd82611175565b611151565b818152846020838601011115610e16578283fd5b816020850160208301379081016020019190915292915050565b600080600080600060a08688031215610e47578081fd5b8535610e52816111e5565b94506020860135610e62816111e5565b9350604086013562ffffff81168114610e79578182fd5b9250606086013591506080860135610e90816111e5565b809150509295509295909350565b60008060408385031215610eb0578182fd5b823567ffffffffffffffff811115610ec6578283fd5b610ed285828601610ddf565b95602094909401359450505050565b60008060408385031215610ef3578182fd5b505080516020909101519092909150565b600080600060608486031215610f18578283fd5b8335925060208401359150604084013567ffffffffffffffff811115610f3c578182fd5b610f4886828701610ddf565b9150509250925092565b600060208284031215610f63578081fd5b815167ffffffffffffffff811115610f79578182fd5b8201601f81018413610f89578182fd5b8051610f97610dfd82611175565b818152856020838501011115610fab578384fd5b6103378260208301602086016111b5565b600060208284031215610fcd578081fd5b5051919050565b60008151808452610fec8160208601602086016111b5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526110ec60a0830184610fd4565b979650505050505050565b60006020825261110a6020830184610fd4565b9392505050565b60208082526010908201527f556e6578706563746564206572726f7200000000000000000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561116d57fe5b604052919050565b600067ffffffffffffffff82111561118957fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110156111d05781810151838201526020016111b8565b838111156111df576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461120757600080fd5b5056fea164736f6c6343000706000a\",\n      linkReferences: {},\n      deployedLinkReferences: {}\n    };\n  }\n});\n\n// node_modules/@uniswap/swap-router-contracts/artifacts/contracts/lens/QuoterV2.sol/QuoterV2.json\nvar require_QuoterV2 = __commonJS({\n  \"node_modules/@uniswap/swap-router-contracts/artifacts/contracts/lens/QuoterV2.sol/QuoterV2.json\"(exports2, module2) {\n    module2.exports = {\n      _format: \"hh-sol-artifact-1\",\n      contractName: \"QuoterV2\",\n      sourceName: \"contracts/lens/QuoterV2.sol\",\n      abi: [\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"_factory\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"_WETH9\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"constructor\"\n        },\n        {\n          inputs: [],\n          name: \"WETH9\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"factory\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes\",\n              name: \"path\",\n              type: \"bytes\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"quoteExactInput\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint160[]\",\n              name: \"sqrtPriceX96AfterList\",\n              type: \"uint160[]\"\n            },\n            {\n              internalType: \"uint32[]\",\n              name: \"initializedTicksCrossedList\",\n              type: \"uint32[]\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"gasEstimate\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"address\",\n                  name: \"tokenIn\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"tokenOut\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountIn\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint24\",\n                  name: \"fee\",\n                  type: \"uint24\"\n                },\n                {\n                  internalType: \"uint160\",\n                  name: \"sqrtPriceLimitX96\",\n                  type: \"uint160\"\n                }\n              ],\n              internalType: \"struct IQuoterV2.QuoteExactInputSingleParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"quoteExactInputSingle\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint160\",\n              name: \"sqrtPriceX96After\",\n              type: \"uint160\"\n            },\n            {\n              internalType: \"uint32\",\n              name: \"initializedTicksCrossed\",\n              type: \"uint32\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"gasEstimate\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes\",\n              name: \"path\",\n              type: \"bytes\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"quoteExactOutput\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint160[]\",\n              name: \"sqrtPriceX96AfterList\",\n              type: \"uint160[]\"\n            },\n            {\n              internalType: \"uint32[]\",\n              name: \"initializedTicksCrossedList\",\n              type: \"uint32[]\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"gasEstimate\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"address\",\n                  name: \"tokenIn\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"tokenOut\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amount\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint24\",\n                  name: \"fee\",\n                  type: \"uint24\"\n                },\n                {\n                  internalType: \"uint160\",\n                  name: \"sqrtPriceLimitX96\",\n                  type: \"uint160\"\n                }\n              ],\n              internalType: \"struct IQuoterV2.QuoteExactOutputSingleParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"quoteExactOutputSingle\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint160\",\n              name: \"sqrtPriceX96After\",\n              type: \"uint160\"\n            },\n            {\n              internalType: \"uint32\",\n              name: \"initializedTicksCrossed\",\n              type: \"uint32\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"gasEstimate\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"int256\",\n              name: \"amount0Delta\",\n              type: \"int256\"\n            },\n            {\n              internalType: \"int256\",\n              name: \"amount1Delta\",\n              type: \"int256\"\n            },\n            {\n              internalType: \"bytes\",\n              name: \"path\",\n              type: \"bytes\"\n            }\n          ],\n          name: \"uniswapV3SwapCallback\",\n          outputs: [],\n          stateMutability: \"view\",\n          type: \"function\"\n        }\n      ],\n      bytecode: \"0x60c06040523480156200001157600080fd5b506040516200212c3803806200212c833981016040819052620000349162000070565b6001600160601b0319606092831b8116608052911b1660a052620000a7565b80516001600160a01b03811681146200006b57600080fd5b919050565b6000806040838503121562000083578182fd5b6200008e8362000053565b91506200009e6020840162000053565b90509250929050565b60805160601c60a05160601c612051620000db60003980610321525080610577528061095d5280610b9252506120516000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c45a01551161005b578063c45a0155146100e6578063c6a5026a146100ee578063cdca175314610101578063fa461e33146101145761007d565b80632f80bb1d146100825780634aa4a4fc146100ae578063bd21704a146100c3575b600080fd5b610095610090366004611b2b565b610129565b6040516100a59493929190611eac565b60405180910390f35b6100b661031f565b6040516100a59190611def565b6100d66100d1366004611c49565b610343565b6040516100a59493929190611f54565b6100b6610575565b6100d66100fc366004611c49565b610599565b61009561010f366004611b2b565b610754565b610127610122366004611b91565b61092c565b005b6000606080600061013986610ae8565b67ffffffffffffffff8111801561014f57600080fd5b50604051908082528060200260200182016040528015610179578160200160208202803683370190505b50925061018586610ae8565b67ffffffffffffffff8111801561019b57600080fd5b506040519080825280602002602001820160405280156101c5578160200160208202803683370190505b50915060005b60008060006101d98a610b17565b92509250925060008060008061025c6040518060a001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018f81526020018762ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250610343565b9350935093509350828b898151811061027157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818a89815181106102b857fe5b63ffffffff90921660209283029190910190910152929b50968201966001909601958b926102e58e610b48565b156102fa576102f38e610b50565b9d5061030a565b8c9b505050505050505050610316565b505050505050506101cb565b92959194509250565b7f000000000000000000000000000000000000000000000000000000000000000081565b60208101518151606083015160009283928392839273ffffffffffffffffffffffffffffffffffffffff808216908416109284926103819290610b8b565b9050866080015173ffffffffffffffffffffffffffffffffffffffff16600014156103af5760408701516000555b60005a90508173ffffffffffffffffffffffffffffffffffffffff1663128acb0830856103df8c60400151610bc9565b6000038c6080015173ffffffffffffffffffffffffffffffffffffffff1660001461040e578c60800151610434565b8761042d5773fffd8963efd1fc6a506488495d951d5263988d25610434565b6401000276a45b8d602001518e606001518f6000015160405160200161045593929190611d89565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401610484959493929190611e10565b6040805180830381600087803b15801561049d57600080fd5b505af19250505080156104eb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526104e891810190611b6e565b60015b610568573d808015610519576040519150601f19603f3d011682016040523d82523d6000602084013e61051e565b606091505b505a82039450886080015173ffffffffffffffffffffffffffffffffffffffff166000141561054c57600080555b610557818487610bfb565b97509750975097505050505061056e565b50505050505b9193509193565b7f000000000000000000000000000000000000000000000000000000000000000081565b60208101518151606083015160009283928392839273ffffffffffffffffffffffffffffffffffffffff808216908416109284926105d79290610b8b565b905060005a90508173ffffffffffffffffffffffffffffffffffffffff1663128acb0830856106098c60400151610bc9565b60808d015173ffffffffffffffffffffffffffffffffffffffff1615610633578c60800151610659565b876106525773fffd8963efd1fc6a506488495d951d5263988d25610659565b6401000276a45b8d600001518e606001518f6020015160405160200161067a93929190611d89565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016106a9959493929190611e10565b6040805180830381600087803b1580156106c257600080fd5b505af1925050508015610710575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261070d91810190611b6e565b60015b610568573d80801561073e576040519150601f19603f3d011682016040523d82523d6000602084013e610743565b606091505b505a82039450610557818487610bfb565b6000606080600061076486610ae8565b67ffffffffffffffff8111801561077a57600080fd5b506040519080825280602002602001820160405280156107a4578160200160208202803683370190505b5092506107b086610ae8565b67ffffffffffffffff811180156107c657600080fd5b506040519080825280602002602001820160405280156107f0578160200160208202803683370190505b50915060005b60008060006108048a610b17565b9250925092506000806000806108876040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018f81526020018762ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250610599565b9350935093509350828b898151811061089c57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818a89815181106108e357fe5b63ffffffff90921660209283029190910190910152929b50968201966001909601958b926109108e610b48565b156102fa5761091e8e610b50565b9d50505050505050506107f6565b600083138061093b5750600082135b61094457600080fd5b600080600061095284610b17565b9250925092506109847f0000000000000000000000000000000000000000000000000000000000000000848484610ccf565b5060008060008089136109ca578573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1610888a6000036109ff565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161089896000035b9250925092506000610a12878787610b8b565b90506000808273ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610a5d57600080fd5b505afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190611c6b565b5050505050915091508515610abb57604051848152826020820152816040820152606081fd5b60005415610ad1576000548414610ad157600080fd5b604051858152826020820152816040820152606081fd5b805160177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec909101045b919050565b60008080610b258482610cee565b9250610b32846014610dee565b9050610b3f846017610cee565b91509193909250565b516042111590565b8051606090610b859083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe901610ede565b92915050565b6000610bc17f0000000000000000000000000000000000000000000000000000000000000000610bbc8686866110c5565b611142565b949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210610bf757600080fd5b5090565b6000806000806000808773ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610c4a57600080fd5b505afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611c6b565b50939650610c9794508d935061127892505050565b91975095509050610cbf73ffffffffffffffffffffffffffffffffffffffff89168383611339565b9350869250505093509350935093565b6000610ce585610ce08686866110c5565b611991565b95945050505050565b600081826014011015610d6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b8160140183511015610dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b600081826003011015610e6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b8160030183511015610ed557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b60608182601f011015610f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b828284011015610fc357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b8183018451101561103557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b60608215801561105457604051915060008252602082016040526110bc565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561108d578051835260209283019201611075565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6110cd6119fa565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161115611105579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061118457600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b60008060008351606014611318576044845110156112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290611e75565b60405180910390fd5b600484019350838060200190518101906112e59190611bdf565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c29190611e62565b8380602001905181019061132c9190611d02565b9250925092509193909250565b60008060008060008060008060088b73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561138d57600080fd5b505afa1580156113a1573d6000803e3d6000fd5b505050506040513d60208110156113b757600080fd5b5051600290810b908c900b816113c957fe5b0560020b901d905060006101008c73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561141c57600080fd5b505afa158015611430573d6000803e3d6000fd5b505050506040513d602081101561144657600080fd5b5051600290810b908d900b8161145857fe5b0560020b8161146357fe5b079050600060088d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114b057600080fd5b505afa1580156114c4573d6000803e3d6000fd5b505050506040513d60208110156114da57600080fd5b5051600290810b908d900b816114ec57fe5b0560020b901d905060006101008e73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561153f57600080fd5b505afa158015611553573d6000803e3d6000fd5b505050506040513d602081101561156957600080fd5b5051600290810b908e900b8161157b57fe5b0560020b8161158657fe5b07905060008160ff166001901b8f73ffffffffffffffffffffffffffffffffffffffff16635339c296856040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b5051161180156116a457508d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561166257600080fd5b505afa158015611676573d6000803e3d6000fd5b505050506040513d602081101561168c57600080fd5b5051600290810b908d900b8161169e57fe5b0760020b155b80156116b557508b60020b8d60020b135b945060008360ff166001901b8f73ffffffffffffffffffffffffffffffffffffffff16635339c296876040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b15801561171557600080fd5b505afa158015611729573d6000803e3d6000fd5b505050506040513d602081101561173f57600080fd5b5051161180156117d257508d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561179057600080fd5b505afa1580156117a4573d6000803e3d6000fd5b505050506040513d60208110156117ba57600080fd5b5051600290810b908e900b816117cc57fe5b0760020b155b80156117e357508b60020b8d60020b125b95508160010b8460010b128061180f57508160010b8460010b14801561180f57508060ff168360ff1611155b1561182557839950829750819850809650611832565b8199508097508398508296505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff87161b9150505b8560010b8760010b13611969578560010b8760010b14156118a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff858103161c165b6000818c73ffffffffffffffffffffffffffffffffffffffff16635339c2968a6040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d602081101561192457600080fd5b5051169050611932816119c1565b61ffff16989098019750506001909501947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61185e565b8115611976576001880397505b8215611983576001880397505b505050505050509392505050565b600061199d8383611142565b90503373ffffffffffffffffffffffffffffffffffffffff821614610b8557600080fd5b6000805b8215610b85577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301909216916001016119c5565b604080516060810182526000808252602082018190529181019190915290565b600082601f830112611a2a578081fd5b8135611a3d611a3882611faf565b611f8b565b818152846020838601011115611a51578283fd5b816020850160208301379081016020019190915292915050565b8051600281900b8114610b1257600080fd5b600060a08284031215611a8e578081fd5b60405160a0810181811067ffffffffffffffff82111715611aab57fe5b6040529050808235611abc8161201f565b81526020830135611acc8161201f565b602082015260408381013590820152606083013562ffffff81168114611af157600080fd5b6060820152611b0260808401611b0e565b60808201525092915050565b8035610b128161201f565b805161ffff81168114610b1257600080fd5b60008060408385031215611b3d578182fd5b823567ffffffffffffffff811115611b53578283fd5b611b5f85828601611a1a565b95602094909401359450505050565b60008060408385031215611b80578182fd5b505080516020909101519092909150565b600080600060608486031215611ba5578081fd5b8335925060208401359150604084013567ffffffffffffffff811115611bc9578182fd5b611bd586828701611a1a565b9150509250925092565b600060208284031215611bf0578081fd5b815167ffffffffffffffff811115611c06578182fd5b8201601f81018413611c16578182fd5b8051611c24611a3882611faf565b818152856020838501011115611c38578384fd5b610ce5826020830160208601611fef565b600060a08284031215611c5a578081fd5b611c648383611a7d565b9392505050565b600080600080600080600060e0888a031215611c85578283fd5b8751611c908161201f565b9650611c9e60208901611a6b565b9550611cac60408901611b19565b9450611cba60608901611b19565b9350611cc860808901611b19565b925060a088015160ff81168114611cdd578283fd5b60c08901519092508015158114611cf2578182fd5b8091505092959891949750929550565b600080600060608486031215611d16578081fd5b835192506020840151611d288161201f565b9150611d3660408501611a6b565b90509250925092565b60008151808452611d57816020860160208601611fef565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152611e5760a0830184611d3f565b979650505050505050565b600060208252611c646020830184611d3f565b60208082526010908201527f556e6578706563746564206572726f7200000000000000000000000000000000604082015260600190565b600060808201868352602060808185015281875180845260a0860191508289019350845b81811015611f0257845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101611ed0565b505084810360408601528651808252908201925081870190845b81811015611f3e57825163ffffffff1685529383019391830191600101611f1c565b5050505060609290920192909252949350505050565b93845273ffffffffffffffffffffffffffffffffffffffff92909216602084015263ffffffff166040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715611fa757fe5b604052919050565b600067ffffffffffffffff821115611fc357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561200a578181015183820152602001611ff2565b83811115612019576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461204157600080fd5b5056fea164736f6c6343000706000a\",\n      deployedBytecode: \"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063c45a01551161005b578063c45a0155146100e6578063c6a5026a146100ee578063cdca175314610101578063fa461e33146101145761007d565b80632f80bb1d146100825780634aa4a4fc146100ae578063bd21704a146100c3575b600080fd5b610095610090366004611b2b565b610129565b6040516100a59493929190611eac565b60405180910390f35b6100b661031f565b6040516100a59190611def565b6100d66100d1366004611c49565b610343565b6040516100a59493929190611f54565b6100b6610575565b6100d66100fc366004611c49565b610599565b61009561010f366004611b2b565b610754565b610127610122366004611b91565b61092c565b005b6000606080600061013986610ae8565b67ffffffffffffffff8111801561014f57600080fd5b50604051908082528060200260200182016040528015610179578160200160208202803683370190505b50925061018586610ae8565b67ffffffffffffffff8111801561019b57600080fd5b506040519080825280602002602001820160405280156101c5578160200160208202803683370190505b50915060005b60008060006101d98a610b17565b92509250925060008060008061025c6040518060a001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018f81526020018762ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250610343565b9350935093509350828b898151811061027157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818a89815181106102b857fe5b63ffffffff90921660209283029190910190910152929b50968201966001909601958b926102e58e610b48565b156102fa576102f38e610b50565b9d5061030a565b8c9b505050505050505050610316565b505050505050506101cb565b92959194509250565b7f000000000000000000000000000000000000000000000000000000000000000081565b60208101518151606083015160009283928392839273ffffffffffffffffffffffffffffffffffffffff808216908416109284926103819290610b8b565b9050866080015173ffffffffffffffffffffffffffffffffffffffff16600014156103af5760408701516000555b60005a90508173ffffffffffffffffffffffffffffffffffffffff1663128acb0830856103df8c60400151610bc9565b6000038c6080015173ffffffffffffffffffffffffffffffffffffffff1660001461040e578c60800151610434565b8761042d5773fffd8963efd1fc6a506488495d951d5263988d25610434565b6401000276a45b8d602001518e606001518f6000015160405160200161045593929190611d89565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401610484959493929190611e10565b6040805180830381600087803b15801561049d57600080fd5b505af19250505080156104eb575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526104e891810190611b6e565b60015b610568573d808015610519576040519150601f19603f3d011682016040523d82523d6000602084013e61051e565b606091505b505a82039450886080015173ffffffffffffffffffffffffffffffffffffffff166000141561054c57600080555b610557818487610bfb565b97509750975097505050505061056e565b50505050505b9193509193565b7f000000000000000000000000000000000000000000000000000000000000000081565b60208101518151606083015160009283928392839273ffffffffffffffffffffffffffffffffffffffff808216908416109284926105d79290610b8b565b905060005a90508173ffffffffffffffffffffffffffffffffffffffff1663128acb0830856106098c60400151610bc9565b60808d015173ffffffffffffffffffffffffffffffffffffffff1615610633578c60800151610659565b876106525773fffd8963efd1fc6a506488495d951d5263988d25610659565b6401000276a45b8d600001518e606001518f6020015160405160200161067a93929190611d89565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016106a9959493929190611e10565b6040805180830381600087803b1580156106c257600080fd5b505af1925050508015610710575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261070d91810190611b6e565b60015b610568573d80801561073e576040519150601f19603f3d011682016040523d82523d6000602084013e610743565b606091505b505a82039450610557818487610bfb565b6000606080600061076486610ae8565b67ffffffffffffffff8111801561077a57600080fd5b506040519080825280602002602001820160405280156107a4578160200160208202803683370190505b5092506107b086610ae8565b67ffffffffffffffff811180156107c657600080fd5b506040519080825280602002602001820160405280156107f0578160200160208202803683370190505b50915060005b60008060006108048a610b17565b9250925092506000806000806108876040518060a001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018f81526020018762ffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815250610599565b9350935093509350828b898151811061089c57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818a89815181106108e357fe5b63ffffffff90921660209283029190910190910152929b50968201966001909601958b926109108e610b48565b156102fa5761091e8e610b50565b9d50505050505050506107f6565b600083138061093b5750600082135b61094457600080fd5b600080600061095284610b17565b9250925092506109847f0000000000000000000000000000000000000000000000000000000000000000848484610ccf565b5060008060008089136109ca578573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1610888a6000036109ff565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161089896000035b9250925092506000610a12878787610b8b565b90506000808273ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610a5d57600080fd5b505afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190611c6b565b5050505050915091508515610abb57604051848152826020820152816040820152606081fd5b60005415610ad1576000548414610ad157600080fd5b604051858152826020820152816040820152606081fd5b805160177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec909101045b919050565b60008080610b258482610cee565b9250610b32846014610dee565b9050610b3f846017610cee565b91509193909250565b516042111590565b8051606090610b859083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe901610ede565b92915050565b6000610bc17f0000000000000000000000000000000000000000000000000000000000000000610bbc8686866110c5565b611142565b949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210610bf757600080fd5b5090565b6000806000806000808773ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610c4a57600080fd5b505afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190611c6b565b50939650610c9794508d935061127892505050565b91975095509050610cbf73ffffffffffffffffffffffffffffffffffffffff89168383611339565b9350869250505093509350935093565b6000610ce585610ce08686866110c5565b611991565b95945050505050565b600081826014011015610d6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b8160140183511015610dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b600081826003011015610e6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b8160030183511015610ed557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b60608182601f011015610f5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b828284011015610fc357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b8183018451101561103557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b60608215801561105457604051915060008252602082016040526110bc565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561108d578051835260209283019201611075565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6110cd6119fa565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161115611105579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061118457600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b60008060008351606014611318576044845110156112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290611e75565b60405180910390fd5b600484019350838060200190518101906112e59190611bdf565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c29190611e62565b8380602001905181019061132c9190611d02565b9250925092509193909250565b60008060008060008060008060088b73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561138d57600080fd5b505afa1580156113a1573d6000803e3d6000fd5b505050506040513d60208110156113b757600080fd5b5051600290810b908c900b816113c957fe5b0560020b901d905060006101008c73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561141c57600080fd5b505afa158015611430573d6000803e3d6000fd5b505050506040513d602081101561144657600080fd5b5051600290810b908d900b8161145857fe5b0560020b8161146357fe5b079050600060088d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114b057600080fd5b505afa1580156114c4573d6000803e3d6000fd5b505050506040513d60208110156114da57600080fd5b5051600290810b908d900b816114ec57fe5b0560020b901d905060006101008e73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561153f57600080fd5b505afa158015611553573d6000803e3d6000fd5b505050506040513d602081101561156957600080fd5b5051600290810b908e900b8161157b57fe5b0560020b8161158657fe5b07905060008160ff166001901b8f73ffffffffffffffffffffffffffffffffffffffff16635339c296856040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b1580156115e757600080fd5b505afa1580156115fb573d6000803e3d6000fd5b505050506040513d602081101561161157600080fd5b5051161180156116a457508d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561166257600080fd5b505afa158015611676573d6000803e3d6000fd5b505050506040513d602081101561168c57600080fd5b5051600290810b908d900b8161169e57fe5b0760020b155b80156116b557508b60020b8d60020b135b945060008360ff166001901b8f73ffffffffffffffffffffffffffffffffffffffff16635339c296876040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b15801561171557600080fd5b505afa158015611729573d6000803e3d6000fd5b505050506040513d602081101561173f57600080fd5b5051161180156117d257508d73ffffffffffffffffffffffffffffffffffffffff1663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561179057600080fd5b505afa1580156117a4573d6000803e3d6000fd5b505050506040513d60208110156117ba57600080fd5b5051600290810b908e900b816117cc57fe5b0760020b155b80156117e357508b60020b8d60020b125b95508160010b8460010b128061180f57508160010b8460010b14801561180f57508060ff168360ff1611155b1561182557839950829750819850809650611832565b8199508097508398508296505b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff87161b9150505b8560010b8760010b13611969578560010b8760010b14156118a3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff858103161c165b6000818c73ffffffffffffffffffffffffffffffffffffffff16635339c2968a6040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d602081101561192457600080fd5b5051169050611932816119c1565b61ffff16989098019750506001909501947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61185e565b8115611976576001880397505b8215611983576001880397505b505050505050509392505050565b600061199d8383611142565b90503373ffffffffffffffffffffffffffffffffffffffff821614610b8557600080fd5b6000805b8215610b85577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301909216916001016119c5565b604080516060810182526000808252602082018190529181019190915290565b600082601f830112611a2a578081fd5b8135611a3d611a3882611faf565b611f8b565b818152846020838601011115611a51578283fd5b816020850160208301379081016020019190915292915050565b8051600281900b8114610b1257600080fd5b600060a08284031215611a8e578081fd5b60405160a0810181811067ffffffffffffffff82111715611aab57fe5b6040529050808235611abc8161201f565b81526020830135611acc8161201f565b602082015260408381013590820152606083013562ffffff81168114611af157600080fd5b6060820152611b0260808401611b0e565b60808201525092915050565b8035610b128161201f565b805161ffff81168114610b1257600080fd5b60008060408385031215611b3d578182fd5b823567ffffffffffffffff811115611b53578283fd5b611b5f85828601611a1a565b95602094909401359450505050565b60008060408385031215611b80578182fd5b505080516020909101519092909150565b600080600060608486031215611ba5578081fd5b8335925060208401359150604084013567ffffffffffffffff811115611bc9578182fd5b611bd586828701611a1a565b9150509250925092565b600060208284031215611bf0578081fd5b815167ffffffffffffffff811115611c06578182fd5b8201601f81018413611c16578182fd5b8051611c24611a3882611faf565b818152856020838501011115611c38578384fd5b610ce5826020830160208601611fef565b600060a08284031215611c5a578081fd5b611c648383611a7d565b9392505050565b600080600080600080600060e0888a031215611c85578283fd5b8751611c908161201f565b9650611c9e60208901611a6b565b9550611cac60408901611b19565b9450611cba60608901611b19565b9350611cc860808901611b19565b925060a088015160ff81168114611cdd578283fd5b60c08901519092508015158114611cf2578182fd5b8091505092959891949750929550565b600080600060608486031215611d16578081fd5b835192506020840151611d288161201f565b9150611d3660408501611a6b565b90509250925092565b60008151808452611d57816020860160208601611fef565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152611e5760a0830184611d3f565b979650505050505050565b600060208252611c646020830184611d3f565b60208082526010908201527f556e6578706563746564206572726f7200000000000000000000000000000000604082015260600190565b600060808201868352602060808185015281875180845260a0860191508289019350845b81811015611f0257845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101611ed0565b505084810360408601528651808252908201925081870190845b81811015611f3e57825163ffffffff1685529383019391830191600101611f1c565b5050505060609290920192909252949350505050565b93845273ffffffffffffffffffffffffffffffffffffffff92909216602084015263ffffffff166040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715611fa757fe5b604052919050565b600067ffffffffffffffff821115611fc357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561200a578181015183820152602001611ff2565b83811115612019576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461204157600080fd5b5056fea164736f6c6343000706000a\",\n      linkReferences: {},\n      deployedLinkReferences: {}\n    };\n  }\n});\n\n// node_modules/@uniswap/v3-staker/artifacts/contracts/UniswapV3Staker.sol/UniswapV3Staker.json\nvar require_UniswapV3Staker = __commonJS({\n  \"node_modules/@uniswap/v3-staker/artifacts/contracts/UniswapV3Staker.sol/UniswapV3Staker.json\"(exports2, module2) {\n    module2.exports = {\n      _format: \"hh-sol-artifact-1\",\n      contractName: \"UniswapV3Staker\",\n      sourceName: \"contracts/UniswapV3Staker.sol\",\n      abi: [\n        {\n          inputs: [\n            {\n              internalType: \"contract IUniswapV3Factory\",\n              name: \"_factory\",\n              type: \"address\"\n            },\n            {\n              internalType: \"contract INonfungiblePositionManager\",\n              name: \"_nonfungiblePositionManager\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"_maxIncentiveStartLeadTime\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"_maxIncentiveDuration\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"constructor\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"oldOwner\",\n              type: \"address\"\n            },\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"newOwner\",\n              type: \"address\"\n            }\n          ],\n          name: \"DepositTransferred\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"contract IERC20Minimal\",\n              name: \"rewardToken\",\n              type: \"address\"\n            },\n            {\n              indexed: true,\n              internalType: \"contract IUniswapV3Pool\",\n              name: \"pool\",\n              type: \"address\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"startTime\",\n              type: \"uint256\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"endTime\",\n              type: \"uint256\"\n            },\n            {\n              indexed: false,\n              internalType: \"address\",\n              name: \"refundee\",\n              type: \"address\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"reward\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"IncentiveCreated\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"bytes32\",\n              name: \"incentiveId\",\n              type: \"bytes32\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"refund\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"IncentiveEnded\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint256\",\n              name: \"reward\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"RewardClaimed\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              indexed: true,\n              internalType: \"bytes32\",\n              name: \"incentiveId\",\n              type: \"bytes32\"\n            },\n            {\n              indexed: false,\n              internalType: \"uint128\",\n              name: \"liquidity\",\n              type: \"uint128\"\n            }\n          ],\n          name: \"TokenStaked\",\n          type: \"event\"\n        },\n        {\n          anonymous: false,\n          inputs: [\n            {\n              indexed: true,\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              indexed: true,\n              internalType: \"bytes32\",\n              name: \"incentiveId\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"TokenUnstaked\",\n          type: \"event\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"contract IERC20Minimal\",\n              name: \"rewardToken\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountRequested\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"claimReward\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"reward\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"contract IERC20Minimal\",\n                  name: \"rewardToken\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"contract IUniswapV3Pool\",\n                  name: \"pool\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"startTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"endTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"refundee\",\n                  type: \"address\"\n                }\n              ],\n              internalType: \"struct IUniswapV3Staker.IncentiveKey\",\n              name: \"key\",\n              type: \"tuple\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"reward\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"createIncentive\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"deposits\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"owner\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint48\",\n              name: \"numberOfStakes\",\n              type: \"uint48\"\n            },\n            {\n              internalType: \"int24\",\n              name: \"tickLower\",\n              type: \"int24\"\n            },\n            {\n              internalType: \"int24\",\n              name: \"tickUpper\",\n              type: \"int24\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"contract IERC20Minimal\",\n                  name: \"rewardToken\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"contract IUniswapV3Pool\",\n                  name: \"pool\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"startTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"endTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"refundee\",\n                  type: \"address\"\n                }\n              ],\n              internalType: \"struct IUniswapV3Staker.IncentiveKey\",\n              name: \"key\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"endIncentive\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"refund\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"factory\",\n          outputs: [\n            {\n              internalType: \"contract IUniswapV3Factory\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"contract IERC20Minimal\",\n                  name: \"rewardToken\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"contract IUniswapV3Pool\",\n                  name: \"pool\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"startTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"endTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"refundee\",\n                  type: \"address\"\n                }\n              ],\n              internalType: \"struct IUniswapV3Staker.IncentiveKey\",\n              name: \"key\",\n              type: \"tuple\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"getRewardInfo\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"reward\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint160\",\n              name: \"secondsInsideX128\",\n              type: \"uint160\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes32\",\n              name: \"\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"incentives\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"totalRewardUnclaimed\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint160\",\n              name: \"totalSecondsClaimedX128\",\n              type: \"uint160\"\n            },\n            {\n              internalType: \"uint96\",\n              name: \"numberOfStakes\",\n              type: \"uint96\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"maxIncentiveDuration\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"maxIncentiveStartLeadTime\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes[]\",\n              name: \"data\",\n              type: \"bytes[]\"\n            }\n          ],\n          name: \"multicall\",\n          outputs: [\n            {\n              internalType: \"bytes[]\",\n              name: \"results\",\n              type: \"bytes[]\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"nonfungiblePositionManager\",\n          outputs: [\n            {\n              internalType: \"contract INonfungiblePositionManager\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"from\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"bytes\",\n              name: \"data\",\n              type: \"bytes\"\n            }\n          ],\n          name: \"onERC721Received\",\n          outputs: [\n            {\n              internalType: \"bytes4\",\n              name: \"\",\n              type: \"bytes4\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"contract IERC20Minimal\",\n              name: \"\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          name: \"rewards\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"contract IERC20Minimal\",\n                  name: \"rewardToken\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"contract IUniswapV3Pool\",\n                  name: \"pool\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"startTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"endTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"refundee\",\n                  type: \"address\"\n                }\n              ],\n              internalType: \"struct IUniswapV3Staker.IncentiveKey\",\n              name: \"key\",\n              type: \"tuple\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"stakeToken\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"incentiveId\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"stakes\",\n          outputs: [\n            {\n              internalType: \"uint160\",\n              name: \"secondsPerLiquidityInsideInitialX128\",\n              type: \"uint160\"\n            },\n            {\n              internalType: \"uint128\",\n              name: \"liquidity\",\n              type: \"uint128\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            }\n          ],\n          name: \"transferDeposit\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"contract IERC20Minimal\",\n                  name: \"rewardToken\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"contract IUniswapV3Pool\",\n                  name: \"pool\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"startTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"endTime\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"refundee\",\n                  type: \"address\"\n                }\n              ],\n              internalType: \"struct IUniswapV3Staker.IncentiveKey\",\n              name: \"key\",\n              type: \"tuple\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            }\n          ],\n          name: \"unstakeToken\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"tokenId\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"to\",\n              type: \"address\"\n            },\n            {\n              internalType: \"bytes\",\n              name: \"data\",\n              type: \"bytes\"\n            }\n          ],\n          name: \"withdrawToken\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        }\n      ],\n      bytecode: \"0x6101006040523480156200001257600080fd5b5060405162003ba338038062003ba383398101604081905262000035916200005e565b6001600160601b0319606094851b81166080529290931b90911660a05260c05260e052620000c3565b6000806000806080858703121562000074578384fd5b84516200008181620000aa565b60208601519094506200009481620000aa565b6040860151606090960151949790965092505050565b6001600160a01b0381168114620000c057600080fd5b50565b60805160601c60a05160601c60c05160e051613a816200012260003980610bbd5280610cfa5250806103b15280610c595250806103ed52806104525280610b4852806110555280611ad552508061124c5280611ab45250613a816000f3fe6080604052600436106101295760003560e01c8063b02c43d0116100a5578063c45a015511610074578063e70b9e2711610059578063e70b9e271461034f578063f2d2909b1461036f578063f549ab421461038f57610129565b8063c45a01551461030c578063d953186e1461032157610129565b8063b02c43d01461026c578063b44a27221461029c578063b5ada6e4146102be578063c36c1ea5146102de57610129565b80633c423f0b116100fc5780635cc5e3d9116100e15780635cc5e3d9146101fd578063607777951461021d578063ac9650d81461024c57610129565b80633c423f0b146101c85780633dc0714b146101e857610129565b806301b754401461012e578063150b7a021461015957806326bfee04146101865780632f2d783d146101a8575b600080fd5b34801561013a57600080fd5b506101436103af565b60405161015091906138b9565b60405180910390f35b34801561016557600080fd5b5061017961017436600461273f565b6103d3565b6040516101509190612db4565b34801561019257600080fd5b506101a66101a1366004612a9c565b61071c565b005b3480156101b457600080fd5b506101436101c3366004612946565b61084a565b3480156101d457600080fd5b506101a66101e3366004612ac0565b610928565b3480156101f457600080fd5b50610143610bbb565b34801561020957600080fd5b506101a6610218366004612a72565b610bdf565b34801561022957600080fd5b5061023d6102383660046128f6565b610e10565b604051610150939291906138e6565b61025f61025a3660046127d9565b610e67565b6040516101509190612d36565b34801561027857600080fd5b5061028c6102873660046128f6565b610fc1565b6040516101509493929190612cf5565b3480156102a857600080fd5b506102b1611053565b6040516101509190612de1565b3480156102ca57600080fd5b506101436102d9366004612a57565b611077565b3480156102ea57600080fd5b506102fe6102f9366004612b52565b6111c5565b604051610150929190613881565b34801561031857600080fd5b506102b161124a565b34801561032d57600080fd5b5061034161033c366004612a72565b61126e565b6040516101509291906138c2565b34801561035b57600080fd5b5061014361036a36600461290e565b611493565b34801561037b57600080fd5b506101a661038a366004612a72565b6114b0565b34801561039b57600080fd5b506101a66103aa366004612a72565b61151b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461044d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061375a565b60405180910390fd5b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166399fbab88876040518263ffffffff1660e01b81526004016104a991906138b9565b6101806040518083038186803b1580156104c257600080fd5b505afa1580156104d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fa9190612b73565b505050505096509650505050505060405180608001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001600065ffffffffffff1681526020018360020b81526020018260020b8152506001600088815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001601a6101000a81548162ffffff021916908360020b62ffffff160217905550606082015181600001601d6101000a81548162ffffff021916908360020b62ffffff1602179055509050508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16877fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f60405160405180910390a483156106ef5760a08414156106ab576106a66106a085870187612a57565b87611964565b6106ef565b60006106b985870187612848565b905060005b81518110156106ec576106e48282815181106106d657fe5b602002602001015189611964565b6001016106be565b50505b507f150b7a0200000000000000000000000000000000000000000000000000000000979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116610769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613183565b60008281526001602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612e86565b60008381526001602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff868116918217909255915191929084169186917fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f91a4505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360209081526040808320338452909152902054811580159061088957508082105b156108915750805b73ffffffffffffffffffffffffffffffffffffffff841660009081526003602090815260408083203384529091529020805482900390556108d3848483611ed1565b8273ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f72418260405161091991906138b9565b60405180910390a29392505050565b73ffffffffffffffffffffffffffffffffffffffff8216301415610978576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906137b7565b6000838152600160209081526040918290208251608081018452905473ffffffffffffffffffffffffffffffffffffffff8116825265ffffffffffff740100000000000000000000000000000000000000008204169282018390527a0100000000000000000000000000000000000000000000000000008104600290810b810b810b948301949094527d0100000000000000000000000000000000000000000000000000000000009004830b830b90920b606083015215610a65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613046565b805173ffffffffffffffffffffffffffffffffffffffff163314610ab5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613481565b6000848152600160205260408082208290558251905173ffffffffffffffffffffffffffffffffffffffff9091169086907fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f908490a46040517fb88d4fde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b88d4fde90610b83903090879089908890600401612cac565b600060405180830381600087803b158015610b9d57600080fd5b505af1158015610bb1573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008111610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906135be565b8160400151421115610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906131e0565b7f0000000000000000000000000000000000000000000000000000000000000000428360400151031115610cb7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061361b565b8160600151826040015110610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906136d7565b7f000000000000000000000000000000000000000000000000000000000000000082604001518360600151031115610d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613679565b6000610d67836120ad565b60008181526020819052604090208054840190558351909150610d8c903330856120de565b826020015173ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff167fa876344e28d4b5191ad03bc0d43f740e3695827ab0faccac739930b915ef8b0285604001518660600151876080015187604051610e039493929190613920565b60405180910390a3505050565b6000602081905290815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff8116907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1683565b60608167ffffffffffffffff81118015610e8057600080fd5b50604051908082528060200260200182016040528015610eb457816020015b6060815260200190600190039081610e9f5790505b50905060005b82811015610fba5760008030868685818110610ed257fe5b9050602002810190610ee49190613951565b604051610ef2929190612c9c565b600060405180830381855af49150503d8060008114610f2d576040519150601f19603f3d011682016040523d82523d6000602084013e610f32565b606091505b509150915081610f9857604481511015610f4b57600080fd5b60048101905080806020019051810190610f6591906129df565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449190612e16565b80848481518110610fa557fe5b60209081029190910101525050600101610eba565b5092915050565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169065ffffffffffff74010000000000000000000000000000000000000000820416907a0100000000000000000000000000000000000000000000000000008104600290810b917d0100000000000000000000000000000000000000000000000000000000009004900b84565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081606001514210156110b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612f66565b60006110c2836120ad565b6000818152602081905260409020805493509091508261110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612e29565b60018101547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1615611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906134de565b6000815583516080850151611186919085611ed1565b817f65124e6175aa9904f40735e87e2a37c76e87a609b855287bb4d1aba8257d9763846040516111b691906138b9565b60405180910390a25050919050565b60008281526002602090815260408083208484529091529020805473ffffffffffffffffffffffffffffffffffffffff8116916bffffffffffffffffffffffff740100000000000000000000000000000000000000009092048216918214156112425760018101546fffffffffffffffffffffffffffffffff1691505b509250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061127c856120ad565b905060008061128b86846111c5565b915091506000816fffffffffffffffffffffffffffffffff16116112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612f09565b60008681526001602081815260408084208151608081018352905473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000080830465ffffffffffff16848701527a0100000000000000000000000000000000000000000000000000008304600290810b810b810b8587019081527d010000000000000000000000000000000000000000000000000000000000909404810b810b900b60608086019182528c8a52898852868a2087519182018852805482529098015480841689890152919091046bffffffffffffffffffffffff1687860152948e01519151945193517fa38807f200000000000000000000000000000000000000000000000000000000815292969491169263a38807f29261140e929190600401612e02565b60606040518083038186803b15801561142657600080fd5b505afa15801561143a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145e9190612986565b50915050611482826000015183602001518c604001518d60600151888a87426122c3565b909b909a5098505050505050505050565b600360209081526000928352604080842090915290825290205481565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16331461150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613561565b6115178282611964565b5050565b6000818152600160209081526040918290208251608081018452905473ffffffffffffffffffffffffffffffffffffffff8116825265ffffffffffff74010000000000000000000000000000000000000000820416928201929092527a0100000000000000000000000000000000000000000000000000008204600290810b810b810b938201939093527d010000000000000000000000000000000000000000000000000000000000909104820b820b90910b60608083019190915283015142101561163157805173ffffffffffffffffffffffffffffffffffffffff163314611631576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061331e565b600061163c846120ad565b905060008061164b85846111c5565b91509150806fffffffffffffffffffffffffffffffff166000141561169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612fe9565b600083815260208181526040808320888452600180845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff65ffffffffffff740100000000000000000000000000000000000000008084048216830190911681027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff9093169290921790925591830180546bffffffffffffffffffffffff848204811690930190921690920273ffffffffffffffffffffffffffffffffffffffff91821617909155928a01518883015160608a015193517fa38807f2000000000000000000000000000000000000000000000000000000008152929594919091169263a38807f2926117b7929190600401612e02565b60606040518083038186803b1580156117cf57600080fd5b505afa1580156117e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118079190612986565b508354600185015460408c015160608d0151939550600094508493611848939273ffffffffffffffffffffffffffffffffffffffff169190898b89426122c3565b6001860180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff9182168401821617909155865483900387558c51811660009081526003602090815260408083208e5190941683529281528282208054860190558d8252600281528282208c8352905290812090815591935091506bffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff87161061192a576001810180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b60405188908b907fe1ba67e807ae0efa0a9549f9520ddc15c27f0a4dae2bc045e800ca66a940778f90600090a35050505050505050505050565b81604001514210156119a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906133a1565b816060015142106119df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613126565b60006119ea836120ad565b600081815260208190526040902054909150611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906132c1565b60008281526002602090815260408083208484529091529020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1615611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906130c9565b600080600080611afa7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000088612345565b9350935093509350866020015173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906133fe565b6000816fffffffffffffffffffffffffffffffff1611611bb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613263565b6000868152600160208181526040808420805465ffffffffffff740100000000000000000000000000000000000000008083048216870190911681027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff9092169190911790915589855291849052808420830180546bffffffffffffffffffffffff848204811690950190941690920273ffffffffffffffffffffffffffffffffffffffff93841617909155517fa38807f20000000000000000000000000000000000000000000000000000000081529086169063a38807f290611ca19087908790600401612e02565b60606040518083038186803b158015611cb957600080fd5b505afa158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf19190612986565b509150506bffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff831610611e0a576040805160608101825273ffffffffffffffffffffffffffffffffffffffff80841682526bffffffffffffffffffffffff60208084018281526fffffffffffffffffffffffffffffffff80891686880190815260008f8152600285528881208f82529094529690922094518554915190931674010000000000000000000000000000000000000000029284167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617909216178255915160019091018054919092167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611e8e565b6000878152600260209081526040808320898452909152902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169190911716740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b85877f3fe90ccd0a34e28f2b4b7a1e8323415ed9dd595f4eec5dfd461d18c2df336dbd84604051611ebf9190613864565b60405180910390a35050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b60208310611fa657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611f69565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612008576040519150601f19603f3d011682016040523d82523d6000602084013e61200d565b606091505b509150915081801561203b57508051158061203b575080806020019051602081101561203857600080fd5b50515b6120a657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5050505050565b6000816040516020016120c09190613814565b6040516020818303038152906040528051906020012090505b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b602083106121bb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161217e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461221d576040519150601f19603f3d011682016040523d82523d6000602084013e612222565b606091505b5091509150818015612250575080511580612250575080806020019051602081101561224d57600080fd5b50515b6122bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b505050505050565b600080878310156122d057fe5b508383036fffffffffffffffffffffffffffffffff861602600073ffffffffffffffffffffffffffffffffffffffff8a1660808a61230e8b8861244e565b03901b0390506123358b8373ffffffffffffffffffffffffffffffffffffffff1683612467565b9250509850989650505050505050565b60008060008060008060008873ffffffffffffffffffffffffffffffffffffffff166399fbab88896040518263ffffffff1660e01b8152600401808281526020019150506101806040518083038186803b1580156123a257600080fd5b505afa1580156123b6573d6000803e3d6000fd5b505050506040513d6101808110156123cd57600080fd5b50604080820151606080840151608085015160a086015160c087015160e0909701518651948501875273ffffffffffffffffffffffffffffffffffffffff80871686528416602086015262ffffff8316968501969096529b50949950929750909550909350909150612440908b90612534565b965050505093509350935093565b60008183101561245e5781612460565b825b9392505050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709868602925082811090839003039050806124bb57600084116124b057600080fd5b508290049050612460565b8084116124c757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061257657600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b80516120d981613a4f565b8051600281900b81146120d957600080fd5b600060a08284031215612698578081fd5b60405160a0810181811067ffffffffffffffff821117156126b557fe5b60405290508082356126c681613a4f565b815260208301356126d681613a4f565b80602083015250604083013560408201526060830135606082015260808301356126ff81613a4f565b6080919091015292915050565b80516fffffffffffffffffffffffffffffffff811681146120d957600080fd5b805162ffffff811681146120d957600080fd5b600080600080600060808688031215612756578081fd5b853561276181613a4f565b9450602086013561277181613a4f565b935060408601359250606086013567ffffffffffffffff80821115612794578283fd5b818801915088601f8301126127a7578283fd5b8135818111156127b5578384fd5b8960208285010111156127c6578384fd5b9699959850939650602001949392505050565b600080602083850312156127eb578182fd5b823567ffffffffffffffff80821115612802578384fd5b818501915085601f830112612815578384fd5b813581811115612823578485fd5b8660208083028501011115612836578485fd5b60209290920196919550909350505050565b6000602080838503121561285a578182fd5b823567ffffffffffffffff80821115612871578384fd5b818501915085601f830112612884578384fd5b81358181111561289057fe5b61289d84858302016139bb565b818152848101925083850160a0808402860187018a10156128bc578788fd5b8795505b838610156128e8576128d28a83612687565b85526001959095019493860193908101906128c0565b509098975050505050505050565b600060208284031215612907578081fd5b5035919050565b60008060408385031215612920578182fd5b823561292b81613a4f565b9150602083013561293b81613a4f565b809150509250929050565b60008060006060848603121561295a578081fd5b833561296581613a4f565b9250602084013561297581613a4f565b929592945050506040919091013590565b60008060006060848603121561299a578081fd5b83518060060b81146129aa578182fd5b60208501519093506129bb81613a4f565b604085015190925063ffffffff811681146129d4578182fd5b809150509250925092565b6000602082840312156129f0578081fd5b815167ffffffffffffffff811115612a06578182fd5b8201601f81018413612a16578182fd5b8051612a29612a24826139df565b6139bb565b818152856020838501011115612a3d578384fd5b612a4e826020830160208601613a1f565b95945050505050565b600060a08284031215612a68578081fd5b6124608383612687565b60008060c08385031215612a84578182fd5b612a8e8484612687565b9460a0939093013593505050565b60008060408385031215612aae578182fd5b82359150602083013561293b81613a4f565b600080600060608486031215612ad4578081fd5b833592506020840135612ae681613a4f565b9150604084013567ffffffffffffffff811115612b01578182fd5b8401601f81018613612b11578182fd5b8035612b1f612a24826139df565b818152876020838501011115612b33578384fd5b8160208401602083013783602083830101528093505050509250925092565b60008060408385031215612b64578182fd5b50508035926020909101359150565b6000806000806000806000806000806000806101808d8f031215612b9557898afd5b8c516bffffffffffffffffffffffff81168114612bb0578a8bfd5b9b50612bbe60208e0161266a565b9a50612bcc60408e0161266a565b9950612bda60608e0161266a565b9850612be860808e0161272c565b9750612bf660a08e01612675565b9650612c0460c08e01612675565b9550612c1260e08e0161270c565b94506101008d015193506101208d01519250612c316101408e0161270c565b9150612c406101608e0161270c565b90509295989b509295989b509295989b565b60008151808452612c6a816020860160208601613a1f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612ceb6080830184612c52565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff94909416845265ffffffffffff929092166020840152600290810b60408401520b606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612da7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612d95858351612c52565b94509285019290850190600101612d5b565b5092979650505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600292830b8152910b602082015260400190565b6000602082526124606020830184612c52565b60208082526032908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206e60408201527f6f20726566756e6420617661696c61626c650000000000000000000000000000606082015260800190565b60208082526045908201527f556e697377617056335374616b65723a3a7472616e736665724465706f73697460408201527f3a2063616e206f6e6c792062652063616c6c6564206279206465706f7369742060608201527f6f776e6572000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526034908201527f556e697377617056335374616b65723a3a676574526577617264496e666f3a2060408201527f7374616b6520646f6573206e6f74206578697374000000000000000000000000606082015260800190565b60208082526043908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206360408201527f616e6e6f7420656e6420696e63656e74697665206265666f726520656e64207460608201527f696d650000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526033908201527f556e697377617056335374616b65723a3a756e7374616b65546f6b656e3a207360408201527f74616b6520646f6573206e6f7420657869737400000000000000000000000000606082015260800190565b60208082526042908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f63616e6e6f7420776974686472617720746f6b656e207768696c65207374616b60608201527f6564000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526031908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20746f6b60408201527f656e20616c7265616479207374616b6564000000000000000000000000000000606082015260800190565b6020808252602c908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20696e6360408201527f656e7469766520656e6465640000000000000000000000000000000000000000606082015260800190565b6020808252603c908201527f556e697377617056335374616b65723a3a7472616e736665724465706f73697460408201527f3a20696e76616c6964207472616e7366657220726563697069656e7400000000606082015260800190565b60208082526049908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a2073746172742074696d65206d757374206265206e6f77206f7220696e207460608201527f6865206675747572650000000000000000000000000000000000000000000000608082015260a00190565b602080825260409082018190527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a2063616e908201527f6e6f74207374616b6520746f6b656e20776974682030206c6971756964697479606082015260800190565b60208082526033908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a206e6f6e60408201527f2d6578697374656e7420696e63656e7469766500000000000000000000000000606082015260800190565b60208082526056908201527f556e697377617056335374616b65723a3a756e7374616b65546f6b656e3a206f60408201527f6e6c79206f776e65722063616e20776974686472617720746f6b656e2062656660608201527f6f726520696e63656e7469766520656e642074696d6500000000000000000000608082015260a00190565b60208082526032908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20696e6360408201527f656e74697665206e6f7420737461727465640000000000000000000000000000606082015260800190565b60208082526041908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20746f6b60408201527f656e20706f6f6c206973206e6f742074686520696e63656e7469766520706f6f60608201527f6c00000000000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603d908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f6f6e6c79206f776e65722063616e20776974686472617720746f6b656e000000606082015260800190565b6020808252604d908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206360408201527f616e6e6f7420656e6420696e63656e74697665207768696c65206465706f736960608201527f747320617265207374616b656400000000000000000000000000000000000000608082015260a00190565b60208082526037908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a206f6e6c60408201527f79206f776e65722063616e207374616b6520746f6b656e000000000000000000606082015260800190565b60208082526039908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a20726577617264206d75737420626520706f73697469766500000000000000606082015260800190565b602080825260409082018190527f556e697377617056335374616b65723a3a637265617465496e63656e74697665908201527f3a2073746172742074696d6520746f6f2066617220696e746f20667574757265606082015260800190565b602080825260409082018190527f556e697377617056335374616b65723a3a637265617465496e63656e74697665908201527f3a20696e63656e74697665206475726174696f6e20697320746f6f206c6f6e67606082015260800190565b60208082526044908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a2073746172742074696d65206d757374206265206265666f726520656e642060608201527f74696d6500000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526032908201527f556e697377617056335374616b65723a3a6f6e4552433732315265636569766560408201527f643a206e6f74206120756e697633206e66740000000000000000000000000000606082015260800190565b60208082526039908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f63616e6e6f7420776974686472617720746f207374616b657200000000000000606082015260800190565b815173ffffffffffffffffffffffffffffffffffffffff90811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b6fffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b92835273ffffffffffffffffffffffffffffffffffffffff9190911660208301526bffffffffffffffffffffffff16604082015260600190565b938452602084019290925273ffffffffffffffffffffffffffffffffffffffff166040830152606082015260800190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613985578283fd5b83018035915067ffffffffffffffff82111561399f578283fd5b6020019150368190038213156139b457600080fd5b9250929050565b60405181810167ffffffffffffffff811182821017156139d757fe5b604052919050565b600067ffffffffffffffff8211156139f357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015613a3a578181015183820152602001613a22565b83811115613a49576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613a7157600080fd5b5056fea164736f6c6343000706000a\",\n      deployedBytecode: \"0x6080604052600436106101295760003560e01c8063b02c43d0116100a5578063c45a015511610074578063e70b9e2711610059578063e70b9e271461034f578063f2d2909b1461036f578063f549ab421461038f57610129565b8063c45a01551461030c578063d953186e1461032157610129565b8063b02c43d01461026c578063b44a27221461029c578063b5ada6e4146102be578063c36c1ea5146102de57610129565b80633c423f0b116100fc5780635cc5e3d9116100e15780635cc5e3d9146101fd578063607777951461021d578063ac9650d81461024c57610129565b80633c423f0b146101c85780633dc0714b146101e857610129565b806301b754401461012e578063150b7a021461015957806326bfee04146101865780632f2d783d146101a8575b600080fd5b34801561013a57600080fd5b506101436103af565b60405161015091906138b9565b60405180910390f35b34801561016557600080fd5b5061017961017436600461273f565b6103d3565b6040516101509190612db4565b34801561019257600080fd5b506101a66101a1366004612a9c565b61071c565b005b3480156101b457600080fd5b506101436101c3366004612946565b61084a565b3480156101d457600080fd5b506101a66101e3366004612ac0565b610928565b3480156101f457600080fd5b50610143610bbb565b34801561020957600080fd5b506101a6610218366004612a72565b610bdf565b34801561022957600080fd5b5061023d6102383660046128f6565b610e10565b604051610150939291906138e6565b61025f61025a3660046127d9565b610e67565b6040516101509190612d36565b34801561027857600080fd5b5061028c6102873660046128f6565b610fc1565b6040516101509493929190612cf5565b3480156102a857600080fd5b506102b1611053565b6040516101509190612de1565b3480156102ca57600080fd5b506101436102d9366004612a57565b611077565b3480156102ea57600080fd5b506102fe6102f9366004612b52565b6111c5565b604051610150929190613881565b34801561031857600080fd5b506102b161124a565b34801561032d57600080fd5b5061034161033c366004612a72565b61126e565b6040516101509291906138c2565b34801561035b57600080fd5b5061014361036a36600461290e565b611493565b34801561037b57600080fd5b506101a661038a366004612a72565b6114b0565b34801561039b57600080fd5b506101a66103aa366004612a72565b61151b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461044d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061375a565b60405180910390fd5b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166399fbab88876040518263ffffffff1660e01b81526004016104a991906138b9565b6101806040518083038186803b1580156104c257600080fd5b505afa1580156104d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fa9190612b73565b505050505096509650505050505060405180608001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001600065ffffffffffff1681526020018360020b81526020018260020b8152506001600088815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001601a6101000a81548162ffffff021916908360020b62ffffff160217905550606082015181600001601d6101000a81548162ffffff021916908360020b62ffffff1602179055509050508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16877fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f60405160405180910390a483156106ef5760a08414156106ab576106a66106a085870187612a57565b87611964565b6106ef565b60006106b985870187612848565b905060005b81518110156106ec576106e48282815181106106d657fe5b602002602001015189611964565b6001016106be565b50505b507f150b7a0200000000000000000000000000000000000000000000000000000000979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116610769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613183565b60008281526001602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612e86565b60008381526001602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff868116918217909255915191929084169186917fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f91a4505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360209081526040808320338452909152902054811580159061088957508082105b156108915750805b73ffffffffffffffffffffffffffffffffffffffff841660009081526003602090815260408083203384529091529020805482900390556108d3848483611ed1565b8273ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f72418260405161091991906138b9565b60405180910390a29392505050565b73ffffffffffffffffffffffffffffffffffffffff8216301415610978576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906137b7565b6000838152600160209081526040918290208251608081018452905473ffffffffffffffffffffffffffffffffffffffff8116825265ffffffffffff740100000000000000000000000000000000000000008204169282018390527a0100000000000000000000000000000000000000000000000000008104600290810b810b810b948301949094527d0100000000000000000000000000000000000000000000000000000000009004830b830b90920b606083015215610a65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613046565b805173ffffffffffffffffffffffffffffffffffffffff163314610ab5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613481565b6000848152600160205260408082208290558251905173ffffffffffffffffffffffffffffffffffffffff9091169086907fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f908490a46040517fb88d4fde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b88d4fde90610b83903090879089908890600401612cac565b600060405180830381600087803b158015610b9d57600080fd5b505af1158015610bb1573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008111610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906135be565b8160400151421115610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906131e0565b7f0000000000000000000000000000000000000000000000000000000000000000428360400151031115610cb7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061361b565b8160600151826040015110610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906136d7565b7f000000000000000000000000000000000000000000000000000000000000000082604001518360600151031115610d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613679565b6000610d67836120ad565b60008181526020819052604090208054840190558351909150610d8c903330856120de565b826020015173ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff167fa876344e28d4b5191ad03bc0d43f740e3695827ab0faccac739930b915ef8b0285604001518660600151876080015187604051610e039493929190613920565b60405180910390a3505050565b6000602081905290815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff8116907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1683565b60608167ffffffffffffffff81118015610e8057600080fd5b50604051908082528060200260200182016040528015610eb457816020015b6060815260200190600190039081610e9f5790505b50905060005b82811015610fba5760008030868685818110610ed257fe5b9050602002810190610ee49190613951565b604051610ef2929190612c9c565b600060405180830381855af49150503d8060008114610f2d576040519150601f19603f3d011682016040523d82523d6000602084013e610f32565b606091505b509150915081610f9857604481511015610f4b57600080fd5b60048101905080806020019051810190610f6591906129df565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449190612e16565b80848481518110610fa557fe5b60209081029190910101525050600101610eba565b5092915050565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169065ffffffffffff74010000000000000000000000000000000000000000820416907a0100000000000000000000000000000000000000000000000000008104600290810b917d0100000000000000000000000000000000000000000000000000000000009004900b84565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081606001514210156110b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612f66565b60006110c2836120ad565b6000818152602081905260409020805493509091508261110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612e29565b60018101547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1615611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906134de565b6000815583516080850151611186919085611ed1565b817f65124e6175aa9904f40735e87e2a37c76e87a609b855287bb4d1aba8257d9763846040516111b691906138b9565b60405180910390a25050919050565b60008281526002602090815260408083208484529091529020805473ffffffffffffffffffffffffffffffffffffffff8116916bffffffffffffffffffffffff740100000000000000000000000000000000000000009092048216918214156112425760018101546fffffffffffffffffffffffffffffffff1691505b509250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061127c856120ad565b905060008061128b86846111c5565b915091506000816fffffffffffffffffffffffffffffffff16116112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612f09565b60008681526001602081815260408084208151608081018352905473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000080830465ffffffffffff16848701527a0100000000000000000000000000000000000000000000000000008304600290810b810b810b8587019081527d010000000000000000000000000000000000000000000000000000000000909404810b810b900b60608086019182528c8a52898852868a2087519182018852805482529098015480841689890152919091046bffffffffffffffffffffffff1687860152948e01519151945193517fa38807f200000000000000000000000000000000000000000000000000000000815292969491169263a38807f29261140e929190600401612e02565b60606040518083038186803b15801561142657600080fd5b505afa15801561143a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145e9190612986565b50915050611482826000015183602001518c604001518d60600151888a87426122c3565b909b909a5098505050505050505050565b600360209081526000928352604080842090915290825290205481565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16331461150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613561565b6115178282611964565b5050565b6000818152600160209081526040918290208251608081018452905473ffffffffffffffffffffffffffffffffffffffff8116825265ffffffffffff74010000000000000000000000000000000000000000820416928201929092527a0100000000000000000000000000000000000000000000000000008204600290810b810b810b938201939093527d010000000000000000000000000000000000000000000000000000000000909104820b820b90910b60608083019190915283015142101561163157805173ffffffffffffffffffffffffffffffffffffffff163314611631576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061331e565b600061163c846120ad565b905060008061164b85846111c5565b91509150806fffffffffffffffffffffffffffffffff166000141561169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612fe9565b600083815260208181526040808320888452600180845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff65ffffffffffff740100000000000000000000000000000000000000008084048216830190911681027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff9093169290921790925591830180546bffffffffffffffffffffffff848204811690930190921690920273ffffffffffffffffffffffffffffffffffffffff91821617909155928a01518883015160608a015193517fa38807f2000000000000000000000000000000000000000000000000000000008152929594919091169263a38807f2926117b7929190600401612e02565b60606040518083038186803b1580156117cf57600080fd5b505afa1580156117e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118079190612986565b508354600185015460408c015160608d0151939550600094508493611848939273ffffffffffffffffffffffffffffffffffffffff169190898b89426122c3565b6001860180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff9182168401821617909155865483900387558c51811660009081526003602090815260408083208e5190941683529281528282208054860190558d8252600281528282208c8352905290812090815591935091506bffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff87161061192a576001810180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b60405188908b907fe1ba67e807ae0efa0a9549f9520ddc15c27f0a4dae2bc045e800ca66a940778f90600090a35050505050505050505050565b81604001514210156119a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906133a1565b816060015142106119df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613126565b60006119ea836120ad565b600081815260208190526040902054909150611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906132c1565b60008281526002602090815260408083208484529091529020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1615611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906130c9565b600080600080611afa7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000088612345565b9350935093509350866020015173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906133fe565b6000816fffffffffffffffffffffffffffffffff1611611bb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613263565b6000868152600160208181526040808420805465ffffffffffff740100000000000000000000000000000000000000008083048216870190911681027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff9092169190911790915589855291849052808420830180546bffffffffffffffffffffffff848204811690950190941690920273ffffffffffffffffffffffffffffffffffffffff93841617909155517fa38807f20000000000000000000000000000000000000000000000000000000081529086169063a38807f290611ca19087908790600401612e02565b60606040518083038186803b158015611cb957600080fd5b505afa158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf19190612986565b509150506bffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff831610611e0a576040805160608101825273ffffffffffffffffffffffffffffffffffffffff80841682526bffffffffffffffffffffffff60208084018281526fffffffffffffffffffffffffffffffff80891686880190815260008f8152600285528881208f82529094529690922094518554915190931674010000000000000000000000000000000000000000029284167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617909216178255915160019091018054919092167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611e8e565b6000878152600260209081526040808320898452909152902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169190911716740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b85877f3fe90ccd0a34e28f2b4b7a1e8323415ed9dd595f4eec5dfd461d18c2df336dbd84604051611ebf9190613864565b60405180910390a35050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b60208310611fa657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611f69565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612008576040519150601f19603f3d011682016040523d82523d6000602084013e61200d565b606091505b509150915081801561203b57508051158061203b575080806020019051602081101561203857600080fd5b50515b6120a657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5050505050565b6000816040516020016120c09190613814565b6040516020818303038152906040528051906020012090505b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b602083106121bb57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161217e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461221d576040519150601f19603f3d011682016040523d82523d6000602084013e612222565b606091505b5091509150818015612250575080511580612250575080806020019051602081101561224d57600080fd5b50515b6122bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b505050505050565b600080878310156122d057fe5b508383036fffffffffffffffffffffffffffffffff861602600073ffffffffffffffffffffffffffffffffffffffff8a1660808a61230e8b8861244e565b03901b0390506123358b8373ffffffffffffffffffffffffffffffffffffffff1683612467565b9250509850989650505050505050565b60008060008060008060008873ffffffffffffffffffffffffffffffffffffffff166399fbab88896040518263ffffffff1660e01b8152600401808281526020019150506101806040518083038186803b1580156123a257600080fd5b505afa1580156123b6573d6000803e3d6000fd5b505050506040513d6101808110156123cd57600080fd5b50604080820151606080840151608085015160a086015160c087015160e0909701518651948501875273ffffffffffffffffffffffffffffffffffffffff80871686528416602086015262ffffff8316968501969096529b50949950929750909550909350909150612440908b90612534565b965050505093509350935093565b60008183101561245e5781612460565b825b9392505050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709868602925082811090839003039050806124bb57600084116124b057600080fd5b508290049050612460565b8084116124c757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061257657600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b80516120d981613a4f565b8051600281900b81146120d957600080fd5b600060a08284031215612698578081fd5b60405160a0810181811067ffffffffffffffff821117156126b557fe5b60405290508082356126c681613a4f565b815260208301356126d681613a4f565b80602083015250604083013560408201526060830135606082015260808301356126ff81613a4f565b6080919091015292915050565b80516fffffffffffffffffffffffffffffffff811681146120d957600080fd5b805162ffffff811681146120d957600080fd5b600080600080600060808688031215612756578081fd5b853561276181613a4f565b9450602086013561277181613a4f565b935060408601359250606086013567ffffffffffffffff80821115612794578283fd5b818801915088601f8301126127a7578283fd5b8135818111156127b5578384fd5b8960208285010111156127c6578384fd5b9699959850939650602001949392505050565b600080602083850312156127eb578182fd5b823567ffffffffffffffff80821115612802578384fd5b818501915085601f830112612815578384fd5b813581811115612823578485fd5b8660208083028501011115612836578485fd5b60209290920196919550909350505050565b6000602080838503121561285a578182fd5b823567ffffffffffffffff80821115612871578384fd5b818501915085601f830112612884578384fd5b81358181111561289057fe5b61289d84858302016139bb565b818152848101925083850160a0808402860187018a10156128bc578788fd5b8795505b838610156128e8576128d28a83612687565b85526001959095019493860193908101906128c0565b509098975050505050505050565b600060208284031215612907578081fd5b5035919050565b60008060408385031215612920578182fd5b823561292b81613a4f565b9150602083013561293b81613a4f565b809150509250929050565b60008060006060848603121561295a578081fd5b833561296581613a4f565b9250602084013561297581613a4f565b929592945050506040919091013590565b60008060006060848603121561299a578081fd5b83518060060b81146129aa578182fd5b60208501519093506129bb81613a4f565b604085015190925063ffffffff811681146129d4578182fd5b809150509250925092565b6000602082840312156129f0578081fd5b815167ffffffffffffffff811115612a06578182fd5b8201601f81018413612a16578182fd5b8051612a29612a24826139df565b6139bb565b818152856020838501011115612a3d578384fd5b612a4e826020830160208601613a1f565b95945050505050565b600060a08284031215612a68578081fd5b6124608383612687565b60008060c08385031215612a84578182fd5b612a8e8484612687565b9460a0939093013593505050565b60008060408385031215612aae578182fd5b82359150602083013561293b81613a4f565b600080600060608486031215612ad4578081fd5b833592506020840135612ae681613a4f565b9150604084013567ffffffffffffffff811115612b01578182fd5b8401601f81018613612b11578182fd5b8035612b1f612a24826139df565b818152876020838501011115612b33578384fd5b8160208401602083013783602083830101528093505050509250925092565b60008060408385031215612b64578182fd5b50508035926020909101359150565b6000806000806000806000806000806000806101808d8f031215612b9557898afd5b8c516bffffffffffffffffffffffff81168114612bb0578a8bfd5b9b50612bbe60208e0161266a565b9a50612bcc60408e0161266a565b9950612bda60608e0161266a565b9850612be860808e0161272c565b9750612bf660a08e01612675565b9650612c0460c08e01612675565b9550612c1260e08e0161270c565b94506101008d015193506101208d01519250612c316101408e0161270c565b9150612c406101608e0161270c565b90509295989b509295989b509295989b565b60008151808452612c6a816020860160208601613a1f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612ceb6080830184612c52565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff94909416845265ffffffffffff929092166020840152600290810b60408401520b606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612da7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612d95858351612c52565b94509285019290850190600101612d5b565b5092979650505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600292830b8152910b602082015260400190565b6000602082526124606020830184612c52565b60208082526032908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206e60408201527f6f20726566756e6420617661696c61626c650000000000000000000000000000606082015260800190565b60208082526045908201527f556e697377617056335374616b65723a3a7472616e736665724465706f73697460408201527f3a2063616e206f6e6c792062652063616c6c6564206279206465706f7369742060608201527f6f776e6572000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526034908201527f556e697377617056335374616b65723a3a676574526577617264496e666f3a2060408201527f7374616b6520646f6573206e6f74206578697374000000000000000000000000606082015260800190565b60208082526043908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206360408201527f616e6e6f7420656e6420696e63656e74697665206265666f726520656e64207460608201527f696d650000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526033908201527f556e697377617056335374616b65723a3a756e7374616b65546f6b656e3a207360408201527f74616b6520646f6573206e6f7420657869737400000000000000000000000000606082015260800190565b60208082526042908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f63616e6e6f7420776974686472617720746f6b656e207768696c65207374616b60608201527f6564000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526031908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20746f6b60408201527f656e20616c7265616479207374616b6564000000000000000000000000000000606082015260800190565b6020808252602c908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20696e6360408201527f656e7469766520656e6465640000000000000000000000000000000000000000606082015260800190565b6020808252603c908201527f556e697377617056335374616b65723a3a7472616e736665724465706f73697460408201527f3a20696e76616c6964207472616e7366657220726563697069656e7400000000606082015260800190565b60208082526049908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a2073746172742074696d65206d757374206265206e6f77206f7220696e207460608201527f6865206675747572650000000000000000000000000000000000000000000000608082015260a00190565b602080825260409082018190527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a2063616e908201527f6e6f74207374616b6520746f6b656e20776974682030206c6971756964697479606082015260800190565b60208082526033908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a206e6f6e60408201527f2d6578697374656e7420696e63656e7469766500000000000000000000000000606082015260800190565b60208082526056908201527f556e697377617056335374616b65723a3a756e7374616b65546f6b656e3a206f60408201527f6e6c79206f776e65722063616e20776974686472617720746f6b656e2062656660608201527f6f726520696e63656e7469766520656e642074696d6500000000000000000000608082015260a00190565b60208082526032908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20696e6360408201527f656e74697665206e6f7420737461727465640000000000000000000000000000606082015260800190565b60208082526041908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20746f6b60408201527f656e20706f6f6c206973206e6f742074686520696e63656e7469766520706f6f60608201527f6c00000000000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603d908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f6f6e6c79206f776e65722063616e20776974686472617720746f6b656e000000606082015260800190565b6020808252604d908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206360408201527f616e6e6f7420656e6420696e63656e74697665207768696c65206465706f736960608201527f747320617265207374616b656400000000000000000000000000000000000000608082015260a00190565b60208082526037908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a206f6e6c60408201527f79206f776e65722063616e207374616b6520746f6b656e000000000000000000606082015260800190565b60208082526039908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a20726577617264206d75737420626520706f73697469766500000000000000606082015260800190565b602080825260409082018190527f556e697377617056335374616b65723a3a637265617465496e63656e74697665908201527f3a2073746172742074696d6520746f6f2066617220696e746f20667574757265606082015260800190565b602080825260409082018190527f556e697377617056335374616b65723a3a637265617465496e63656e74697665908201527f3a20696e63656e74697665206475726174696f6e20697320746f6f206c6f6e67606082015260800190565b60208082526044908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a2073746172742074696d65206d757374206265206265666f726520656e642060608201527f74696d6500000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526032908201527f556e697377617056335374616b65723a3a6f6e4552433732315265636569766560408201527f643a206e6f74206120756e697633206e66740000000000000000000000000000606082015260800190565b60208082526039908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f63616e6e6f7420776974686472617720746f207374616b657200000000000000606082015260800190565b815173ffffffffffffffffffffffffffffffffffffffff90811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b6fffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b92835273ffffffffffffffffffffffffffffffffffffffff9190911660208301526bffffffffffffffffffffffff16604082015260600190565b938452602084019290925273ffffffffffffffffffffffffffffffffffffffff166040830152606082015260800190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613985578283fd5b83018035915067ffffffffffffffff82111561399f578283fd5b6020019150368190038213156139b457600080fd5b9250929050565b60405181810167ffffffffffffffff811182821017156139d757fe5b604052919050565b600067ffffffffffffffff8211156139f357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015613a3a578181015183820152602001613a22565b83811115613a49576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114613a7157600080fd5b5056fea164736f6c6343000706000a\",\n      linkReferences: {},\n      deployedLinkReferences: {}\n    };\n  }\n});\n\n// node_modules/@uniswap/v3-periphery/artifacts/contracts/SwapRouter.sol/SwapRouter.json\nvar require_SwapRouter = __commonJS({\n  \"node_modules/@uniswap/v3-periphery/artifacts/contracts/SwapRouter.sol/SwapRouter.json\"(exports2, module2) {\n    module2.exports = {\n      _format: \"hh-sol-artifact-1\",\n      contractName: \"SwapRouter\",\n      sourceName: \"contracts/SwapRouter.sol\",\n      abi: [\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"_factory\",\n              type: \"address\"\n            },\n            {\n              internalType: \"address\",\n              name: \"_WETH9\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"nonpayable\",\n          type: \"constructor\"\n        },\n        {\n          inputs: [],\n          name: \"WETH9\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"bytes\",\n                  name: \"path\",\n                  type: \"bytes\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"recipient\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"deadline\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountIn\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountOutMinimum\",\n                  type: \"uint256\"\n                }\n              ],\n              internalType: \"struct ISwapRouter.ExactInputParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"exactInput\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"address\",\n                  name: \"tokenIn\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"tokenOut\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint24\",\n                  name: \"fee\",\n                  type: \"uint24\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"recipient\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"deadline\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountIn\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountOutMinimum\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint160\",\n                  name: \"sqrtPriceLimitX96\",\n                  type: \"uint160\"\n                }\n              ],\n              internalType: \"struct ISwapRouter.ExactInputSingleParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"exactInputSingle\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountOut\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"bytes\",\n                  name: \"path\",\n                  type: \"bytes\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"recipient\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"deadline\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountOut\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountInMaximum\",\n                  type: \"uint256\"\n                }\n              ],\n              internalType: \"struct ISwapRouter.ExactOutputParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"exactOutput\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              components: [\n                {\n                  internalType: \"address\",\n                  name: \"tokenIn\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"tokenOut\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint24\",\n                  name: \"fee\",\n                  type: \"uint24\"\n                },\n                {\n                  internalType: \"address\",\n                  name: \"recipient\",\n                  type: \"address\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"deadline\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountOut\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint256\",\n                  name: \"amountInMaximum\",\n                  type: \"uint256\"\n                },\n                {\n                  internalType: \"uint160\",\n                  name: \"sqrtPriceLimitX96\",\n                  type: \"uint160\"\n                }\n              ],\n              internalType: \"struct ISwapRouter.ExactOutputSingleParams\",\n              name: \"params\",\n              type: \"tuple\"\n            }\n          ],\n          name: \"exactOutputSingle\",\n          outputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountIn\",\n              type: \"uint256\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"factory\",\n          outputs: [\n            {\n              internalType: \"address\",\n              name: \"\",\n              type: \"address\"\n            }\n          ],\n          stateMutability: \"view\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"bytes[]\",\n              name: \"data\",\n              type: \"bytes[]\"\n            }\n          ],\n          name: \"multicall\",\n          outputs: [\n            {\n              internalType: \"bytes[]\",\n              name: \"results\",\n              type: \"bytes[]\"\n            }\n          ],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [],\n          name: \"refundETH\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"value\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"deadline\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermit\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"nonce\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"expiry\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitAllowed\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"nonce\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"expiry\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitAllowedIfNecessary\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"value\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"deadline\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"uint8\",\n              name: \"v\",\n              type: \"uint8\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"r\",\n              type: \"bytes32\"\n            },\n            {\n              internalType: \"bytes32\",\n              name: \"s\",\n              type: \"bytes32\"\n            }\n          ],\n          name: \"selfPermitIfNecessary\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"sweepToken\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"address\",\n              name: \"token\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"feeBips\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"feeRecipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"sweepTokenWithFee\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"int256\",\n              name: \"amount0Delta\",\n              type: \"int256\"\n            },\n            {\n              internalType: \"int256\",\n              name: \"amount1Delta\",\n              type: \"int256\"\n            },\n            {\n              internalType: \"bytes\",\n              name: \"_data\",\n              type: \"bytes\"\n            }\n          ],\n          name: \"uniswapV3SwapCallback\",\n          outputs: [],\n          stateMutability: \"nonpayable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"unwrapWETH9\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          inputs: [\n            {\n              internalType: \"uint256\",\n              name: \"amountMinimum\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"recipient\",\n              type: \"address\"\n            },\n            {\n              internalType: \"uint256\",\n              name: \"feeBips\",\n              type: \"uint256\"\n            },\n            {\n              internalType: \"address\",\n              name: \"feeRecipient\",\n              type: \"address\"\n            }\n          ],\n          name: \"unwrapWETH9WithFee\",\n          outputs: [],\n          stateMutability: \"payable\",\n          type: \"function\"\n        },\n        {\n          stateMutability: \"payable\",\n          type: \"receive\"\n        }\n      ],\n      bytecode: \"0x60c06040526000196000553480156200001757600080fd5b506040516200302f3803806200302f8339810160408190526200003a9162000076565b6001600160601b0319606092831b8116608052911b1660a052620000ad565b80516001600160a01b03811681146200007157600080fd5b919050565b6000806040838503121562000089578182fd5b620000948362000059565b9150620000a46020840162000059565b90509250929050565b60805160601c60a05160601c612f26620001096000398061012f528061058352806106ad5280610747528061078752806108b15280611c435280611ca35280611d24525080610dc6528061140c5280611e265250612f266000f3fe6080604052600436106101125760003560e01c8063c04b8d59116100a5578063df2ab5bb11610074578063f28c049811610059578063f28c0498146102f5578063f3995c6714610308578063fa461e331461031b576101bd565b8063df2ab5bb146102cf578063e0e189a0146102e2576101bd565b8063c04b8d5914610281578063c2e3140a14610294578063c45a0155146102a7578063db3e2198146102bc576101bd565b80634aa4a4fc116100e15780634aa4a4fc146102195780639b2c0a371461023b578063a4a78f0c1461024e578063ac9650d814610261576101bd565b806312210e8a146101c2578063414bf389146101ca5780634659a494146101f357806349404b7c14610206576101bd565b366101bd573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742057455448390000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b6101bb61033b565b6101dd6101d83660046129f8565b61034d565b6040516101ea9190612df1565b60405180910390f35b6101bb610201366004612776565b6104bf565b6101bb610214366004612aff565b61057f565b34801561022557600080fd5b5061022e610745565b6040516101ea9190612c37565b6101bb610249366004612b2e565b610769565b6101bb61025c366004612776565b610981565b61027461026f3660046127d6565b610a56565b6040516101ea9190612caa565b6101dd61028f36600461294d565b610bb0565b6101bb6102a2366004612776565b610d0f565b3480156102b357600080fd5b5061022e610dc4565b6101dd6102ca3660046129f8565b610de8565b6101bb6102dd3660046126d7565b610f78565b6101bb6102f0366004612718565b611095565b6101dd610303366004612a14565b6111fb565b6101bb610316366004612776565b61132f565b34801561032757600080fd5b506101bb610336366004612868565b6113c7565b471561034b5761034b334761150e565b565b600081608001358061035d61165c565b11156103ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b61047060a08401356103e260808601606087016126b4565b6103f3610100870160e088016126b4565b604080518082019091528061040b60208a018a6126b4565b61041b60608b0160408c01612adc565b61042b60408c0160208d016126b4565b60405160200161043d93929190612bc1565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250611660565b91508260c001358210156104b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090612d72565b60405180910390fd5b50919050565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e48101839052905173ffffffffffffffffffffffffffffffffffffffff881691638fcbaf0c9161010480830192600092919082900301818387803b15801561055f57600080fd5b505af1158015610573573d6000803e3d6000fd5b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561060857600080fd5b505afa15801561061c573d6000803e3d6000fd5b505050506040513d602081101561063257600080fd5b50519050828110156106a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b8015610740577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561071e57600080fd5b505af1158015610732573d6000803e3d6000fd5b50505050610740828261150e565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008211801561077a575060648211155b61078357600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561080c57600080fd5b505afa158015610820573d6000803e3d6000fd5b505050506040513d602081101561083657600080fd5b50519050848110156108a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b801561097a577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561092257600080fd5b505af1158015610936573d6000803e3d6000fd5b50505050600061271061095285846117e690919063ffffffff16565b8161095957fe5b049050801561096c5761096c838261150e565b6109788582840361150e565b505b5050505050565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b158015610a1657600080fd5b505afa158015610a2a573d6000803e3d6000fd5b505050506040513d6020811015610a4057600080fd5b50511015610978576109788686868686866104bf565b60608167ffffffffffffffff81118015610a6f57600080fd5b50604051908082528060200260200182016040528015610aa357816020015b6060815260200190600190039081610a8e5790505b50905060005b82811015610ba95760008030868685818110610ac157fe5b9050602002810190610ad39190612dfa565b604051610ae1929190612c27565b600060405180830381855af49150503d8060008114610b1c576040519150601f19603f3d011682016040523d82523d6000602084013e610b21565b606091505b509150915081610b8757604481511015610b3a57600080fd5b60048101905080806020019051810190610b5491906128e3565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b09190612d28565b80848481518110610b9457fe5b60209081029190910101525050600101610aa9565b5092915050565b6000816040015180610bc061165c565b1115610c2d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b335b6000610c3e8560000151611810565b9050610c97856060015182610c57578660200151610c59565b305b60006040518060400160405280610c738b6000015161181c565b81526020018773ffffffffffffffffffffffffffffffffffffffff16815250611660565b60608601528015610cb7578451309250610cb09061182b565b8552610cc4565b8460600151935050610cca565b50610c2f565b8360800151831015610d08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090612d72565b5050919050565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051869173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b158015610d8457600080fd5b505afa158015610d98573d6000803e3d6000fd5b505050506040513d6020811015610dae57600080fd5b505110156109785761097886868686868661132f565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000816080013580610df861165c565b1115610e6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b610f0e60a0840135610e7d60808601606087016126b4565b610e8e610100870160e088016126b4565b6040518060400160405280886020016020810190610eac91906126b4565b610ebc60608b0160408c01612adc565b610ec960208c018c6126b4565b604051602001610edb93929190612bc1565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250611860565b91508260c00135821115610f4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090612d3b565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d602081101561100b57600080fd5b505190508281101561107e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b801561108f5761108f848383611a1c565b50505050565b6000821180156110a6575060648211155b6110af57600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b50519050848110156111b557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b80156109785760006127106111ca83866117e6565b816111d157fe5b04905080156111e5576111e5878483611a1c565b6111f28786838503611a1c565b50505050505050565b600081604001358061120b61165c565b111561127857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b6112eb606084013561129060408601602087016126b4565b60408051808201909152600090806112a88980612dfa565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525033602090910152611860565b5060005491508260800135821115610f4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090612d3b565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c48101839052905173ffffffffffffffffffffffffffffffffffffffff88169163d505accf9160e480830192600092919082900301818387803b15801561055f57600080fd5b60008413806113d65750600083135b6113df57600080fd5b60006113ed82840184612a4c565b905060008060006114018460000151611bf1565b9250925092506114337f0000000000000000000000000000000000000000000000000000000000000000848484611c22565b5060008060008a13611474578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610896114a5565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108a5b9150915081156114c4576114bf8587602001513384611c41565b610573565b85516114cf90611810565b156114f45785516114df9061182b565b86526114ee8133600089611860565b50610573565b806000819055508394506105738587602001513384611c41565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b6020831061158557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611548565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146115e7576040519150601f19603f3d011682016040523d82523d6000602084013e6115ec565b606091505b505090508061074057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b4290565b600073ffffffffffffffffffffffffffffffffffffffff8416611681573093505b60008060006116938560000151611bf1565b9194509250905073ffffffffffffffffffffffffffffffffffffffff808316908416106000806116c4868686611e1f565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856116ea8f611e5d565b73ffffffffffffffffffffffffffffffffffffffff8e161561170c578d611732565b8761172b5773fffd8963efd1fc6a506488495d951d5263988d25611732565b6401000276a45b8d6040516020016117439190612da9565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611772959493929190612c58565b6040805180830381600087803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190612845565b91509150826117d257816117d4565b805b6000039b9a5050505050505050505050565b6000821580611801575050818102818382816117fe57fe5b04145b61180a57600080fd5b92915050565b8051604211155b919050565b606061180a826000602b611e8f565b805160609061180a9083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe901611e8f565b600073ffffffffffffffffffffffffffffffffffffffff8416611881573093505b60008060006118938560000151611bf1565b9194509250905073ffffffffffffffffffffffffffffffffffffffff808416908316106000806118c4858786611e1f565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856118ea8f611e5d565b60000373ffffffffffffffffffffffffffffffffffffffff8e161561190f578d611935565b8761192e5773fffd8963efd1fc6a506488495d951d5263988d25611935565b6401000276a45b8d6040516020016119469190612da9565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611975959493929190612c58565b6040805180830381600087803b15801561198e57600080fd5b505af11580156119a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c69190612845565b915091506000836119db5781836000036119e1565b82826000035b909850905073ffffffffffffffffffffffffffffffffffffffff8a16611a0d578b8114611a0d57600080fd5b50505050505050949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b60208310611af157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611ab4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611b53576040519150601f19603f3d011682016040523d82523d6000602084013e611b58565b606091505b5091509150818015611b86575080511580611b865750808060200190516020811015611b8357600080fd5b50515b61097a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60008080611bff8482612076565b9250611c0c846014612176565b9050611c19846017612076565b91509193909250565b6000611c3885611c33868686612266565b6122e3565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611c9c5750804710155b15611de5577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611db357600080fd5b505af1158015611dc7573d6000803e3d6000fd5b505050506040513d6020811015611ddd57600080fd5b5061108f9050565b73ffffffffffffffffffffffffffffffffffffffff8316301415611e1357611e0e848383611a1c565b61108f565b61108f84848484612313565b6000611e557f0000000000000000000000000000000000000000000000000000000000000000611e50868686612266565b6124f0565b949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210611e8b57600080fd5b5090565b60608182601f011015611f0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b828284011015611f7457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b81830184511015611fe657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b606082158015612005576040519150600082526020820160405261206d565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561203e578051835260209283019201612026565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6000818260140110156120ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b816014018351101561215d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b6000818260030110156121ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b816003018351101561225d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b61226e612626565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1611156122a6579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b60006122ef83836124f0565b90503373ffffffffffffffffffffffffffffffffffffffff82161461180a57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b602083106123f057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016123b3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612452576040519150601f19603f3d011682016040523d82523d6000602084013e612457565b606091505b5091509150818015612485575080511580612485575080806020019051602081101561248257600080fd5b50515b61097857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061253257600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b604080516060810182526000808252602082018190529181019190915290565b803561181781612ef4565b600082601f830112612661578081fd5b813561267461266f82612e88565b612e64565b818152846020838601011115612688578283fd5b816020850160208301379081016020019190915292915050565b600061010082840312156104b9578081fd5b6000602082840312156126c5578081fd5b81356126d081612ef4565b9392505050565b6000806000606084860312156126eb578182fd5b83356126f681612ef4565b925060208401359150604084013561270d81612ef4565b809150509250925092565b600080600080600060a0868803121561272f578081fd5b853561273a81612ef4565b945060208601359350604086013561275181612ef4565b925060608601359150608086013561276881612ef4565b809150509295509295909350565b60008060008060008060c0878903121561278e578081fd5b863561279981612ef4565b95506020870135945060408701359350606087013560ff811681146127bc578182fd5b9598949750929560808101359460a0909101359350915050565b600080602083850312156127e8578182fd5b823567ffffffffffffffff808211156127ff578384fd5b818501915085601f830112612812578384fd5b813581811115612820578485fd5b8660208083028501011115612833578485fd5b60209290920196919550909350505050565b60008060408385031215612857578182fd5b505080516020909101519092909150565b6000806000806060858703121561287d578182fd5b8435935060208501359250604085013567ffffffffffffffff808211156128a2578384fd5b818701915087601f8301126128b5578384fd5b8135818111156128c3578485fd5b8860208285010111156128d4578485fd5b95989497505060200194505050565b6000602082840312156128f4578081fd5b815167ffffffffffffffff81111561290a578182fd5b8201601f8101841361291a578182fd5b805161292861266f82612e88565b81815285602083850101111561293c578384fd5b611c38826020830160208601612ec8565b60006020828403121561295e578081fd5b813567ffffffffffffffff80821115612975578283fd5b9083019060a08286031215612988578283fd5b60405160a08101818110838211171561299d57fe5b6040528235828111156129ae578485fd5b6129ba87828601612651565b8252506129c960208401612646565b602082015260408301356040820152606083013560608201526080830135608082015280935050505092915050565b60006101008284031215612a0a578081fd5b6126d083836126a2565b600060208284031215612a25578081fd5b813567ffffffffffffffff811115612a3b578182fd5b820160a081850312156126d0578182fd5b600060208284031215612a5d578081fd5b813567ffffffffffffffff80821115612a74578283fd5b9083019060408286031215612a87578283fd5b604051604081018181108382111715612a9c57fe5b604052823582811115612aad578485fd5b612ab987828601612651565b82525060208301359250612acc83612ef4565b6020810192909252509392505050565b600060208284031215612aed578081fd5b813562ffffff811681146126d0578182fd5b60008060408385031215612b11578182fd5b823591506020830135612b2381612ef4565b809150509250929050565b60008060008060808587031215612b43578182fd5b843593506020850135612b5581612ef4565b9250604085013591506060850135612b6c81612ef4565b939692955090935050565b60008151808452612b8f816020860160208601612ec8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152612c9f60a0830184612b77565b979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612d1b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612d09858351612b77565b94509285019290850190600101612ccf565b5092979650505050505050565b6000602082526126d06020830184612b77565b60208082526012908201527f546f6f206d756368207265717565737465640000000000000000000000000000604082015260600190565b60208082526013908201527f546f6f206c6974746c6520726563656976656400000000000000000000000000604082015260600190565b600060208252825160406020840152612dc56060840182612b77565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b90815260200190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612e2e578283fd5b83018035915067ffffffffffffffff821115612e48578283fd5b602001915036819003821315612e5d57600080fd5b9250929050565b60405181810167ffffffffffffffff81118282101715612e8057fe5b604052919050565b600067ffffffffffffffff821115612e9c57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612ee3578181015183820152602001612ecb565b8381111561108f5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114612f1657600080fd5b5056fea164736f6c6343000706000a\",\n      deployedBytecode: \"0x6080604052600436106101125760003560e01c8063c04b8d59116100a5578063df2ab5bb11610074578063f28c049811610059578063f28c0498146102f5578063f3995c6714610308578063fa461e331461031b576101bd565b8063df2ab5bb146102cf578063e0e189a0146102e2576101bd565b8063c04b8d5914610281578063c2e3140a14610294578063c45a0155146102a7578063db3e2198146102bc576101bd565b80634aa4a4fc116100e15780634aa4a4fc146102195780639b2c0a371461023b578063a4a78f0c1461024e578063ac9650d814610261576101bd565b806312210e8a146101c2578063414bf389146101ca5780634659a494146101f357806349404b7c14610206576101bd565b366101bd573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f742057455448390000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b6101bb61033b565b6101dd6101d83660046129f8565b61034d565b6040516101ea9190612df1565b60405180910390f35b6101bb610201366004612776565b6104bf565b6101bb610214366004612aff565b61057f565b34801561022557600080fd5b5061022e610745565b6040516101ea9190612c37565b6101bb610249366004612b2e565b610769565b6101bb61025c366004612776565b610981565b61027461026f3660046127d6565b610a56565b6040516101ea9190612caa565b6101dd61028f36600461294d565b610bb0565b6101bb6102a2366004612776565b610d0f565b3480156102b357600080fd5b5061022e610dc4565b6101dd6102ca3660046129f8565b610de8565b6101bb6102dd3660046126d7565b610f78565b6101bb6102f0366004612718565b611095565b6101dd610303366004612a14565b6111fb565b6101bb610316366004612776565b61132f565b34801561032757600080fd5b506101bb610336366004612868565b6113c7565b471561034b5761034b334761150e565b565b600081608001358061035d61165c565b11156103ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b61047060a08401356103e260808601606087016126b4565b6103f3610100870160e088016126b4565b604080518082019091528061040b60208a018a6126b4565b61041b60608b0160408c01612adc565b61042b60408c0160208d016126b4565b60405160200161043d93929190612bc1565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250611660565b91508260c001358210156104b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090612d72565b60405180910390fd5b50919050565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e48101839052905173ffffffffffffffffffffffffffffffffffffffff881691638fcbaf0c9161010480830192600092919082900301818387803b15801561055f57600080fd5b505af1158015610573573d6000803e3d6000fd5b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561060857600080fd5b505afa15801561061c573d6000803e3d6000fd5b505050506040513d602081101561063257600080fd5b50519050828110156106a557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b8015610740577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561071e57600080fd5b505af1158015610732573d6000803e3d6000fd5b50505050610740828261150e565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008211801561077a575060648211155b61078357600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561080c57600080fd5b505afa158015610820573d6000803e3d6000fd5b505050506040513d602081101561083657600080fd5b50519050848110156108a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742057455448390000000000000000000000000000604482015290519081900360640190fd5b801561097a577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561092257600080fd5b505af1158015610936573d6000803e3d6000fd5b50505050600061271061095285846117e690919063ffffffff16565b8161095957fe5b049050801561096c5761096c838261150e565b6109788582840361150e565b505b5050505050565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b158015610a1657600080fd5b505afa158015610a2a573d6000803e3d6000fd5b505050506040513d6020811015610a4057600080fd5b50511015610978576109788686868686866104bf565b60608167ffffffffffffffff81118015610a6f57600080fd5b50604051908082528060200260200182016040528015610aa357816020015b6060815260200190600190039081610a8e5790505b50905060005b82811015610ba95760008030868685818110610ac157fe5b9050602002810190610ad39190612dfa565b604051610ae1929190612c27565b600060405180830381855af49150503d8060008114610b1c576040519150601f19603f3d011682016040523d82523d6000602084013e610b21565b606091505b509150915081610b8757604481511015610b3a57600080fd5b60048101905080806020019051810190610b5491906128e3565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b09190612d28565b80848481518110610b9457fe5b60209081029190910101525050600101610aa9565b5092915050565b6000816040015180610bc061165c565b1115610c2d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b335b6000610c3e8560000151611810565b9050610c97856060015182610c57578660200151610c59565b305b60006040518060400160405280610c738b6000015161181c565b81526020018773ffffffffffffffffffffffffffffffffffffffff16815250611660565b60608601528015610cb7578451309250610cb09061182b565b8552610cc4565b8460600151935050610cca565b50610c2f565b8360800151831015610d08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090612d72565b5050919050565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051869173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b158015610d8457600080fd5b505afa158015610d98573d6000803e3d6000fd5b505050506040513d6020811015610dae57600080fd5b505110156109785761097886868686868661132f565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000816080013580610df861165c565b1115610e6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b610f0e60a0840135610e7d60808601606087016126b4565b610e8e610100870160e088016126b4565b6040518060400160405280886020016020810190610eac91906126b4565b610ebc60608b0160408c01612adc565b610ec960208c018c6126b4565b604051602001610edb93929190612bc1565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250611860565b91508260c00135821115610f4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090612d3b565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610fe157600080fd5b505afa158015610ff5573d6000803e3d6000fd5b505050506040513d602081101561100b57600080fd5b505190508281101561107e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b801561108f5761108f848383611a1c565b50505050565b6000821180156110a6575060648211155b6110af57600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b50519050848110156111b557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b80156109785760006127106111ca83866117e6565b816111d157fe5b04905080156111e5576111e5878483611a1c565b6111f28786838503611a1c565b50505050505050565b600081604001358061120b61165c565b111561127857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b6112eb606084013561129060408601602087016126b4565b60408051808201909152600090806112a88980612dfa565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525033602090910152611860565b5060005491508260800135821115610f4e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104b090612d3b565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c48101839052905173ffffffffffffffffffffffffffffffffffffffff88169163d505accf9160e480830192600092919082900301818387803b15801561055f57600080fd5b60008413806113d65750600083135b6113df57600080fd5b60006113ed82840184612a4c565b905060008060006114018460000151611bf1565b9250925092506114337f0000000000000000000000000000000000000000000000000000000000000000848484611c22565b5060008060008a13611474578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610896114a5565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108a5b9150915081156114c4576114bf8587602001513384611c41565b610573565b85516114cf90611810565b156114f45785516114df9061182b565b86526114ee8133600089611860565b50610573565b806000819055508394506105738587602001513384611c41565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b6020831061158557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611548565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146115e7576040519150601f19603f3d011682016040523d82523d6000602084013e6115ec565b606091505b505090508061074057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b4290565b600073ffffffffffffffffffffffffffffffffffffffff8416611681573093505b60008060006116938560000151611bf1565b9194509250905073ffffffffffffffffffffffffffffffffffffffff808316908416106000806116c4868686611e1f565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856116ea8f611e5d565b73ffffffffffffffffffffffffffffffffffffffff8e161561170c578d611732565b8761172b5773fffd8963efd1fc6a506488495d951d5263988d25611732565b6401000276a45b8d6040516020016117439190612da9565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611772959493929190612c58565b6040805180830381600087803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190612845565b91509150826117d257816117d4565b805b6000039b9a5050505050505050505050565b6000821580611801575050818102818382816117fe57fe5b04145b61180a57600080fd5b92915050565b8051604211155b919050565b606061180a826000602b611e8f565b805160609061180a9083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe901611e8f565b600073ffffffffffffffffffffffffffffffffffffffff8416611881573093505b60008060006118938560000151611bf1565b9194509250905073ffffffffffffffffffffffffffffffffffffffff808416908316106000806118c4858786611e1f565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856118ea8f611e5d565b60000373ffffffffffffffffffffffffffffffffffffffff8e161561190f578d611935565b8761192e5773fffd8963efd1fc6a506488495d951d5263988d25611935565b6401000276a45b8d6040516020016119469190612da9565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611975959493929190612c58565b6040805180830381600087803b15801561198e57600080fd5b505af11580156119a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c69190612845565b915091506000836119db5781836000036119e1565b82826000035b909850905073ffffffffffffffffffffffffffffffffffffffff8a16611a0d578b8114611a0d57600080fd5b50505050505050949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b60208310611af157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611ab4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611b53576040519150601f19603f3d011682016040523d82523d6000602084013e611b58565b606091505b5091509150818015611b86575080511580611b865750808060200190516020811015611b8357600080fd5b50515b61097a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60008080611bff8482612076565b9250611c0c846014612176565b9050611c19846017612076565b91509193909250565b6000611c3885611c33868686612266565b6122e3565b95945050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611c9c5750804710155b15611de5577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611db357600080fd5b505af1158015611dc7573d6000803e3d6000fd5b505050506040513d6020811015611ddd57600080fd5b5061108f9050565b73ffffffffffffffffffffffffffffffffffffffff8316301415611e1357611e0e848383611a1c565b61108f565b61108f84848484612313565b6000611e557f0000000000000000000000000000000000000000000000000000000000000000611e50868686612266565b6124f0565b949350505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210611e8b57600080fd5b5090565b60608182601f011015611f0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b828284011015611f7457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b81830184511015611fe657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b606082158015612005576040519150600082526020820160405261206d565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561203e578051835260209283019201612026565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6000818260140110156120ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b816014018351101561215d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b6000818260030110156121ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f746f55696e7432345f6f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b816003018351101561225d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f746f55696e7432345f6f75744f66426f756e6473000000000000000000000000604482015290519081900360640190fd5b50016003015190565b61226e612626565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1611156122a6579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b60006122ef83836124f0565b90503373ffffffffffffffffffffffffffffffffffffffff82161461180a57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b602083106123f057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016123b3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612452576040519150601f19603f3d011682016040523d82523d6000602084013e612457565b606091505b5091509150818015612485575080511580612485575080806020019051602081101561248257600080fd5b50515b61097857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061253257600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b604080516060810182526000808252602082018190529181019190915290565b803561181781612ef4565b600082601f830112612661578081fd5b813561267461266f82612e88565b612e64565b818152846020838601011115612688578283fd5b816020850160208301379081016020019190915292915050565b600061010082840312156104b9578081fd5b6000602082840312156126c5578081fd5b81356126d081612ef4565b9392505050565b6000806000606084860312156126eb578182fd5b83356126f681612ef4565b925060208401359150604084013561270d81612ef4565b809150509250925092565b600080600080600060a0868803121561272f578081fd5b853561273a81612ef4565b945060208601359350604086013561275181612ef4565b925060608601359150608086013561276881612ef4565b809150509295509295909350565b60008060008060008060c0878903121561278e578081fd5b863561279981612ef4565b95506020870135945060408701359350606087013560ff811681146127bc578182fd5b9598949750929560808101359460a0909101359350915050565b600080602083850312156127e8578182fd5b823567ffffffffffffffff808211156127ff578384fd5b818501915085601f830112612812578384fd5b813581811115612820578485fd5b8660208083028501011115612833578485fd5b60209290920196919550909350505050565b60008060408385031215612857578182fd5b505080516020909101519092909150565b6000806000806060858703121561287d578182fd5b8435935060208501359250604085013567ffffffffffffffff808211156128a2578384fd5b818701915087601f8301126128b5578384fd5b8135818111156128c3578485fd5b8860208285010111156128d4578485fd5b95989497505060200194505050565b6000602082840312156128f4578081fd5b815167ffffffffffffffff81111561290a578182fd5b8201601f8101841361291a578182fd5b805161292861266f82612e88565b81815285602083850101111561293c578384fd5b611c38826020830160208601612ec8565b60006020828403121561295e578081fd5b813567ffffffffffffffff80821115612975578283fd5b9083019060a08286031215612988578283fd5b60405160a08101818110838211171561299d57fe5b6040528235828111156129ae578485fd5b6129ba87828601612651565b8252506129c960208401612646565b602082015260408301356040820152606083013560608201526080830135608082015280935050505092915050565b60006101008284031215612a0a578081fd5b6126d083836126a2565b600060208284031215612a25578081fd5b813567ffffffffffffffff811115612a3b578182fd5b820160a081850312156126d0578182fd5b600060208284031215612a5d578081fd5b813567ffffffffffffffff80821115612a74578283fd5b9083019060408286031215612a87578283fd5b604051604081018181108382111715612a9c57fe5b604052823582811115612aad578485fd5b612ab987828601612651565b82525060208301359250612acc83612ef4565b6020810192909252509392505050565b600060208284031215612aed578081fd5b813562ffffff811681146126d0578182fd5b60008060408385031215612b11578182fd5b823591506020830135612b2381612ef4565b809150509250929050565b60008060008060808587031215612b43578182fd5b843593506020850135612b5581612ef4565b9250604085013591506060850135612b6c81612ef4565b939692955090935050565b60008151808452612b8f816020860160208601612ec8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b606093841b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000908116825260e89390931b7fffffff0000000000000000000000000000000000000000000000000000000000166014820152921b166017820152602b0190565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152612c9f60a0830184612b77565b979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612d1b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612d09858351612b77565b94509285019290850190600101612ccf565b5092979650505050505050565b6000602082526126d06020830184612b77565b60208082526012908201527f546f6f206d756368207265717565737465640000000000000000000000000000604082015260600190565b60208082526013908201527f546f6f206c6974746c6520726563656976656400000000000000000000000000604082015260600190565b600060208252825160406020840152612dc56060840182612b77565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b90815260200190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612e2e578283fd5b83018035915067ffffffffffffffff821115612e48578283fd5b602001915036819003821315612e5d57600080fd5b9250929050565b60405181810167ffffffffffffffff81118282101715612e8057fe5b604052919050565b600067ffffffffffffffff821115612e9c57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612ee3578181015183820152602001612ecb565b8381111561108f5750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114612f1657600080fd5b5056fea164736f6c6343000706000a\",\n      linkReferences: {},\n      deployedLinkReferences: {}\n    };\n  }\n});\n\n// node_modules/@uniswap/v3-sdk/dist/v3-sdk.cjs.production.min.js\nvar require_v3_sdk_cjs_production_min = __commonJS({\n  \"node_modules/@uniswap/v3-sdk/dist/v3-sdk.cjs.production.min.js\"(exports2) {\n    \"use strict\";\n    function t(t2) {\n      return t2 && \"object\" == typeof t2 && \"default\" in t2 ? t2.default : t2;\n    }\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    var e;\n    var n = require_dist();\n    var r = t(require_jsbi_cjs());\n    var i = t(require_tiny_invariant_cjs());\n    var o = require_lib11();\n    var u = require_lib7();\n    var a = require_lib29();\n    var c = t(require_IMulticall());\n    var s = t(require_NonfungiblePositionManager());\n    var p = t(require_ISelfPermit());\n    var l = t(require_IPeripheryPaymentsWithFee());\n    var d = t(require_Quoter());\n    var f = t(require_QuoterV2());\n    var h = t(require_UniswapV3Staker());\n    var m = t(require_SwapRouter());\n    function v() {\n      v = function() {\n        return e2;\n      };\n      var t2, e2 = {}, n2 = Object.prototype, r2 = n2.hasOwnProperty, i2 = Object.defineProperty || function(t3, e3, n3) {\n        t3[e3] = n3.value;\n      }, o2 = \"function\" == typeof Symbol ? Symbol : {}, u2 = o2.iterator || \"@@iterator\", a2 = o2.asyncIterator || \"@@asyncIterator\", c2 = o2.toStringTag || \"@@toStringTag\";\n      function s2(t3, e3, n3) {\n        return Object.defineProperty(t3, e3, { value: n3, enumerable: true, configurable: true, writable: true }), t3[e3];\n      }\n      try {\n        s2({}, \"\");\n      } catch (t3) {\n        s2 = function(t4, e3, n3) {\n          return t4[e3] = n3;\n        };\n      }\n      function p2(t3, e3, n3, r3) {\n        var o3 = Object.create((e3 && e3.prototype instanceof y2 ? e3 : y2).prototype), u3 = new C2(r3 || []);\n        return i2(o3, \"_invoke\", { value: b2(t3, n3, u3) }), o3;\n      }\n      function l2(t3, e3, n3) {\n        try {\n          return { type: \"normal\", arg: t3.call(e3, n3) };\n        } catch (t4) {\n          return { type: \"throw\", arg: t4 };\n        }\n      }\n      e2.wrap = p2;\n      var d2 = \"suspendedStart\", f2 = \"executing\", h2 = \"completed\", m2 = {};\n      function y2() {\n      }\n      function k2() {\n      }\n      function g2() {\n      }\n      var A2 = {};\n      s2(A2, u2, function() {\n        return this;\n      });\n      var T2 = Object.getPrototypeOf, w2 = T2 && T2(T2(O2([])));\n      w2 && w2 !== n2 && r2.call(w2, u2) && (A2 = w2);\n      var x2 = g2.prototype = y2.prototype = Object.create(A2);\n      function I2(t3) {\n        [\"next\", \"throw\", \"return\"].forEach(function(e3) {\n          s2(t3, e3, function(t4) {\n            return this._invoke(e3, t4);\n          });\n        });\n      }\n      function q2(t3, e3) {\n        function n3(i3, o4, u3, a3) {\n          var c3 = l2(t3[i3], t3, o4);\n          if (\"throw\" !== c3.type) {\n            var s3 = c3.arg, p3 = s3.value;\n            return p3 && \"object\" == typeof p3 && r2.call(p3, \"__await\") ? e3.resolve(p3.__await).then(function(t4) {\n              n3(\"next\", t4, u3, a3);\n            }, function(t4) {\n              n3(\"throw\", t4, u3, a3);\n            }) : e3.resolve(p3).then(function(t4) {\n              s3.value = t4, u3(s3);\n            }, function(t4) {\n              return n3(\"throw\", t4, u3, a3);\n            });\n          }\n          a3(c3.arg);\n        }\n        var o3;\n        i2(this, \"_invoke\", { value: function(t4, r3) {\n          function i3() {\n            return new e3(function(e4, i4) {\n              n3(t4, r3, e4, i4);\n            });\n          }\n          return o3 = o3 ? o3.then(i3, i3) : i3();\n        } });\n      }\n      function b2(e3, n3, r3) {\n        var i3 = d2;\n        return function(o3, u3) {\n          if (i3 === f2) throw new Error(\"Generator is already running\");\n          if (i3 === h2) {\n            if (\"throw\" === o3) throw u3;\n            return { value: t2, done: true };\n          }\n          for (r3.method = o3, r3.arg = u3; ; ) {\n            var a3 = r3.delegate;\n            if (a3) {\n              var c3 = R2(a3, r3);\n              if (c3) {\n                if (c3 === m2) continue;\n                return c3;\n              }\n            }\n            if (\"next\" === r3.method) r3.sent = r3._sent = r3.arg;\n            else if (\"throw\" === r3.method) {\n              if (i3 === d2) throw i3 = h2, r3.arg;\n              r3.dispatchException(r3.arg);\n            } else \"return\" === r3.method && r3.abrupt(\"return\", r3.arg);\n            i3 = f2;\n            var s3 = l2(e3, n3, r3);\n            if (\"normal\" === s3.type) {\n              if (i3 = r3.done ? h2 : \"suspendedYield\", s3.arg === m2) continue;\n              return { value: s3.arg, done: r3.done };\n            }\n            \"throw\" === s3.type && (i3 = h2, r3.method = \"throw\", r3.arg = s3.arg);\n          }\n        };\n      }\n      function R2(e3, n3) {\n        var r3 = n3.method, i3 = e3.iterator[r3];\n        if (i3 === t2) return n3.delegate = null, \"throw\" === r3 && e3.iterator.return && (n3.method = \"return\", n3.arg = t2, R2(e3, n3), \"throw\" === n3.method) || \"return\" !== r3 && (n3.method = \"throw\", n3.arg = new TypeError(\"The iterator does not provide a '\" + r3 + \"' method\")), m2;\n        var o3 = l2(i3, e3.iterator, n3.arg);\n        if (\"throw\" === o3.type) return n3.method = \"throw\", n3.arg = o3.arg, n3.delegate = null, m2;\n        var u3 = o3.arg;\n        return u3 ? u3.done ? (n3[e3.resultName] = u3.value, n3.next = e3.nextLoc, \"return\" !== n3.method && (n3.method = \"next\", n3.arg = t2), n3.delegate = null, m2) : u3 : (n3.method = \"throw\", n3.arg = new TypeError(\"iterator result is not an object\"), n3.delegate = null, m2);\n      }\n      function E2(t3) {\n        var e3 = { tryLoc: t3[0] };\n        1 in t3 && (e3.catchLoc = t3[1]), 2 in t3 && (e3.finallyLoc = t3[2], e3.afterLoc = t3[3]), this.tryEntries.push(e3);\n      }\n      function P2(t3) {\n        var e3 = t3.completion || {};\n        e3.type = \"normal\", delete e3.arg, t3.completion = e3;\n      }\n      function C2(t3) {\n        this.tryEntries = [{ tryLoc: \"root\" }], t3.forEach(E2, this), this.reset(true);\n      }\n      function O2(e3) {\n        if (e3 || \"\" === e3) {\n          var n3 = e3[u2];\n          if (n3) return n3.call(e3);\n          if (\"function\" == typeof e3.next) return e3;\n          if (!isNaN(e3.length)) {\n            var i3 = -1, o3 = function n4() {\n              for (; ++i3 < e3.length; ) if (r2.call(e3, i3)) return n4.value = e3[i3], n4.done = false, n4;\n              return n4.value = t2, n4.done = true, n4;\n            };\n            return o3.next = o3;\n          }\n        }\n        throw new TypeError(typeof e3 + \" is not iterable\");\n      }\n      return k2.prototype = g2, i2(x2, \"constructor\", { value: g2, configurable: true }), i2(g2, \"constructor\", { value: k2, configurable: true }), k2.displayName = s2(g2, c2, \"GeneratorFunction\"), e2.isGeneratorFunction = function(t3) {\n        var e3 = \"function\" == typeof t3 && t3.constructor;\n        return !!e3 && (e3 === k2 || \"GeneratorFunction\" === (e3.displayName || e3.name));\n      }, e2.mark = function(t3) {\n        return Object.setPrototypeOf ? Object.setPrototypeOf(t3, g2) : (t3.__proto__ = g2, s2(t3, c2, \"GeneratorFunction\")), t3.prototype = Object.create(x2), t3;\n      }, e2.awrap = function(t3) {\n        return { __await: t3 };\n      }, I2(q2.prototype), s2(q2.prototype, a2, function() {\n        return this;\n      }), e2.AsyncIterator = q2, e2.async = function(t3, n3, r3, i3, o3) {\n        void 0 === o3 && (o3 = Promise);\n        var u3 = new q2(p2(t3, n3, r3, i3), o3);\n        return e2.isGeneratorFunction(n3) ? u3 : u3.next().then(function(t4) {\n          return t4.done ? t4.value : u3.next();\n        });\n      }, I2(x2), s2(x2, c2, \"Generator\"), s2(x2, u2, function() {\n        return this;\n      }), s2(x2, \"toString\", function() {\n        return \"[object Generator]\";\n      }), e2.keys = function(t3) {\n        var e3 = Object(t3), n3 = [];\n        for (var r3 in e3) n3.push(r3);\n        return n3.reverse(), function t4() {\n          for (; n3.length; ) {\n            var r4 = n3.pop();\n            if (r4 in e3) return t4.value = r4, t4.done = false, t4;\n          }\n          return t4.done = true, t4;\n        };\n      }, e2.values = O2, C2.prototype = { constructor: C2, reset: function(e3) {\n        if (this.prev = 0, this.next = 0, this.sent = this._sent = t2, this.done = false, this.delegate = null, this.method = \"next\", this.arg = t2, this.tryEntries.forEach(P2), !e3) for (var n3 in this) \"t\" === n3.charAt(0) && r2.call(this, n3) && !isNaN(+n3.slice(1)) && (this[n3] = t2);\n      }, stop: function() {\n        this.done = true;\n        var t3 = this.tryEntries[0].completion;\n        if (\"throw\" === t3.type) throw t3.arg;\n        return this.rval;\n      }, dispatchException: function(e3) {\n        if (this.done) throw e3;\n        var n3 = this;\n        function i3(r3, i4) {\n          return a3.type = \"throw\", a3.arg = e3, n3.next = r3, i4 && (n3.method = \"next\", n3.arg = t2), !!i4;\n        }\n        for (var o3 = this.tryEntries.length - 1; o3 >= 0; --o3) {\n          var u3 = this.tryEntries[o3], a3 = u3.completion;\n          if (\"root\" === u3.tryLoc) return i3(\"end\");\n          if (u3.tryLoc <= this.prev) {\n            var c3 = r2.call(u3, \"catchLoc\"), s3 = r2.call(u3, \"finallyLoc\");\n            if (c3 && s3) {\n              if (this.prev < u3.catchLoc) return i3(u3.catchLoc, true);\n              if (this.prev < u3.finallyLoc) return i3(u3.finallyLoc);\n            } else if (c3) {\n              if (this.prev < u3.catchLoc) return i3(u3.catchLoc, true);\n            } else {\n              if (!s3) throw new Error(\"try statement without catch or finally\");\n              if (this.prev < u3.finallyLoc) return i3(u3.finallyLoc);\n            }\n          }\n        }\n      }, abrupt: function(t3, e3) {\n        for (var n3 = this.tryEntries.length - 1; n3 >= 0; --n3) {\n          var i3 = this.tryEntries[n3];\n          if (i3.tryLoc <= this.prev && r2.call(i3, \"finallyLoc\") && this.prev < i3.finallyLoc) {\n            var o3 = i3;\n            break;\n          }\n        }\n        o3 && (\"break\" === t3 || \"continue\" === t3) && o3.tryLoc <= e3 && e3 <= o3.finallyLoc && (o3 = null);\n        var u3 = o3 ? o3.completion : {};\n        return u3.type = t3, u3.arg = e3, o3 ? (this.method = \"next\", this.next = o3.finallyLoc, m2) : this.complete(u3);\n      }, complete: function(t3, e3) {\n        if (\"throw\" === t3.type) throw t3.arg;\n        return \"break\" === t3.type || \"continue\" === t3.type ? this.next = t3.arg : \"return\" === t3.type ? (this.rval = this.arg = t3.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t3.type && e3 && (this.next = e3), m2;\n      }, finish: function(t3) {\n        for (var e3 = this.tryEntries.length - 1; e3 >= 0; --e3) {\n          var n3 = this.tryEntries[e3];\n          if (n3.finallyLoc === t3) return this.complete(n3.completion, n3.afterLoc), P2(n3), m2;\n        }\n      }, catch: function(t3) {\n        for (var e3 = this.tryEntries.length - 1; e3 >= 0; --e3) {\n          var n3 = this.tryEntries[e3];\n          if (n3.tryLoc === t3) {\n            var r3 = n3.completion;\n            if (\"throw\" === r3.type) {\n              var i3 = r3.arg;\n              P2(n3);\n            }\n            return i3;\n          }\n        }\n        throw new Error(\"illegal catch attempt\");\n      }, delegateYield: function(e3, n3, r3) {\n        return this.delegate = { iterator: O2(e3), resultName: n3, nextLoc: r3 }, \"next\" === this.method && (this.arg = t2), m2;\n      } }, e2;\n    }\n    function y(t2) {\n      var e2 = function(t3, e3) {\n        if (\"object\" != typeof t3 || !t3) return t3;\n        var n2 = t3[Symbol.toPrimitive];\n        if (void 0 !== n2) {\n          var r2 = n2.call(t3, \"string\");\n          if (\"object\" != typeof r2) return r2;\n          throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n        }\n        return String(t3);\n      }(t2);\n      return \"symbol\" == typeof e2 ? e2 : String(e2);\n    }\n    function k(t2, e2, n2, r2, i2, o2, u2) {\n      try {\n        var a2 = t2[o2](u2), c2 = a2.value;\n      } catch (t3) {\n        return void n2(t3);\n      }\n      a2.done ? e2(c2) : Promise.resolve(c2).then(r2, i2);\n    }\n    function g(t2) {\n      return function() {\n        var e2 = this, n2 = arguments;\n        return new Promise(function(r2, i2) {\n          var o2 = t2.apply(e2, n2);\n          function u2(t3) {\n            k(o2, r2, i2, u2, a2, \"next\", t3);\n          }\n          function a2(t3) {\n            k(o2, r2, i2, u2, a2, \"throw\", t3);\n          }\n          u2(void 0);\n        });\n      };\n    }\n    function A(t2, e2) {\n      for (var n2 = 0; n2 < e2.length; n2++) {\n        var r2 = e2[n2];\n        r2.enumerable = r2.enumerable || false, r2.configurable = true, \"value\" in r2 && (r2.writable = true), Object.defineProperty(t2, y(r2.key), r2);\n      }\n    }\n    function T(t2, e2, n2) {\n      return e2 && A(t2.prototype, e2), n2 && A(t2, n2), Object.defineProperty(t2, \"prototype\", { writable: false }), t2;\n    }\n    function w() {\n      return (w = Object.assign ? Object.assign.bind() : function(t2) {\n        for (var e2 = 1; e2 < arguments.length; e2++) {\n          var n2 = arguments[e2];\n          for (var r2 in n2) Object.prototype.hasOwnProperty.call(n2, r2) && (t2[r2] = n2[r2]);\n        }\n        return t2;\n      }).apply(this, arguments);\n    }\n    function x(t2, e2) {\n      (null == e2 || e2 > t2.length) && (e2 = t2.length);\n      for (var n2 = 0, r2 = new Array(e2); n2 < e2; n2++) r2[n2] = t2[n2];\n      return r2;\n    }\n    function I(t2, e2) {\n      var n2 = \"undefined\" != typeof Symbol && t2[Symbol.iterator] || t2[\"@@iterator\"];\n      if (n2) return (n2 = n2.call(t2)).next.bind(n2);\n      if (Array.isArray(t2) || (n2 = function(t3, e3) {\n        if (t3) {\n          if (\"string\" == typeof t3) return x(t3, void 0);\n          var n3 = Object.prototype.toString.call(t3).slice(8, -1);\n          return \"Object\" === n3 && t3.constructor && (n3 = t3.constructor.name), \"Map\" === n3 || \"Set\" === n3 ? Array.from(t3) : \"Arguments\" === n3 || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n3) ? x(t3, void 0) : void 0;\n        }\n      }(t2)) || e2 && t2 && \"number\" == typeof t2.length) {\n        n2 && (t2 = n2);\n        var r2 = 0;\n        return function() {\n          return r2 >= t2.length ? { done: true } : { done: false, value: t2[r2++] };\n        };\n      }\n      throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var q;\n    var b = \"0x0000000000000000000000000000000000000000\";\n    var R = \"0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54\";\n    (q = exports2.FeeAmount || (exports2.FeeAmount = {}))[q.LOWEST = 100] = \"LOWEST\", q[q.LOW = 500] = \"LOW\", q[q.MEDIUM = 3e3] = \"MEDIUM\", q[q.HIGH = 1e4] = \"HIGH\";\n    var E = ((e = {})[exports2.FeeAmount.LOWEST] = 1, e[exports2.FeeAmount.LOW] = 10, e[exports2.FeeAmount.MEDIUM] = 60, e[exports2.FeeAmount.HIGH] = 200, e);\n    var P = r.BigInt(-1);\n    var C = r.BigInt(0);\n    var O = r.BigInt(1);\n    var S = r.exponentiate(r.BigInt(2), r.BigInt(96));\n    var N = r.exponentiate(S, r.BigInt(2));\n    function _(t2) {\n      var e2 = t2.factoryAddress, n2 = t2.tokenA, r2 = t2.tokenB, i2 = t2.fee, c2 = t2.initCodeHashManualOverride, s2 = n2.sortsBefore(r2) ? [n2, r2] : [r2, n2];\n      return u.getCreate2Address(e2, a.keccak256([\"bytes\"], [o.defaultAbiCoder.encode([\"address\", \"address\", \"uint24\"], [s2[0].address, s2[1].address, i2])]), null != c2 ? c2 : R);\n    }\n    var F = function() {\n      function t2() {\n      }\n      return t2.addDelta = function(t3, e2) {\n        return r.lessThan(e2, C) ? r.subtract(t3, r.multiply(e2, P)) : r.add(t3, e2);\n      }, t2;\n    }();\n    var X = function() {\n      function t2() {\n      }\n      return t2.mulDivRoundingUp = function(t3, e2, n2) {\n        var i2 = r.multiply(t3, e2), o2 = r.divide(i2, n2);\n        return r.notEqual(r.remainder(i2, n2), C) && (o2 = r.add(o2, O)), o2;\n      }, t2;\n    }();\n    var L = r.subtract(r.exponentiate(r.BigInt(2), r.BigInt(160)), O);\n    function U(t2, e2) {\n      var i2 = r.multiply(t2, e2);\n      return r.bitwiseAnd(i2, n.MaxUint256);\n    }\n    var B = function() {\n      function t2() {\n      }\n      return t2.getAmount0Delta = function(t3, e2, n2, i2) {\n        if (r.greaterThan(t3, e2)) {\n          var o2 = [e2, t3];\n          t3 = o2[0], e2 = o2[1];\n        }\n        var u2 = r.leftShift(n2, r.BigInt(96)), a2 = r.subtract(e2, t3);\n        return i2 ? X.mulDivRoundingUp(X.mulDivRoundingUp(u2, a2, e2), O, t3) : r.divide(r.divide(r.multiply(u2, a2), e2), t3);\n      }, t2.getAmount1Delta = function(t3, e2, n2, i2) {\n        if (r.greaterThan(t3, e2)) {\n          var o2 = [e2, t3];\n          t3 = o2[0], e2 = o2[1];\n        }\n        return i2 ? X.mulDivRoundingUp(n2, r.subtract(e2, t3), S) : r.divide(r.multiply(n2, r.subtract(e2, t3)), S);\n      }, t2.getNextSqrtPriceFromInput = function(t3, e2, n2, o2) {\n        return r.greaterThan(t3, C) || i(false), r.greaterThan(e2, C) || i(false), o2 ? this.getNextSqrtPriceFromAmount0RoundingUp(t3, e2, n2, true) : this.getNextSqrtPriceFromAmount1RoundingDown(t3, e2, n2, true);\n      }, t2.getNextSqrtPriceFromOutput = function(t3, e2, n2, o2) {\n        return r.greaterThan(t3, C) || i(false), r.greaterThan(e2, C) || i(false), o2 ? this.getNextSqrtPriceFromAmount1RoundingDown(t3, e2, n2, false) : this.getNextSqrtPriceFromAmount0RoundingUp(t3, e2, n2, false);\n      }, t2.getNextSqrtPriceFromAmount0RoundingUp = function(t3, e2, o2, u2) {\n        if (r.equal(o2, C)) return t3;\n        var a2 = r.leftShift(e2, r.BigInt(96));\n        if (u2) {\n          var c2 = U(o2, t3);\n          if (r.equal(r.divide(c2, o2), t3)) {\n            var s2 = (l2 = r.add(a2, c2), r.bitwiseAnd(l2, n.MaxUint256));\n            if (r.greaterThanOrEqual(s2, a2)) return X.mulDivRoundingUp(a2, t3, s2);\n          }\n          return X.mulDivRoundingUp(a2, O, r.add(r.divide(a2, t3), o2));\n        }\n        var p2 = U(o2, t3);\n        r.equal(r.divide(p2, o2), t3) || i(false), r.greaterThan(a2, p2) || i(false);\n        var l2, d2 = r.subtract(a2, p2);\n        return X.mulDivRoundingUp(a2, t3, d2);\n      }, t2.getNextSqrtPriceFromAmount1RoundingDown = function(t3, e2, n2, o2) {\n        if (o2) {\n          var u2 = r.lessThanOrEqual(n2, L) ? r.divide(r.leftShift(n2, r.BigInt(96)), e2) : r.divide(r.multiply(n2, S), e2);\n          return r.add(t3, u2);\n        }\n        var a2 = X.mulDivRoundingUp(n2, S, e2);\n        return r.greaterThan(t3, a2) || i(false), r.subtract(t3, a2);\n      }, t2;\n    }();\n    var M = r.exponentiate(r.BigInt(10), r.BigInt(6));\n    var D = function() {\n      function t2() {\n      }\n      return t2.computeSwapStep = function(t3, e2, n2, i2, o2) {\n        var u2 = {}, a2 = r.greaterThanOrEqual(t3, e2), c2 = r.greaterThanOrEqual(i2, C);\n        if (c2) {\n          var s2 = r.divide(r.multiply(i2, r.subtract(M, r.BigInt(o2))), M);\n          u2.amountIn = a2 ? B.getAmount0Delta(e2, t3, n2, true) : B.getAmount1Delta(t3, e2, n2, true), u2.sqrtRatioNextX96 = r.greaterThanOrEqual(s2, u2.amountIn) ? e2 : B.getNextSqrtPriceFromInput(t3, n2, s2, a2);\n        } else u2.amountOut = a2 ? B.getAmount1Delta(e2, t3, n2, false) : B.getAmount0Delta(t3, e2, n2, false), u2.sqrtRatioNextX96 = r.greaterThanOrEqual(r.multiply(i2, P), u2.amountOut) ? e2 : B.getNextSqrtPriceFromOutput(t3, n2, r.multiply(i2, P), a2);\n        var p2 = r.equal(e2, u2.sqrtRatioNextX96);\n        return a2 ? (u2.amountIn = p2 && c2 ? u2.amountIn : B.getAmount0Delta(u2.sqrtRatioNextX96, t3, n2, true), u2.amountOut = p2 && !c2 ? u2.amountOut : B.getAmount1Delta(u2.sqrtRatioNextX96, t3, n2, false)) : (u2.amountIn = p2 && c2 ? u2.amountIn : B.getAmount1Delta(t3, u2.sqrtRatioNextX96, n2, true), u2.amountOut = p2 && !c2 ? u2.amountOut : B.getAmount0Delta(t3, u2.sqrtRatioNextX96, n2, false)), !c2 && r.greaterThan(u2.amountOut, r.multiply(i2, P)) && (u2.amountOut = r.multiply(i2, P)), u2.feeAmount = c2 && r.notEqual(u2.sqrtRatioNextX96, e2) ? r.subtract(i2, u2.amountIn) : X.mulDivRoundingUp(u2.amountIn, r.BigInt(o2), r.subtract(M, r.BigInt(o2))), [u2.sqrtRatioNextX96, u2.amountIn, u2.amountOut, u2.feeAmount];\n      }, t2;\n    }();\n    var j = r.BigInt(2);\n    var W = [128, 64, 32, 16, 8, 4, 2, 1].map(function(t2) {\n      return [t2, r.exponentiate(j, r.BigInt(t2))];\n    });\n    function G(t2) {\n      r.greaterThan(t2, C) || i(false), r.lessThanOrEqual(t2, n.MaxUint256) || i(false);\n      for (var e2, o2 = 0, u2 = I(W); !(e2 = u2()).done; ) {\n        var a2 = e2.value, c2 = a2[0];\n        r.greaterThanOrEqual(t2, a2[1]) && (t2 = r.signedRightShift(t2, r.BigInt(c2)), o2 += c2);\n      }\n      return o2;\n    }\n    function K(t2, e2) {\n      return r.signedRightShift(r.multiply(t2, r.BigInt(e2)), r.BigInt(128));\n    }\n    var H = r.exponentiate(r.BigInt(2), r.BigInt(32));\n    var Q = function() {\n      function t2() {\n      }\n      return t2.getSqrtRatioAtTick = function(e2) {\n        e2 >= t2.MIN_TICK && e2 <= t2.MAX_TICK && Number.isInteger(e2) || i(false);\n        var o2 = e2 < 0 ? -1 * e2 : e2, u2 = r.BigInt(0 != (1 & o2) ? \"0xfffcb933bd6fad37aa2d162d1a594001\" : \"0x100000000000000000000000000000000\");\n        return 0 != (2 & o2) && (u2 = K(u2, \"0xfff97272373d413259a46990580e213a\")), 0 != (4 & o2) && (u2 = K(u2, \"0xfff2e50f5f656932ef12357cf3c7fdcc\")), 0 != (8 & o2) && (u2 = K(u2, \"0xffe5caca7e10e4e61c3624eaa0941cd0\")), 0 != (16 & o2) && (u2 = K(u2, \"0xffcb9843d60f6159c9db58835c926644\")), 0 != (32 & o2) && (u2 = K(u2, \"0xff973b41fa98c081472e6896dfb254c0\")), 0 != (64 & o2) && (u2 = K(u2, \"0xff2ea16466c96a3843ec78b326b52861\")), 0 != (128 & o2) && (u2 = K(u2, \"0xfe5dee046a99a2a811c461f1969c3053\")), 0 != (256 & o2) && (u2 = K(u2, \"0xfcbe86c7900a88aedcffc83b479aa3a4\")), 0 != (512 & o2) && (u2 = K(u2, \"0xf987a7253ac413176f2b074cf7815e54\")), 0 != (1024 & o2) && (u2 = K(u2, \"0xf3392b0822b70005940c7a398e4b70f3\")), 0 != (2048 & o2) && (u2 = K(u2, \"0xe7159475a2c29b7443b29c7fa6e889d9\")), 0 != (4096 & o2) && (u2 = K(u2, \"0xd097f3bdfd2022b8845ad8f792aa5825\")), 0 != (8192 & o2) && (u2 = K(u2, \"0xa9f746462d870fdf8a65dc1f90e061e5\")), 0 != (16384 & o2) && (u2 = K(u2, \"0x70d869a156d2a1b890bb3df62baf32f7\")), 0 != (32768 & o2) && (u2 = K(u2, \"0x31be135f97d08fd981231505542fcfa6\")), 0 != (65536 & o2) && (u2 = K(u2, \"0x9aa508b5b7a84e1c677de54f3e99bc9\")), 0 != (131072 & o2) && (u2 = K(u2, \"0x5d6af8dedb81196699c329225ee604\")), 0 != (262144 & o2) && (u2 = K(u2, \"0x2216e584f5fa1ea926041bedfe98\")), 0 != (524288 & o2) && (u2 = K(u2, \"0x48a170391f7dc42444e8fa2\")), e2 > 0 && (u2 = r.divide(n.MaxUint256, u2)), r.greaterThan(r.remainder(u2, H), C) ? r.add(r.divide(u2, H), O) : r.divide(u2, H);\n      }, t2.getTickAtSqrtRatio = function(e2) {\n        r.greaterThanOrEqual(e2, t2.MIN_SQRT_RATIO) && r.lessThan(e2, t2.MAX_SQRT_RATIO) || i(false);\n        var n2, o2 = r.leftShift(e2, r.BigInt(32)), u2 = G(o2);\n        n2 = r.greaterThanOrEqual(r.BigInt(u2), r.BigInt(128)) ? r.signedRightShift(o2, r.BigInt(u2 - 127)) : r.leftShift(o2, r.BigInt(127 - u2));\n        for (var a2 = r.leftShift(r.subtract(r.BigInt(u2), r.BigInt(128)), r.BigInt(64)), c2 = 0; c2 < 14; c2++) {\n          n2 = r.signedRightShift(r.multiply(n2, n2), r.BigInt(127));\n          var s2 = r.signedRightShift(n2, r.BigInt(128));\n          a2 = r.bitwiseOr(a2, r.leftShift(s2, r.BigInt(63 - c2))), n2 = r.signedRightShift(n2, s2);\n        }\n        var p2 = r.multiply(a2, r.BigInt(\"255738958999603826347141\")), l2 = r.toNumber(r.signedRightShift(r.subtract(p2, r.BigInt(\"3402992956809132418596140100660247210\")), r.BigInt(128))), d2 = r.toNumber(r.signedRightShift(r.add(p2, r.BigInt(\"291339464771989622907027621153398088495\")), r.BigInt(128)));\n        return l2 === d2 ? l2 : r.lessThanOrEqual(t2.getSqrtRatioAtTick(d2), e2) ? d2 : l2;\n      }, t2;\n    }();\n    Q.MIN_TICK = -887272, Q.MAX_TICK = -Q.MIN_TICK, Q.MIN_SQRT_RATIO = r.BigInt(\"4295128739\"), Q.MAX_SQRT_RATIO = r.BigInt(\"1461446703485210103287273052203988822378723970342\");\n    var V = function() {\n      function t2() {\n      }\n      var e2 = t2.prototype;\n      return e2.getTick = function() {\n        var e3 = g(v().mark(function e4(n2) {\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                throw new Error(t2.ERROR_MESSAGE);\n              case 1:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4);\n        }));\n        return function(t3) {\n          return e3.apply(this, arguments);\n        };\n      }(), e2.nextInitializedTickWithinOneWord = function() {\n        var e3 = g(v().mark(function e4(n2, r2, i2) {\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                throw new Error(t2.ERROR_MESSAGE);\n              case 1:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4);\n        }));\n        return function(t3, n2, r2) {\n          return e3.apply(this, arguments);\n        };\n      }(), t2;\n    }();\n    function z(t2, e2) {\n      for (var n2 = 0; n2 < t2.length - 1; n2++) if (e2(t2[n2], t2[n2 + 1]) > 0) return false;\n      return true;\n    }\n    function Y(t2, e2) {\n      return t2.index - e2.index;\n    }\n    V.ERROR_MESSAGE = \"No tick data provider was given\";\n    var Z = function() {\n      function t2() {\n      }\n      return t2.validateList = function(t3, e2) {\n        e2 > 0 || i(false), t3.every(function(t4) {\n          return t4.index % e2 == 0;\n        }) || i(false), r.equal(t3.reduce(function(t4, e3) {\n          return r.add(t4, e3.liquidityNet);\n        }, C), C) || i(false), z(t3, Y) || i(false);\n      }, t2.isBelowSmallest = function(t3, e2) {\n        return t3.length > 0 || i(false), e2 < t3[0].index;\n      }, t2.isAtOrAboveLargest = function(t3, e2) {\n        return t3.length > 0 || i(false), e2 >= t3[t3.length - 1].index;\n      }, t2.getTick = function(t3, e2) {\n        var n2 = t3[this.binarySearch(t3, e2)];\n        return n2.index !== e2 && i(false), n2;\n      }, t2.binarySearch = function(t3, e2) {\n        this.isBelowSmallest(t3, e2) && i(false);\n        for (var n2, r2 = 0, o2 = t3.length - 1; ; ) {\n          if (t3[n2 = Math.floor((r2 + o2) / 2)].index <= e2 && (n2 === t3.length - 1 || t3[n2 + 1].index > e2)) return n2;\n          t3[n2].index < e2 ? r2 = n2 + 1 : o2 = n2 - 1;\n        }\n      }, t2.nextInitializedTick = function(e2, n2, r2) {\n        return r2 ? (t2.isBelowSmallest(e2, n2) && i(false), t2.isAtOrAboveLargest(e2, n2) ? e2[e2.length - 1] : e2[this.binarySearch(e2, n2)]) : (this.isAtOrAboveLargest(e2, n2) && i(false), this.isBelowSmallest(e2, n2) ? e2[0] : e2[this.binarySearch(e2, n2) + 1]);\n      }, t2.nextInitializedTickWithinOneWord = function(e2, n2, r2, i2) {\n        var o2 = Math.floor(n2 / i2);\n        if (r2) {\n          var u2 = (o2 >> 8 << 8) * i2;\n          if (t2.isBelowSmallest(e2, n2)) return [u2, false];\n          var a2 = t2.nextInitializedTick(e2, n2, r2).index, c2 = Math.max(u2, a2);\n          return [c2, c2 === a2];\n        }\n        var s2 = ((1 + (o2 + 1 >> 8) << 8) - 1) * i2;\n        if (this.isAtOrAboveLargest(e2, n2)) return [s2, false];\n        var p2 = this.nextInitializedTick(e2, n2, r2).index, l2 = Math.min(s2, p2);\n        return [l2, l2 === p2];\n      }, t2;\n    }();\n    function $(t2) {\n      var e2 = r.BigInt(t2).toString(16);\n      return e2.length % 2 != 0 && (e2 = \"0\" + e2), \"0x\" + e2;\n    }\n    function J(t2, e2) {\n      var n2 = t2.pools.reduce(function(t3, e3, n3) {\n        var r3 = t3.inputToken, i3 = t3.path, o2 = t3.types, u2 = e3.token0.equals(r3) ? e3.token1 : e3.token0;\n        return 0 === n3 ? { inputToken: u2, types: [\"address\", \"uint24\", \"address\"], path: [r3.address, e3.fee, u2.address] } : { inputToken: u2, types: [].concat(o2, [\"uint24\", \"address\"]), path: [].concat(i3, [e3.fee, u2.address]) };\n      }, { inputToken: t2.input.wrapped, path: [], types: [] }), r2 = n2.path, i2 = n2.types;\n      return e2 ? a.pack(i2.reverse(), r2.reverse()) : a.pack(i2, r2);\n    }\n    function tt(t2, e2) {\n      var i2 = r.leftShift(r.BigInt(t2), r.BigInt(192)), o2 = r.BigInt(e2), u2 = r.divide(i2, o2);\n      return n.sqrt(u2);\n    }\n    function et(t2, e2, n2) {\n      if (r.greaterThan(t2, e2)) {\n        var i2 = [e2, t2];\n        t2 = i2[0], e2 = i2[1];\n      }\n      var o2 = r.divide(r.multiply(t2, e2), S);\n      return r.divide(r.multiply(r.BigInt(n2), o2), r.subtract(e2, t2));\n    }\n    function nt(t2, e2, n2) {\n      if (r.greaterThan(t2, e2)) {\n        var i2 = [e2, t2];\n        t2 = i2[0], e2 = i2[1];\n      }\n      var o2 = r.multiply(r.multiply(r.BigInt(n2), t2), e2), u2 = r.multiply(S, r.subtract(e2, t2));\n      return r.divide(o2, u2);\n    }\n    function rt(t2, e2, n2) {\n      if (r.greaterThan(t2, e2)) {\n        var i2 = [e2, t2];\n        t2 = i2[0], e2 = i2[1];\n      }\n      return r.divide(r.multiply(r.BigInt(n2), S), r.subtract(e2, t2));\n    }\n    function it(t2, e2, n2, i2, o2, u2) {\n      if (r.greaterThan(e2, n2)) {\n        var a2 = [n2, e2];\n        e2 = a2[0], n2 = a2[1];\n      }\n      var c2 = u2 ? nt : et;\n      if (r.lessThanOrEqual(t2, e2)) return c2(e2, n2, i2);\n      if (r.lessThan(t2, n2)) {\n        var s2 = c2(t2, n2, i2), p2 = rt(e2, t2, o2);\n        return r.lessThan(s2, p2) ? s2 : p2;\n      }\n      return rt(e2, n2, o2);\n    }\n    var ot = r.exponentiate(r.BigInt(2), r.BigInt(128));\n    var ut = function() {\n      function t2() {\n      }\n      return t2.getTokensOwed = function(t3, e2, n2, i2, o2) {\n        return [r.divide(r.multiply(st(i2, t3), n2), ot), r.divide(r.multiply(st(o2, e2), n2), ot)];\n      }, t2;\n    }();\n    function at(t2, e2, i2) {\n      var o2 = Q.getSqrtRatioAtTick(i2), u2 = r.multiply(o2, o2);\n      return t2.sortsBefore(e2) ? new n.Price(t2, e2, N, u2) : new n.Price(t2, e2, u2, N);\n    }\n    var ct = r.exponentiate(r.BigInt(2), r.BigInt(256));\n    function st(t2, e2) {\n      var n2 = r.subtract(t2, e2);\n      return r.lessThan(n2, C) ? r.add(ct, n2) : n2;\n    }\n    var pt = function() {\n      function t2() {\n      }\n      return t2.getFeeGrowthInside = function(t3, e2, n2, r2, i2, o2, u2) {\n        var a2, c2, s2, p2;\n        return i2 >= n2 ? (a2 = t3.feeGrowthOutside0X128, c2 = t3.feeGrowthOutside1X128) : (a2 = st(o2, t3.feeGrowthOutside0X128), c2 = st(u2, t3.feeGrowthOutside1X128)), i2 < r2 ? (s2 = e2.feeGrowthOutside0X128, p2 = e2.feeGrowthOutside1X128) : (s2 = st(o2, e2.feeGrowthOutside0X128), p2 = st(u2, e2.feeGrowthOutside1X128)), [st(st(o2, a2), s2), st(st(u2, c2), p2)];\n      }, t2;\n    }();\n    var lt = function(t2) {\n      var e2 = t2.index, n2 = t2.liquidityGross, o2 = t2.liquidityNet;\n      e2 >= Q.MIN_TICK && e2 <= Q.MAX_TICK || i(false), this.index = e2, this.liquidityGross = r.BigInt(n2), this.liquidityNet = r.BigInt(o2);\n    };\n    var dt = function() {\n      function t2(t3, e3) {\n        var n2 = t3.map(function(t4) {\n          return t4 instanceof lt ? t4 : new lt(t4);\n        });\n        Z.validateList(n2, e3), this.ticks = n2;\n      }\n      var e2 = t2.prototype;\n      return e2.getTick = function() {\n        var t3 = g(v().mark(function t4(e3) {\n          return v().wrap(function(t5) {\n            for (; ; ) switch (t5.prev = t5.next) {\n              case 0:\n                return t5.abrupt(\"return\", Z.getTick(this.ticks, e3));\n              case 1:\n              case \"end\":\n                return t5.stop();\n            }\n          }, t4, this);\n        }));\n        return function(e3) {\n          return t3.apply(this, arguments);\n        };\n      }(), e2.nextInitializedTickWithinOneWord = function() {\n        var t3 = g(v().mark(function t4(e3, n2, r2) {\n          return v().wrap(function(t5) {\n            for (; ; ) switch (t5.prev = t5.next) {\n              case 0:\n                return t5.abrupt(\"return\", Z.nextInitializedTickWithinOneWord(this.ticks, e3, n2, r2));\n              case 1:\n              case \"end\":\n                return t5.stop();\n            }\n          }, t4, this);\n        }));\n        return function(e3, n2, r2) {\n          return t3.apply(this, arguments);\n        };\n      }(), t2;\n    }();\n    var ft = new V();\n    var ht = function() {\n      function t2(t3, e3, n2, o2, u2, a2, c2) {\n        void 0 === c2 && (c2 = ft), Number.isInteger(n2) && n2 < 1e6 || i(false);\n        var s2 = Q.getSqrtRatioAtTick(a2), p2 = Q.getSqrtRatioAtTick(a2 + 1);\n        r.greaterThanOrEqual(r.BigInt(o2), s2) && r.lessThanOrEqual(r.BigInt(o2), p2) || i(false);\n        var l2 = t3.sortsBefore(e3) ? [t3, e3] : [e3, t3];\n        this.token0 = l2[0], this.token1 = l2[1], this.fee = n2, this.sqrtRatioX96 = r.BigInt(o2), this.liquidity = r.BigInt(u2), this.tickCurrent = a2, this.tickDataProvider = Array.isArray(c2) ? new dt(c2, E[n2]) : c2;\n      }\n      t2.getAddress = function(t3, e3, n2, r2, i2) {\n        return _({ factoryAddress: null != i2 ? i2 : \"0x1F98431c8aD98523631AE4a59f267346ea31F984\", fee: n2, tokenA: t3, tokenB: e3, initCodeHashManualOverride: r2 });\n      };\n      var e2 = t2.prototype;\n      return e2.involvesToken = function(t3) {\n        return t3.equals(this.token0) || t3.equals(this.token1);\n      }, e2.priceOf = function(t3) {\n        return this.involvesToken(t3) || i(false), t3.equals(this.token0) ? this.token0Price : this.token1Price;\n      }, e2.getOutputAmount = function() {\n        var e3 = g(v().mark(function e4(o2, u2) {\n          var a2, c2, s2, p2, l2;\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                return this.involvesToken(o2.currency) || i(false), a2 = o2.currency.equals(this.token0), e5.next = 4, this.swap(a2, o2.quotient, u2);\n              case 4:\n                return s2 = (c2 = e5.sent).sqrtRatioX96, p2 = c2.liquidity, l2 = c2.tickCurrent, e5.abrupt(\"return\", [n.CurrencyAmount.fromRawAmount(a2 ? this.token1 : this.token0, r.multiply(c2.amountCalculated, P)), new t2(this.token0, this.token1, this.fee, s2, p2, l2, this.tickDataProvider)]);\n              case 11:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4, this);\n        }));\n        return function(t3, n2) {\n          return e3.apply(this, arguments);\n        };\n      }(), e2.getInputAmount = function() {\n        var e3 = g(v().mark(function e4(o2, u2) {\n          var a2, c2, s2, p2, l2;\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                return o2.currency.isToken && this.involvesToken(o2.currency) || i(false), a2 = o2.currency.equals(this.token1), e5.next = 4, this.swap(a2, r.multiply(o2.quotient, P), u2);\n              case 4:\n                return s2 = (c2 = e5.sent).sqrtRatioX96, p2 = c2.liquidity, l2 = c2.tickCurrent, e5.abrupt(\"return\", [n.CurrencyAmount.fromRawAmount(a2 ? this.token0 : this.token1, c2.amountCalculated), new t2(this.token0, this.token1, this.fee, s2, p2, l2, this.tickDataProvider)]);\n              case 11:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4, this);\n        }));\n        return function(t3, n2) {\n          return e3.apply(this, arguments);\n        };\n      }(), e2.swap = function() {\n        var t3 = g(v().mark(function t4(e3, n2, o2) {\n          var u2, a2, c2, s2, p2, l2;\n          return v().wrap(function(t5) {\n            for (; ; ) switch (t5.prev = t5.next) {\n              case 0:\n                o2 || (o2 = e3 ? r.add(Q.MIN_SQRT_RATIO, O) : r.subtract(Q.MAX_SQRT_RATIO, O)), e3 ? (r.greaterThan(o2, Q.MIN_SQRT_RATIO) || i(false), r.lessThan(o2, this.sqrtRatioX96) || i(false)) : (r.lessThan(o2, Q.MAX_SQRT_RATIO) || i(false), r.greaterThan(o2, this.sqrtRatioX96) || i(false)), u2 = r.greaterThanOrEqual(n2, C), a2 = { amountSpecifiedRemaining: n2, amountCalculated: C, sqrtPriceX96: this.sqrtRatioX96, tick: this.tickCurrent, liquidity: this.liquidity };\n              case 4:\n                if (!r.notEqual(a2.amountSpecifiedRemaining, C) || a2.sqrtPriceX96 === o2) {\n                  t5.next = 35;\n                  break;\n                }\n                return (c2 = {}).sqrtPriceStartX96 = a2.sqrtPriceX96, t5.next = 9, this.tickDataProvider.nextInitializedTickWithinOneWord(a2.tick, e3, this.tickSpacing);\n              case 9:\n                if (c2.tickNext = (s2 = t5.sent)[0], c2.initialized = s2[1], c2.tickNext < Q.MIN_TICK ? c2.tickNext = Q.MIN_TICK : c2.tickNext > Q.MAX_TICK && (c2.tickNext = Q.MAX_TICK), c2.sqrtPriceNextX96 = Q.getSqrtRatioAtTick(c2.tickNext), p2 = D.computeSwapStep(a2.sqrtPriceX96, (e3 ? r.lessThan(c2.sqrtPriceNextX96, o2) : r.greaterThan(c2.sqrtPriceNextX96, o2)) ? o2 : c2.sqrtPriceNextX96, a2.liquidity, a2.amountSpecifiedRemaining, this.fee), a2.sqrtPriceX96 = p2[0], c2.amountIn = p2[1], c2.amountOut = p2[2], c2.feeAmount = p2[3], u2 ? (a2.amountSpecifiedRemaining = r.subtract(a2.amountSpecifiedRemaining, r.add(c2.amountIn, c2.feeAmount)), a2.amountCalculated = r.subtract(a2.amountCalculated, c2.amountOut)) : (a2.amountSpecifiedRemaining = r.add(a2.amountSpecifiedRemaining, c2.amountOut), a2.amountCalculated = r.add(a2.amountCalculated, r.add(c2.amountIn, c2.feeAmount))), !r.equal(a2.sqrtPriceX96, c2.sqrtPriceNextX96)) {\n                  t5.next = 32;\n                  break;\n                }\n                if (!c2.initialized) {\n                  t5.next = 29;\n                  break;\n                }\n                return t5.t0 = r, t5.next = 25, this.tickDataProvider.getTick(c2.tickNext);\n              case 25:\n                t5.t1 = t5.sent.liquidityNet, l2 = t5.t0.BigInt.call(t5.t0, t5.t1), e3 && (l2 = r.multiply(l2, P)), a2.liquidity = F.addDelta(a2.liquidity, l2);\n              case 29:\n                a2.tick = e3 ? c2.tickNext - 1 : c2.tickNext, t5.next = 33;\n                break;\n              case 32:\n                r.notEqual(a2.sqrtPriceX96, c2.sqrtPriceStartX96) && (a2.tick = Q.getTickAtSqrtRatio(a2.sqrtPriceX96));\n              case 33:\n                t5.next = 4;\n                break;\n              case 35:\n                return t5.abrupt(\"return\", { amountCalculated: a2.amountCalculated, sqrtRatioX96: a2.sqrtPriceX96, liquidity: a2.liquidity, tickCurrent: a2.tick });\n              case 36:\n              case \"end\":\n                return t5.stop();\n            }\n          }, t4, this);\n        }));\n        return function(e3, n2, r2) {\n          return t3.apply(this, arguments);\n        };\n      }(), T(t2, [{ key: \"token0Price\", get: function() {\n        var t3;\n        return null != (t3 = this._token0Price) ? t3 : this._token0Price = new n.Price(this.token0, this.token1, N, r.multiply(this.sqrtRatioX96, this.sqrtRatioX96));\n      } }, { key: \"token1Price\", get: function() {\n        var t3;\n        return null != (t3 = this._token1Price) ? t3 : this._token1Price = new n.Price(this.token1, this.token0, r.multiply(this.sqrtRatioX96, this.sqrtRatioX96), N);\n      } }, { key: \"chainId\", get: function() {\n        return this.token0.chainId;\n      } }, { key: \"tickSpacing\", get: function() {\n        return E[this.fee];\n      } }]), t2;\n    }();\n    var mt = function() {\n      function t2(t3) {\n        var e3 = t3.pool, n2 = t3.liquidity, o2 = t3.tickLower, u2 = t3.tickUpper;\n        this._token0Amount = null, this._token1Amount = null, this._mintAmounts = null, o2 < u2 || i(false), o2 >= Q.MIN_TICK && o2 % e3.tickSpacing == 0 || i(false), u2 <= Q.MAX_TICK && u2 % e3.tickSpacing == 0 || i(false), this.pool = e3, this.tickLower = o2, this.tickUpper = u2, this.liquidity = r.BigInt(n2);\n      }\n      var e2 = t2.prototype;\n      return e2.ratiosAfterSlippage = function(t3) {\n        var e3 = this.pool.token0Price.asFraction.multiply(new n.Percent(1).subtract(t3)), i2 = this.pool.token0Price.asFraction.multiply(t3.add(1)), o2 = tt(e3.numerator, e3.denominator);\n        r.lessThanOrEqual(o2, Q.MIN_SQRT_RATIO) && (o2 = r.add(Q.MIN_SQRT_RATIO, r.BigInt(1)));\n        var u2 = tt(i2.numerator, i2.denominator);\n        return r.greaterThanOrEqual(u2, Q.MAX_SQRT_RATIO) && (u2 = r.subtract(Q.MAX_SQRT_RATIO, r.BigInt(1))), { sqrtRatioX96Lower: o2, sqrtRatioX96Upper: u2 };\n      }, e2.mintAmountsWithSlippage = function(e3) {\n        var n2 = this.ratiosAfterSlippage(e3), r2 = n2.sqrtRatioX96Upper, i2 = n2.sqrtRatioX96Lower, o2 = new ht(this.pool.token0, this.pool.token1, this.pool.fee, i2, 0, Q.getTickAtSqrtRatio(i2)), u2 = new ht(this.pool.token0, this.pool.token1, this.pool.fee, r2, 0, Q.getTickAtSqrtRatio(r2)), a2 = t2.fromAmounts(w({ pool: this.pool, tickLower: this.tickLower, tickUpper: this.tickUpper }, this.mintAmounts, { useFullPrecision: false }));\n        return { amount0: new t2({ pool: u2, liquidity: a2.liquidity, tickLower: this.tickLower, tickUpper: this.tickUpper }).mintAmounts.amount0, amount1: new t2({ pool: o2, liquidity: a2.liquidity, tickLower: this.tickLower, tickUpper: this.tickUpper }).mintAmounts.amount1 };\n      }, e2.burnAmountsWithSlippage = function(e3) {\n        var n2 = this.ratiosAfterSlippage(e3), r2 = n2.sqrtRatioX96Upper, i2 = n2.sqrtRatioX96Lower, o2 = new ht(this.pool.token0, this.pool.token1, this.pool.fee, i2, 0, Q.getTickAtSqrtRatio(i2)), u2 = new t2({ pool: new ht(this.pool.token0, this.pool.token1, this.pool.fee, r2, 0, Q.getTickAtSqrtRatio(r2)), liquidity: this.liquidity, tickLower: this.tickLower, tickUpper: this.tickUpper }).amount0, a2 = new t2({ pool: o2, liquidity: this.liquidity, tickLower: this.tickLower, tickUpper: this.tickUpper }).amount1;\n        return { amount0: u2.quotient, amount1: a2.quotient };\n      }, t2.fromAmounts = function(e3) {\n        var n2 = e3.pool, r2 = e3.tickLower, i2 = e3.tickUpper, o2 = e3.amount0, u2 = e3.amount1, a2 = e3.useFullPrecision, c2 = Q.getSqrtRatioAtTick(r2), s2 = Q.getSqrtRatioAtTick(i2);\n        return new t2({ pool: n2, tickLower: r2, tickUpper: i2, liquidity: it(n2.sqrtRatioX96, c2, s2, o2, u2, a2) });\n      }, t2.fromAmount0 = function(e3) {\n        return t2.fromAmounts({ pool: e3.pool, tickLower: e3.tickLower, tickUpper: e3.tickUpper, amount0: e3.amount0, amount1: n.MaxUint256, useFullPrecision: e3.useFullPrecision });\n      }, t2.fromAmount1 = function(e3) {\n        return t2.fromAmounts({ pool: e3.pool, tickLower: e3.tickLower, tickUpper: e3.tickUpper, amount0: n.MaxUint256, amount1: e3.amount1, useFullPrecision: true });\n      }, T(t2, [{ key: \"token0PriceLower\", get: function() {\n        return at(this.pool.token0, this.pool.token1, this.tickLower);\n      } }, { key: \"token0PriceUpper\", get: function() {\n        return at(this.pool.token0, this.pool.token1, this.tickUpper);\n      } }, { key: \"amount0\", get: function() {\n        return null === this._token0Amount && (this._token0Amount = n.CurrencyAmount.fromRawAmount(this.pool.token0, this.pool.tickCurrent < this.tickLower ? B.getAmount0Delta(Q.getSqrtRatioAtTick(this.tickLower), Q.getSqrtRatioAtTick(this.tickUpper), this.liquidity, false) : this.pool.tickCurrent < this.tickUpper ? B.getAmount0Delta(this.pool.sqrtRatioX96, Q.getSqrtRatioAtTick(this.tickUpper), this.liquidity, false) : C)), this._token0Amount;\n      } }, { key: \"amount1\", get: function() {\n        return null === this._token1Amount && (this._token1Amount = n.CurrencyAmount.fromRawAmount(this.pool.token1, this.pool.tickCurrent < this.tickLower ? C : B.getAmount1Delta(Q.getSqrtRatioAtTick(this.tickLower), this.pool.tickCurrent < this.tickUpper ? this.pool.sqrtRatioX96 : Q.getSqrtRatioAtTick(this.tickUpper), this.liquidity, false))), this._token1Amount;\n      } }, { key: \"mintAmounts\", get: function() {\n        return null === this._mintAmounts ? this.pool.tickCurrent < this.tickLower ? { amount0: B.getAmount0Delta(Q.getSqrtRatioAtTick(this.tickLower), Q.getSqrtRatioAtTick(this.tickUpper), this.liquidity, true), amount1: C } : this.pool.tickCurrent < this.tickUpper ? { amount0: B.getAmount0Delta(this.pool.sqrtRatioX96, Q.getSqrtRatioAtTick(this.tickUpper), this.liquidity, true), amount1: B.getAmount1Delta(Q.getSqrtRatioAtTick(this.tickLower), this.pool.sqrtRatioX96, this.liquidity, true) } : { amount0: C, amount1: B.getAmount1Delta(Q.getSqrtRatioAtTick(this.tickLower), Q.getSqrtRatioAtTick(this.tickUpper), this.liquidity, true) } : this._mintAmounts;\n      } }]), t2;\n    }();\n    var vt = function() {\n      function t2(t3, e2, n2) {\n        this._midPrice = null, t3.length > 0 || i(false);\n        var r2 = t3[0].chainId;\n        t3.every(function(t4) {\n          return t4.chainId === r2;\n        }) || i(false);\n        var o2 = e2.wrapped;\n        t3[0].involvesToken(o2) || i(false), t3[t3.length - 1].involvesToken(n2.wrapped) || i(false);\n        for (var u2, a2 = [o2], c2 = I(t3.entries()); !(u2 = c2()).done; ) {\n          var s2 = u2.value, p2 = s2[1], l2 = a2[s2[0]];\n          l2.equals(p2.token0) || l2.equals(p2.token1) || i(false);\n          var d2 = l2.equals(p2.token0) ? p2.token1 : p2.token0;\n          a2.push(d2);\n        }\n        this.pools = t3, this.tokenPath = a2, this.input = e2, this.output = null != n2 ? n2 : a2[a2.length - 1];\n      }\n      return T(t2, [{ key: \"chainId\", get: function() {\n        return this.pools[0].chainId;\n      } }, { key: \"midPrice\", get: function() {\n        if (null !== this._midPrice) return this._midPrice;\n        var t3 = this.pools.slice(1).reduce(function(t4, e2) {\n          var n2 = t4.price;\n          return t4.nextInput.equals(e2.token0) ? { nextInput: e2.token1, price: n2.multiply(e2.token0Price) } : { nextInput: e2.token0, price: n2.multiply(e2.token1Price) };\n        }, this.pools[0].token0.equals(this.input.wrapped) ? { nextInput: this.pools[0].token1, price: this.pools[0].token0Price } : { nextInput: this.pools[0].token0, price: this.pools[0].token1Price }).price;\n        return this._midPrice = new n.Price(this.input, this.output, t3.denominator, t3.numerator);\n      } }]), t2;\n    }();\n    function yt(t2, e2) {\n      return t2.inputAmount.currency.equals(e2.inputAmount.currency) || i(false), t2.outputAmount.currency.equals(e2.outputAmount.currency) || i(false), t2.outputAmount.equalTo(e2.outputAmount) ? t2.inputAmount.equalTo(e2.inputAmount) ? t2.swaps.reduce(function(t3, e3) {\n        return t3 + e3.route.tokenPath.length;\n      }, 0) - e2.swaps.reduce(function(t3, e3) {\n        return t3 + e3.route.tokenPath.length;\n      }, 0) : t2.inputAmount.lessThan(e2.inputAmount) ? -1 : 1 : t2.outputAmount.lessThan(e2.outputAmount) ? 1 : -1;\n    }\n    var kt = function() {\n      function t2(t3) {\n        var e3 = t3.routes, n2 = t3.tradeType, r2 = e3[0].inputAmount.currency, o2 = e3[0].outputAmount.currency;\n        e3.every(function(t4) {\n          return r2.wrapped.equals(t4.route.input.wrapped);\n        }) || i(false), e3.every(function(t4) {\n          return o2.wrapped.equals(t4.route.output.wrapped);\n        }) || i(false);\n        for (var u2, a2 = e3.map(function(t4) {\n          return t4.route.pools.length;\n        }).reduce(function(t4, e4) {\n          return t4 + e4;\n        }, 0), c2 = /* @__PURE__ */ new Set(), s2 = I(e3); !(u2 = s2()).done; ) for (var p2, l2 = I(u2.value.route.pools); !(p2 = l2()).done; ) {\n          var d2 = p2.value;\n          c2.add(ht.getAddress(d2.token0, d2.token1, d2.fee));\n        }\n        a2 !== c2.size && i(false), this.swaps = e3, this.tradeType = n2;\n      }\n      t2.exactIn = function() {\n        var e3 = g(v().mark(function e4(r2, i2) {\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                return e5.abrupt(\"return\", t2.fromRoute(r2, i2, n.TradeType.EXACT_INPUT));\n              case 1:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4);\n        }));\n        return function(t3, n2) {\n          return e3.apply(this, arguments);\n        };\n      }(), t2.exactOut = function() {\n        var e3 = g(v().mark(function e4(r2, i2) {\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                return e5.abrupt(\"return\", t2.fromRoute(r2, i2, n.TradeType.EXACT_OUTPUT));\n              case 1:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4);\n        }));\n        return function(t3, n2) {\n          return e3.apply(this, arguments);\n        };\n      }(), t2.fromRoute = function() {\n        var e3 = g(v().mark(function e4(r2, o2, u2) {\n          var a2, c2, s2, p2, l2, d2, f2;\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                if (a2 = new Array(r2.tokenPath.length), u2 !== n.TradeType.EXACT_INPUT) {\n                  e5.next = 19;\n                  break;\n                }\n                o2.currency.equals(r2.input) || i(false), a2[0] = o2.wrapped, p2 = 0;\n              case 5:\n                if (!(p2 < r2.tokenPath.length - 1)) {\n                  e5.next = 15;\n                  break;\n                }\n                return l2 = r2.pools[p2], e5.next = 9, l2.getOutputAmount(a2[p2]);\n              case 9:\n                a2[p2 + 1] = e5.sent[0];\n              case 12:\n                p2++, e5.next = 5;\n                break;\n              case 15:\n                c2 = n.CurrencyAmount.fromFractionalAmount(r2.input, o2.numerator, o2.denominator), s2 = n.CurrencyAmount.fromFractionalAmount(r2.output, a2[a2.length - 1].numerator, a2[a2.length - 1].denominator), e5.next = 34;\n                break;\n              case 19:\n                o2.currency.equals(r2.output) || i(false), a2[a2.length - 1] = o2.wrapped, d2 = r2.tokenPath.length - 1;\n              case 22:\n                if (!(d2 > 0)) {\n                  e5.next = 32;\n                  break;\n                }\n                return f2 = r2.pools[d2 - 1], e5.next = 26, f2.getInputAmount(a2[d2]);\n              case 26:\n                a2[d2 - 1] = e5.sent[0];\n              case 29:\n                d2--, e5.next = 22;\n                break;\n              case 32:\n                c2 = n.CurrencyAmount.fromFractionalAmount(r2.input, a2[0].numerator, a2[0].denominator), s2 = n.CurrencyAmount.fromFractionalAmount(r2.output, o2.numerator, o2.denominator);\n              case 34:\n                return e5.abrupt(\"return\", new t2({ routes: [{ inputAmount: c2, outputAmount: s2, route: r2 }], tradeType: u2 }));\n              case 35:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4);\n        }));\n        return function(t3, n2, r2) {\n          return e3.apply(this, arguments);\n        };\n      }(), t2.fromRoutes = function() {\n        var e3 = g(v().mark(function e4(r2, o2) {\n          var u2, a2, c2, s2, p2, l2, d2, f2, h2, m2, y2, k2, g2;\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                u2 = [], a2 = I(r2);\n              case 2:\n                if ((c2 = a2()).done) {\n                  e5.next = 43;\n                  break;\n                }\n                if (p2 = (s2 = c2.value).route, l2 = s2.amount, d2 = new Array(p2.tokenPath.length), f2 = void 0, h2 = void 0, o2 !== n.TradeType.EXACT_INPUT) {\n                  e5.next = 25;\n                  break;\n                }\n                l2.currency.equals(p2.input) || i(false), f2 = n.CurrencyAmount.fromFractionalAmount(p2.input, l2.numerator, l2.denominator), d2[0] = n.CurrencyAmount.fromFractionalAmount(p2.input.wrapped, l2.numerator, l2.denominator), m2 = 0;\n              case 12:\n                if (!(m2 < p2.tokenPath.length - 1)) {\n                  e5.next = 22;\n                  break;\n                }\n                return y2 = p2.pools[m2], e5.next = 16, y2.getOutputAmount(d2[m2]);\n              case 16:\n                d2[m2 + 1] = e5.sent[0];\n              case 19:\n                m2++, e5.next = 12;\n                break;\n              case 22:\n                h2 = n.CurrencyAmount.fromFractionalAmount(p2.output, d2[d2.length - 1].numerator, d2[d2.length - 1].denominator), e5.next = 40;\n                break;\n              case 25:\n                l2.currency.equals(p2.output) || i(false), h2 = n.CurrencyAmount.fromFractionalAmount(p2.output, l2.numerator, l2.denominator), d2[d2.length - 1] = n.CurrencyAmount.fromFractionalAmount(p2.output.wrapped, l2.numerator, l2.denominator), k2 = p2.tokenPath.length - 1;\n              case 29:\n                if (!(k2 > 0)) {\n                  e5.next = 39;\n                  break;\n                }\n                return g2 = p2.pools[k2 - 1], e5.next = 33, g2.getInputAmount(d2[k2]);\n              case 33:\n                d2[k2 - 1] = e5.sent[0];\n              case 36:\n                k2--, e5.next = 29;\n                break;\n              case 39:\n                f2 = n.CurrencyAmount.fromFractionalAmount(p2.input, d2[0].numerator, d2[0].denominator);\n              case 40:\n                u2.push({ route: p2, inputAmount: f2, outputAmount: h2 });\n              case 41:\n                e5.next = 2;\n                break;\n              case 43:\n                return e5.abrupt(\"return\", new t2({ routes: u2, tradeType: o2 }));\n              case 44:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4);\n        }));\n        return function(t3, n2) {\n          return e3.apply(this, arguments);\n        };\n      }(), t2.createUncheckedTrade = function(e3) {\n        return new t2(w({}, e3, { routes: [{ inputAmount: e3.inputAmount, outputAmount: e3.outputAmount, route: e3.route }] }));\n      }, t2.createUncheckedTradeWithMultipleRoutes = function(e3) {\n        return new t2(e3);\n      };\n      var e2 = t2.prototype;\n      return e2.minimumAmountOut = function(t3, e3) {\n        if (void 0 === e3 && (e3 = this.outputAmount), t3.lessThan(C) && i(false), this.tradeType === n.TradeType.EXACT_OUTPUT) return e3;\n        var r2 = new n.Fraction(O).add(t3).invert().multiply(e3.quotient).quotient;\n        return n.CurrencyAmount.fromRawAmount(e3.currency, r2);\n      }, e2.maximumAmountIn = function(t3, e3) {\n        if (void 0 === e3 && (e3 = this.inputAmount), t3.lessThan(C) && i(false), this.tradeType === n.TradeType.EXACT_INPUT) return e3;\n        var r2 = new n.Fraction(O).add(t3).multiply(e3.quotient).quotient;\n        return n.CurrencyAmount.fromRawAmount(e3.currency, r2);\n      }, e2.worstExecutionPrice = function(t3) {\n        return new n.Price(this.inputAmount.currency, this.outputAmount.currency, this.maximumAmountIn(t3).quotient, this.minimumAmountOut(t3).quotient);\n      }, t2.bestTradeExactIn = function() {\n        var e3 = g(v().mark(function e4(r2, o2, u2, a2, c2, s2, p2) {\n          var l2, d2, f2, h2, m2, y2, k2, g2, A2, T2, w2;\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                f2 = void 0 === (d2 = (l2 = void 0 === a2 ? {} : a2).maxNumResults) ? 3 : d2, m2 = void 0 === (h2 = l2.maxHops) ? 3 : h2, void 0 === c2 && (c2 = []), void 0 === s2 && (s2 = o2), void 0 === p2 && (p2 = []), r2.length > 0 || i(false), m2 > 0 || i(false), o2 === s2 || c2.length > 0 || i(false), y2 = s2.wrapped, k2 = u2.wrapped, g2 = 0;\n              case 10:\n                if (!(g2 < r2.length)) {\n                  e5.next = 46;\n                  break;\n                }\n                if ((A2 = r2[g2]).token0.equals(y2.currency) || A2.token1.equals(y2.currency)) {\n                  e5.next = 14;\n                  break;\n                }\n                return e5.abrupt(\"continue\", 43);\n              case 14:\n                return T2 = void 0, e5.prev = 15, e5.next = 19, A2.getOutputAmount(y2);\n              case 19:\n                T2 = e5.sent[0], e5.next = 28;\n                break;\n              case 23:\n                if (e5.prev = 23, e5.t0 = e5.catch(15), !e5.t0.isInsufficientInputAmountError) {\n                  e5.next = 27;\n                  break;\n                }\n                return e5.abrupt(\"continue\", 43);\n              case 27:\n                throw e5.t0;\n              case 28:\n                if (!T2.currency.isToken || !T2.currency.equals(k2)) {\n                  e5.next = 39;\n                  break;\n                }\n                return e5.t1 = n.sortedInsert, e5.t2 = p2, e5.next = 33, t2.fromRoute(new vt([].concat(c2, [A2]), o2.currency, u2), o2, n.TradeType.EXACT_INPUT);\n              case 33:\n                e5.t3 = e5.sent, e5.t4 = f2, e5.t5 = yt, (0, e5.t1)(e5.t2, e5.t3, e5.t4, e5.t5), e5.next = 43;\n                break;\n              case 39:\n                if (!(m2 > 1 && r2.length > 1)) {\n                  e5.next = 43;\n                  break;\n                }\n                return w2 = r2.slice(0, g2).concat(r2.slice(g2 + 1, r2.length)), e5.next = 43, t2.bestTradeExactIn(w2, o2, u2, { maxNumResults: f2, maxHops: m2 - 1 }, [].concat(c2, [A2]), T2, p2);\n              case 43:\n                g2++, e5.next = 10;\n                break;\n              case 46:\n                return e5.abrupt(\"return\", p2);\n              case 47:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4, null, [[15, 23]]);\n        }));\n        return function(t3, n2, r2, i2, o2, u2, a2) {\n          return e3.apply(this, arguments);\n        };\n      }(), t2.bestTradeExactOut = function() {\n        var e3 = g(v().mark(function e4(r2, o2, u2, a2, c2, s2, p2) {\n          var l2, d2, f2, h2, m2, y2, k2, g2, A2, T2, w2;\n          return v().wrap(function(e5) {\n            for (; ; ) switch (e5.prev = e5.next) {\n              case 0:\n                f2 = void 0 === (d2 = (l2 = void 0 === a2 ? {} : a2).maxNumResults) ? 3 : d2, m2 = void 0 === (h2 = l2.maxHops) ? 3 : h2, void 0 === c2 && (c2 = []), void 0 === s2 && (s2 = u2), void 0 === p2 && (p2 = []), r2.length > 0 || i(false), m2 > 0 || i(false), u2 === s2 || c2.length > 0 || i(false), y2 = s2.wrapped, k2 = o2.wrapped, g2 = 0;\n              case 10:\n                if (!(g2 < r2.length)) {\n                  e5.next = 46;\n                  break;\n                }\n                if ((A2 = r2[g2]).token0.equals(y2.currency) || A2.token1.equals(y2.currency)) {\n                  e5.next = 14;\n                  break;\n                }\n                return e5.abrupt(\"continue\", 43);\n              case 14:\n                return T2 = void 0, e5.prev = 15, e5.next = 19, A2.getInputAmount(y2);\n              case 19:\n                T2 = e5.sent[0], e5.next = 28;\n                break;\n              case 23:\n                if (e5.prev = 23, e5.t0 = e5.catch(15), !e5.t0.isInsufficientReservesError) {\n                  e5.next = 27;\n                  break;\n                }\n                return e5.abrupt(\"continue\", 43);\n              case 27:\n                throw e5.t0;\n              case 28:\n                if (!T2.currency.equals(k2)) {\n                  e5.next = 39;\n                  break;\n                }\n                return e5.t1 = n.sortedInsert, e5.t2 = p2, e5.next = 33, t2.fromRoute(new vt([A2].concat(c2), o2, u2.currency), u2, n.TradeType.EXACT_OUTPUT);\n              case 33:\n                e5.t3 = e5.sent, e5.t4 = f2, e5.t5 = yt, (0, e5.t1)(e5.t2, e5.t3, e5.t4, e5.t5), e5.next = 43;\n                break;\n              case 39:\n                if (!(m2 > 1 && r2.length > 1)) {\n                  e5.next = 43;\n                  break;\n                }\n                return w2 = r2.slice(0, g2).concat(r2.slice(g2 + 1, r2.length)), e5.next = 43, t2.bestTradeExactOut(w2, o2, u2, { maxNumResults: f2, maxHops: m2 - 1 }, [A2].concat(c2), T2, p2);\n              case 43:\n                g2++, e5.next = 10;\n                break;\n              case 46:\n                return e5.abrupt(\"return\", p2);\n              case 47:\n              case \"end\":\n                return e5.stop();\n            }\n          }, e4, null, [[15, 23]]);\n        }));\n        return function(t3, n2, r2, i2, o2, u2, a2) {\n          return e3.apply(this, arguments);\n        };\n      }(), T(t2, [{ key: \"route\", get: function() {\n        return 1 !== this.swaps.length && i(false), this.swaps[0].route;\n      } }, { key: \"inputAmount\", get: function() {\n        if (this._inputAmount) return this._inputAmount;\n        var t3 = this.swaps[0].inputAmount.currency, e3 = this.swaps.map(function(t4) {\n          return t4.inputAmount;\n        }).reduce(function(t4, e4) {\n          return t4.add(e4);\n        }, n.CurrencyAmount.fromRawAmount(t3, 0));\n        return this._inputAmount = e3, this._inputAmount;\n      } }, { key: \"outputAmount\", get: function() {\n        if (this._outputAmount) return this._outputAmount;\n        var t3 = this.swaps[0].outputAmount.currency, e3 = this.swaps.map(function(t4) {\n          return t4.outputAmount;\n        }).reduce(function(t4, e4) {\n          return t4.add(e4);\n        }, n.CurrencyAmount.fromRawAmount(t3, 0));\n        return this._outputAmount = e3, this._outputAmount;\n      } }, { key: \"executionPrice\", get: function() {\n        var t3;\n        return null != (t3 = this._executionPrice) ? t3 : this._executionPrice = new n.Price(this.inputAmount.currency, this.outputAmount.currency, this.inputAmount.quotient, this.outputAmount.quotient);\n      } }, { key: \"priceImpact\", get: function() {\n        if (this._priceImpact) return this._priceImpact;\n        for (var t3, e3 = n.CurrencyAmount.fromRawAmount(this.outputAmount.currency, 0), r2 = I(this.swaps); !(t3 = r2()).done; ) {\n          var i2 = t3.value;\n          e3 = e3.add(i2.route.midPrice.quote(i2.inputAmount));\n        }\n        var o2 = e3.subtract(this.outputAmount).divide(e3);\n        return this._priceImpact = new n.Percent(o2.numerator, o2.denominator), this._priceImpact;\n      } }]), t2;\n    }();\n    var gt = function() {\n      function t2() {\n      }\n      return t2.encodeMulticall = function(e2) {\n        return Array.isArray(e2) || (e2 = [e2]), 1 === e2.length ? e2[0] : t2.INTERFACE.encodeFunctionData(\"multicall\", [e2]);\n      }, t2;\n    }();\n    gt.INTERFACE = new o.Interface(c.abi);\n    var At = function() {\n      function t2() {\n      }\n      return t2.encodePermit = function(e2, n2) {\n        return \"nonce\" in n2 ? t2.INTERFACE.encodeFunctionData(\"selfPermitAllowed\", [e2.address, $(n2.nonce), $(n2.expiry), n2.v, n2.r, n2.s]) : t2.INTERFACE.encodeFunctionData(\"selfPermit\", [e2.address, $(n2.amount), $(n2.deadline), n2.v, n2.r, n2.s]);\n      }, t2;\n    }();\n    At.INTERFACE = new o.Interface(p.abi);\n    var Tt = function() {\n      function t2() {\n      }\n      return t2.encodeFeeBips = function(t3) {\n        return $(t3.multiply(1e4).quotient);\n      }, t2.encodeUnwrapWETH9 = function(e2, r2, i2) {\n        if (r2 = n.validateAndParseAddress(r2), i2) {\n          var o2 = this.encodeFeeBips(i2.fee), u2 = n.validateAndParseAddress(i2.recipient);\n          return t2.INTERFACE.encodeFunctionData(\"unwrapWETH9WithFee\", [$(e2), r2, o2, u2]);\n        }\n        return t2.INTERFACE.encodeFunctionData(\"unwrapWETH9\", [$(e2), r2]);\n      }, t2.encodeSweepToken = function(e2, r2, i2, o2) {\n        if (i2 = n.validateAndParseAddress(i2), o2) {\n          var u2 = this.encodeFeeBips(o2.fee), a2 = n.validateAndParseAddress(o2.recipient);\n          return t2.INTERFACE.encodeFunctionData(\"sweepTokenWithFee\", [e2.address, $(r2), i2, u2, a2]);\n        }\n        return t2.INTERFACE.encodeFunctionData(\"sweepToken\", [e2.address, $(r2), i2]);\n      }, t2.encodeRefundETH = function() {\n        return t2.INTERFACE.encodeFunctionData(\"refundETH\");\n      }, t2;\n    }();\n    Tt.INTERFACE = new o.Interface(l.abi);\n    var wt = [\"expectedCurrencyOwed0\", \"expectedCurrencyOwed1\"];\n    var xt = $(r.subtract(r.exponentiate(r.BigInt(2), r.BigInt(128)), r.BigInt(1)));\n    function It(t2) {\n      return Object.keys(t2).some(function(t3) {\n        return \"recipient\" === t3;\n      });\n    }\n    var qt = function() {\n      function t2() {\n      }\n      return t2.encodeCreate = function(e2) {\n        return t2.INTERFACE.encodeFunctionData(\"createAndInitializePoolIfNecessary\", [e2.token0.address, e2.token1.address, e2.fee, $(e2.sqrtRatioX96)]);\n      }, t2.createCallParameters = function(t3) {\n        return { calldata: this.encodeCreate(t3), value: $(0) };\n      }, t2.addCallParameters = function(e2, o2) {\n        r.greaterThan(e2.liquidity, C) || i(false);\n        var u2 = [], a2 = e2.mintAmounts, c2 = a2.amount0, s2 = a2.amount1, p2 = e2.mintAmountsWithSlippage(o2.slippageTolerance), l2 = $(p2.amount0), d2 = $(p2.amount1), f2 = $(o2.deadline);\n        if (It(o2) && o2.createPool && u2.push(this.encodeCreate(e2.pool)), o2.token0Permit && u2.push(At.encodePermit(e2.pool.token0, o2.token0Permit)), o2.token1Permit && u2.push(At.encodePermit(e2.pool.token1, o2.token1Permit)), It(o2)) {\n          var h2 = n.validateAndParseAddress(o2.recipient);\n          u2.push(t2.INTERFACE.encodeFunctionData(\"mint\", [{ token0: e2.pool.token0.address, token1: e2.pool.token1.address, fee: e2.pool.fee, tickLower: e2.tickLower, tickUpper: e2.tickUpper, amount0Desired: $(c2), amount1Desired: $(s2), amount0Min: l2, amount1Min: d2, recipient: h2, deadline: f2 }]));\n        } else u2.push(t2.INTERFACE.encodeFunctionData(\"increaseLiquidity\", [{ tokenId: $(o2.tokenId), amount0Desired: $(c2), amount1Desired: $(s2), amount0Min: l2, amount1Min: d2, deadline: f2 }]));\n        var m2 = $(0);\n        if (o2.useNative) {\n          var v2 = o2.useNative.wrapped;\n          e2.pool.token0.equals(v2) || e2.pool.token1.equals(v2) || i(false);\n          var y2 = e2.pool.token0.equals(v2) ? c2 : s2;\n          r.greaterThan(y2, C) && u2.push(Tt.encodeRefundETH()), m2 = $(y2);\n        }\n        return { calldata: gt.encodeMulticall(u2), value: m2 };\n      }, t2.encodeCollect = function(e2) {\n        var r2 = [], i2 = $(e2.tokenId), o2 = e2.expectedCurrencyOwed0.currency.isNative || e2.expectedCurrencyOwed1.currency.isNative, u2 = n.validateAndParseAddress(e2.recipient);\n        if (r2.push(t2.INTERFACE.encodeFunctionData(\"collect\", [{ tokenId: i2, recipient: o2 ? b : u2, amount0Max: xt, amount1Max: xt }])), o2) {\n          var a2 = e2.expectedCurrencyOwed0.currency.isNative ? e2.expectedCurrencyOwed1.currency : e2.expectedCurrencyOwed0.currency, c2 = e2.expectedCurrencyOwed0.currency.isNative ? e2.expectedCurrencyOwed1.quotient : e2.expectedCurrencyOwed0.quotient;\n          r2.push(Tt.encodeUnwrapWETH9(e2.expectedCurrencyOwed0.currency.isNative ? e2.expectedCurrencyOwed0.quotient : e2.expectedCurrencyOwed1.quotient, u2)), r2.push(Tt.encodeSweepToken(a2, c2, u2));\n        }\n        return r2;\n      }, t2.collectCallParameters = function(e2) {\n        var n2 = t2.encodeCollect(e2);\n        return { calldata: gt.encodeMulticall(n2), value: $(0) };\n      }, t2.removeCallParameters = function(e2, o2) {\n        var u2 = [], a2 = $(o2.deadline), c2 = $(o2.tokenId), s2 = new mt({ pool: e2.pool, liquidity: o2.liquidityPercentage.multiply(e2.liquidity).quotient, tickLower: e2.tickLower, tickUpper: e2.tickUpper });\n        r.greaterThan(s2.liquidity, C) || i(false);\n        var p2 = s2.burnAmountsWithSlippage(o2.slippageTolerance), l2 = p2.amount0, d2 = p2.amount1;\n        o2.permit && u2.push(t2.INTERFACE.encodeFunctionData(\"permit\", [n.validateAndParseAddress(o2.permit.spender), c2, $(o2.permit.deadline), o2.permit.v, o2.permit.r, o2.permit.s])), u2.push(t2.INTERFACE.encodeFunctionData(\"decreaseLiquidity\", [{ tokenId: c2, liquidity: $(s2.liquidity), amount0Min: $(l2), amount1Min: $(d2), deadline: a2 }]));\n        var f2 = o2.collectOptions, h2 = f2.expectedCurrencyOwed0, m2 = f2.expectedCurrencyOwed1, v2 = function(t3, e3) {\n          if (null == t3) return {};\n          var n2, r2, i2 = {}, o3 = Object.keys(t3);\n          for (r2 = 0; r2 < o3.length; r2++) e3.indexOf(n2 = o3[r2]) >= 0 || (i2[n2] = t3[n2]);\n          return i2;\n        }(f2, wt);\n        return u2.push.apply(u2, t2.encodeCollect(w({ tokenId: $(o2.tokenId), expectedCurrencyOwed0: h2.add(n.CurrencyAmount.fromRawAmount(h2.currency, l2)), expectedCurrencyOwed1: m2.add(n.CurrencyAmount.fromRawAmount(m2.currency, d2)) }, v2))), o2.liquidityPercentage.equalTo(O) ? o2.burnToken && u2.push(t2.INTERFACE.encodeFunctionData(\"burn\", [c2])) : true === o2.burnToken && i(false), { calldata: gt.encodeMulticall(u2), value: $(0) };\n      }, t2.safeTransferFromParameters = function(e2) {\n        var r2 = n.validateAndParseAddress(e2.recipient), i2 = n.validateAndParseAddress(e2.sender);\n        return { calldata: e2.data ? t2.INTERFACE.encodeFunctionData(\"safeTransferFrom(address,address,uint256,bytes)\", [i2, r2, $(e2.tokenId), e2.data]) : t2.INTERFACE.encodeFunctionData(\"safeTransferFrom(address,address,uint256)\", [i2, r2, $(e2.tokenId)]), value: $(0) };\n      }, t2;\n    }();\n    qt.INTERFACE = new o.Interface(s.abi);\n    var bt = function() {\n      function t2() {\n      }\n      return t2.quoteCallParameters = function(t3, e2, r2, o2) {\n        void 0 === o2 && (o2 = {});\n        var u2, a2 = 1 === t3.pools.length, c2 = $(e2.quotient), s2 = o2.useQuoterV2 ? this.V2INTERFACE : this.V1INTERFACE;\n        if (a2) {\n          var p2, l2, d2 = { tokenIn: t3.tokenPath[0].address, tokenOut: t3.tokenPath[1].address, fee: t3.pools[0].fee, sqrtPriceLimitX96: $(null != (p2 = null == (l2 = o2) ? void 0 : l2.sqrtPriceLimitX96) ? p2 : 0) }, f2 = w({}, d2, r2 === n.TradeType.EXACT_INPUT ? { amountIn: c2 } : { amount: c2 });\n          u2 = s2.encodeFunctionData(r2 === n.TradeType.EXACT_INPUT ? \"quoteExactInputSingle\" : \"quoteExactOutputSingle\", o2.useQuoterV2 ? [f2] : [d2.tokenIn, d2.tokenOut, d2.fee, c2, d2.sqrtPriceLimitX96]);\n        } else {\n          var h2;\n          void 0 !== (null == (h2 = o2) ? void 0 : h2.sqrtPriceLimitX96) && i(false);\n          var m2 = J(t3, r2 === n.TradeType.EXACT_OUTPUT);\n          u2 = s2.encodeFunctionData(r2 === n.TradeType.EXACT_INPUT ? \"quoteExactInput\" : \"quoteExactOutput\", [m2, c2]);\n        }\n        return { calldata: u2, value: $(0) };\n      }, t2;\n    }();\n    bt.V1INTERFACE = new o.Interface(d.abi), bt.V2INTERFACE = new o.Interface(f.abi);\n    var Rt = function() {\n      function t2() {\n      }\n      return t2.encodeClaim = function(e2, r2) {\n        var i2, o2 = [];\n        o2.push(t2.INTERFACE.encodeFunctionData(\"unstakeToken\", [this._encodeIncentiveKey(e2), $(r2.tokenId)]));\n        var u2 = n.validateAndParseAddress(r2.recipient), a2 = null != (i2 = r2.amount) ? i2 : 0;\n        return o2.push(t2.INTERFACE.encodeFunctionData(\"claimReward\", [e2.rewardToken.address, u2, $(a2)])), o2;\n      }, t2.collectRewards = function(e2, n2) {\n        e2 = Array.isArray(e2) ? e2 : [e2];\n        for (var r2 = [], i2 = 0; i2 < e2.length; i2++) {\n          var o2 = e2[i2];\n          (r2 = r2.concat(this.encodeClaim(o2, n2))).push(t2.INTERFACE.encodeFunctionData(\"stakeToken\", [this._encodeIncentiveKey(o2), $(n2.tokenId)]));\n        }\n        return { calldata: gt.encodeMulticall(r2), value: $(0) };\n      }, t2.withdrawToken = function(e2, r2) {\n        var i2 = [];\n        e2 = Array.isArray(e2) ? e2 : [e2];\n        for (var o2 = { tokenId: r2.tokenId, recipient: r2.recipient, amount: r2.amount }, u2 = 0; u2 < e2.length; u2++) i2 = i2.concat(this.encodeClaim(e2[u2], o2));\n        var a2 = n.validateAndParseAddress(r2.owner);\n        return i2.push(t2.INTERFACE.encodeFunctionData(\"withdrawToken\", [$(r2.tokenId), a2, r2.data ? r2.data : $(0)])), { calldata: gt.encodeMulticall(i2), value: $(0) };\n      }, t2.encodeDeposit = function(e2) {\n        var n2;\n        if ((e2 = Array.isArray(e2) ? e2 : [e2]).length > 1) {\n          for (var r2 = [], i2 = 0; i2 < e2.length; i2++) r2.push(this._encodeIncentiveKey(e2[i2]));\n          n2 = o.defaultAbiCoder.encode([t2.INCENTIVE_KEY_ABI + \"[]\"], [r2]);\n        } else n2 = o.defaultAbiCoder.encode([t2.INCENTIVE_KEY_ABI], [this._encodeIncentiveKey(e2[0])]);\n        return n2;\n      }, t2._encodeIncentiveKey = function(t3) {\n        var e2 = t3.pool, r2 = e2.token0, i2 = e2.token1, o2 = e2.fee, u2 = n.validateAndParseAddress(t3.refundee);\n        return { rewardToken: t3.rewardToken.address, pool: ht.getAddress(r2, i2, o2), startTime: $(t3.startTime), endTime: $(t3.endTime), refundee: u2 };\n      }, t2;\n    }();\n    Rt.INTERFACE = new o.Interface(h.abi), Rt.INCENTIVE_KEY_ABI = \"tuple(address rewardToken, address pool, uint256 startTime, uint256 endTime, address refundee)\";\n    var Et = function() {\n      function t2() {\n      }\n      return t2.swapCallParameters = function(e2, r2) {\n        Array.isArray(e2) || (e2 = [e2]);\n        var o2 = e2[0], u2 = o2.inputAmount.currency.wrapped, a2 = o2.outputAmount.currency.wrapped;\n        e2.every(function(t3) {\n          return t3.inputAmount.currency.wrapped.equals(u2);\n        }) || i(false), e2.every(function(t3) {\n          return t3.outputAmount.currency.wrapped.equals(a2);\n        }) || i(false);\n        var c2 = [], s2 = n.CurrencyAmount.fromRawAmount(e2[0].inputAmount.currency, 0), p2 = n.CurrencyAmount.fromRawAmount(e2[0].outputAmount.currency, 0), l2 = e2.reduce(function(t3, e3) {\n          return t3.add(e3.minimumAmountOut(r2.slippageTolerance));\n        }, p2), d2 = o2.inputAmount.currency.isNative && o2.tradeType === n.TradeType.EXACT_OUTPUT, f2 = o2.outputAmount.currency.isNative, h2 = f2 || !!r2.fee, m2 = o2.inputAmount.currency.isNative ? e2.reduce(function(t3, e3) {\n          return t3.add(e3.maximumAmountIn(r2.slippageTolerance));\n        }, s2) : s2;\n        r2.inputTokenPermit && (o2.inputAmount.currency.isToken || i(false), c2.push(At.encodePermit(o2.inputAmount.currency, r2.inputTokenPermit)));\n        for (var v2, y2 = n.validateAndParseAddress(r2.recipient), k2 = $(r2.deadline), g2 = I(e2); !(v2 = g2()).done; ) for (var A2, T2 = v2.value, w2 = I(T2.swaps); !(A2 = w2()).done; ) {\n          var x2 = A2.value, q2 = x2.route, R2 = x2.outputAmount, E2 = $(T2.maximumAmountIn(r2.slippageTolerance, x2.inputAmount).quotient), P2 = $(T2.minimumAmountOut(r2.slippageTolerance, R2).quotient);\n          if (1 === q2.pools.length) if (T2.tradeType === n.TradeType.EXACT_INPUT) {\n            var C2, O2 = { tokenIn: q2.tokenPath[0].address, tokenOut: q2.tokenPath[1].address, fee: q2.pools[0].fee, recipient: h2 ? b : y2, deadline: k2, amountIn: E2, amountOutMinimum: P2, sqrtPriceLimitX96: $(null != (C2 = r2.sqrtPriceLimitX96) ? C2 : 0) };\n            c2.push(t2.INTERFACE.encodeFunctionData(\"exactInputSingle\", [O2]));\n          } else {\n            var S2, N2 = { tokenIn: q2.tokenPath[0].address, tokenOut: q2.tokenPath[1].address, fee: q2.pools[0].fee, recipient: h2 ? b : y2, deadline: k2, amountOut: P2, amountInMaximum: E2, sqrtPriceLimitX96: $(null != (S2 = r2.sqrtPriceLimitX96) ? S2 : 0) };\n            c2.push(t2.INTERFACE.encodeFunctionData(\"exactOutputSingle\", [N2]));\n          }\n          else {\n            void 0 !== r2.sqrtPriceLimitX96 && i(false);\n            var _2 = J(q2, T2.tradeType === n.TradeType.EXACT_OUTPUT);\n            c2.push(T2.tradeType === n.TradeType.EXACT_INPUT ? t2.INTERFACE.encodeFunctionData(\"exactInput\", [{ path: _2, recipient: h2 ? b : y2, deadline: k2, amountIn: E2, amountOutMinimum: P2 }]) : t2.INTERFACE.encodeFunctionData(\"exactOutput\", [{ path: _2, recipient: h2 ? b : y2, deadline: k2, amountOut: P2, amountInMaximum: E2 }]));\n          }\n        }\n        return h2 && c2.push(r2.fee ? f2 ? Tt.encodeUnwrapWETH9(l2.quotient, y2, r2.fee) : Tt.encodeSweepToken(o2.outputAmount.currency.wrapped, l2.quotient, y2, r2.fee) : Tt.encodeUnwrapWETH9(l2.quotient, y2)), d2 && c2.push(Tt.encodeRefundETH()), { calldata: gt.encodeMulticall(c2), value: $(m2.quotient) };\n      }, t2;\n    }();\n    Et.INTERFACE = new o.Interface(m.abi), exports2.ADDRESS_ZERO = b, exports2.FACTORY_ADDRESS = \"0x1F98431c8aD98523631AE4a59f267346ea31F984\", exports2.FullMath = X, exports2.LiquidityMath = F, exports2.Multicall = gt, exports2.NoTickDataProvider = V, exports2.NonfungiblePositionManager = qt, exports2.POOL_INIT_CODE_HASH = R, exports2.Payments = Tt, exports2.Pool = ht, exports2.Position = mt, exports2.PositionLibrary = ut, exports2.Route = vt, exports2.SelfPermit = At, exports2.SqrtPriceMath = B, exports2.Staker = Rt, exports2.SwapMath = D, exports2.SwapQuoter = bt, exports2.SwapRouter = Et, exports2.TICK_SPACINGS = E, exports2.Tick = lt, exports2.TickLibrary = pt, exports2.TickList = Z, exports2.TickListDataProvider = dt, exports2.TickMath = Q, exports2.Trade = kt, exports2.computePoolAddress = _, exports2.encodeRouteToPath = J, exports2.encodeSqrtRatioX96 = tt, exports2.isSorted = z, exports2.maxLiquidityForAmounts = it, exports2.mostSignificantBit = G, exports2.nearestUsableTick = function(t2, e2) {\n      Number.isInteger(t2) && Number.isInteger(e2) || i(false), e2 > 0 || i(false), t2 >= Q.MIN_TICK && t2 <= Q.MAX_TICK || i(false);\n      var n2 = Math.round(t2 / e2) * e2;\n      return n2 < Q.MIN_TICK ? n2 + e2 : n2 > Q.MAX_TICK ? n2 - e2 : n2;\n    }, exports2.priceToClosestTick = function(t2) {\n      var e2 = t2.baseCurrency.sortsBefore(t2.quoteCurrency), n2 = e2 ? tt(t2.numerator, t2.denominator) : tt(t2.denominator, t2.numerator), r2 = Q.getTickAtSqrtRatio(n2), i2 = at(t2.baseCurrency, t2.quoteCurrency, r2 + 1);\n      return e2 ? t2.lessThan(i2) || r2++ : t2.greaterThan(i2) || r2++, r2;\n    }, exports2.subIn256 = st, exports2.tickToPrice = at, exports2.toHex = $, exports2.tradeComparator = yt;\n  }\n});\n\n// node_modules/@uniswap/v3-sdk/dist/v3-sdk.cjs.development.js\nvar require_v3_sdk_cjs_development = __commonJS({\n  \"node_modules/@uniswap/v3-sdk/dist/v3-sdk.cjs.development.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    function _interopDefault(ex) {\n      return ex && typeof ex === \"object\" && \"default\" in ex ? ex[\"default\"] : ex;\n    }\n    var sdkCore = require_dist();\n    var JSBI3 = _interopDefault(require_jsbi_cjs());\n    var invariant = _interopDefault(require_tiny_invariant_cjs());\n    var abi = require_lib11();\n    var address = require_lib7();\n    var solidity = require_lib29();\n    var IMulticall = _interopDefault(require_IMulticall());\n    var INonfungiblePositionManager = _interopDefault(require_NonfungiblePositionManager());\n    var ISelfPermit = _interopDefault(require_ISelfPermit());\n    var IPeripheryPaymentsWithFee = _interopDefault(require_IPeripheryPaymentsWithFee());\n    var IQuoter = _interopDefault(require_Quoter());\n    var IQuoterV2 = _interopDefault(require_QuoterV2());\n    var IUniswapV3Staker = _interopDefault(require_UniswapV3Staker());\n    var ISwapRouter = _interopDefault(require_SwapRouter());\n    function _regeneratorRuntime() {\n      _regeneratorRuntime = function() {\n        return e;\n      };\n      var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function(t2, e2, r2) {\n        t2[e2] = r2.value;\n      }, i = \"function\" == typeof Symbol ? Symbol : {}, a = i.iterator || \"@@iterator\", c = i.asyncIterator || \"@@asyncIterator\", u = i.toStringTag || \"@@toStringTag\";\n      function define2(t2, e2, r2) {\n        return Object.defineProperty(t2, e2, {\n          value: r2,\n          enumerable: true,\n          configurable: true,\n          writable: true\n        }), t2[e2];\n      }\n      try {\n        define2({}, \"\");\n      } catch (t2) {\n        define2 = function(t3, e2, r2) {\n          return t3[e2] = r2;\n        };\n      }\n      function wrap(t2, e2, r2, n2) {\n        var i2 = e2 && e2.prototype instanceof Generator ? e2 : Generator, a2 = Object.create(i2.prototype), c2 = new Context(n2 || []);\n        return o(a2, \"_invoke\", {\n          value: makeInvokeMethod(t2, r2, c2)\n        }), a2;\n      }\n      function tryCatch(t2, e2, r2) {\n        try {\n          return {\n            type: \"normal\",\n            arg: t2.call(e2, r2)\n          };\n        } catch (t3) {\n          return {\n            type: \"throw\",\n            arg: t3\n          };\n        }\n      }\n      e.wrap = wrap;\n      var h = \"suspendedStart\", l = \"suspendedYield\", f = \"executing\", s = \"completed\", y = {};\n      function Generator() {\n      }\n      function GeneratorFunction() {\n      }\n      function GeneratorFunctionPrototype() {\n      }\n      var p = {};\n      define2(p, a, function() {\n        return this;\n      });\n      var d = Object.getPrototypeOf, v = d && d(d(values([])));\n      v && v !== r && n.call(v, a) && (p = v);\n      var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);\n      function defineIteratorMethods(t2) {\n        [\"next\", \"throw\", \"return\"].forEach(function(e2) {\n          define2(t2, e2, function(t3) {\n            return this._invoke(e2, t3);\n          });\n        });\n      }\n      function AsyncIterator(t2, e2) {\n        function invoke(r3, o2, i2, a2) {\n          var c2 = tryCatch(t2[r3], t2, o2);\n          if (\"throw\" !== c2.type) {\n            var u2 = c2.arg, h2 = u2.value;\n            return h2 && \"object\" == typeof h2 && n.call(h2, \"__await\") ? e2.resolve(h2.__await).then(function(t3) {\n              invoke(\"next\", t3, i2, a2);\n            }, function(t3) {\n              invoke(\"throw\", t3, i2, a2);\n            }) : e2.resolve(h2).then(function(t3) {\n              u2.value = t3, i2(u2);\n            }, function(t3) {\n              return invoke(\"throw\", t3, i2, a2);\n            });\n          }\n          a2(c2.arg);\n        }\n        var r2;\n        o(this, \"_invoke\", {\n          value: function(t3, n2) {\n            function callInvokeWithMethodAndArg() {\n              return new e2(function(e3, r3) {\n                invoke(t3, n2, e3, r3);\n              });\n            }\n            return r2 = r2 ? r2.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n          }\n        });\n      }\n      function makeInvokeMethod(e2, r2, n2) {\n        var o2 = h;\n        return function(i2, a2) {\n          if (o2 === f) throw new Error(\"Generator is already running\");\n          if (o2 === s) {\n            if (\"throw\" === i2) throw a2;\n            return {\n              value: t,\n              done: true\n            };\n          }\n          for (n2.method = i2, n2.arg = a2; ; ) {\n            var c2 = n2.delegate;\n            if (c2) {\n              var u2 = maybeInvokeDelegate(c2, n2);\n              if (u2) {\n                if (u2 === y) continue;\n                return u2;\n              }\n            }\n            if (\"next\" === n2.method) n2.sent = n2._sent = n2.arg;\n            else if (\"throw\" === n2.method) {\n              if (o2 === h) throw o2 = s, n2.arg;\n              n2.dispatchException(n2.arg);\n            } else \"return\" === n2.method && n2.abrupt(\"return\", n2.arg);\n            o2 = f;\n            var p2 = tryCatch(e2, r2, n2);\n            if (\"normal\" === p2.type) {\n              if (o2 = n2.done ? s : l, p2.arg === y) continue;\n              return {\n                value: p2.arg,\n                done: n2.done\n              };\n            }\n            \"throw\" === p2.type && (o2 = s, n2.method = \"throw\", n2.arg = p2.arg);\n          }\n        };\n      }\n      function maybeInvokeDelegate(e2, r2) {\n        var n2 = r2.method, o2 = e2.iterator[n2];\n        if (o2 === t) return r2.delegate = null, \"throw\" === n2 && e2.iterator.return && (r2.method = \"return\", r2.arg = t, maybeInvokeDelegate(e2, r2), \"throw\" === r2.method) || \"return\" !== n2 && (r2.method = \"throw\", r2.arg = new TypeError(\"The iterator does not provide a '\" + n2 + \"' method\")), y;\n        var i2 = tryCatch(o2, e2.iterator, r2.arg);\n        if (\"throw\" === i2.type) return r2.method = \"throw\", r2.arg = i2.arg, r2.delegate = null, y;\n        var a2 = i2.arg;\n        return a2 ? a2.done ? (r2[e2.resultName] = a2.value, r2.next = e2.nextLoc, \"return\" !== r2.method && (r2.method = \"next\", r2.arg = t), r2.delegate = null, y) : a2 : (r2.method = \"throw\", r2.arg = new TypeError(\"iterator result is not an object\"), r2.delegate = null, y);\n      }\n      function pushTryEntry(t2) {\n        var e2 = {\n          tryLoc: t2[0]\n        };\n        1 in t2 && (e2.catchLoc = t2[1]), 2 in t2 && (e2.finallyLoc = t2[2], e2.afterLoc = t2[3]), this.tryEntries.push(e2);\n      }\n      function resetTryEntry(t2) {\n        var e2 = t2.completion || {};\n        e2.type = \"normal\", delete e2.arg, t2.completion = e2;\n      }\n      function Context(t2) {\n        this.tryEntries = [{\n          tryLoc: \"root\"\n        }], t2.forEach(pushTryEntry, this), this.reset(true);\n      }\n      function values(e2) {\n        if (e2 || \"\" === e2) {\n          var r2 = e2[a];\n          if (r2) return r2.call(e2);\n          if (\"function\" == typeof e2.next) return e2;\n          if (!isNaN(e2.length)) {\n            var o2 = -1, i2 = function next() {\n              for (; ++o2 < e2.length; ) if (n.call(e2, o2)) return next.value = e2[o2], next.done = false, next;\n              return next.value = t, next.done = true, next;\n            };\n            return i2.next = i2;\n          }\n        }\n        throw new TypeError(typeof e2 + \" is not iterable\");\n      }\n      return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", {\n        value: GeneratorFunctionPrototype,\n        configurable: true\n      }), o(GeneratorFunctionPrototype, \"constructor\", {\n        value: GeneratorFunction,\n        configurable: true\n      }), GeneratorFunction.displayName = define2(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function(t2) {\n        var e2 = \"function\" == typeof t2 && t2.constructor;\n        return !!e2 && (e2 === GeneratorFunction || \"GeneratorFunction\" === (e2.displayName || e2.name));\n      }, e.mark = function(t2) {\n        return Object.setPrototypeOf ? Object.setPrototypeOf(t2, GeneratorFunctionPrototype) : (t2.__proto__ = GeneratorFunctionPrototype, define2(t2, u, \"GeneratorFunction\")), t2.prototype = Object.create(g), t2;\n      }, e.awrap = function(t2) {\n        return {\n          __await: t2\n        };\n      }, defineIteratorMethods(AsyncIterator.prototype), define2(AsyncIterator.prototype, c, function() {\n        return this;\n      }), e.AsyncIterator = AsyncIterator, e.async = function(t2, r2, n2, o2, i2) {\n        void 0 === i2 && (i2 = Promise);\n        var a2 = new AsyncIterator(wrap(t2, r2, n2, o2), i2);\n        return e.isGeneratorFunction(r2) ? a2 : a2.next().then(function(t3) {\n          return t3.done ? t3.value : a2.next();\n        });\n      }, defineIteratorMethods(g), define2(g, u, \"Generator\"), define2(g, a, function() {\n        return this;\n      }), define2(g, \"toString\", function() {\n        return \"[object Generator]\";\n      }), e.keys = function(t2) {\n        var e2 = Object(t2), r2 = [];\n        for (var n2 in e2) r2.push(n2);\n        return r2.reverse(), function next() {\n          for (; r2.length; ) {\n            var t3 = r2.pop();\n            if (t3 in e2) return next.value = t3, next.done = false, next;\n          }\n          return next.done = true, next;\n        };\n      }, e.values = values, Context.prototype = {\n        constructor: Context,\n        reset: function(e2) {\n          if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = false, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e2) for (var r2 in this) \"t\" === r2.charAt(0) && n.call(this, r2) && !isNaN(+r2.slice(1)) && (this[r2] = t);\n        },\n        stop: function() {\n          this.done = true;\n          var t2 = this.tryEntries[0].completion;\n          if (\"throw\" === t2.type) throw t2.arg;\n          return this.rval;\n        },\n        dispatchException: function(e2) {\n          if (this.done) throw e2;\n          var r2 = this;\n          function handle(n2, o3) {\n            return a2.type = \"throw\", a2.arg = e2, r2.next = n2, o3 && (r2.method = \"next\", r2.arg = t), !!o3;\n          }\n          for (var o2 = this.tryEntries.length - 1; o2 >= 0; --o2) {\n            var i2 = this.tryEntries[o2], a2 = i2.completion;\n            if (\"root\" === i2.tryLoc) return handle(\"end\");\n            if (i2.tryLoc <= this.prev) {\n              var c2 = n.call(i2, \"catchLoc\"), u2 = n.call(i2, \"finallyLoc\");\n              if (c2 && u2) {\n                if (this.prev < i2.catchLoc) return handle(i2.catchLoc, true);\n                if (this.prev < i2.finallyLoc) return handle(i2.finallyLoc);\n              } else if (c2) {\n                if (this.prev < i2.catchLoc) return handle(i2.catchLoc, true);\n              } else {\n                if (!u2) throw new Error(\"try statement without catch or finally\");\n                if (this.prev < i2.finallyLoc) return handle(i2.finallyLoc);\n              }\n            }\n          }\n        },\n        abrupt: function(t2, e2) {\n          for (var r2 = this.tryEntries.length - 1; r2 >= 0; --r2) {\n            var o2 = this.tryEntries[r2];\n            if (o2.tryLoc <= this.prev && n.call(o2, \"finallyLoc\") && this.prev < o2.finallyLoc) {\n              var i2 = o2;\n              break;\n            }\n          }\n          i2 && (\"break\" === t2 || \"continue\" === t2) && i2.tryLoc <= e2 && e2 <= i2.finallyLoc && (i2 = null);\n          var a2 = i2 ? i2.completion : {};\n          return a2.type = t2, a2.arg = e2, i2 ? (this.method = \"next\", this.next = i2.finallyLoc, y) : this.complete(a2);\n        },\n        complete: function(t2, e2) {\n          if (\"throw\" === t2.type) throw t2.arg;\n          return \"break\" === t2.type || \"continue\" === t2.type ? this.next = t2.arg : \"return\" === t2.type ? (this.rval = this.arg = t2.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t2.type && e2 && (this.next = e2), y;\n        },\n        finish: function(t2) {\n          for (var e2 = this.tryEntries.length - 1; e2 >= 0; --e2) {\n            var r2 = this.tryEntries[e2];\n            if (r2.finallyLoc === t2) return this.complete(r2.completion, r2.afterLoc), resetTryEntry(r2), y;\n          }\n        },\n        catch: function(t2) {\n          for (var e2 = this.tryEntries.length - 1; e2 >= 0; --e2) {\n            var r2 = this.tryEntries[e2];\n            if (r2.tryLoc === t2) {\n              var n2 = r2.completion;\n              if (\"throw\" === n2.type) {\n                var o2 = n2.arg;\n                resetTryEntry(r2);\n              }\n              return o2;\n            }\n          }\n          throw new Error(\"illegal catch attempt\");\n        },\n        delegateYield: function(e2, r2, n2) {\n          return this.delegate = {\n            iterator: values(e2),\n            resultName: r2,\n            nextLoc: n2\n          }, \"next\" === this.method && (this.arg = t), y;\n        }\n      }, e;\n    }\n    function _toPrimitive(t, r) {\n      if (\"object\" != typeof t || !t) return t;\n      var e = t[Symbol.toPrimitive];\n      if (void 0 !== e) {\n        var i = e.call(t, r || \"default\");\n        if (\"object\" != typeof i) return i;\n        throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n      }\n      return (\"string\" === r ? String : Number)(t);\n    }\n    function _toPropertyKey(t) {\n      var i = _toPrimitive(t, \"string\");\n      return \"symbol\" == typeof i ? i : String(i);\n    }\n    function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n      try {\n        var info = gen[key](arg);\n        var value = info.value;\n      } catch (error) {\n        reject(error);\n        return;\n      }\n      if (info.done) {\n        resolve(value);\n      } else {\n        Promise.resolve(value).then(_next, _throw);\n      }\n    }\n    function _asyncToGenerator(fn) {\n      return function() {\n        var self2 = this, args = arguments;\n        return new Promise(function(resolve, reject) {\n          var gen = fn.apply(self2, args);\n          function _next(value) {\n            asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n          }\n          function _throw(err) {\n            asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n          }\n          _next(void 0);\n        });\n      };\n    }\n    function _defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);\n      }\n    }\n    function _createClass(Constructor, protoProps, staticProps) {\n      if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) _defineProperties(Constructor, staticProps);\n      Object.defineProperty(Constructor, \"prototype\", {\n        writable: false\n      });\n      return Constructor;\n    }\n    function _extends() {\n      _extends = Object.assign ? Object.assign.bind() : function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n          var source = arguments[i];\n          for (var key in source) {\n            if (Object.prototype.hasOwnProperty.call(source, key)) {\n              target[key] = source[key];\n            }\n          }\n        }\n        return target;\n      };\n      return _extends.apply(this, arguments);\n    }\n    function _objectWithoutPropertiesLoose(source, excluded) {\n      if (source == null) return {};\n      var target = {};\n      var sourceKeys = Object.keys(source);\n      var key, i;\n      for (i = 0; i < sourceKeys.length; i++) {\n        key = sourceKeys[i];\n        if (excluded.indexOf(key) >= 0) continue;\n        target[key] = source[key];\n      }\n      return target;\n    }\n    function _unsupportedIterableToArray(o, minLen) {\n      if (!o) return;\n      if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n      var n = Object.prototype.toString.call(o).slice(8, -1);\n      if (n === \"Object\" && o.constructor) n = o.constructor.name;\n      if (n === \"Map\" || n === \"Set\") return Array.from(o);\n      if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n    }\n    function _arrayLikeToArray(arr, len) {\n      if (len == null || len > arr.length) len = arr.length;\n      for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n      return arr2;\n    }\n    function _createForOfIteratorHelperLoose(o, allowArrayLike) {\n      var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n      if (it) return (it = it.call(o)).next.bind(it);\n      if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n        if (it) o = it;\n        var i = 0;\n        return function() {\n          if (i >= o.length) return {\n            done: true\n          };\n          return {\n            done: false,\n            value: o[i++]\n          };\n        };\n      }\n      throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n    }\n    var _TICK_SPACINGS;\n    var FACTORY_ADDRESS = \"0x1F98431c8aD98523631AE4a59f267346ea31F984\";\n    var ADDRESS_ZERO = \"0x0000000000000000000000000000000000000000\";\n    var POOL_INIT_CODE_HASH = \"0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54\";\n    (function(FeeAmount) {\n      FeeAmount[FeeAmount[\"LOWEST\"] = 100] = \"LOWEST\";\n      FeeAmount[FeeAmount[\"LOW\"] = 500] = \"LOW\";\n      FeeAmount[FeeAmount[\"MEDIUM\"] = 3e3] = \"MEDIUM\";\n      FeeAmount[FeeAmount[\"HIGH\"] = 1e4] = \"HIGH\";\n    })(exports2.FeeAmount || (exports2.FeeAmount = {}));\n    var TICK_SPACINGS = (_TICK_SPACINGS = {}, _TICK_SPACINGS[exports2.FeeAmount.LOWEST] = 1, _TICK_SPACINGS[exports2.FeeAmount.LOW] = 10, _TICK_SPACINGS[exports2.FeeAmount.MEDIUM] = 60, _TICK_SPACINGS[exports2.FeeAmount.HIGH] = 200, _TICK_SPACINGS);\n    var NEGATIVE_ONE = /* @__PURE__ */ JSBI3.BigInt(-1);\n    var ZERO = /* @__PURE__ */ JSBI3.BigInt(0);\n    var ONE = /* @__PURE__ */ JSBI3.BigInt(1);\n    var Q96 = /* @__PURE__ */ JSBI3.exponentiate(/* @__PURE__ */ JSBI3.BigInt(2), /* @__PURE__ */ JSBI3.BigInt(96));\n    var Q192 = /* @__PURE__ */ JSBI3.exponentiate(Q96, /* @__PURE__ */ JSBI3.BigInt(2));\n    function computePoolAddress(_ref) {\n      var factoryAddress = _ref.factoryAddress, tokenA = _ref.tokenA, tokenB = _ref.tokenB, fee = _ref.fee, initCodeHashManualOverride = _ref.initCodeHashManualOverride;\n      var _ref2 = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA], token0 = _ref2[0], token1 = _ref2[1];\n      return address.getCreate2Address(factoryAddress, solidity.keccak256([\"bytes\"], [abi.defaultAbiCoder.encode([\"address\", \"address\", \"uint24\"], [token0.address, token1.address, fee])]), initCodeHashManualOverride != null ? initCodeHashManualOverride : POOL_INIT_CODE_HASH);\n    }\n    var LiquidityMath = /* @__PURE__ */ function() {\n      function LiquidityMath2() {\n      }\n      LiquidityMath2.addDelta = function addDelta(x, y) {\n        if (JSBI3.lessThan(y, ZERO)) {\n          return JSBI3.subtract(x, JSBI3.multiply(y, NEGATIVE_ONE));\n        } else {\n          return JSBI3.add(x, y);\n        }\n      };\n      return LiquidityMath2;\n    }();\n    var FullMath = /* @__PURE__ */ function() {\n      function FullMath2() {\n      }\n      FullMath2.mulDivRoundingUp = function mulDivRoundingUp(a, b, denominator) {\n        var product = JSBI3.multiply(a, b);\n        var result2 = JSBI3.divide(product, denominator);\n        if (JSBI3.notEqual(JSBI3.remainder(product, denominator), ZERO)) result2 = JSBI3.add(result2, ONE);\n        return result2;\n      };\n      return FullMath2;\n    }();\n    var MaxUint160 = /* @__PURE__ */ JSBI3.subtract(/* @__PURE__ */ JSBI3.exponentiate(/* @__PURE__ */ JSBI3.BigInt(2), /* @__PURE__ */ JSBI3.BigInt(160)), ONE);\n    function multiplyIn256(x, y) {\n      var product = JSBI3.multiply(x, y);\n      return JSBI3.bitwiseAnd(product, sdkCore.MaxUint256);\n    }\n    function addIn256(x, y) {\n      var sum = JSBI3.add(x, y);\n      return JSBI3.bitwiseAnd(sum, sdkCore.MaxUint256);\n    }\n    var SqrtPriceMath2 = /* @__PURE__ */ function() {\n      function SqrtPriceMath3() {\n      }\n      SqrtPriceMath3.getAmount0Delta = function getAmount0Delta2(sqrtRatioAX96, sqrtRatioBX96, liquidity2, roundUp) {\n        if (JSBI3.greaterThan(sqrtRatioAX96, sqrtRatioBX96)) {\n          var _ref = [sqrtRatioBX96, sqrtRatioAX96];\n          sqrtRatioAX96 = _ref[0];\n          sqrtRatioBX96 = _ref[1];\n        }\n        var numerator1 = JSBI3.leftShift(liquidity2, JSBI3.BigInt(96));\n        var numerator2 = JSBI3.subtract(sqrtRatioBX96, sqrtRatioAX96);\n        return roundUp ? FullMath.mulDivRoundingUp(FullMath.mulDivRoundingUp(numerator1, numerator2, sqrtRatioBX96), ONE, sqrtRatioAX96) : JSBI3.divide(JSBI3.divide(JSBI3.multiply(numerator1, numerator2), sqrtRatioBX96), sqrtRatioAX96);\n      };\n      SqrtPriceMath3.getAmount1Delta = function getAmount1Delta2(sqrtRatioAX96, sqrtRatioBX96, liquidity2, roundUp) {\n        if (JSBI3.greaterThan(sqrtRatioAX96, sqrtRatioBX96)) {\n          var _ref2 = [sqrtRatioBX96, sqrtRatioAX96];\n          sqrtRatioAX96 = _ref2[0];\n          sqrtRatioBX96 = _ref2[1];\n        }\n        return roundUp ? FullMath.mulDivRoundingUp(liquidity2, JSBI3.subtract(sqrtRatioBX96, sqrtRatioAX96), Q96) : JSBI3.divide(JSBI3.multiply(liquidity2, JSBI3.subtract(sqrtRatioBX96, sqrtRatioAX96)), Q96);\n      };\n      SqrtPriceMath3.getNextSqrtPriceFromInput = function getNextSqrtPriceFromInput(sqrtPX96, liquidity2, amountIn, zeroForOne) {\n        !JSBI3.greaterThan(sqrtPX96, ZERO) ? invariant(false) : void 0;\n        !JSBI3.greaterThan(liquidity2, ZERO) ? invariant(false) : void 0;\n        return zeroForOne ? this.getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity2, amountIn, true) : this.getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity2, amountIn, true);\n      };\n      SqrtPriceMath3.getNextSqrtPriceFromOutput = function getNextSqrtPriceFromOutput(sqrtPX96, liquidity2, amountOut, zeroForOne) {\n        !JSBI3.greaterThan(sqrtPX96, ZERO) ? invariant(false) : void 0;\n        !JSBI3.greaterThan(liquidity2, ZERO) ? invariant(false) : void 0;\n        return zeroForOne ? this.getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity2, amountOut, false) : this.getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity2, amountOut, false);\n      };\n      SqrtPriceMath3.getNextSqrtPriceFromAmount0RoundingUp = function getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity2, amount, add) {\n        if (JSBI3.equal(amount, ZERO)) return sqrtPX96;\n        var numerator1 = JSBI3.leftShift(liquidity2, JSBI3.BigInt(96));\n        if (add) {\n          var product = multiplyIn256(amount, sqrtPX96);\n          if (JSBI3.equal(JSBI3.divide(product, amount), sqrtPX96)) {\n            var denominator = addIn256(numerator1, product);\n            if (JSBI3.greaterThanOrEqual(denominator, numerator1)) {\n              return FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator);\n            }\n          }\n          return FullMath.mulDivRoundingUp(numerator1, ONE, JSBI3.add(JSBI3.divide(numerator1, sqrtPX96), amount));\n        } else {\n          var _product = multiplyIn256(amount, sqrtPX96);\n          !JSBI3.equal(JSBI3.divide(_product, amount), sqrtPX96) ? invariant(false) : void 0;\n          !JSBI3.greaterThan(numerator1, _product) ? invariant(false) : void 0;\n          var _denominator = JSBI3.subtract(numerator1, _product);\n          return FullMath.mulDivRoundingUp(numerator1, sqrtPX96, _denominator);\n        }\n      };\n      SqrtPriceMath3.getNextSqrtPriceFromAmount1RoundingDown = function getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity2, amount, add) {\n        if (add) {\n          var quotient = JSBI3.lessThanOrEqual(amount, MaxUint160) ? JSBI3.divide(JSBI3.leftShift(amount, JSBI3.BigInt(96)), liquidity2) : JSBI3.divide(JSBI3.multiply(amount, Q96), liquidity2);\n          return JSBI3.add(sqrtPX96, quotient);\n        } else {\n          var _quotient = FullMath.mulDivRoundingUp(amount, Q96, liquidity2);\n          !JSBI3.greaterThan(sqrtPX96, _quotient) ? invariant(false) : void 0;\n          return JSBI3.subtract(sqrtPX96, _quotient);\n        }\n      };\n      return SqrtPriceMath3;\n    }();\n    var MAX_FEE = /* @__PURE__ */ JSBI3.exponentiate(/* @__PURE__ */ JSBI3.BigInt(10), /* @__PURE__ */ JSBI3.BigInt(6));\n    var SwapMath = /* @__PURE__ */ function() {\n      function SwapMath2() {\n      }\n      SwapMath2.computeSwapStep = function computeSwapStep(sqrtRatioCurrentX96, sqrtRatioTargetX96, liquidity2, amountRemaining, feePips) {\n        var returnValues = {};\n        var zeroForOne = JSBI3.greaterThanOrEqual(sqrtRatioCurrentX96, sqrtRatioTargetX96);\n        var exactIn = JSBI3.greaterThanOrEqual(amountRemaining, ZERO);\n        if (exactIn) {\n          var amountRemainingLessFee = JSBI3.divide(JSBI3.multiply(amountRemaining, JSBI3.subtract(MAX_FEE, JSBI3.BigInt(feePips))), MAX_FEE);\n          returnValues.amountIn = zeroForOne ? SqrtPriceMath2.getAmount0Delta(sqrtRatioTargetX96, sqrtRatioCurrentX96, liquidity2, true) : SqrtPriceMath2.getAmount1Delta(sqrtRatioCurrentX96, sqrtRatioTargetX96, liquidity2, true);\n          if (JSBI3.greaterThanOrEqual(amountRemainingLessFee, returnValues.amountIn)) {\n            returnValues.sqrtRatioNextX96 = sqrtRatioTargetX96;\n          } else {\n            returnValues.sqrtRatioNextX96 = SqrtPriceMath2.getNextSqrtPriceFromInput(sqrtRatioCurrentX96, liquidity2, amountRemainingLessFee, zeroForOne);\n          }\n        } else {\n          returnValues.amountOut = zeroForOne ? SqrtPriceMath2.getAmount1Delta(sqrtRatioTargetX96, sqrtRatioCurrentX96, liquidity2, false) : SqrtPriceMath2.getAmount0Delta(sqrtRatioCurrentX96, sqrtRatioTargetX96, liquidity2, false);\n          if (JSBI3.greaterThanOrEqual(JSBI3.multiply(amountRemaining, NEGATIVE_ONE), returnValues.amountOut)) {\n            returnValues.sqrtRatioNextX96 = sqrtRatioTargetX96;\n          } else {\n            returnValues.sqrtRatioNextX96 = SqrtPriceMath2.getNextSqrtPriceFromOutput(sqrtRatioCurrentX96, liquidity2, JSBI3.multiply(amountRemaining, NEGATIVE_ONE), zeroForOne);\n          }\n        }\n        var max = JSBI3.equal(sqrtRatioTargetX96, returnValues.sqrtRatioNextX96);\n        if (zeroForOne) {\n          returnValues.amountIn = max && exactIn ? returnValues.amountIn : SqrtPriceMath2.getAmount0Delta(returnValues.sqrtRatioNextX96, sqrtRatioCurrentX96, liquidity2, true);\n          returnValues.amountOut = max && !exactIn ? returnValues.amountOut : SqrtPriceMath2.getAmount1Delta(returnValues.sqrtRatioNextX96, sqrtRatioCurrentX96, liquidity2, false);\n        } else {\n          returnValues.amountIn = max && exactIn ? returnValues.amountIn : SqrtPriceMath2.getAmount1Delta(sqrtRatioCurrentX96, returnValues.sqrtRatioNextX96, liquidity2, true);\n          returnValues.amountOut = max && !exactIn ? returnValues.amountOut : SqrtPriceMath2.getAmount0Delta(sqrtRatioCurrentX96, returnValues.sqrtRatioNextX96, liquidity2, false);\n        }\n        if (!exactIn && JSBI3.greaterThan(returnValues.amountOut, JSBI3.multiply(amountRemaining, NEGATIVE_ONE))) {\n          returnValues.amountOut = JSBI3.multiply(amountRemaining, NEGATIVE_ONE);\n        }\n        if (exactIn && JSBI3.notEqual(returnValues.sqrtRatioNextX96, sqrtRatioTargetX96)) {\n          returnValues.feeAmount = JSBI3.subtract(amountRemaining, returnValues.amountIn);\n        } else {\n          returnValues.feeAmount = FullMath.mulDivRoundingUp(returnValues.amountIn, JSBI3.BigInt(feePips), JSBI3.subtract(MAX_FEE, JSBI3.BigInt(feePips)));\n        }\n        return [returnValues.sqrtRatioNextX96, returnValues.amountIn, returnValues.amountOut, returnValues.feeAmount];\n      };\n      return SwapMath2;\n    }();\n    var TWO = /* @__PURE__ */ JSBI3.BigInt(2);\n    var POWERS_OF_2 = /* @__PURE__ */ [128, 64, 32, 16, 8, 4, 2, 1].map(function(pow) {\n      return [pow, JSBI3.exponentiate(TWO, JSBI3.BigInt(pow))];\n    });\n    function mostSignificantBit(x) {\n      !JSBI3.greaterThan(x, ZERO) ? invariant(false, \"ZERO\") : void 0;\n      !JSBI3.lessThanOrEqual(x, sdkCore.MaxUint256) ? invariant(false, \"MAX\") : void 0;\n      var msb = 0;\n      for (var _iterator = _createForOfIteratorHelperLoose(POWERS_OF_2), _step; !(_step = _iterator()).done; ) {\n        var _step$value = _step.value, power = _step$value[0], min = _step$value[1];\n        if (JSBI3.greaterThanOrEqual(x, min)) {\n          x = JSBI3.signedRightShift(x, JSBI3.BigInt(power));\n          msb += power;\n        }\n      }\n      return msb;\n    }\n    function mulShift(val, mulBy) {\n      return JSBI3.signedRightShift(JSBI3.multiply(val, JSBI3.BigInt(mulBy)), JSBI3.BigInt(128));\n    }\n    var Q32 = /* @__PURE__ */ JSBI3.exponentiate(/* @__PURE__ */ JSBI3.BigInt(2), /* @__PURE__ */ JSBI3.BigInt(32));\n    var TickMath = /* @__PURE__ */ function() {\n      function TickMath2() {\n      }\n      TickMath2.getSqrtRatioAtTick = function getSqrtRatioAtTick(tick) {\n        !(tick >= TickMath2.MIN_TICK && tick <= TickMath2.MAX_TICK && Number.isInteger(tick)) ? invariant(false, \"TICK\") : void 0;\n        var absTick = tick < 0 ? tick * -1 : tick;\n        var ratio = (absTick & 1) !== 0 ? JSBI3.BigInt(\"0xfffcb933bd6fad37aa2d162d1a594001\") : JSBI3.BigInt(\"0x100000000000000000000000000000000\");\n        if ((absTick & 2) !== 0) ratio = mulShift(ratio, \"0xfff97272373d413259a46990580e213a\");\n        if ((absTick & 4) !== 0) ratio = mulShift(ratio, \"0xfff2e50f5f656932ef12357cf3c7fdcc\");\n        if ((absTick & 8) !== 0) ratio = mulShift(ratio, \"0xffe5caca7e10e4e61c3624eaa0941cd0\");\n        if ((absTick & 16) !== 0) ratio = mulShift(ratio, \"0xffcb9843d60f6159c9db58835c926644\");\n        if ((absTick & 32) !== 0) ratio = mulShift(ratio, \"0xff973b41fa98c081472e6896dfb254c0\");\n        if ((absTick & 64) !== 0) ratio = mulShift(ratio, \"0xff2ea16466c96a3843ec78b326b52861\");\n        if ((absTick & 128) !== 0) ratio = mulShift(ratio, \"0xfe5dee046a99a2a811c461f1969c3053\");\n        if ((absTick & 256) !== 0) ratio = mulShift(ratio, \"0xfcbe86c7900a88aedcffc83b479aa3a4\");\n        if ((absTick & 512) !== 0) ratio = mulShift(ratio, \"0xf987a7253ac413176f2b074cf7815e54\");\n        if ((absTick & 1024) !== 0) ratio = mulShift(ratio, \"0xf3392b0822b70005940c7a398e4b70f3\");\n        if ((absTick & 2048) !== 0) ratio = mulShift(ratio, \"0xe7159475a2c29b7443b29c7fa6e889d9\");\n        if ((absTick & 4096) !== 0) ratio = mulShift(ratio, \"0xd097f3bdfd2022b8845ad8f792aa5825\");\n        if ((absTick & 8192) !== 0) ratio = mulShift(ratio, \"0xa9f746462d870fdf8a65dc1f90e061e5\");\n        if ((absTick & 16384) !== 0) ratio = mulShift(ratio, \"0x70d869a156d2a1b890bb3df62baf32f7\");\n        if ((absTick & 32768) !== 0) ratio = mulShift(ratio, \"0x31be135f97d08fd981231505542fcfa6\");\n        if ((absTick & 65536) !== 0) ratio = mulShift(ratio, \"0x9aa508b5b7a84e1c677de54f3e99bc9\");\n        if ((absTick & 131072) !== 0) ratio = mulShift(ratio, \"0x5d6af8dedb81196699c329225ee604\");\n        if ((absTick & 262144) !== 0) ratio = mulShift(ratio, \"0x2216e584f5fa1ea926041bedfe98\");\n        if ((absTick & 524288) !== 0) ratio = mulShift(ratio, \"0x48a170391f7dc42444e8fa2\");\n        if (tick > 0) ratio = JSBI3.divide(sdkCore.MaxUint256, ratio);\n        return JSBI3.greaterThan(JSBI3.remainder(ratio, Q32), ZERO) ? JSBI3.add(JSBI3.divide(ratio, Q32), ONE) : JSBI3.divide(ratio, Q32);\n      };\n      TickMath2.getTickAtSqrtRatio = function getTickAtSqrtRatio(sqrtRatioX96) {\n        !(JSBI3.greaterThanOrEqual(sqrtRatioX96, TickMath2.MIN_SQRT_RATIO) && JSBI3.lessThan(sqrtRatioX96, TickMath2.MAX_SQRT_RATIO)) ? invariant(false, \"SQRT_RATIO\") : void 0;\n        var sqrtRatioX128 = JSBI3.leftShift(sqrtRatioX96, JSBI3.BigInt(32));\n        var msb = mostSignificantBit(sqrtRatioX128);\n        var r;\n        if (JSBI3.greaterThanOrEqual(JSBI3.BigInt(msb), JSBI3.BigInt(128))) {\n          r = JSBI3.signedRightShift(sqrtRatioX128, JSBI3.BigInt(msb - 127));\n        } else {\n          r = JSBI3.leftShift(sqrtRatioX128, JSBI3.BigInt(127 - msb));\n        }\n        var log_2 = JSBI3.leftShift(JSBI3.subtract(JSBI3.BigInt(msb), JSBI3.BigInt(128)), JSBI3.BigInt(64));\n        for (var i = 0; i < 14; i++) {\n          r = JSBI3.signedRightShift(JSBI3.multiply(r, r), JSBI3.BigInt(127));\n          var f = JSBI3.signedRightShift(r, JSBI3.BigInt(128));\n          log_2 = JSBI3.bitwiseOr(log_2, JSBI3.leftShift(f, JSBI3.BigInt(63 - i)));\n          r = JSBI3.signedRightShift(r, f);\n        }\n        var log_sqrt10001 = JSBI3.multiply(log_2, JSBI3.BigInt(\"255738958999603826347141\"));\n        var tickLow = JSBI3.toNumber(JSBI3.signedRightShift(JSBI3.subtract(log_sqrt10001, JSBI3.BigInt(\"3402992956809132418596140100660247210\")), JSBI3.BigInt(128)));\n        var tickHigh = JSBI3.toNumber(JSBI3.signedRightShift(JSBI3.add(log_sqrt10001, JSBI3.BigInt(\"291339464771989622907027621153398088495\")), JSBI3.BigInt(128)));\n        return tickLow === tickHigh ? tickLow : JSBI3.lessThanOrEqual(TickMath2.getSqrtRatioAtTick(tickHigh), sqrtRatioX96) ? tickHigh : tickLow;\n      };\n      return TickMath2;\n    }();\n    TickMath.MIN_TICK = -887272;\n    TickMath.MAX_TICK = -TickMath.MIN_TICK;\n    TickMath.MIN_SQRT_RATIO = /* @__PURE__ */ JSBI3.BigInt(\"4295128739\");\n    TickMath.MAX_SQRT_RATIO = /* @__PURE__ */ JSBI3.BigInt(\"1461446703485210103287273052203988822378723970342\");\n    var NoTickDataProvider = /* @__PURE__ */ function() {\n      function NoTickDataProvider2() {\n      }\n      var _proto = NoTickDataProvider2.prototype;\n      _proto.getTick = /* @__PURE__ */ function() {\n        var _getTick = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee(_tick) {\n          return _regeneratorRuntime().wrap(function _callee$(_context) {\n            while (1) switch (_context.prev = _context.next) {\n              case 0:\n                throw new Error(NoTickDataProvider2.ERROR_MESSAGE);\n              case 1:\n              case \"end\":\n                return _context.stop();\n            }\n          }, _callee);\n        }));\n        function getTick(_x) {\n          return _getTick.apply(this, arguments);\n        }\n        return getTick;\n      }();\n      _proto.nextInitializedTickWithinOneWord = /* @__PURE__ */ function() {\n        var _nextInitializedTickWithinOneWord = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee2(_tick, _lte, _tickSpacing) {\n          return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n            while (1) switch (_context2.prev = _context2.next) {\n              case 0:\n                throw new Error(NoTickDataProvider2.ERROR_MESSAGE);\n              case 1:\n              case \"end\":\n                return _context2.stop();\n            }\n          }, _callee2);\n        }));\n        function nextInitializedTickWithinOneWord(_x2, _x3, _x4) {\n          return _nextInitializedTickWithinOneWord.apply(this, arguments);\n        }\n        return nextInitializedTickWithinOneWord;\n      }();\n      return NoTickDataProvider2;\n    }();\n    NoTickDataProvider.ERROR_MESSAGE = \"No tick data provider was given\";\n    function isSorted(list, comparator) {\n      for (var i = 0; i < list.length - 1; i++) {\n        if (comparator(list[i], list[i + 1]) > 0) {\n          return false;\n        }\n      }\n      return true;\n    }\n    function tickComparator(a, b) {\n      return a.index - b.index;\n    }\n    var TickList = /* @__PURE__ */ function() {\n      function TickList2() {\n      }\n      TickList2.validateList = function validateList(ticks, tickSpacing) {\n        !(tickSpacing > 0) ? invariant(false, \"TICK_SPACING_NONZERO\") : void 0;\n        !ticks.every(function(_ref) {\n          var index = _ref.index;\n          return index % tickSpacing === 0;\n        }) ? invariant(false, \"TICK_SPACING\") : void 0;\n        !JSBI3.equal(ticks.reduce(function(accumulator, _ref2) {\n          var liquidityNet = _ref2.liquidityNet;\n          return JSBI3.add(accumulator, liquidityNet);\n        }, ZERO), ZERO) ? invariant(false, \"ZERO_NET\") : void 0;\n        !isSorted(ticks, tickComparator) ? invariant(false, \"SORTED\") : void 0;\n      };\n      TickList2.isBelowSmallest = function isBelowSmallest(ticks, tick) {\n        !(ticks.length > 0) ? invariant(false, \"LENGTH\") : void 0;\n        return tick < ticks[0].index;\n      };\n      TickList2.isAtOrAboveLargest = function isAtOrAboveLargest(ticks, tick) {\n        !(ticks.length > 0) ? invariant(false, \"LENGTH\") : void 0;\n        return tick >= ticks[ticks.length - 1].index;\n      };\n      TickList2.getTick = function getTick(ticks, index) {\n        var tick = ticks[this.binarySearch(ticks, index)];\n        !(tick.index === index) ? invariant(false, \"NOT_CONTAINED\") : void 0;\n        return tick;\n      };\n      TickList2.binarySearch = function binarySearch(ticks, tick) {\n        !!this.isBelowSmallest(ticks, tick) ? invariant(false, \"BELOW_SMALLEST\") : void 0;\n        var l = 0;\n        var r = ticks.length - 1;\n        var i;\n        while (true) {\n          i = Math.floor((l + r) / 2);\n          if (ticks[i].index <= tick && (i === ticks.length - 1 || ticks[i + 1].index > tick)) {\n            return i;\n          }\n          if (ticks[i].index < tick) {\n            l = i + 1;\n          } else {\n            r = i - 1;\n          }\n        }\n      };\n      TickList2.nextInitializedTick = function nextInitializedTick(ticks, tick, lte) {\n        if (lte) {\n          !!TickList2.isBelowSmallest(ticks, tick) ? invariant(false, \"BELOW_SMALLEST\") : void 0;\n          if (TickList2.isAtOrAboveLargest(ticks, tick)) {\n            return ticks[ticks.length - 1];\n          }\n          var index = this.binarySearch(ticks, tick);\n          return ticks[index];\n        } else {\n          !!this.isAtOrAboveLargest(ticks, tick) ? invariant(false, \"AT_OR_ABOVE_LARGEST\") : void 0;\n          if (this.isBelowSmallest(ticks, tick)) {\n            return ticks[0];\n          }\n          var _index = this.binarySearch(ticks, tick);\n          return ticks[_index + 1];\n        }\n      };\n      TickList2.nextInitializedTickWithinOneWord = function nextInitializedTickWithinOneWord(ticks, tick, lte, tickSpacing) {\n        var compressed = Math.floor(tick / tickSpacing);\n        if (lte) {\n          var wordPos = compressed >> 8;\n          var minimum = (wordPos << 8) * tickSpacing;\n          if (TickList2.isBelowSmallest(ticks, tick)) {\n            return [minimum, false];\n          }\n          var index = TickList2.nextInitializedTick(ticks, tick, lte).index;\n          var nextInitializedTick = Math.max(minimum, index);\n          return [nextInitializedTick, nextInitializedTick === index];\n        } else {\n          var _wordPos = compressed + 1 >> 8;\n          var maximum = ((_wordPos + 1 << 8) - 1) * tickSpacing;\n          if (this.isAtOrAboveLargest(ticks, tick)) {\n            return [maximum, false];\n          }\n          var _index2 = this.nextInitializedTick(ticks, tick, lte).index;\n          var _nextInitializedTick = Math.min(maximum, _index2);\n          return [_nextInitializedTick, _nextInitializedTick === _index2];\n        }\n      };\n      return TickList2;\n    }();\n    function toHex(bigintIsh) {\n      var bigInt = JSBI3.BigInt(bigintIsh);\n      var hex = bigInt.toString(16);\n      if (hex.length % 2 !== 0) {\n        hex = \"0\" + hex;\n      }\n      return \"0x\" + hex;\n    }\n    function encodeRouteToPath(route, exactOutput) {\n      var firstInputToken = route.input.wrapped;\n      var _route$pools$reduce = route.pools.reduce(function(_ref, pool, index) {\n        var inputToken = _ref.inputToken, path2 = _ref.path, types2 = _ref.types;\n        var outputToken = pool.token0.equals(inputToken) ? pool.token1 : pool.token0;\n        if (index === 0) {\n          return {\n            inputToken: outputToken,\n            types: [\"address\", \"uint24\", \"address\"],\n            path: [inputToken.address, pool.fee, outputToken.address]\n          };\n        } else {\n          return {\n            inputToken: outputToken,\n            types: [].concat(types2, [\"uint24\", \"address\"]),\n            path: [].concat(path2, [pool.fee, outputToken.address])\n          };\n        }\n      }, {\n        inputToken: firstInputToken,\n        path: [],\n        types: []\n      }), path = _route$pools$reduce.path, types = _route$pools$reduce.types;\n      return exactOutput ? solidity.pack(types.reverse(), path.reverse()) : solidity.pack(types, path);\n    }\n    function encodeSqrtRatioX96(amount1, amount0) {\n      var numerator = JSBI3.leftShift(JSBI3.BigInt(amount1), JSBI3.BigInt(192));\n      var denominator = JSBI3.BigInt(amount0);\n      var ratioX192 = JSBI3.divide(numerator, denominator);\n      return sdkCore.sqrt(ratioX192);\n    }\n    function maxLiquidityForAmount0Imprecise(sqrtRatioAX96, sqrtRatioBX96, amount0) {\n      if (JSBI3.greaterThan(sqrtRatioAX96, sqrtRatioBX96)) {\n        var _ref = [sqrtRatioBX96, sqrtRatioAX96];\n        sqrtRatioAX96 = _ref[0];\n        sqrtRatioBX96 = _ref[1];\n      }\n      var intermediate = JSBI3.divide(JSBI3.multiply(sqrtRatioAX96, sqrtRatioBX96), Q96);\n      return JSBI3.divide(JSBI3.multiply(JSBI3.BigInt(amount0), intermediate), JSBI3.subtract(sqrtRatioBX96, sqrtRatioAX96));\n    }\n    function maxLiquidityForAmount0Precise(sqrtRatioAX96, sqrtRatioBX96, amount0) {\n      if (JSBI3.greaterThan(sqrtRatioAX96, sqrtRatioBX96)) {\n        var _ref2 = [sqrtRatioBX96, sqrtRatioAX96];\n        sqrtRatioAX96 = _ref2[0];\n        sqrtRatioBX96 = _ref2[1];\n      }\n      var numerator = JSBI3.multiply(JSBI3.multiply(JSBI3.BigInt(amount0), sqrtRatioAX96), sqrtRatioBX96);\n      var denominator = JSBI3.multiply(Q96, JSBI3.subtract(sqrtRatioBX96, sqrtRatioAX96));\n      return JSBI3.divide(numerator, denominator);\n    }\n    function maxLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, amount1) {\n      if (JSBI3.greaterThan(sqrtRatioAX96, sqrtRatioBX96)) {\n        var _ref3 = [sqrtRatioBX96, sqrtRatioAX96];\n        sqrtRatioAX96 = _ref3[0];\n        sqrtRatioBX96 = _ref3[1];\n      }\n      return JSBI3.divide(JSBI3.multiply(JSBI3.BigInt(amount1), Q96), JSBI3.subtract(sqrtRatioBX96, sqrtRatioAX96));\n    }\n    function maxLiquidityForAmounts(sqrtRatioCurrentX96, sqrtRatioAX96, sqrtRatioBX96, amount0, amount1, useFullPrecision) {\n      if (JSBI3.greaterThan(sqrtRatioAX96, sqrtRatioBX96)) {\n        var _ref4 = [sqrtRatioBX96, sqrtRatioAX96];\n        sqrtRatioAX96 = _ref4[0];\n        sqrtRatioBX96 = _ref4[1];\n      }\n      var maxLiquidityForAmount0 = useFullPrecision ? maxLiquidityForAmount0Precise : maxLiquidityForAmount0Imprecise;\n      if (JSBI3.lessThanOrEqual(sqrtRatioCurrentX96, sqrtRatioAX96)) {\n        return maxLiquidityForAmount0(sqrtRatioAX96, sqrtRatioBX96, amount0);\n      } else if (JSBI3.lessThan(sqrtRatioCurrentX96, sqrtRatioBX96)) {\n        var liquidity0 = maxLiquidityForAmount0(sqrtRatioCurrentX96, sqrtRatioBX96, amount0);\n        var liquidity1 = maxLiquidityForAmount1(sqrtRatioAX96, sqrtRatioCurrentX96, amount1);\n        return JSBI3.lessThan(liquidity0, liquidity1) ? liquidity0 : liquidity1;\n      } else {\n        return maxLiquidityForAmount1(sqrtRatioAX96, sqrtRatioBX96, amount1);\n      }\n    }\n    function nearestUsableTick(tick, tickSpacing) {\n      !(Number.isInteger(tick) && Number.isInteger(tickSpacing)) ? invariant(false, \"INTEGERS\") : void 0;\n      !(tickSpacing > 0) ? invariant(false, \"TICK_SPACING\") : void 0;\n      !(tick >= TickMath.MIN_TICK && tick <= TickMath.MAX_TICK) ? invariant(false, \"TICK_BOUND\") : void 0;\n      var rounded = Math.round(tick / tickSpacing) * tickSpacing;\n      if (rounded < TickMath.MIN_TICK) return rounded + tickSpacing;\n      else if (rounded > TickMath.MAX_TICK) return rounded - tickSpacing;\n      else return rounded;\n    }\n    var Q128 = /* @__PURE__ */ JSBI3.exponentiate(/* @__PURE__ */ JSBI3.BigInt(2), /* @__PURE__ */ JSBI3.BigInt(128));\n    var PositionLibrary = /* @__PURE__ */ function() {\n      function PositionLibrary2() {\n      }\n      PositionLibrary2.getTokensOwed = function getTokensOwed(feeGrowthInside0LastX128, feeGrowthInside1LastX128, liquidity2, feeGrowthInside0X128, feeGrowthInside1X128) {\n        var tokensOwed0 = JSBI3.divide(JSBI3.multiply(subIn256(feeGrowthInside0X128, feeGrowthInside0LastX128), liquidity2), Q128);\n        var tokensOwed1 = JSBI3.divide(JSBI3.multiply(subIn256(feeGrowthInside1X128, feeGrowthInside1LastX128), liquidity2), Q128);\n        return [tokensOwed0, tokensOwed1];\n      };\n      return PositionLibrary2;\n    }();\n    function tickToPrice(baseToken, quoteToken, tick) {\n      var sqrtRatioX96 = TickMath.getSqrtRatioAtTick(tick);\n      var ratioX192 = JSBI3.multiply(sqrtRatioX96, sqrtRatioX96);\n      return baseToken.sortsBefore(quoteToken) ? new sdkCore.Price(baseToken, quoteToken, Q192, ratioX192) : new sdkCore.Price(baseToken, quoteToken, ratioX192, Q192);\n    }\n    function priceToClosestTick(price) {\n      var sorted = price.baseCurrency.sortsBefore(price.quoteCurrency);\n      var sqrtRatioX96 = sorted ? encodeSqrtRatioX96(price.numerator, price.denominator) : encodeSqrtRatioX96(price.denominator, price.numerator);\n      var tick = TickMath.getTickAtSqrtRatio(sqrtRatioX96);\n      var nextTickPrice = tickToPrice(price.baseCurrency, price.quoteCurrency, tick + 1);\n      if (sorted) {\n        if (!price.lessThan(nextTickPrice)) {\n          tick++;\n        }\n      } else {\n        if (!price.greaterThan(nextTickPrice)) {\n          tick++;\n        }\n      }\n      return tick;\n    }\n    var Q256 = /* @__PURE__ */ JSBI3.exponentiate(/* @__PURE__ */ JSBI3.BigInt(2), /* @__PURE__ */ JSBI3.BigInt(256));\n    function subIn256(x, y) {\n      var difference = JSBI3.subtract(x, y);\n      if (JSBI3.lessThan(difference, ZERO)) {\n        return JSBI3.add(Q256, difference);\n      } else {\n        return difference;\n      }\n    }\n    var TickLibrary = /* @__PURE__ */ function() {\n      function TickLibrary2() {\n      }\n      TickLibrary2.getFeeGrowthInside = function getFeeGrowthInside(feeGrowthOutsideLower, feeGrowthOutsideUpper, tickLower2, tickUpper2, tickCurrent, feeGrowthGlobal0X128, feeGrowthGlobal1X128) {\n        var feeGrowthBelow0X128;\n        var feeGrowthBelow1X128;\n        if (tickCurrent >= tickLower2) {\n          feeGrowthBelow0X128 = feeGrowthOutsideLower.feeGrowthOutside0X128;\n          feeGrowthBelow1X128 = feeGrowthOutsideLower.feeGrowthOutside1X128;\n        } else {\n          feeGrowthBelow0X128 = subIn256(feeGrowthGlobal0X128, feeGrowthOutsideLower.feeGrowthOutside0X128);\n          feeGrowthBelow1X128 = subIn256(feeGrowthGlobal1X128, feeGrowthOutsideLower.feeGrowthOutside1X128);\n        }\n        var feeGrowthAbove0X128;\n        var feeGrowthAbove1X128;\n        if (tickCurrent < tickUpper2) {\n          feeGrowthAbove0X128 = feeGrowthOutsideUpper.feeGrowthOutside0X128;\n          feeGrowthAbove1X128 = feeGrowthOutsideUpper.feeGrowthOutside1X128;\n        } else {\n          feeGrowthAbove0X128 = subIn256(feeGrowthGlobal0X128, feeGrowthOutsideUpper.feeGrowthOutside0X128);\n          feeGrowthAbove1X128 = subIn256(feeGrowthGlobal1X128, feeGrowthOutsideUpper.feeGrowthOutside1X128);\n        }\n        return [subIn256(subIn256(feeGrowthGlobal0X128, feeGrowthBelow0X128), feeGrowthAbove0X128), subIn256(subIn256(feeGrowthGlobal1X128, feeGrowthBelow1X128), feeGrowthAbove1X128)];\n      };\n      return TickLibrary2;\n    }();\n    var Tick = function Tick2(_ref) {\n      var index = _ref.index, liquidityGross = _ref.liquidityGross, liquidityNet = _ref.liquidityNet;\n      !(index >= TickMath.MIN_TICK && index <= TickMath.MAX_TICK) ? invariant(false, \"TICK\") : void 0;\n      this.index = index;\n      this.liquidityGross = JSBI3.BigInt(liquidityGross);\n      this.liquidityNet = JSBI3.BigInt(liquidityNet);\n    };\n    var TickListDataProvider = /* @__PURE__ */ function() {\n      function TickListDataProvider2(ticks, tickSpacing) {\n        var ticksMapped = ticks.map(function(t) {\n          return t instanceof Tick ? t : new Tick(t);\n        });\n        TickList.validateList(ticksMapped, tickSpacing);\n        this.ticks = ticksMapped;\n      }\n      var _proto = TickListDataProvider2.prototype;\n      _proto.getTick = /* @__PURE__ */ function() {\n        var _getTick = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee(tick) {\n          return _regeneratorRuntime().wrap(function _callee$(_context) {\n            while (1) switch (_context.prev = _context.next) {\n              case 0:\n                return _context.abrupt(\"return\", TickList.getTick(this.ticks, tick));\n              case 1:\n              case \"end\":\n                return _context.stop();\n            }\n          }, _callee, this);\n        }));\n        function getTick(_x) {\n          return _getTick.apply(this, arguments);\n        }\n        return getTick;\n      }();\n      _proto.nextInitializedTickWithinOneWord = /* @__PURE__ */ function() {\n        var _nextInitializedTickWithinOneWord = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee2(tick, lte, tickSpacing) {\n          return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n            while (1) switch (_context2.prev = _context2.next) {\n              case 0:\n                return _context2.abrupt(\"return\", TickList.nextInitializedTickWithinOneWord(this.ticks, tick, lte, tickSpacing));\n              case 1:\n              case \"end\":\n                return _context2.stop();\n            }\n          }, _callee2, this);\n        }));\n        function nextInitializedTickWithinOneWord(_x2, _x3, _x4) {\n          return _nextInitializedTickWithinOneWord.apply(this, arguments);\n        }\n        return nextInitializedTickWithinOneWord;\n      }();\n      return TickListDataProvider2;\n    }();\n    var NO_TICK_DATA_PROVIDER_DEFAULT = /* @__PURE__ */ new NoTickDataProvider();\n    var Pool = /* @__PURE__ */ function() {\n      function Pool2(tokenA, tokenB, fee, sqrtRatioX96, liquidity2, tickCurrent, ticks) {\n        if (ticks === void 0) {\n          ticks = NO_TICK_DATA_PROVIDER_DEFAULT;\n        }\n        !(Number.isInteger(fee) && fee < 1e6) ? invariant(false, \"FEE\") : void 0;\n        var tickCurrentSqrtRatioX96 = TickMath.getSqrtRatioAtTick(tickCurrent);\n        var nextTickSqrtRatioX96 = TickMath.getSqrtRatioAtTick(tickCurrent + 1);\n        !(JSBI3.greaterThanOrEqual(JSBI3.BigInt(sqrtRatioX96), tickCurrentSqrtRatioX96) && JSBI3.lessThanOrEqual(JSBI3.BigInt(sqrtRatioX96), nextTickSqrtRatioX96)) ? invariant(false, \"PRICE_BOUNDS\") : void 0;\n        var _ref = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA];\n        this.token0 = _ref[0];\n        this.token1 = _ref[1];\n        this.fee = fee;\n        this.sqrtRatioX96 = JSBI3.BigInt(sqrtRatioX96);\n        this.liquidity = JSBI3.BigInt(liquidity2);\n        this.tickCurrent = tickCurrent;\n        this.tickDataProvider = Array.isArray(ticks) ? new TickListDataProvider(ticks, TICK_SPACINGS[fee]) : ticks;\n      }\n      Pool2.getAddress = function getAddress(tokenA, tokenB, fee, initCodeHashManualOverride, factoryAddressOverride) {\n        return computePoolAddress({\n          factoryAddress: factoryAddressOverride != null ? factoryAddressOverride : FACTORY_ADDRESS,\n          fee,\n          tokenA,\n          tokenB,\n          initCodeHashManualOverride\n        });\n      };\n      var _proto = Pool2.prototype;\n      _proto.involvesToken = function involvesToken(token) {\n        return token.equals(this.token0) || token.equals(this.token1);\n      };\n      _proto.priceOf = function priceOf(token) {\n        !this.involvesToken(token) ? invariant(false, \"TOKEN\") : void 0;\n        return token.equals(this.token0) ? this.token0Price : this.token1Price;\n      };\n      _proto.getOutputAmount = /* @__PURE__ */ function() {\n        var _getOutputAmount = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee(inputAmount, sqrtPriceLimitX96) {\n          var zeroForOne, _yield$this$swap, outputAmount, sqrtRatioX96, liquidity2, tickCurrent, outputToken;\n          return _regeneratorRuntime().wrap(function _callee$(_context) {\n            while (1) switch (_context.prev = _context.next) {\n              case 0:\n                !this.involvesToken(inputAmount.currency) ? invariant(false, \"TOKEN\") : void 0;\n                zeroForOne = inputAmount.currency.equals(this.token0);\n                _context.next = 4;\n                return this.swap(zeroForOne, inputAmount.quotient, sqrtPriceLimitX96);\n              case 4:\n                _yield$this$swap = _context.sent;\n                outputAmount = _yield$this$swap.amountCalculated;\n                sqrtRatioX96 = _yield$this$swap.sqrtRatioX96;\n                liquidity2 = _yield$this$swap.liquidity;\n                tickCurrent = _yield$this$swap.tickCurrent;\n                outputToken = zeroForOne ? this.token1 : this.token0;\n                return _context.abrupt(\"return\", [sdkCore.CurrencyAmount.fromRawAmount(outputToken, JSBI3.multiply(outputAmount, NEGATIVE_ONE)), new Pool2(this.token0, this.token1, this.fee, sqrtRatioX96, liquidity2, tickCurrent, this.tickDataProvider)]);\n              case 11:\n              case \"end\":\n                return _context.stop();\n            }\n          }, _callee, this);\n        }));\n        function getOutputAmount(_x, _x2) {\n          return _getOutputAmount.apply(this, arguments);\n        }\n        return getOutputAmount;\n      }();\n      _proto.getInputAmount = /* @__PURE__ */ function() {\n        var _getInputAmount = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee2(outputAmount, sqrtPriceLimitX96) {\n          var zeroForOne, _yield$this$swap2, inputAmount, sqrtRatioX96, liquidity2, tickCurrent, inputToken;\n          return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n            while (1) switch (_context2.prev = _context2.next) {\n              case 0:\n                !(outputAmount.currency.isToken && this.involvesToken(outputAmount.currency)) ? invariant(false, \"TOKEN\") : void 0;\n                zeroForOne = outputAmount.currency.equals(this.token1);\n                _context2.next = 4;\n                return this.swap(zeroForOne, JSBI3.multiply(outputAmount.quotient, NEGATIVE_ONE), sqrtPriceLimitX96);\n              case 4:\n                _yield$this$swap2 = _context2.sent;\n                inputAmount = _yield$this$swap2.amountCalculated;\n                sqrtRatioX96 = _yield$this$swap2.sqrtRatioX96;\n                liquidity2 = _yield$this$swap2.liquidity;\n                tickCurrent = _yield$this$swap2.tickCurrent;\n                inputToken = zeroForOne ? this.token0 : this.token1;\n                return _context2.abrupt(\"return\", [sdkCore.CurrencyAmount.fromRawAmount(inputToken, inputAmount), new Pool2(this.token0, this.token1, this.fee, sqrtRatioX96, liquidity2, tickCurrent, this.tickDataProvider)]);\n              case 11:\n              case \"end\":\n                return _context2.stop();\n            }\n          }, _callee2, this);\n        }));\n        function getInputAmount(_x3, _x4) {\n          return _getInputAmount.apply(this, arguments);\n        }\n        return getInputAmount;\n      }();\n      _proto.swap = /* @__PURE__ */ function() {\n        var _swap = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee3(zeroForOne, amountSpecified, sqrtPriceLimitX96) {\n          var exactInput, state, step, _yield$this$tickDataP, _SwapMath$computeSwap, liquidityNet;\n          return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n            while (1) switch (_context3.prev = _context3.next) {\n              case 0:\n                if (!sqrtPriceLimitX96) sqrtPriceLimitX96 = zeroForOne ? JSBI3.add(TickMath.MIN_SQRT_RATIO, ONE) : JSBI3.subtract(TickMath.MAX_SQRT_RATIO, ONE);\n                if (zeroForOne) {\n                  !JSBI3.greaterThan(sqrtPriceLimitX96, TickMath.MIN_SQRT_RATIO) ? invariant(false, \"RATIO_MIN\") : void 0;\n                  !JSBI3.lessThan(sqrtPriceLimitX96, this.sqrtRatioX96) ? invariant(false, \"RATIO_CURRENT\") : void 0;\n                } else {\n                  !JSBI3.lessThan(sqrtPriceLimitX96, TickMath.MAX_SQRT_RATIO) ? invariant(false, \"RATIO_MAX\") : void 0;\n                  !JSBI3.greaterThan(sqrtPriceLimitX96, this.sqrtRatioX96) ? invariant(false, \"RATIO_CURRENT\") : void 0;\n                }\n                exactInput = JSBI3.greaterThanOrEqual(amountSpecified, ZERO);\n                state = {\n                  amountSpecifiedRemaining: amountSpecified,\n                  amountCalculated: ZERO,\n                  sqrtPriceX96: this.sqrtRatioX96,\n                  tick: this.tickCurrent,\n                  liquidity: this.liquidity\n                };\n              case 4:\n                if (!(JSBI3.notEqual(state.amountSpecifiedRemaining, ZERO) && state.sqrtPriceX96 !== sqrtPriceLimitX96)) {\n                  _context3.next = 35;\n                  break;\n                }\n                step = {};\n                step.sqrtPriceStartX96 = state.sqrtPriceX96;\n                _context3.next = 9;\n                return this.tickDataProvider.nextInitializedTickWithinOneWord(state.tick, zeroForOne, this.tickSpacing);\n              case 9:\n                _yield$this$tickDataP = _context3.sent;\n                step.tickNext = _yield$this$tickDataP[0];\n                step.initialized = _yield$this$tickDataP[1];\n                if (step.tickNext < TickMath.MIN_TICK) {\n                  step.tickNext = TickMath.MIN_TICK;\n                } else if (step.tickNext > TickMath.MAX_TICK) {\n                  step.tickNext = TickMath.MAX_TICK;\n                }\n                step.sqrtPriceNextX96 = TickMath.getSqrtRatioAtTick(step.tickNext);\n                _SwapMath$computeSwap = SwapMath.computeSwapStep(state.sqrtPriceX96, (zeroForOne ? JSBI3.lessThan(step.sqrtPriceNextX96, sqrtPriceLimitX96) : JSBI3.greaterThan(step.sqrtPriceNextX96, sqrtPriceLimitX96)) ? sqrtPriceLimitX96 : step.sqrtPriceNextX96, state.liquidity, state.amountSpecifiedRemaining, this.fee);\n                state.sqrtPriceX96 = _SwapMath$computeSwap[0];\n                step.amountIn = _SwapMath$computeSwap[1];\n                step.amountOut = _SwapMath$computeSwap[2];\n                step.feeAmount = _SwapMath$computeSwap[3];\n                if (exactInput) {\n                  state.amountSpecifiedRemaining = JSBI3.subtract(state.amountSpecifiedRemaining, JSBI3.add(step.amountIn, step.feeAmount));\n                  state.amountCalculated = JSBI3.subtract(state.amountCalculated, step.amountOut);\n                } else {\n                  state.amountSpecifiedRemaining = JSBI3.add(state.amountSpecifiedRemaining, step.amountOut);\n                  state.amountCalculated = JSBI3.add(state.amountCalculated, JSBI3.add(step.amountIn, step.feeAmount));\n                }\n                if (!JSBI3.equal(state.sqrtPriceX96, step.sqrtPriceNextX96)) {\n                  _context3.next = 32;\n                  break;\n                }\n                if (!step.initialized) {\n                  _context3.next = 29;\n                  break;\n                }\n                _context3.t0 = JSBI3;\n                _context3.next = 25;\n                return this.tickDataProvider.getTick(step.tickNext);\n              case 25:\n                _context3.t1 = _context3.sent.liquidityNet;\n                liquidityNet = _context3.t0.BigInt.call(_context3.t0, _context3.t1);\n                if (zeroForOne) liquidityNet = JSBI3.multiply(liquidityNet, NEGATIVE_ONE);\n                state.liquidity = LiquidityMath.addDelta(state.liquidity, liquidityNet);\n              case 29:\n                state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext;\n                _context3.next = 33;\n                break;\n              case 32:\n                if (JSBI3.notEqual(state.sqrtPriceX96, step.sqrtPriceStartX96)) {\n                  state.tick = TickMath.getTickAtSqrtRatio(state.sqrtPriceX96);\n                }\n              case 33:\n                _context3.next = 4;\n                break;\n              case 35:\n                return _context3.abrupt(\"return\", {\n                  amountCalculated: state.amountCalculated,\n                  sqrtRatioX96: state.sqrtPriceX96,\n                  liquidity: state.liquidity,\n                  tickCurrent: state.tick\n                });\n              case 36:\n              case \"end\":\n                return _context3.stop();\n            }\n          }, _callee3, this);\n        }));\n        function swap(_x5, _x6, _x7) {\n          return _swap.apply(this, arguments);\n        }\n        return swap;\n      }();\n      _createClass(Pool2, [{\n        key: \"token0Price\",\n        get: function get() {\n          var _this$_token0Price;\n          return (_this$_token0Price = this._token0Price) != null ? _this$_token0Price : this._token0Price = new sdkCore.Price(this.token0, this.token1, Q192, JSBI3.multiply(this.sqrtRatioX96, this.sqrtRatioX96));\n        }\n        /**\n         * Returns the current mid price of the pool in terms of token1, i.e. the ratio of token0 over token1\n         */\n      }, {\n        key: \"token1Price\",\n        get: function get() {\n          var _this$_token1Price;\n          return (_this$_token1Price = this._token1Price) != null ? _this$_token1Price : this._token1Price = new sdkCore.Price(this.token1, this.token0, JSBI3.multiply(this.sqrtRatioX96, this.sqrtRatioX96), Q192);\n        }\n      }, {\n        key: \"chainId\",\n        get: function get() {\n          return this.token0.chainId;\n        }\n      }, {\n        key: \"tickSpacing\",\n        get: function get() {\n          return TICK_SPACINGS[this.fee];\n        }\n      }]);\n      return Pool2;\n    }();\n    var Position = /* @__PURE__ */ function() {\n      function Position2(_ref) {\n        var pool = _ref.pool, liquidity2 = _ref.liquidity, tickLower2 = _ref.tickLower, tickUpper2 = _ref.tickUpper;\n        this._token0Amount = null;\n        this._token1Amount = null;\n        this._mintAmounts = null;\n        !(tickLower2 < tickUpper2) ? invariant(false, \"TICK_ORDER\") : void 0;\n        !(tickLower2 >= TickMath.MIN_TICK && tickLower2 % pool.tickSpacing === 0) ? invariant(false, \"TICK_LOWER\") : void 0;\n        !(tickUpper2 <= TickMath.MAX_TICK && tickUpper2 % pool.tickSpacing === 0) ? invariant(false, \"TICK_UPPER\") : void 0;\n        this.pool = pool;\n        this.tickLower = tickLower2;\n        this.tickUpper = tickUpper2;\n        this.liquidity = JSBI3.BigInt(liquidity2);\n      }\n      var _proto = Position2.prototype;\n      _proto.ratiosAfterSlippage = function ratiosAfterSlippage(slippageTolerance) {\n        var priceLower = this.pool.token0Price.asFraction.multiply(new sdkCore.Percent(1).subtract(slippageTolerance));\n        var priceUpper = this.pool.token0Price.asFraction.multiply(slippageTolerance.add(1));\n        var sqrtRatioX96Lower = encodeSqrtRatioX96(priceLower.numerator, priceLower.denominator);\n        if (JSBI3.lessThanOrEqual(sqrtRatioX96Lower, TickMath.MIN_SQRT_RATIO)) {\n          sqrtRatioX96Lower = JSBI3.add(TickMath.MIN_SQRT_RATIO, JSBI3.BigInt(1));\n        }\n        var sqrtRatioX96Upper = encodeSqrtRatioX96(priceUpper.numerator, priceUpper.denominator);\n        if (JSBI3.greaterThanOrEqual(sqrtRatioX96Upper, TickMath.MAX_SQRT_RATIO)) {\n          sqrtRatioX96Upper = JSBI3.subtract(TickMath.MAX_SQRT_RATIO, JSBI3.BigInt(1));\n        }\n        return {\n          sqrtRatioX96Lower,\n          sqrtRatioX96Upper\n        };\n      };\n      _proto.mintAmountsWithSlippage = function mintAmountsWithSlippage(slippageTolerance) {\n        var _this$ratiosAfterSlip = this.ratiosAfterSlippage(slippageTolerance), sqrtRatioX96Upper = _this$ratiosAfterSlip.sqrtRatioX96Upper, sqrtRatioX96Lower = _this$ratiosAfterSlip.sqrtRatioX96Lower;\n        var poolLower = new Pool(this.pool.token0, this.pool.token1, this.pool.fee, sqrtRatioX96Lower, 0, TickMath.getTickAtSqrtRatio(sqrtRatioX96Lower));\n        var poolUpper = new Pool(this.pool.token0, this.pool.token1, this.pool.fee, sqrtRatioX96Upper, 0, TickMath.getTickAtSqrtRatio(sqrtRatioX96Upper));\n        var positionThatWillBeCreated = Position2.fromAmounts(_extends({\n          pool: this.pool,\n          tickLower: this.tickLower,\n          tickUpper: this.tickUpper\n        }, this.mintAmounts, {\n          useFullPrecision: false\n        }));\n        var amount0 = new Position2({\n          pool: poolUpper,\n          liquidity: positionThatWillBeCreated.liquidity,\n          tickLower: this.tickLower,\n          tickUpper: this.tickUpper\n        }).mintAmounts.amount0;\n        var amount1 = new Position2({\n          pool: poolLower,\n          liquidity: positionThatWillBeCreated.liquidity,\n          tickLower: this.tickLower,\n          tickUpper: this.tickUpper\n        }).mintAmounts.amount1;\n        return {\n          amount0,\n          amount1\n        };\n      };\n      _proto.burnAmountsWithSlippage = function burnAmountsWithSlippage(slippageTolerance) {\n        var _this$ratiosAfterSlip2 = this.ratiosAfterSlippage(slippageTolerance), sqrtRatioX96Upper = _this$ratiosAfterSlip2.sqrtRatioX96Upper, sqrtRatioX96Lower = _this$ratiosAfterSlip2.sqrtRatioX96Lower;\n        var poolLower = new Pool(this.pool.token0, this.pool.token1, this.pool.fee, sqrtRatioX96Lower, 0, TickMath.getTickAtSqrtRatio(sqrtRatioX96Lower));\n        var poolUpper = new Pool(this.pool.token0, this.pool.token1, this.pool.fee, sqrtRatioX96Upper, 0, TickMath.getTickAtSqrtRatio(sqrtRatioX96Upper));\n        var amount0 = new Position2({\n          pool: poolUpper,\n          liquidity: this.liquidity,\n          tickLower: this.tickLower,\n          tickUpper: this.tickUpper\n        }).amount0;\n        var amount1 = new Position2({\n          pool: poolLower,\n          liquidity: this.liquidity,\n          tickLower: this.tickLower,\n          tickUpper: this.tickUpper\n        }).amount1;\n        return {\n          amount0: amount0.quotient,\n          amount1: amount1.quotient\n        };\n      };\n      Position2.fromAmounts = function fromAmounts(_ref2) {\n        var pool = _ref2.pool, tickLower2 = _ref2.tickLower, tickUpper2 = _ref2.tickUpper, amount0 = _ref2.amount0, amount1 = _ref2.amount1, useFullPrecision = _ref2.useFullPrecision;\n        var sqrtRatioAX96 = TickMath.getSqrtRatioAtTick(tickLower2);\n        var sqrtRatioBX96 = TickMath.getSqrtRatioAtTick(tickUpper2);\n        return new Position2({\n          pool,\n          tickLower: tickLower2,\n          tickUpper: tickUpper2,\n          liquidity: maxLiquidityForAmounts(pool.sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, amount0, amount1, useFullPrecision)\n        });\n      };\n      Position2.fromAmount0 = function fromAmount0(_ref3) {\n        var pool = _ref3.pool, tickLower2 = _ref3.tickLower, tickUpper2 = _ref3.tickUpper, amount0 = _ref3.amount0, useFullPrecision = _ref3.useFullPrecision;\n        return Position2.fromAmounts({\n          pool,\n          tickLower: tickLower2,\n          tickUpper: tickUpper2,\n          amount0,\n          amount1: sdkCore.MaxUint256,\n          useFullPrecision\n        });\n      };\n      Position2.fromAmount1 = function fromAmount1(_ref4) {\n        var pool = _ref4.pool, tickLower2 = _ref4.tickLower, tickUpper2 = _ref4.tickUpper, amount1 = _ref4.amount1;\n        return Position2.fromAmounts({\n          pool,\n          tickLower: tickLower2,\n          tickUpper: tickUpper2,\n          amount0: sdkCore.MaxUint256,\n          amount1,\n          useFullPrecision: true\n        });\n      };\n      _createClass(Position2, [{\n        key: \"token0PriceLower\",\n        get: function get() {\n          return tickToPrice(this.pool.token0, this.pool.token1, this.tickLower);\n        }\n        /**\n         * Returns the price of token0 at the upper tick\n         */\n      }, {\n        key: \"token0PriceUpper\",\n        get: function get() {\n          return tickToPrice(this.pool.token0, this.pool.token1, this.tickUpper);\n        }\n        /**\n         * Returns the amount of token0 that this position's liquidity could be burned for at the current pool price\n         */\n      }, {\n        key: \"amount0\",\n        get: function get() {\n          if (this._token0Amount === null) {\n            if (this.pool.tickCurrent < this.tickLower) {\n              this._token0Amount = sdkCore.CurrencyAmount.fromRawAmount(this.pool.token0, SqrtPriceMath2.getAmount0Delta(TickMath.getSqrtRatioAtTick(this.tickLower), TickMath.getSqrtRatioAtTick(this.tickUpper), this.liquidity, false));\n            } else if (this.pool.tickCurrent < this.tickUpper) {\n              this._token0Amount = sdkCore.CurrencyAmount.fromRawAmount(this.pool.token0, SqrtPriceMath2.getAmount0Delta(this.pool.sqrtRatioX96, TickMath.getSqrtRatioAtTick(this.tickUpper), this.liquidity, false));\n            } else {\n              this._token0Amount = sdkCore.CurrencyAmount.fromRawAmount(this.pool.token0, ZERO);\n            }\n          }\n          return this._token0Amount;\n        }\n        /**\n         * Returns the amount of token1 that this position's liquidity could be burned for at the current pool price\n         */\n      }, {\n        key: \"amount1\",\n        get: function get() {\n          if (this._token1Amount === null) {\n            if (this.pool.tickCurrent < this.tickLower) {\n              this._token1Amount = sdkCore.CurrencyAmount.fromRawAmount(this.pool.token1, ZERO);\n            } else if (this.pool.tickCurrent < this.tickUpper) {\n              this._token1Amount = sdkCore.CurrencyAmount.fromRawAmount(this.pool.token1, SqrtPriceMath2.getAmount1Delta(TickMath.getSqrtRatioAtTick(this.tickLower), this.pool.sqrtRatioX96, this.liquidity, false));\n            } else {\n              this._token1Amount = sdkCore.CurrencyAmount.fromRawAmount(this.pool.token1, SqrtPriceMath2.getAmount1Delta(TickMath.getSqrtRatioAtTick(this.tickLower), TickMath.getSqrtRatioAtTick(this.tickUpper), this.liquidity, false));\n            }\n          }\n          return this._token1Amount;\n        }\n      }, {\n        key: \"mintAmounts\",\n        get: function get() {\n          if (this._mintAmounts === null) {\n            if (this.pool.tickCurrent < this.tickLower) {\n              return {\n                amount0: SqrtPriceMath2.getAmount0Delta(TickMath.getSqrtRatioAtTick(this.tickLower), TickMath.getSqrtRatioAtTick(this.tickUpper), this.liquidity, true),\n                amount1: ZERO\n              };\n            } else if (this.pool.tickCurrent < this.tickUpper) {\n              return {\n                amount0: SqrtPriceMath2.getAmount0Delta(this.pool.sqrtRatioX96, TickMath.getSqrtRatioAtTick(this.tickUpper), this.liquidity, true),\n                amount1: SqrtPriceMath2.getAmount1Delta(TickMath.getSqrtRatioAtTick(this.tickLower), this.pool.sqrtRatioX96, this.liquidity, true)\n              };\n            } else {\n              return {\n                amount0: ZERO,\n                amount1: SqrtPriceMath2.getAmount1Delta(TickMath.getSqrtRatioAtTick(this.tickLower), TickMath.getSqrtRatioAtTick(this.tickUpper), this.liquidity, true)\n              };\n            }\n          }\n          return this._mintAmounts;\n        }\n      }]);\n      return Position2;\n    }();\n    var Route = /* @__PURE__ */ function() {\n      function Route2(pools, input, output) {\n        this._midPrice = null;\n        !(pools.length > 0) ? invariant(false, \"POOLS\") : void 0;\n        var chainId = pools[0].chainId;\n        var allOnSameChain = pools.every(function(pool2) {\n          return pool2.chainId === chainId;\n        });\n        !allOnSameChain ? invariant(false, \"CHAIN_IDS\") : void 0;\n        var wrappedInput = input.wrapped;\n        !pools[0].involvesToken(wrappedInput) ? invariant(false, \"INPUT\") : void 0;\n        !pools[pools.length - 1].involvesToken(output.wrapped) ? invariant(false, \"OUTPUT\") : void 0;\n        var tokenPath = [wrappedInput];\n        for (var _iterator = _createForOfIteratorHelperLoose(pools.entries()), _step; !(_step = _iterator()).done; ) {\n          var _step$value = _step.value, i = _step$value[0], pool = _step$value[1];\n          var currentInputToken = tokenPath[i];\n          !(currentInputToken.equals(pool.token0) || currentInputToken.equals(pool.token1)) ? invariant(false, \"PATH\") : void 0;\n          var nextToken = currentInputToken.equals(pool.token0) ? pool.token1 : pool.token0;\n          tokenPath.push(nextToken);\n        }\n        this.pools = pools;\n        this.tokenPath = tokenPath;\n        this.input = input;\n        this.output = output != null ? output : tokenPath[tokenPath.length - 1];\n      }\n      _createClass(Route2, [{\n        key: \"chainId\",\n        get: function get() {\n          return this.pools[0].chainId;\n        }\n        /**\n         * Returns the mid price of the route\n         */\n      }, {\n        key: \"midPrice\",\n        get: function get() {\n          if (this._midPrice !== null) return this._midPrice;\n          var price = this.pools.slice(1).reduce(function(_ref, pool) {\n            var nextInput = _ref.nextInput, price2 = _ref.price;\n            return nextInput.equals(pool.token0) ? {\n              nextInput: pool.token1,\n              price: price2.multiply(pool.token0Price)\n            } : {\n              nextInput: pool.token0,\n              price: price2.multiply(pool.token1Price)\n            };\n          }, this.pools[0].token0.equals(this.input.wrapped) ? {\n            nextInput: this.pools[0].token1,\n            price: this.pools[0].token0Price\n          } : {\n            nextInput: this.pools[0].token0,\n            price: this.pools[0].token1Price\n          }).price;\n          return this._midPrice = new sdkCore.Price(this.input, this.output, price.denominator, price.numerator);\n        }\n      }]);\n      return Route2;\n    }();\n    function tradeComparator(a, b) {\n      !a.inputAmount.currency.equals(b.inputAmount.currency) ? invariant(false, \"INPUT_CURRENCY\") : void 0;\n      !a.outputAmount.currency.equals(b.outputAmount.currency) ? invariant(false, \"OUTPUT_CURRENCY\") : void 0;\n      if (a.outputAmount.equalTo(b.outputAmount)) {\n        if (a.inputAmount.equalTo(b.inputAmount)) {\n          var aHops = a.swaps.reduce(function(total, cur) {\n            return total + cur.route.tokenPath.length;\n          }, 0);\n          var bHops = b.swaps.reduce(function(total, cur) {\n            return total + cur.route.tokenPath.length;\n          }, 0);\n          return aHops - bHops;\n        }\n        if (a.inputAmount.lessThan(b.inputAmount)) {\n          return -1;\n        } else {\n          return 1;\n        }\n      } else {\n        if (a.outputAmount.lessThan(b.outputAmount)) {\n          return 1;\n        } else {\n          return -1;\n        }\n      }\n    }\n    var Trade = /* @__PURE__ */ function() {\n      function Trade2(_ref) {\n        var routes = _ref.routes, tradeType = _ref.tradeType;\n        var inputCurrency = routes[0].inputAmount.currency;\n        var outputCurrency = routes[0].outputAmount.currency;\n        !routes.every(function(_ref2) {\n          var route2 = _ref2.route;\n          return inputCurrency.wrapped.equals(route2.input.wrapped);\n        }) ? invariant(false, \"INPUT_CURRENCY_MATCH\") : void 0;\n        !routes.every(function(_ref3) {\n          var route2 = _ref3.route;\n          return outputCurrency.wrapped.equals(route2.output.wrapped);\n        }) ? invariant(false, \"OUTPUT_CURRENCY_MATCH\") : void 0;\n        var numPools = routes.map(function(_ref4) {\n          var route2 = _ref4.route;\n          return route2.pools.length;\n        }).reduce(function(total, cur) {\n          return total + cur;\n        }, 0);\n        var poolAddressSet = /* @__PURE__ */ new Set();\n        for (var _iterator = _createForOfIteratorHelperLoose(routes), _step; !(_step = _iterator()).done; ) {\n          var route = _step.value.route;\n          for (var _iterator2 = _createForOfIteratorHelperLoose(route.pools), _step2; !(_step2 = _iterator2()).done; ) {\n            var pool = _step2.value;\n            poolAddressSet.add(Pool.getAddress(pool.token0, pool.token1, pool.fee));\n          }\n        }\n        !(numPools === poolAddressSet.size) ? invariant(false, \"POOLS_DUPLICATED\") : void 0;\n        this.swaps = routes;\n        this.tradeType = tradeType;\n      }\n      Trade2.exactIn = /* @__PURE__ */ function() {\n        var _exactIn = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee(route, amountIn) {\n          return _regeneratorRuntime().wrap(function _callee$(_context) {\n            while (1) switch (_context.prev = _context.next) {\n              case 0:\n                return _context.abrupt(\"return\", Trade2.fromRoute(route, amountIn, sdkCore.TradeType.EXACT_INPUT));\n              case 1:\n              case \"end\":\n                return _context.stop();\n            }\n          }, _callee);\n        }));\n        function exactIn(_x, _x2) {\n          return _exactIn.apply(this, arguments);\n        }\n        return exactIn;\n      }();\n      Trade2.exactOut = /* @__PURE__ */ function() {\n        var _exactOut = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee2(route, amountOut) {\n          return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n            while (1) switch (_context2.prev = _context2.next) {\n              case 0:\n                return _context2.abrupt(\"return\", Trade2.fromRoute(route, amountOut, sdkCore.TradeType.EXACT_OUTPUT));\n              case 1:\n              case \"end\":\n                return _context2.stop();\n            }\n          }, _callee2);\n        }));\n        function exactOut(_x3, _x4) {\n          return _exactOut.apply(this, arguments);\n        }\n        return exactOut;\n      }();\n      Trade2.fromRoute = /* @__PURE__ */ function() {\n        var _fromRoute = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee3(route, amount, tradeType) {\n          var amounts, inputAmount, outputAmount, i, pool, _yield$pool$getOutput, _outputAmount, _i, _pool, _yield$_pool$getInput, _inputAmount;\n          return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n            while (1) switch (_context3.prev = _context3.next) {\n              case 0:\n                amounts = new Array(route.tokenPath.length);\n                if (!(tradeType === sdkCore.TradeType.EXACT_INPUT)) {\n                  _context3.next = 19;\n                  break;\n                }\n                !amount.currency.equals(route.input) ? invariant(false, \"INPUT\") : void 0;\n                amounts[0] = amount.wrapped;\n                i = 0;\n              case 5:\n                if (!(i < route.tokenPath.length - 1)) {\n                  _context3.next = 15;\n                  break;\n                }\n                pool = route.pools[i];\n                _context3.next = 9;\n                return pool.getOutputAmount(amounts[i]);\n              case 9:\n                _yield$pool$getOutput = _context3.sent;\n                _outputAmount = _yield$pool$getOutput[0];\n                amounts[i + 1] = _outputAmount;\n              case 12:\n                i++;\n                _context3.next = 5;\n                break;\n              case 15:\n                inputAmount = sdkCore.CurrencyAmount.fromFractionalAmount(route.input, amount.numerator, amount.denominator);\n                outputAmount = sdkCore.CurrencyAmount.fromFractionalAmount(route.output, amounts[amounts.length - 1].numerator, amounts[amounts.length - 1].denominator);\n                _context3.next = 34;\n                break;\n              case 19:\n                !amount.currency.equals(route.output) ? invariant(false, \"OUTPUT\") : void 0;\n                amounts[amounts.length - 1] = amount.wrapped;\n                _i = route.tokenPath.length - 1;\n              case 22:\n                if (!(_i > 0)) {\n                  _context3.next = 32;\n                  break;\n                }\n                _pool = route.pools[_i - 1];\n                _context3.next = 26;\n                return _pool.getInputAmount(amounts[_i]);\n              case 26:\n                _yield$_pool$getInput = _context3.sent;\n                _inputAmount = _yield$_pool$getInput[0];\n                amounts[_i - 1] = _inputAmount;\n              case 29:\n                _i--;\n                _context3.next = 22;\n                break;\n              case 32:\n                inputAmount = sdkCore.CurrencyAmount.fromFractionalAmount(route.input, amounts[0].numerator, amounts[0].denominator);\n                outputAmount = sdkCore.CurrencyAmount.fromFractionalAmount(route.output, amount.numerator, amount.denominator);\n              case 34:\n                return _context3.abrupt(\"return\", new Trade2({\n                  routes: [{\n                    inputAmount,\n                    outputAmount,\n                    route\n                  }],\n                  tradeType\n                }));\n              case 35:\n              case \"end\":\n                return _context3.stop();\n            }\n          }, _callee3);\n        }));\n        function fromRoute(_x5, _x6, _x7) {\n          return _fromRoute.apply(this, arguments);\n        }\n        return fromRoute;\n      }();\n      Trade2.fromRoutes = /* @__PURE__ */ function() {\n        var _fromRoutes = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee4(routes, tradeType) {\n          var populatedRoutes, _iterator3, _step3, _step3$value, route, amount, amounts, inputAmount, outputAmount, i, pool, _yield$pool$getOutput2, _outputAmount2, _i2, _pool2, _yield$_pool2$getInpu, _inputAmount2;\n          return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n            while (1) switch (_context4.prev = _context4.next) {\n              case 0:\n                populatedRoutes = [];\n                _iterator3 = _createForOfIteratorHelperLoose(routes);\n              case 2:\n                if ((_step3 = _iterator3()).done) {\n                  _context4.next = 43;\n                  break;\n                }\n                _step3$value = _step3.value, route = _step3$value.route, amount = _step3$value.amount;\n                amounts = new Array(route.tokenPath.length);\n                inputAmount = void 0;\n                outputAmount = void 0;\n                if (!(tradeType === sdkCore.TradeType.EXACT_INPUT)) {\n                  _context4.next = 25;\n                  break;\n                }\n                !amount.currency.equals(route.input) ? invariant(false, \"INPUT\") : void 0;\n                inputAmount = sdkCore.CurrencyAmount.fromFractionalAmount(route.input, amount.numerator, amount.denominator);\n                amounts[0] = sdkCore.CurrencyAmount.fromFractionalAmount(route.input.wrapped, amount.numerator, amount.denominator);\n                i = 0;\n              case 12:\n                if (!(i < route.tokenPath.length - 1)) {\n                  _context4.next = 22;\n                  break;\n                }\n                pool = route.pools[i];\n                _context4.next = 16;\n                return pool.getOutputAmount(amounts[i]);\n              case 16:\n                _yield$pool$getOutput2 = _context4.sent;\n                _outputAmount2 = _yield$pool$getOutput2[0];\n                amounts[i + 1] = _outputAmount2;\n              case 19:\n                i++;\n                _context4.next = 12;\n                break;\n              case 22:\n                outputAmount = sdkCore.CurrencyAmount.fromFractionalAmount(route.output, amounts[amounts.length - 1].numerator, amounts[amounts.length - 1].denominator);\n                _context4.next = 40;\n                break;\n              case 25:\n                !amount.currency.equals(route.output) ? invariant(false, \"OUTPUT\") : void 0;\n                outputAmount = sdkCore.CurrencyAmount.fromFractionalAmount(route.output, amount.numerator, amount.denominator);\n                amounts[amounts.length - 1] = sdkCore.CurrencyAmount.fromFractionalAmount(route.output.wrapped, amount.numerator, amount.denominator);\n                _i2 = route.tokenPath.length - 1;\n              case 29:\n                if (!(_i2 > 0)) {\n                  _context4.next = 39;\n                  break;\n                }\n                _pool2 = route.pools[_i2 - 1];\n                _context4.next = 33;\n                return _pool2.getInputAmount(amounts[_i2]);\n              case 33:\n                _yield$_pool2$getInpu = _context4.sent;\n                _inputAmount2 = _yield$_pool2$getInpu[0];\n                amounts[_i2 - 1] = _inputAmount2;\n              case 36:\n                _i2--;\n                _context4.next = 29;\n                break;\n              case 39:\n                inputAmount = sdkCore.CurrencyAmount.fromFractionalAmount(route.input, amounts[0].numerator, amounts[0].denominator);\n              case 40:\n                populatedRoutes.push({\n                  route,\n                  inputAmount,\n                  outputAmount\n                });\n              case 41:\n                _context4.next = 2;\n                break;\n              case 43:\n                return _context4.abrupt(\"return\", new Trade2({\n                  routes: populatedRoutes,\n                  tradeType\n                }));\n              case 44:\n              case \"end\":\n                return _context4.stop();\n            }\n          }, _callee4);\n        }));\n        function fromRoutes(_x8, _x9) {\n          return _fromRoutes.apply(this, arguments);\n        }\n        return fromRoutes;\n      }();\n      Trade2.createUncheckedTrade = function createUncheckedTrade(constructorArguments) {\n        return new Trade2(_extends({}, constructorArguments, {\n          routes: [{\n            inputAmount: constructorArguments.inputAmount,\n            outputAmount: constructorArguments.outputAmount,\n            route: constructorArguments.route\n          }]\n        }));\n      };\n      Trade2.createUncheckedTradeWithMultipleRoutes = function createUncheckedTradeWithMultipleRoutes(constructorArguments) {\n        return new Trade2(constructorArguments);\n      };\n      var _proto = Trade2.prototype;\n      _proto.minimumAmountOut = function minimumAmountOut(slippageTolerance, amountOut) {\n        if (amountOut === void 0) {\n          amountOut = this.outputAmount;\n        }\n        !!slippageTolerance.lessThan(ZERO) ? invariant(false, \"SLIPPAGE_TOLERANCE\") : void 0;\n        if (this.tradeType === sdkCore.TradeType.EXACT_OUTPUT) {\n          return amountOut;\n        } else {\n          var slippageAdjustedAmountOut = new sdkCore.Fraction(ONE).add(slippageTolerance).invert().multiply(amountOut.quotient).quotient;\n          return sdkCore.CurrencyAmount.fromRawAmount(amountOut.currency, slippageAdjustedAmountOut);\n        }\n      };\n      _proto.maximumAmountIn = function maximumAmountIn(slippageTolerance, amountIn) {\n        if (amountIn === void 0) {\n          amountIn = this.inputAmount;\n        }\n        !!slippageTolerance.lessThan(ZERO) ? invariant(false, \"SLIPPAGE_TOLERANCE\") : void 0;\n        if (this.tradeType === sdkCore.TradeType.EXACT_INPUT) {\n          return amountIn;\n        } else {\n          var slippageAdjustedAmountIn = new sdkCore.Fraction(ONE).add(slippageTolerance).multiply(amountIn.quotient).quotient;\n          return sdkCore.CurrencyAmount.fromRawAmount(amountIn.currency, slippageAdjustedAmountIn);\n        }\n      };\n      _proto.worstExecutionPrice = function worstExecutionPrice(slippageTolerance) {\n        return new sdkCore.Price(this.inputAmount.currency, this.outputAmount.currency, this.maximumAmountIn(slippageTolerance).quotient, this.minimumAmountOut(slippageTolerance).quotient);\n      };\n      Trade2.bestTradeExactIn = /* @__PURE__ */ function() {\n        var _bestTradeExactIn = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee5(pools, currencyAmountIn, currencyOut, _temp, currentPools, nextAmountIn, bestTrades) {\n          var _ref5, _ref5$maxNumResults, maxNumResults, _ref5$maxHops, maxHops, amountIn, tokenOut, i, pool, amountOut, _yield$pool$getOutput3, poolsExcludingThisPool;\n          return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n            while (1) switch (_context5.prev = _context5.next) {\n              case 0:\n                _ref5 = _temp === void 0 ? {} : _temp, _ref5$maxNumResults = _ref5.maxNumResults, maxNumResults = _ref5$maxNumResults === void 0 ? 3 : _ref5$maxNumResults, _ref5$maxHops = _ref5.maxHops, maxHops = _ref5$maxHops === void 0 ? 3 : _ref5$maxHops;\n                if (currentPools === void 0) {\n                  currentPools = [];\n                }\n                if (nextAmountIn === void 0) {\n                  nextAmountIn = currencyAmountIn;\n                }\n                if (bestTrades === void 0) {\n                  bestTrades = [];\n                }\n                !(pools.length > 0) ? invariant(false, \"POOLS\") : void 0;\n                !(maxHops > 0) ? invariant(false, \"MAX_HOPS\") : void 0;\n                !(currencyAmountIn === nextAmountIn || currentPools.length > 0) ? invariant(false, \"INVALID_RECURSION\") : void 0;\n                amountIn = nextAmountIn.wrapped;\n                tokenOut = currencyOut.wrapped;\n                i = 0;\n              case 10:\n                if (!(i < pools.length)) {\n                  _context5.next = 46;\n                  break;\n                }\n                pool = pools[i];\n                if (!(!pool.token0.equals(amountIn.currency) && !pool.token1.equals(amountIn.currency))) {\n                  _context5.next = 14;\n                  break;\n                }\n                return _context5.abrupt(\"continue\", 43);\n              case 14:\n                amountOut = void 0;\n                _context5.prev = 15;\n                _context5.next = 19;\n                return pool.getOutputAmount(amountIn);\n              case 19:\n                _yield$pool$getOutput3 = _context5.sent;\n                amountOut = _yield$pool$getOutput3[0];\n                _context5.next = 28;\n                break;\n              case 23:\n                _context5.prev = 23;\n                _context5.t0 = _context5[\"catch\"](15);\n                if (!_context5.t0.isInsufficientInputAmountError) {\n                  _context5.next = 27;\n                  break;\n                }\n                return _context5.abrupt(\"continue\", 43);\n              case 27:\n                throw _context5.t0;\n              case 28:\n                if (!(amountOut.currency.isToken && amountOut.currency.equals(tokenOut))) {\n                  _context5.next = 39;\n                  break;\n                }\n                _context5.t1 = sdkCore.sortedInsert;\n                _context5.t2 = bestTrades;\n                _context5.next = 33;\n                return Trade2.fromRoute(new Route([].concat(currentPools, [pool]), currencyAmountIn.currency, currencyOut), currencyAmountIn, sdkCore.TradeType.EXACT_INPUT);\n              case 33:\n                _context5.t3 = _context5.sent;\n                _context5.t4 = maxNumResults;\n                _context5.t5 = tradeComparator;\n                (0, _context5.t1)(_context5.t2, _context5.t3, _context5.t4, _context5.t5);\n                _context5.next = 43;\n                break;\n              case 39:\n                if (!(maxHops > 1 && pools.length > 1)) {\n                  _context5.next = 43;\n                  break;\n                }\n                poolsExcludingThisPool = pools.slice(0, i).concat(pools.slice(i + 1, pools.length));\n                _context5.next = 43;\n                return Trade2.bestTradeExactIn(poolsExcludingThisPool, currencyAmountIn, currencyOut, {\n                  maxNumResults,\n                  maxHops: maxHops - 1\n                }, [].concat(currentPools, [pool]), amountOut, bestTrades);\n              case 43:\n                i++;\n                _context5.next = 10;\n                break;\n              case 46:\n                return _context5.abrupt(\"return\", bestTrades);\n              case 47:\n              case \"end\":\n                return _context5.stop();\n            }\n          }, _callee5, null, [[15, 23]]);\n        }));\n        function bestTradeExactIn(_x10, _x11, _x12, _x13, _x14, _x15, _x16) {\n          return _bestTradeExactIn.apply(this, arguments);\n        }\n        return bestTradeExactIn;\n      }();\n      Trade2.bestTradeExactOut = /* @__PURE__ */ function() {\n        var _bestTradeExactOut = /* @__PURE__ */ _asyncToGenerator(/* @__PURE__ */ _regeneratorRuntime().mark(function _callee6(pools, currencyIn, currencyAmountOut, _temp2, currentPools, nextAmountOut, bestTrades) {\n          var _ref6, _ref6$maxNumResults, maxNumResults, _ref6$maxHops, maxHops, amountOut, tokenIn, i, pool, amountIn, _yield$pool$getInputA, poolsExcludingThisPool;\n          return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n            while (1) switch (_context6.prev = _context6.next) {\n              case 0:\n                _ref6 = _temp2 === void 0 ? {} : _temp2, _ref6$maxNumResults = _ref6.maxNumResults, maxNumResults = _ref6$maxNumResults === void 0 ? 3 : _ref6$maxNumResults, _ref6$maxHops = _ref6.maxHops, maxHops = _ref6$maxHops === void 0 ? 3 : _ref6$maxHops;\n                if (currentPools === void 0) {\n                  currentPools = [];\n                }\n                if (nextAmountOut === void 0) {\n                  nextAmountOut = currencyAmountOut;\n                }\n                if (bestTrades === void 0) {\n                  bestTrades = [];\n                }\n                !(pools.length > 0) ? invariant(false, \"POOLS\") : void 0;\n                !(maxHops > 0) ? invariant(false, \"MAX_HOPS\") : void 0;\n                !(currencyAmountOut === nextAmountOut || currentPools.length > 0) ? invariant(false, \"INVALID_RECURSION\") : void 0;\n                amountOut = nextAmountOut.wrapped;\n                tokenIn = currencyIn.wrapped;\n                i = 0;\n              case 10:\n                if (!(i < pools.length)) {\n                  _context6.next = 46;\n                  break;\n                }\n                pool = pools[i];\n                if (!(!pool.token0.equals(amountOut.currency) && !pool.token1.equals(amountOut.currency))) {\n                  _context6.next = 14;\n                  break;\n                }\n                return _context6.abrupt(\"continue\", 43);\n              case 14:\n                amountIn = void 0;\n                _context6.prev = 15;\n                _context6.next = 19;\n                return pool.getInputAmount(amountOut);\n              case 19:\n                _yield$pool$getInputA = _context6.sent;\n                amountIn = _yield$pool$getInputA[0];\n                _context6.next = 28;\n                break;\n              case 23:\n                _context6.prev = 23;\n                _context6.t0 = _context6[\"catch\"](15);\n                if (!_context6.t0.isInsufficientReservesError) {\n                  _context6.next = 27;\n                  break;\n                }\n                return _context6.abrupt(\"continue\", 43);\n              case 27:\n                throw _context6.t0;\n              case 28:\n                if (!amountIn.currency.equals(tokenIn)) {\n                  _context6.next = 39;\n                  break;\n                }\n                _context6.t1 = sdkCore.sortedInsert;\n                _context6.t2 = bestTrades;\n                _context6.next = 33;\n                return Trade2.fromRoute(new Route([pool].concat(currentPools), currencyIn, currencyAmountOut.currency), currencyAmountOut, sdkCore.TradeType.EXACT_OUTPUT);\n              case 33:\n                _context6.t3 = _context6.sent;\n                _context6.t4 = maxNumResults;\n                _context6.t5 = tradeComparator;\n                (0, _context6.t1)(_context6.t2, _context6.t3, _context6.t4, _context6.t5);\n                _context6.next = 43;\n                break;\n              case 39:\n                if (!(maxHops > 1 && pools.length > 1)) {\n                  _context6.next = 43;\n                  break;\n                }\n                poolsExcludingThisPool = pools.slice(0, i).concat(pools.slice(i + 1, pools.length));\n                _context6.next = 43;\n                return Trade2.bestTradeExactOut(poolsExcludingThisPool, currencyIn, currencyAmountOut, {\n                  maxNumResults,\n                  maxHops: maxHops - 1\n                }, [pool].concat(currentPools), amountIn, bestTrades);\n              case 43:\n                i++;\n                _context6.next = 10;\n                break;\n              case 46:\n                return _context6.abrupt(\"return\", bestTrades);\n              case 47:\n              case \"end\":\n                return _context6.stop();\n            }\n          }, _callee6, null, [[15, 23]]);\n        }));\n        function bestTradeExactOut(_x17, _x18, _x19, _x20, _x21, _x22, _x23) {\n          return _bestTradeExactOut.apply(this, arguments);\n        }\n        return bestTradeExactOut;\n      }();\n      _createClass(Trade2, [{\n        key: \"route\",\n        get: function get() {\n          !(this.swaps.length === 1) ? invariant(false, \"MULTIPLE_ROUTES\") : void 0;\n          return this.swaps[0].route;\n        }\n        /**\n         * The input amount for the trade assuming no slippage.\n         */\n      }, {\n        key: \"inputAmount\",\n        get: function get() {\n          if (this._inputAmount) {\n            return this._inputAmount;\n          }\n          var inputCurrency = this.swaps[0].inputAmount.currency;\n          var totalInputFromRoutes = this.swaps.map(function(_ref7) {\n            var inputAmount = _ref7.inputAmount;\n            return inputAmount;\n          }).reduce(function(total, cur) {\n            return total.add(cur);\n          }, sdkCore.CurrencyAmount.fromRawAmount(inputCurrency, 0));\n          this._inputAmount = totalInputFromRoutes;\n          return this._inputAmount;\n        }\n        /**\n         * The output amount for the trade assuming no slippage.\n         */\n      }, {\n        key: \"outputAmount\",\n        get: function get() {\n          if (this._outputAmount) {\n            return this._outputAmount;\n          }\n          var outputCurrency = this.swaps[0].outputAmount.currency;\n          var totalOutputFromRoutes = this.swaps.map(function(_ref8) {\n            var outputAmount = _ref8.outputAmount;\n            return outputAmount;\n          }).reduce(function(total, cur) {\n            return total.add(cur);\n          }, sdkCore.CurrencyAmount.fromRawAmount(outputCurrency, 0));\n          this._outputAmount = totalOutputFromRoutes;\n          return this._outputAmount;\n        }\n        /**\n         * The price expressed in terms of output amount/input amount.\n         */\n      }, {\n        key: \"executionPrice\",\n        get: function get() {\n          var _this$_executionPrice;\n          return (_this$_executionPrice = this._executionPrice) != null ? _this$_executionPrice : this._executionPrice = new sdkCore.Price(this.inputAmount.currency, this.outputAmount.currency, this.inputAmount.quotient, this.outputAmount.quotient);\n        }\n        /**\n         * Returns the percent difference between the route's mid price and the price impact\n         */\n      }, {\n        key: \"priceImpact\",\n        get: function get() {\n          if (this._priceImpact) {\n            return this._priceImpact;\n          }\n          var spotOutputAmount = sdkCore.CurrencyAmount.fromRawAmount(this.outputAmount.currency, 0);\n          for (var _iterator4 = _createForOfIteratorHelperLoose(this.swaps), _step4; !(_step4 = _iterator4()).done; ) {\n            var _step4$value = _step4.value, route = _step4$value.route, inputAmount = _step4$value.inputAmount;\n            var midPrice = route.midPrice;\n            spotOutputAmount = spotOutputAmount.add(midPrice.quote(inputAmount));\n          }\n          var priceImpact = spotOutputAmount.subtract(this.outputAmount).divide(spotOutputAmount);\n          this._priceImpact = new sdkCore.Percent(priceImpact.numerator, priceImpact.denominator);\n          return this._priceImpact;\n        }\n      }]);\n      return Trade2;\n    }();\n    var Multicall = /* @__PURE__ */ function() {\n      function Multicall2() {\n      }\n      Multicall2.encodeMulticall = function encodeMulticall(calldatas) {\n        if (!Array.isArray(calldatas)) {\n          calldatas = [calldatas];\n        }\n        return calldatas.length === 1 ? calldatas[0] : Multicall2.INTERFACE.encodeFunctionData(\"multicall\", [calldatas]);\n      };\n      return Multicall2;\n    }();\n    Multicall.INTERFACE = /* @__PURE__ */ new abi.Interface(IMulticall.abi);\n    function isAllowedPermit(permitOptions) {\n      return \"nonce\" in permitOptions;\n    }\n    var SelfPermit = /* @__PURE__ */ function() {\n      function SelfPermit2() {\n      }\n      SelfPermit2.encodePermit = function encodePermit(token, options) {\n        return isAllowedPermit(options) ? SelfPermit2.INTERFACE.encodeFunctionData(\"selfPermitAllowed\", [token.address, toHex(options.nonce), toHex(options.expiry), options.v, options.r, options.s]) : SelfPermit2.INTERFACE.encodeFunctionData(\"selfPermit\", [token.address, toHex(options.amount), toHex(options.deadline), options.v, options.r, options.s]);\n      };\n      return SelfPermit2;\n    }();\n    SelfPermit.INTERFACE = /* @__PURE__ */ new abi.Interface(ISelfPermit.abi);\n    var Payments = /* @__PURE__ */ function() {\n      function Payments2() {\n      }\n      Payments2.encodeFeeBips = function encodeFeeBips(fee) {\n        return toHex(fee.multiply(1e4).quotient);\n      };\n      Payments2.encodeUnwrapWETH9 = function encodeUnwrapWETH9(amountMinimum, recipient, feeOptions) {\n        recipient = sdkCore.validateAndParseAddress(recipient);\n        if (!!feeOptions) {\n          var feeBips = this.encodeFeeBips(feeOptions.fee);\n          var feeRecipient = sdkCore.validateAndParseAddress(feeOptions.recipient);\n          return Payments2.INTERFACE.encodeFunctionData(\"unwrapWETH9WithFee\", [toHex(amountMinimum), recipient, feeBips, feeRecipient]);\n        } else {\n          return Payments2.INTERFACE.encodeFunctionData(\"unwrapWETH9\", [toHex(amountMinimum), recipient]);\n        }\n      };\n      Payments2.encodeSweepToken = function encodeSweepToken(token, amountMinimum, recipient, feeOptions) {\n        recipient = sdkCore.validateAndParseAddress(recipient);\n        if (!!feeOptions) {\n          var feeBips = this.encodeFeeBips(feeOptions.fee);\n          var feeRecipient = sdkCore.validateAndParseAddress(feeOptions.recipient);\n          return Payments2.INTERFACE.encodeFunctionData(\"sweepTokenWithFee\", [token.address, toHex(amountMinimum), recipient, feeBips, feeRecipient]);\n        } else {\n          return Payments2.INTERFACE.encodeFunctionData(\"sweepToken\", [token.address, toHex(amountMinimum), recipient]);\n        }\n      };\n      Payments2.encodeRefundETH = function encodeRefundETH() {\n        return Payments2.INTERFACE.encodeFunctionData(\"refundETH\");\n      };\n      return Payments2;\n    }();\n    Payments.INTERFACE = /* @__PURE__ */ new abi.Interface(IPeripheryPaymentsWithFee.abi);\n    var _excluded = [\"expectedCurrencyOwed0\", \"expectedCurrencyOwed1\"];\n    var MaxUint128 = /* @__PURE__ */ toHex(/* @__PURE__ */ JSBI3.subtract(/* @__PURE__ */ JSBI3.exponentiate(/* @__PURE__ */ JSBI3.BigInt(2), /* @__PURE__ */ JSBI3.BigInt(128)), /* @__PURE__ */ JSBI3.BigInt(1)));\n    function isMint(options) {\n      return Object.keys(options).some(function(k) {\n        return k === \"recipient\";\n      });\n    }\n    var NonfungiblePositionManager = /* @__PURE__ */ function() {\n      function NonfungiblePositionManager2() {\n      }\n      NonfungiblePositionManager2.encodeCreate = function encodeCreate(pool) {\n        return NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"createAndInitializePoolIfNecessary\", [pool.token0.address, pool.token1.address, pool.fee, toHex(pool.sqrtRatioX96)]);\n      };\n      NonfungiblePositionManager2.createCallParameters = function createCallParameters(pool) {\n        return {\n          calldata: this.encodeCreate(pool),\n          value: toHex(0)\n        };\n      };\n      NonfungiblePositionManager2.addCallParameters = function addCallParameters(position, options) {\n        !JSBI3.greaterThan(position.liquidity, ZERO) ? invariant(false, \"ZERO_LIQUIDITY\") : void 0;\n        var calldatas = [];\n        var _position$mintAmounts = position.mintAmounts, amount0Desired = _position$mintAmounts.amount0, amount1Desired = _position$mintAmounts.amount1;\n        var minimumAmounts = position.mintAmountsWithSlippage(options.slippageTolerance);\n        var amount0Min = toHex(minimumAmounts.amount0);\n        var amount1Min = toHex(minimumAmounts.amount1);\n        var deadline = toHex(options.deadline);\n        if (isMint(options) && options.createPool) {\n          calldatas.push(this.encodeCreate(position.pool));\n        }\n        if (options.token0Permit) {\n          calldatas.push(SelfPermit.encodePermit(position.pool.token0, options.token0Permit));\n        }\n        if (options.token1Permit) {\n          calldatas.push(SelfPermit.encodePermit(position.pool.token1, options.token1Permit));\n        }\n        if (isMint(options)) {\n          var recipient = sdkCore.validateAndParseAddress(options.recipient);\n          calldatas.push(NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"mint\", [{\n            token0: position.pool.token0.address,\n            token1: position.pool.token1.address,\n            fee: position.pool.fee,\n            tickLower: position.tickLower,\n            tickUpper: position.tickUpper,\n            amount0Desired: toHex(amount0Desired),\n            amount1Desired: toHex(amount1Desired),\n            amount0Min,\n            amount1Min,\n            recipient,\n            deadline\n          }]));\n        } else {\n          calldatas.push(NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"increaseLiquidity\", [{\n            tokenId: toHex(options.tokenId),\n            amount0Desired: toHex(amount0Desired),\n            amount1Desired: toHex(amount1Desired),\n            amount0Min,\n            amount1Min,\n            deadline\n          }]));\n        }\n        var value = toHex(0);\n        if (options.useNative) {\n          var wrapped = options.useNative.wrapped;\n          !(position.pool.token0.equals(wrapped) || position.pool.token1.equals(wrapped)) ? invariant(false, \"NO_WETH\") : void 0;\n          var wrappedValue = position.pool.token0.equals(wrapped) ? amount0Desired : amount1Desired;\n          if (JSBI3.greaterThan(wrappedValue, ZERO)) {\n            calldatas.push(Payments.encodeRefundETH());\n          }\n          value = toHex(wrappedValue);\n        }\n        return {\n          calldata: Multicall.encodeMulticall(calldatas),\n          value\n        };\n      };\n      NonfungiblePositionManager2.encodeCollect = function encodeCollect(options) {\n        var calldatas = [];\n        var tokenId = toHex(options.tokenId);\n        var involvesETH = options.expectedCurrencyOwed0.currency.isNative || options.expectedCurrencyOwed1.currency.isNative;\n        var recipient = sdkCore.validateAndParseAddress(options.recipient);\n        calldatas.push(NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"collect\", [{\n          tokenId,\n          recipient: involvesETH ? ADDRESS_ZERO : recipient,\n          amount0Max: MaxUint128,\n          amount1Max: MaxUint128\n        }]));\n        if (involvesETH) {\n          var ethAmount = options.expectedCurrencyOwed0.currency.isNative ? options.expectedCurrencyOwed0.quotient : options.expectedCurrencyOwed1.quotient;\n          var token = options.expectedCurrencyOwed0.currency.isNative ? options.expectedCurrencyOwed1.currency : options.expectedCurrencyOwed0.currency;\n          var tokenAmount = options.expectedCurrencyOwed0.currency.isNative ? options.expectedCurrencyOwed1.quotient : options.expectedCurrencyOwed0.quotient;\n          calldatas.push(Payments.encodeUnwrapWETH9(ethAmount, recipient));\n          calldatas.push(Payments.encodeSweepToken(token, tokenAmount, recipient));\n        }\n        return calldatas;\n      };\n      NonfungiblePositionManager2.collectCallParameters = function collectCallParameters(options) {\n        var calldatas = NonfungiblePositionManager2.encodeCollect(options);\n        return {\n          calldata: Multicall.encodeMulticall(calldatas),\n          value: toHex(0)\n        };\n      };\n      NonfungiblePositionManager2.removeCallParameters = function removeCallParameters(position, options) {\n        var calldatas = [];\n        var deadline = toHex(options.deadline);\n        var tokenId = toHex(options.tokenId);\n        var partialPosition = new Position({\n          pool: position.pool,\n          liquidity: options.liquidityPercentage.multiply(position.liquidity).quotient,\n          tickLower: position.tickLower,\n          tickUpper: position.tickUpper\n        });\n        !JSBI3.greaterThan(partialPosition.liquidity, ZERO) ? invariant(false, \"ZERO_LIQUIDITY\") : void 0;\n        var _partialPosition$burn = partialPosition.burnAmountsWithSlippage(options.slippageTolerance), amount0Min = _partialPosition$burn.amount0, amount1Min = _partialPosition$burn.amount1;\n        if (options.permit) {\n          calldatas.push(NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"permit\", [sdkCore.validateAndParseAddress(options.permit.spender), tokenId, toHex(options.permit.deadline), options.permit.v, options.permit.r, options.permit.s]));\n        }\n        calldatas.push(NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"decreaseLiquidity\", [{\n          tokenId,\n          liquidity: toHex(partialPosition.liquidity),\n          amount0Min: toHex(amount0Min),\n          amount1Min: toHex(amount1Min),\n          deadline\n        }]));\n        var _options$collectOptio = options.collectOptions, expectedCurrencyOwed0 = _options$collectOptio.expectedCurrencyOwed0, expectedCurrencyOwed1 = _options$collectOptio.expectedCurrencyOwed1, rest = _objectWithoutPropertiesLoose(_options$collectOptio, _excluded);\n        calldatas.push.apply(calldatas, NonfungiblePositionManager2.encodeCollect(_extends({\n          tokenId: toHex(options.tokenId),\n          // add the underlying value to the expected currency already owed\n          expectedCurrencyOwed0: expectedCurrencyOwed0.add(sdkCore.CurrencyAmount.fromRawAmount(expectedCurrencyOwed0.currency, amount0Min)),\n          expectedCurrencyOwed1: expectedCurrencyOwed1.add(sdkCore.CurrencyAmount.fromRawAmount(expectedCurrencyOwed1.currency, amount1Min))\n        }, rest)));\n        if (options.liquidityPercentage.equalTo(ONE)) {\n          if (options.burnToken) {\n            calldatas.push(NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"burn\", [tokenId]));\n          }\n        } else {\n          !(options.burnToken !== true) ? invariant(false, \"CANNOT_BURN\") : void 0;\n        }\n        return {\n          calldata: Multicall.encodeMulticall(calldatas),\n          value: toHex(0)\n        };\n      };\n      NonfungiblePositionManager2.safeTransferFromParameters = function safeTransferFromParameters(options) {\n        var recipient = sdkCore.validateAndParseAddress(options.recipient);\n        var sender = sdkCore.validateAndParseAddress(options.sender);\n        var calldata;\n        if (options.data) {\n          calldata = NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"safeTransferFrom(address,address,uint256,bytes)\", [sender, recipient, toHex(options.tokenId), options.data]);\n        } else {\n          calldata = NonfungiblePositionManager2.INTERFACE.encodeFunctionData(\"safeTransferFrom(address,address,uint256)\", [sender, recipient, toHex(options.tokenId)]);\n        }\n        return {\n          calldata,\n          value: toHex(0)\n        };\n      };\n      return NonfungiblePositionManager2;\n    }();\n    NonfungiblePositionManager.INTERFACE = /* @__PURE__ */ new abi.Interface(INonfungiblePositionManager.abi);\n    var SwapQuoter = /* @__PURE__ */ function() {\n      function SwapQuoter2() {\n      }\n      SwapQuoter2.quoteCallParameters = function quoteCallParameters(route, amount, tradeType, options) {\n        if (options === void 0) {\n          options = {};\n        }\n        var singleHop = route.pools.length === 1;\n        var quoteAmount = toHex(amount.quotient);\n        var calldata;\n        var swapInterface = options.useQuoterV2 ? this.V2INTERFACE : this.V1INTERFACE;\n        if (singleHop) {\n          var _options$sqrtPriceLim, _options;\n          var baseQuoteParams = {\n            tokenIn: route.tokenPath[0].address,\n            tokenOut: route.tokenPath[1].address,\n            fee: route.pools[0].fee,\n            sqrtPriceLimitX96: toHex((_options$sqrtPriceLim = (_options = options) == null ? void 0 : _options.sqrtPriceLimitX96) != null ? _options$sqrtPriceLim : 0)\n          };\n          var v2QuoteParams = _extends({}, baseQuoteParams, tradeType === sdkCore.TradeType.EXACT_INPUT ? {\n            amountIn: quoteAmount\n          } : {\n            amount: quoteAmount\n          });\n          var v1QuoteParams = [baseQuoteParams.tokenIn, baseQuoteParams.tokenOut, baseQuoteParams.fee, quoteAmount, baseQuoteParams.sqrtPriceLimitX96];\n          var tradeTypeFunctionName = tradeType === sdkCore.TradeType.EXACT_INPUT ? \"quoteExactInputSingle\" : \"quoteExactOutputSingle\";\n          calldata = swapInterface.encodeFunctionData(tradeTypeFunctionName, options.useQuoterV2 ? [v2QuoteParams] : v1QuoteParams);\n        } else {\n          var _options2;\n          !(((_options2 = options) == null ? void 0 : _options2.sqrtPriceLimitX96) === void 0) ? invariant(false, \"MULTIHOP_PRICE_LIMIT\") : void 0;\n          var path = encodeRouteToPath(route, tradeType === sdkCore.TradeType.EXACT_OUTPUT);\n          var _tradeTypeFunctionName = tradeType === sdkCore.TradeType.EXACT_INPUT ? \"quoteExactInput\" : \"quoteExactOutput\";\n          calldata = swapInterface.encodeFunctionData(_tradeTypeFunctionName, [path, quoteAmount]);\n        }\n        return {\n          calldata,\n          value: toHex(0)\n        };\n      };\n      return SwapQuoter2;\n    }();\n    SwapQuoter.V1INTERFACE = /* @__PURE__ */ new abi.Interface(IQuoter.abi);\n    SwapQuoter.V2INTERFACE = /* @__PURE__ */ new abi.Interface(IQuoterV2.abi);\n    var Staker = /* @__PURE__ */ function() {\n      function Staker2() {\n      }\n      Staker2.encodeClaim = function encodeClaim(incentiveKey, options) {\n        var _options$amount;\n        var calldatas = [];\n        calldatas.push(Staker2.INTERFACE.encodeFunctionData(\"unstakeToken\", [this._encodeIncentiveKey(incentiveKey), toHex(options.tokenId)]));\n        var recipient = sdkCore.validateAndParseAddress(options.recipient);\n        var amount = (_options$amount = options.amount) != null ? _options$amount : 0;\n        calldatas.push(Staker2.INTERFACE.encodeFunctionData(\"claimReward\", [incentiveKey.rewardToken.address, recipient, toHex(amount)]));\n        return calldatas;\n      };\n      Staker2.collectRewards = function collectRewards(incentiveKeys, options) {\n        incentiveKeys = Array.isArray(incentiveKeys) ? incentiveKeys : [incentiveKeys];\n        var calldatas = [];\n        for (var i = 0; i < incentiveKeys.length; i++) {\n          var incentiveKey = incentiveKeys[i];\n          calldatas = calldatas.concat(this.encodeClaim(incentiveKey, options));\n          calldatas.push(Staker2.INTERFACE.encodeFunctionData(\"stakeToken\", [this._encodeIncentiveKey(incentiveKey), toHex(options.tokenId)]));\n        }\n        return {\n          calldata: Multicall.encodeMulticall(calldatas),\n          value: toHex(0)\n        };\n      };\n      Staker2.withdrawToken = function withdrawToken(incentiveKeys, withdrawOptions) {\n        var calldatas = [];\n        incentiveKeys = Array.isArray(incentiveKeys) ? incentiveKeys : [incentiveKeys];\n        var claimOptions = {\n          tokenId: withdrawOptions.tokenId,\n          recipient: withdrawOptions.recipient,\n          amount: withdrawOptions.amount\n        };\n        for (var i = 0; i < incentiveKeys.length; i++) {\n          var incentiveKey = incentiveKeys[i];\n          calldatas = calldatas.concat(this.encodeClaim(incentiveKey, claimOptions));\n        }\n        var owner = sdkCore.validateAndParseAddress(withdrawOptions.owner);\n        calldatas.push(Staker2.INTERFACE.encodeFunctionData(\"withdrawToken\", [toHex(withdrawOptions.tokenId), owner, withdrawOptions.data ? withdrawOptions.data : toHex(0)]));\n        return {\n          calldata: Multicall.encodeMulticall(calldatas),\n          value: toHex(0)\n        };\n      };\n      Staker2.encodeDeposit = function encodeDeposit(incentiveKeys) {\n        incentiveKeys = Array.isArray(incentiveKeys) ? incentiveKeys : [incentiveKeys];\n        var data;\n        if (incentiveKeys.length > 1) {\n          var keys = [];\n          for (var i = 0; i < incentiveKeys.length; i++) {\n            var incentiveKey = incentiveKeys[i];\n            keys.push(this._encodeIncentiveKey(incentiveKey));\n          }\n          data = abi.defaultAbiCoder.encode([Staker2.INCENTIVE_KEY_ABI + \"[]\"], [keys]);\n        } else {\n          data = abi.defaultAbiCoder.encode([Staker2.INCENTIVE_KEY_ABI], [this._encodeIncentiveKey(incentiveKeys[0])]);\n        }\n        return data;\n      };\n      Staker2._encodeIncentiveKey = function _encodeIncentiveKey(incentiveKey) {\n        var _incentiveKey$pool = incentiveKey.pool, token0 = _incentiveKey$pool.token0, token1 = _incentiveKey$pool.token1, fee = _incentiveKey$pool.fee;\n        var refundee = sdkCore.validateAndParseAddress(incentiveKey.refundee);\n        return {\n          rewardToken: incentiveKey.rewardToken.address,\n          pool: Pool.getAddress(token0, token1, fee),\n          startTime: toHex(incentiveKey.startTime),\n          endTime: toHex(incentiveKey.endTime),\n          refundee\n        };\n      };\n      return Staker2;\n    }();\n    Staker.INTERFACE = /* @__PURE__ */ new abi.Interface(IUniswapV3Staker.abi);\n    Staker.INCENTIVE_KEY_ABI = \"tuple(address rewardToken, address pool, uint256 startTime, uint256 endTime, address refundee)\";\n    var SwapRouter = /* @__PURE__ */ function() {\n      function SwapRouter2() {\n      }\n      SwapRouter2.swapCallParameters = function swapCallParameters(trades, options) {\n        if (!Array.isArray(trades)) {\n          trades = [trades];\n        }\n        var sampleTrade = trades[0];\n        var tokenIn = sampleTrade.inputAmount.currency.wrapped;\n        var tokenOut = sampleTrade.outputAmount.currency.wrapped;\n        !trades.every(function(trade2) {\n          return trade2.inputAmount.currency.wrapped.equals(tokenIn);\n        }) ? invariant(false, \"TOKEN_IN_DIFF\") : void 0;\n        !trades.every(function(trade2) {\n          return trade2.outputAmount.currency.wrapped.equals(tokenOut);\n        }) ? invariant(false, \"TOKEN_OUT_DIFF\") : void 0;\n        var calldatas = [];\n        var ZERO_IN = sdkCore.CurrencyAmount.fromRawAmount(trades[0].inputAmount.currency, 0);\n        var ZERO_OUT = sdkCore.CurrencyAmount.fromRawAmount(trades[0].outputAmount.currency, 0);\n        var totalAmountOut = trades.reduce(function(sum, trade2) {\n          return sum.add(trade2.minimumAmountOut(options.slippageTolerance));\n        }, ZERO_OUT);\n        var mustRefund = sampleTrade.inputAmount.currency.isNative && sampleTrade.tradeType === sdkCore.TradeType.EXACT_OUTPUT;\n        var inputIsNative = sampleTrade.inputAmount.currency.isNative;\n        var outputIsNative = sampleTrade.outputAmount.currency.isNative;\n        var routerMustCustody = outputIsNative || !!options.fee;\n        var totalValue = inputIsNative ? trades.reduce(function(sum, trade2) {\n          return sum.add(trade2.maximumAmountIn(options.slippageTolerance));\n        }, ZERO_IN) : ZERO_IN;\n        if (options.inputTokenPermit) {\n          !sampleTrade.inputAmount.currency.isToken ? invariant(false, \"NON_TOKEN_PERMIT\") : void 0;\n          calldatas.push(SelfPermit.encodePermit(sampleTrade.inputAmount.currency, options.inputTokenPermit));\n        }\n        var recipient = sdkCore.validateAndParseAddress(options.recipient);\n        var deadline = toHex(options.deadline);\n        for (var _iterator = _createForOfIteratorHelperLoose(trades), _step; !(_step = _iterator()).done; ) {\n          var trade = _step.value;\n          for (var _iterator2 = _createForOfIteratorHelperLoose(trade.swaps), _step2; !(_step2 = _iterator2()).done; ) {\n            var _step2$value = _step2.value, route = _step2$value.route, inputAmount = _step2$value.inputAmount, outputAmount = _step2$value.outputAmount;\n            var amountIn = toHex(trade.maximumAmountIn(options.slippageTolerance, inputAmount).quotient);\n            var amountOut = toHex(trade.minimumAmountOut(options.slippageTolerance, outputAmount).quotient);\n            var singleHop = route.pools.length === 1;\n            if (singleHop) {\n              if (trade.tradeType === sdkCore.TradeType.EXACT_INPUT) {\n                var _options$sqrtPriceLim;\n                var exactInputSingleParams = {\n                  tokenIn: route.tokenPath[0].address,\n                  tokenOut: route.tokenPath[1].address,\n                  fee: route.pools[0].fee,\n                  recipient: routerMustCustody ? ADDRESS_ZERO : recipient,\n                  deadline,\n                  amountIn,\n                  amountOutMinimum: amountOut,\n                  sqrtPriceLimitX96: toHex((_options$sqrtPriceLim = options.sqrtPriceLimitX96) != null ? _options$sqrtPriceLim : 0)\n                };\n                calldatas.push(SwapRouter2.INTERFACE.encodeFunctionData(\"exactInputSingle\", [exactInputSingleParams]));\n              } else {\n                var _options$sqrtPriceLim2;\n                var exactOutputSingleParams = {\n                  tokenIn: route.tokenPath[0].address,\n                  tokenOut: route.tokenPath[1].address,\n                  fee: route.pools[0].fee,\n                  recipient: routerMustCustody ? ADDRESS_ZERO : recipient,\n                  deadline,\n                  amountOut,\n                  amountInMaximum: amountIn,\n                  sqrtPriceLimitX96: toHex((_options$sqrtPriceLim2 = options.sqrtPriceLimitX96) != null ? _options$sqrtPriceLim2 : 0)\n                };\n                calldatas.push(SwapRouter2.INTERFACE.encodeFunctionData(\"exactOutputSingle\", [exactOutputSingleParams]));\n              }\n            } else {\n              !(options.sqrtPriceLimitX96 === void 0) ? invariant(false, \"MULTIHOP_PRICE_LIMIT\") : void 0;\n              var path = encodeRouteToPath(route, trade.tradeType === sdkCore.TradeType.EXACT_OUTPUT);\n              if (trade.tradeType === sdkCore.TradeType.EXACT_INPUT) {\n                var exactInputParams = {\n                  path,\n                  recipient: routerMustCustody ? ADDRESS_ZERO : recipient,\n                  deadline,\n                  amountIn,\n                  amountOutMinimum: amountOut\n                };\n                calldatas.push(SwapRouter2.INTERFACE.encodeFunctionData(\"exactInput\", [exactInputParams]));\n              } else {\n                var exactOutputParams = {\n                  path,\n                  recipient: routerMustCustody ? ADDRESS_ZERO : recipient,\n                  deadline,\n                  amountOut,\n                  amountInMaximum: amountIn\n                };\n                calldatas.push(SwapRouter2.INTERFACE.encodeFunctionData(\"exactOutput\", [exactOutputParams]));\n              }\n            }\n          }\n        }\n        if (routerMustCustody) {\n          if (!!options.fee) {\n            if (outputIsNative) {\n              calldatas.push(Payments.encodeUnwrapWETH9(totalAmountOut.quotient, recipient, options.fee));\n            } else {\n              calldatas.push(Payments.encodeSweepToken(sampleTrade.outputAmount.currency.wrapped, totalAmountOut.quotient, recipient, options.fee));\n            }\n          } else {\n            calldatas.push(Payments.encodeUnwrapWETH9(totalAmountOut.quotient, recipient));\n          }\n        }\n        if (mustRefund) {\n          calldatas.push(Payments.encodeRefundETH());\n        }\n        return {\n          calldata: Multicall.encodeMulticall(calldatas),\n          value: toHex(totalValue.quotient)\n        };\n      };\n      return SwapRouter2;\n    }();\n    SwapRouter.INTERFACE = /* @__PURE__ */ new abi.Interface(ISwapRouter.abi);\n    exports2.ADDRESS_ZERO = ADDRESS_ZERO;\n    exports2.FACTORY_ADDRESS = FACTORY_ADDRESS;\n    exports2.FullMath = FullMath;\n    exports2.LiquidityMath = LiquidityMath;\n    exports2.Multicall = Multicall;\n    exports2.NoTickDataProvider = NoTickDataProvider;\n    exports2.NonfungiblePositionManager = NonfungiblePositionManager;\n    exports2.POOL_INIT_CODE_HASH = POOL_INIT_CODE_HASH;\n    exports2.Payments = Payments;\n    exports2.Pool = Pool;\n    exports2.Position = Position;\n    exports2.PositionLibrary = PositionLibrary;\n    exports2.Route = Route;\n    exports2.SelfPermit = SelfPermit;\n    exports2.SqrtPriceMath = SqrtPriceMath2;\n    exports2.Staker = Staker;\n    exports2.SwapMath = SwapMath;\n    exports2.SwapQuoter = SwapQuoter;\n    exports2.SwapRouter = SwapRouter;\n    exports2.TICK_SPACINGS = TICK_SPACINGS;\n    exports2.Tick = Tick;\n    exports2.TickLibrary = TickLibrary;\n    exports2.TickList = TickList;\n    exports2.TickListDataProvider = TickListDataProvider;\n    exports2.TickMath = TickMath;\n    exports2.Trade = Trade;\n    exports2.computePoolAddress = computePoolAddress;\n    exports2.encodeRouteToPath = encodeRouteToPath;\n    exports2.encodeSqrtRatioX96 = encodeSqrtRatioX96;\n    exports2.isSorted = isSorted;\n    exports2.maxLiquidityForAmounts = maxLiquidityForAmounts;\n    exports2.mostSignificantBit = mostSignificantBit;\n    exports2.nearestUsableTick = nearestUsableTick;\n    exports2.priceToClosestTick = priceToClosestTick;\n    exports2.subIn256 = subIn256;\n    exports2.tickToPrice = tickToPrice;\n    exports2.toHex = toHex;\n    exports2.tradeComparator = tradeComparator;\n  }\n});\n\n// node_modules/@uniswap/v3-sdk/dist/index.js\nvar require_dist2 = __commonJS({\n  \"node_modules/@uniswap/v3-sdk/dist/index.js\"(exports2, module2) {\n    \"use strict\";\n    if (process.env.NODE_ENV === \"production\") {\n      module2.exports = require_v3_sdk_cjs_production_min();\n    } else {\n      module2.exports = require_v3_sdk_cjs_development();\n    }\n  }\n});\n\n// src/getModifyLiquidityResult.ts\nvar import_ethers = __toESM(require_lib31());\nvar import_jsbi2 = __toESM(require_jsbi_cjs());\n\n// src/utils/shared.ts\nvar import_decimal = __toESM(require_decimal());\nvar import_jsbi = __toESM(require_jsbi_cjs());\nvar import_v3_sdk = __toESM(require_dist2());\nvar JSBI_ZERO = import_jsbi.default.BigInt(0);\nfunction getSqrtPriceAtTick(tick) {\n  return new import_decimal.default(1.0001).pow(tick).sqrt().mul(new import_decimal.default(2).pow(96)).toFixed(0);\n}\nfunction getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, liquidity2) {\n  if (import_jsbi.default.lessThan(liquidity2, JSBI_ZERO)) {\n    return import_v3_sdk.SqrtPriceMath.getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, import_jsbi.default.unaryMinus(liquidity2), false);\n  } else {\n    return import_jsbi.default.unaryMinus(import_v3_sdk.SqrtPriceMath.getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, liquidity2, true));\n  }\n}\nfunction getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, liquidity2) {\n  if (import_jsbi.default.lessThan(liquidity2, JSBI_ZERO)) {\n    return import_v3_sdk.SqrtPriceMath.getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, import_jsbi.default.unaryMinus(liquidity2), false);\n  } else {\n    return import_jsbi.default.unaryMinus(import_v3_sdk.SqrtPriceMath.getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, liquidity2, true));\n  }\n}\n\n// src/getModifyLiquidityResult.ts\nvar params = process.argv[2].split(\",\");\nvar tickLower = params[0];\nvar tickUpper = params[1];\nvar liquidity = params[2];\nvar slot0Tick = params[3];\nvar slot0Price = params[4];\nvar result = modifyLiquidity(tickLower, tickUpper, liquidity, slot0Tick, slot0Price);\nprocess.stdout.write(import_ethers.ethers.utils.defaultAbiCoder.encode([\"int128[]\"], [result]));\nfunction modifyLiquidity(_tickLower, _tickUpper, _liquidity, slot0Tick2, slot0Price2) {\n  const liquidity2 = import_jsbi2.default.BigInt(_liquidity);\n  if (import_jsbi2.default.EQ(liquidity2, 0)) {\n    return [JSBI_ZERO.toString(), JSBI_ZERO.toString()];\n  }\n  const tick = import_jsbi2.default.BigInt(slot0Tick2);\n  const sqrtPriceX96 = import_jsbi2.default.BigInt(slot0Price2);\n  const tickLower2 = import_jsbi2.default.BigInt(_tickLower);\n  const tickUpper2 = import_jsbi2.default.BigInt(_tickUpper);\n  let delta = [];\n  if (import_jsbi2.default.LT(tick, tickLower2)) {\n    let priceLower = import_jsbi2.default.BigInt(getSqrtPriceAtTick(_tickLower));\n    let priceUpper = import_jsbi2.default.BigInt(getSqrtPriceAtTick(_tickUpper));\n    let amount0 = getAmount0Delta(priceLower, priceUpper, liquidity2);\n    delta.push(amount0.toString());\n    delta.push(JSBI_ZERO.toString());\n  } else if (import_jsbi2.default.LT(tick, tickUpper2)) {\n    let priceUpper = import_jsbi2.default.BigInt(getSqrtPriceAtTick(_tickUpper));\n    let priceLower = import_jsbi2.default.BigInt(getSqrtPriceAtTick(_tickLower));\n    if (import_jsbi2.default.EQ(tickLower2, tick)) {\n      priceLower = sqrtPriceX96;\n    }\n    let amount0 = getAmount0Delta(sqrtPriceX96, priceUpper, liquidity2);\n    let amount1 = getAmount1Delta(priceLower, sqrtPriceX96, liquidity2);\n    delta.push(amount0.toString());\n    delta.push(amount1.toString());\n  } else {\n    let priceLower = import_jsbi2.default.BigInt(getSqrtPriceAtTick(_tickLower));\n    let priceUpper = import_jsbi2.default.BigInt(getSqrtPriceAtTick(_tickUpper));\n    let amount1 = getAmount1Delta(priceLower, priceUpper, liquidity2);\n    delta.push(JSBI_ZERO.toString());\n    delta.push(amount1.toString());\n  }\n  return delta;\n}\n/*! Bundled license information:\n\njs-sha3/src/sha3.js:\n  (**\n   * [js-sha3]{@link https://github.com/emn178/js-sha3}\n   *\n   * @version 0.8.0\n   * @author Chen, Yi-Cyuan [emn178@gmail.com]\n   * @copyright Chen, Yi-Cyuan 2015-2018\n   * @license MIT\n   *)\n\ndecimal.js-light/decimal.js:\n  (*! decimal.js-light v2.5.1 https://github.com/MikeMcl/decimal.js-light/LICENCE *)\n*/\n"
  },
  {
    "path": "test/js-scripts/dist/getSqrtPriceAtTick.js",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod) => function __require() {\n  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\n\n// node_modules/decimal.js/decimal.js\nvar require_decimal = __commonJS({\n  \"node_modules/decimal.js/decimal.js\"(exports2, module2) {\n    (function(globalScope) {\n      \"use strict\";\n      var EXP_LIMIT = 9e15, MAX_DIGITS = 1e9, NUMERALS = \"0123456789abcdef\", LN10 = \"2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058\", PI = \"3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789\", DEFAULTS = {\n        // These values must be integers within the stated ranges (inclusive).\n        // Most of these values can be changed at run-time using the `Decimal.config` method.\n        // The maximum number of significant digits of the result of a calculation or base conversion.\n        // E.g. `Decimal.config({ precision: 20 });`\n        precision: 20,\n        // 1 to MAX_DIGITS\n        // The rounding mode used when rounding to `precision`.\n        //\n        // ROUND_UP         0 Away from zero.\n        // ROUND_DOWN       1 Towards zero.\n        // ROUND_CEIL       2 Towards +Infinity.\n        // ROUND_FLOOR      3 Towards -Infinity.\n        // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.\n        // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\n        // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\n        // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\n        // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\n        //\n        // E.g.\n        // `Decimal.rounding = 4;`\n        // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\n        rounding: 4,\n        // 0 to 8\n        // The modulo mode used when calculating the modulus: a mod n.\n        // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\n        // The remainder (r) is calculated as: r = a - n * q.\n        //\n        // UP         0 The remainder is positive if the dividend is negative, else is negative.\n        // DOWN       1 The remainder has the same sign as the dividend (JavaScript %).\n        // FLOOR      3 The remainder has the same sign as the divisor (Python %).\n        // HALF_EVEN  6 The IEEE 754 remainder function.\n        // EUCLID     9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\n        //\n        // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\n        // division (9) are commonly used for the modulus operation. The other rounding modes can also\n        // be used, but they may not give useful results.\n        modulo: 1,\n        // 0 to 9\n        // The exponent value at and beneath which `toString` returns exponential notation.\n        // JavaScript numbers: -7\n        toExpNeg: -7,\n        // 0 to -EXP_LIMIT\n        // The exponent value at and above which `toString` returns exponential notation.\n        // JavaScript numbers: 21\n        toExpPos: 21,\n        // 0 to EXP_LIMIT\n        // The minimum exponent value, beneath which underflow to zero occurs.\n        // JavaScript numbers: -324  (5e-324)\n        minE: -EXP_LIMIT,\n        // -1 to -EXP_LIMIT\n        // The maximum exponent value, above which overflow to Infinity occurs.\n        // JavaScript numbers: 308  (1.7976931348623157e+308)\n        maxE: EXP_LIMIT,\n        // 1 to EXP_LIMIT\n        // Whether to use cryptographically-secure random number generation, if available.\n        crypto: false\n        // true/false\n      }, Decimal2, inexact, noConflict, quadrant, external = true, decimalError = \"[DecimalError] \", invalidArgument = decimalError + \"Invalid argument: \", precisionLimitExceeded = decimalError + \"Precision limit exceeded\", cryptoUnavailable = decimalError + \"crypto unavailable\", tag = \"[object Decimal]\", mathfloor = Math.floor, mathpow = Math.pow, isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i, isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i, isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i, isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i, BASE = 1e7, LOG_BASE = 7, MAX_SAFE_INTEGER = 9007199254740991, LN10_PRECISION = LN10.length - 1, PI_PRECISION = PI.length - 1, P = { toStringTag: tag };\n      P.absoluteValue = P.abs = function() {\n        var x = new this.constructor(this);\n        if (x.s < 0) x.s = 1;\n        return finalise(x);\n      };\n      P.ceil = function() {\n        return finalise(new this.constructor(this), this.e + 1, 2);\n      };\n      P.clampedTo = P.clamp = function(min2, max2) {\n        var k, x = this, Ctor = x.constructor;\n        min2 = new Ctor(min2);\n        max2 = new Ctor(max2);\n        if (!min2.s || !max2.s) return new Ctor(NaN);\n        if (min2.gt(max2)) throw Error(invalidArgument + max2);\n        k = x.cmp(min2);\n        return k < 0 ? min2 : x.cmp(max2) > 0 ? max2 : new Ctor(x);\n      };\n      P.comparedTo = P.cmp = function(y) {\n        var i, j, xdL, ydL, x = this, xd = x.d, yd = (y = new x.constructor(y)).d, xs = x.s, ys = y.s;\n        if (!xd || !yd) {\n          return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\n        }\n        if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\n        if (xs !== ys) return xs;\n        if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\n        xdL = xd.length;\n        ydL = yd.length;\n        for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\n          if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\n        }\n        return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\n      };\n      P.cosine = P.cos = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.d) return new Ctor(NaN);\n        if (!x.d[0]) return new Ctor(1);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\n        Ctor.rounding = 1;\n        x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\n      };\n      P.cubeRoot = P.cbrt = function() {\n        var e, m, n, r, rep, s, sd, t, t3, t3plusx, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        external = false;\n        s = x.s * mathpow(x.s * x, 1 / 3);\n        if (!s || Math.abs(s) == 1 / 0) {\n          n = digitsToString(x.d);\n          e = x.e;\n          if (s = (e - n.length + 1) % 3) n += s == 1 || s == -2 ? \"0\" : \"00\";\n          s = mathpow(n, 1 / 3);\n          e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\n          if (s == 1 / 0) {\n            n = \"5e\" + e;\n          } else {\n            n = s.toExponential();\n            n = n.slice(0, n.indexOf(\"e\") + 1) + e;\n          }\n          r = new Ctor(n);\n          r.s = x.s;\n        } else {\n          r = new Ctor(s.toString());\n        }\n        sd = (e = Ctor.precision) + 3;\n        for (; ; ) {\n          t = r;\n          t3 = t.times(t).times(t);\n          t3plusx = t3.plus(x);\n          r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\n          if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\n            n = n.slice(sd - 3, sd + 1);\n            if (n == \"9999\" || !rep && n == \"4999\") {\n              if (!rep) {\n                finalise(t, e + 1, 0);\n                if (t.times(t).times(t).eq(x)) {\n                  r = t;\n                  break;\n                }\n              }\n              sd += 4;\n              rep = 1;\n            } else {\n              if (!+n || !+n.slice(1) && n.charAt(0) == \"5\") {\n                finalise(r, e + 1, 1);\n                m = !r.times(r).times(r).eq(x);\n              }\n              break;\n            }\n          }\n        }\n        external = true;\n        return finalise(r, e, Ctor.rounding, m);\n      };\n      P.decimalPlaces = P.dp = function() {\n        var w, d = this.d, n = NaN;\n        if (d) {\n          w = d.length - 1;\n          n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\n          w = d[w];\n          if (w) for (; w % 10 == 0; w /= 10) n--;\n          if (n < 0) n = 0;\n        }\n        return n;\n      };\n      P.dividedBy = P.div = function(y) {\n        return divide(this, new this.constructor(y));\n      };\n      P.dividedToIntegerBy = P.divToInt = function(y) {\n        var x = this, Ctor = x.constructor;\n        return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\n      };\n      P.equals = P.eq = function(y) {\n        return this.cmp(y) === 0;\n      };\n      P.floor = function() {\n        return finalise(new this.constructor(this), this.e + 1, 3);\n      };\n      P.greaterThan = P.gt = function(y) {\n        return this.cmp(y) > 0;\n      };\n      P.greaterThanOrEqualTo = P.gte = function(y) {\n        var k = this.cmp(y);\n        return k == 1 || k === 0;\n      };\n      P.hyperbolicCosine = P.cosh = function() {\n        var k, n, pr, rm, len, x = this, Ctor = x.constructor, one = new Ctor(1);\n        if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\n        if (x.isZero()) return one;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\n        Ctor.rounding = 1;\n        len = x.d.length;\n        if (len < 32) {\n          k = Math.ceil(len / 3);\n          n = (1 / tinyPow(4, k)).toString();\n        } else {\n          k = 16;\n          n = \"2.3283064365386962890625e-10\";\n        }\n        x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\n        var cosh2_x, i = k, d8 = new Ctor(8);\n        for (; i--; ) {\n          cosh2_x = x.times(x);\n          x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\n        }\n        return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\n      };\n      P.hyperbolicSine = P.sinh = function() {\n        var k, pr, rm, len, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\n        Ctor.rounding = 1;\n        len = x.d.length;\n        if (len < 3) {\n          x = taylorSeries(Ctor, 2, x, x, true);\n        } else {\n          k = 1.4 * Math.sqrt(len);\n          k = k > 16 ? 16 : k | 0;\n          x = x.times(1 / tinyPow(5, k));\n          x = taylorSeries(Ctor, 2, x, x, true);\n          var sinh2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20);\n          for (; k--; ) {\n            sinh2_x = x.times(x);\n            x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\n          }\n        }\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(x, pr, rm, true);\n      };\n      P.hyperbolicTangent = P.tanh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(x.s);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 7;\n        Ctor.rounding = 1;\n        return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\n      };\n      P.inverseCosine = P.acos = function() {\n        var halfPi, x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding;\n        if (k !== -1) {\n          return k === 0 ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) : new Ctor(NaN);\n        }\n        if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\n        Ctor.precision = pr + 6;\n        Ctor.rounding = 1;\n        x = x.asin();\n        halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return halfPi.minus(x);\n      };\n      P.inverseHyperbolicCosine = P.acosh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\n        if (!x.isFinite()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\n        Ctor.rounding = 1;\n        external = false;\n        x = x.times(x).minus(1).sqrt().plus(x);\n        external = true;\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.ln();\n      };\n      P.inverseHyperbolicSine = P.asinh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\n        Ctor.rounding = 1;\n        external = false;\n        x = x.times(x).plus(1).sqrt().plus(x);\n        external = true;\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.ln();\n      };\n      P.inverseHyperbolicTangent = P.atanh = function() {\n        var pr, rm, wpr, xsd, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        xsd = x.sd();\n        if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\n        Ctor.precision = wpr = xsd - x.e;\n        x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\n        Ctor.precision = pr + 4;\n        Ctor.rounding = 1;\n        x = x.ln();\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.times(0.5);\n      };\n      P.inverseSine = P.asin = function() {\n        var halfPi, k, pr, rm, x = this, Ctor = x.constructor;\n        if (x.isZero()) return new Ctor(x);\n        k = x.abs().cmp(1);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (k !== -1) {\n          if (k === 0) {\n            halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\n            halfPi.s = x.s;\n            return halfPi;\n          }\n          return new Ctor(NaN);\n        }\n        Ctor.precision = pr + 6;\n        Ctor.rounding = 1;\n        x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.times(2);\n      };\n      P.inverseTangent = P.atan = function() {\n        var i, j, k, n, px, t, r, wpr, x2, x = this, Ctor = x.constructor, pr = Ctor.precision, rm = Ctor.rounding;\n        if (!x.isFinite()) {\n          if (!x.s) return new Ctor(NaN);\n          if (pr + 4 <= PI_PRECISION) {\n            r = getPi(Ctor, pr + 4, rm).times(0.5);\n            r.s = x.s;\n            return r;\n          }\n        } else if (x.isZero()) {\n          return new Ctor(x);\n        } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\n          r = getPi(Ctor, pr + 4, rm).times(0.25);\n          r.s = x.s;\n          return r;\n        }\n        Ctor.precision = wpr = pr + 10;\n        Ctor.rounding = 1;\n        k = Math.min(28, wpr / LOG_BASE + 2 | 0);\n        for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\n        external = false;\n        j = Math.ceil(wpr / LOG_BASE);\n        n = 1;\n        x2 = x.times(x);\n        r = new Ctor(x);\n        px = x;\n        for (; i !== -1; ) {\n          px = px.times(x2);\n          t = r.minus(px.div(n += 2));\n          px = px.times(x2);\n          r = t.plus(px.div(n += 2));\n          if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--; ) ;\n        }\n        if (k) r = r.times(2 << k - 1);\n        external = true;\n        return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\n      };\n      P.isFinite = function() {\n        return !!this.d;\n      };\n      P.isInteger = P.isInt = function() {\n        return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\n      };\n      P.isNaN = function() {\n        return !this.s;\n      };\n      P.isNegative = P.isNeg = function() {\n        return this.s < 0;\n      };\n      P.isPositive = P.isPos = function() {\n        return this.s > 0;\n      };\n      P.isZero = function() {\n        return !!this.d && this.d[0] === 0;\n      };\n      P.lessThan = P.lt = function(y) {\n        return this.cmp(y) < 0;\n      };\n      P.lessThanOrEqualTo = P.lte = function(y) {\n        return this.cmp(y) < 1;\n      };\n      P.logarithm = P.log = function(base) {\n        var isBase10, d, denominator, k, inf, num, sd, r, arg = this, Ctor = arg.constructor, pr = Ctor.precision, rm = Ctor.rounding, guard = 5;\n        if (base == null) {\n          base = new Ctor(10);\n          isBase10 = true;\n        } else {\n          base = new Ctor(base);\n          d = base.d;\n          if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\n          isBase10 = base.eq(10);\n        }\n        d = arg.d;\n        if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\n          return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\n        }\n        if (isBase10) {\n          if (d.length > 1) {\n            inf = true;\n          } else {\n            for (k = d[0]; k % 10 === 0; ) k /= 10;\n            inf = k !== 1;\n          }\n        }\n        external = false;\n        sd = pr + guard;\n        num = naturalLogarithm(arg, sd);\n        denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\n        r = divide(num, denominator, sd, 1);\n        if (checkRoundingDigits(r.d, k = pr, rm)) {\n          do {\n            sd += 10;\n            num = naturalLogarithm(arg, sd);\n            denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\n            r = divide(num, denominator, sd, 1);\n            if (!inf) {\n              if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\n                r = finalise(r, pr + 1, 0);\n              }\n              break;\n            }\n          } while (checkRoundingDigits(r.d, k += 10, rm));\n        }\n        external = true;\n        return finalise(r, pr, rm);\n      };\n      P.minus = P.sub = function(y) {\n        var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.d) {\n          if (!x.s || !y.s) y = new Ctor(NaN);\n          else if (x.d) y.s = -y.s;\n          else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\n          return y;\n        }\n        if (x.s != y.s) {\n          y.s = -y.s;\n          return x.plus(y);\n        }\n        xd = x.d;\n        yd = y.d;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (!xd[0] || !yd[0]) {\n          if (yd[0]) y.s = -y.s;\n          else if (xd[0]) y = new Ctor(x);\n          else return new Ctor(rm === 3 ? -0 : 0);\n          return external ? finalise(y, pr, rm) : y;\n        }\n        e = mathfloor(y.e / LOG_BASE);\n        xe = mathfloor(x.e / LOG_BASE);\n        xd = xd.slice();\n        k = xe - e;\n        if (k) {\n          xLTy = k < 0;\n          if (xLTy) {\n            d = xd;\n            k = -k;\n            len = yd.length;\n          } else {\n            d = yd;\n            e = xe;\n            len = xd.length;\n          }\n          i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\n          if (k > i) {\n            k = i;\n            d.length = 1;\n          }\n          d.reverse();\n          for (i = k; i--; ) d.push(0);\n          d.reverse();\n        } else {\n          i = xd.length;\n          len = yd.length;\n          xLTy = i < len;\n          if (xLTy) len = i;\n          for (i = 0; i < len; i++) {\n            if (xd[i] != yd[i]) {\n              xLTy = xd[i] < yd[i];\n              break;\n            }\n          }\n          k = 0;\n        }\n        if (xLTy) {\n          d = xd;\n          xd = yd;\n          yd = d;\n          y.s = -y.s;\n        }\n        len = xd.length;\n        for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\n        for (i = yd.length; i > k; ) {\n          if (xd[--i] < yd[i]) {\n            for (j = i; j && xd[--j] === 0; ) xd[j] = BASE - 1;\n            --xd[j];\n            xd[i] += BASE;\n          }\n          xd[i] -= yd[i];\n        }\n        for (; xd[--len] === 0; ) xd.pop();\n        for (; xd[0] === 0; xd.shift()) --e;\n        if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\n        y.d = xd;\n        y.e = getBase10Exponent(xd, e);\n        return external ? finalise(y, pr, rm) : y;\n      };\n      P.modulo = P.mod = function(y) {\n        var q, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\n        if (!y.d || x.d && !x.d[0]) {\n          return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\n        }\n        external = false;\n        if (Ctor.modulo == 9) {\n          q = divide(x, y.abs(), 0, 3, 1);\n          q.s *= y.s;\n        } else {\n          q = divide(x, y, 0, Ctor.modulo, 1);\n        }\n        q = q.times(y);\n        external = true;\n        return x.minus(q);\n      };\n      P.naturalExponential = P.exp = function() {\n        return naturalExponential(this);\n      };\n      P.naturalLogarithm = P.ln = function() {\n        return naturalLogarithm(this);\n      };\n      P.negated = P.neg = function() {\n        var x = new this.constructor(this);\n        x.s = -x.s;\n        return finalise(x);\n      };\n      P.plus = P.add = function(y) {\n        var carry, d, e, i, k, len, pr, rm, xd, yd, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.d) {\n          if (!x.s || !y.s) y = new Ctor(NaN);\n          else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\n          return y;\n        }\n        if (x.s != y.s) {\n          y.s = -y.s;\n          return x.minus(y);\n        }\n        xd = x.d;\n        yd = y.d;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (!xd[0] || !yd[0]) {\n          if (!yd[0]) y = new Ctor(x);\n          return external ? finalise(y, pr, rm) : y;\n        }\n        k = mathfloor(x.e / LOG_BASE);\n        e = mathfloor(y.e / LOG_BASE);\n        xd = xd.slice();\n        i = k - e;\n        if (i) {\n          if (i < 0) {\n            d = xd;\n            i = -i;\n            len = yd.length;\n          } else {\n            d = yd;\n            e = k;\n            len = xd.length;\n          }\n          k = Math.ceil(pr / LOG_BASE);\n          len = k > len ? k + 1 : len + 1;\n          if (i > len) {\n            i = len;\n            d.length = 1;\n          }\n          d.reverse();\n          for (; i--; ) d.push(0);\n          d.reverse();\n        }\n        len = xd.length;\n        i = yd.length;\n        if (len - i < 0) {\n          i = len;\n          d = yd;\n          yd = xd;\n          xd = d;\n        }\n        for (carry = 0; i; ) {\n          carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\n          xd[i] %= BASE;\n        }\n        if (carry) {\n          xd.unshift(carry);\n          ++e;\n        }\n        for (len = xd.length; xd[--len] == 0; ) xd.pop();\n        y.d = xd;\n        y.e = getBase10Exponent(xd, e);\n        return external ? finalise(y, pr, rm) : y;\n      };\n      P.precision = P.sd = function(z) {\n        var k, x = this;\n        if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\n        if (x.d) {\n          k = getPrecision(x.d);\n          if (z && x.e + 1 > k) k = x.e + 1;\n        } else {\n          k = NaN;\n        }\n        return k;\n      };\n      P.round = function() {\n        var x = this, Ctor = x.constructor;\n        return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\n      };\n      P.sine = P.sin = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\n        Ctor.rounding = 1;\n        x = sine(Ctor, toLessThanHalfPi(Ctor, x));\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\n      };\n      P.squareRoot = P.sqrt = function() {\n        var m, n, sd, r, rep, t, x = this, d = x.d, e = x.e, s = x.s, Ctor = x.constructor;\n        if (s !== 1 || !d || !d[0]) {\n          return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\n        }\n        external = false;\n        s = Math.sqrt(+x);\n        if (s == 0 || s == 1 / 0) {\n          n = digitsToString(d);\n          if ((n.length + e) % 2 == 0) n += \"0\";\n          s = Math.sqrt(n);\n          e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\n          if (s == 1 / 0) {\n            n = \"5e\" + e;\n          } else {\n            n = s.toExponential();\n            n = n.slice(0, n.indexOf(\"e\") + 1) + e;\n          }\n          r = new Ctor(n);\n        } else {\n          r = new Ctor(s.toString());\n        }\n        sd = (e = Ctor.precision) + 3;\n        for (; ; ) {\n          t = r;\n          r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\n          if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\n            n = n.slice(sd - 3, sd + 1);\n            if (n == \"9999\" || !rep && n == \"4999\") {\n              if (!rep) {\n                finalise(t, e + 1, 0);\n                if (t.times(t).eq(x)) {\n                  r = t;\n                  break;\n                }\n              }\n              sd += 4;\n              rep = 1;\n            } else {\n              if (!+n || !+n.slice(1) && n.charAt(0) == \"5\") {\n                finalise(r, e + 1, 1);\n                m = !r.times(r).eq(x);\n              }\n              break;\n            }\n          }\n        }\n        external = true;\n        return finalise(r, e, Ctor.rounding, m);\n      };\n      P.tangent = P.tan = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 10;\n        Ctor.rounding = 1;\n        x = x.sin();\n        x.s = 1;\n        x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\n      };\n      P.times = P.mul = function(y) {\n        var carry, e, i, k, r, rL, t, xdL, ydL, x = this, Ctor = x.constructor, xd = x.d, yd = (y = new Ctor(y)).d;\n        y.s *= x.s;\n        if (!xd || !xd[0] || !yd || !yd[0]) {\n          return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd ? NaN : !xd || !yd ? y.s / 0 : y.s * 0);\n        }\n        e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\n        xdL = xd.length;\n        ydL = yd.length;\n        if (xdL < ydL) {\n          r = xd;\n          xd = yd;\n          yd = r;\n          rL = xdL;\n          xdL = ydL;\n          ydL = rL;\n        }\n        r = [];\n        rL = xdL + ydL;\n        for (i = rL; i--; ) r.push(0);\n        for (i = ydL; --i >= 0; ) {\n          carry = 0;\n          for (k = xdL + i; k > i; ) {\n            t = r[k] + yd[i] * xd[k - i - 1] + carry;\n            r[k--] = t % BASE | 0;\n            carry = t / BASE | 0;\n          }\n          r[k] = (r[k] + carry) % BASE | 0;\n        }\n        for (; !r[--rL]; ) r.pop();\n        if (carry) ++e;\n        else r.shift();\n        y.d = r;\n        y.e = getBase10Exponent(r, e);\n        return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\n      };\n      P.toBinary = function(sd, rm) {\n        return toStringBinary(this, 2, sd, rm);\n      };\n      P.toDecimalPlaces = P.toDP = function(dp, rm) {\n        var x = this, Ctor = x.constructor;\n        x = new Ctor(x);\n        if (dp === void 0) return x;\n        checkInt32(dp, 0, MAX_DIGITS);\n        if (rm === void 0) rm = Ctor.rounding;\n        else checkInt32(rm, 0, 8);\n        return finalise(x, dp + x.e + 1, rm);\n      };\n      P.toExponential = function(dp, rm) {\n        var str, x = this, Ctor = x.constructor;\n        if (dp === void 0) {\n          str = finiteToString(x, true);\n        } else {\n          checkInt32(dp, 0, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          x = finalise(new Ctor(x), dp + 1, rm);\n          str = finiteToString(x, true, dp + 1);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toFixed = function(dp, rm) {\n        var str, y, x = this, Ctor = x.constructor;\n        if (dp === void 0) {\n          str = finiteToString(x);\n        } else {\n          checkInt32(dp, 0, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          y = finalise(new Ctor(x), dp + x.e + 1, rm);\n          str = finiteToString(y, false, dp + y.e + 1);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toFraction = function(maxD) {\n        var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, x = this, xd = x.d, Ctor = x.constructor;\n        if (!xd) return new Ctor(x);\n        n1 = d0 = new Ctor(1);\n        d1 = n0 = new Ctor(0);\n        d = new Ctor(d1);\n        e = d.e = getPrecision(xd) - x.e - 1;\n        k = e % LOG_BASE;\n        d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\n        if (maxD == null) {\n          maxD = e > 0 ? d : n1;\n        } else {\n          n = new Ctor(maxD);\n          if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\n          maxD = n.gt(d) ? e > 0 ? d : n1 : n;\n        }\n        external = false;\n        n = new Ctor(digitsToString(xd));\n        pr = Ctor.precision;\n        Ctor.precision = e = xd.length * LOG_BASE * 2;\n        for (; ; ) {\n          q = divide(n, d, 0, 1, 1);\n          d2 = d0.plus(q.times(d1));\n          if (d2.cmp(maxD) == 1) break;\n          d0 = d1;\n          d1 = d2;\n          d2 = n1;\n          n1 = n0.plus(q.times(d2));\n          n0 = d2;\n          d2 = d;\n          d = n.minus(q.times(d2));\n          n = d2;\n        }\n        d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\n        n0 = n0.plus(d2.times(n1));\n        d0 = d0.plus(d2.times(d1));\n        n0.s = n1.s = x.s;\n        r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\n        Ctor.precision = pr;\n        external = true;\n        return r;\n      };\n      P.toHexadecimal = P.toHex = function(sd, rm) {\n        return toStringBinary(this, 16, sd, rm);\n      };\n      P.toNearest = function(y, rm) {\n        var x = this, Ctor = x.constructor;\n        x = new Ctor(x);\n        if (y == null) {\n          if (!x.d) return x;\n          y = new Ctor(1);\n          rm = Ctor.rounding;\n        } else {\n          y = new Ctor(y);\n          if (rm === void 0) {\n            rm = Ctor.rounding;\n          } else {\n            checkInt32(rm, 0, 8);\n          }\n          if (!x.d) return y.s ? x : y;\n          if (!y.d) {\n            if (y.s) y.s = x.s;\n            return y;\n          }\n        }\n        if (y.d[0]) {\n          external = false;\n          x = divide(x, y, 0, rm, 1).times(y);\n          external = true;\n          finalise(x);\n        } else {\n          y.s = x.s;\n          x = y;\n        }\n        return x;\n      };\n      P.toNumber = function() {\n        return +this;\n      };\n      P.toOctal = function(sd, rm) {\n        return toStringBinary(this, 8, sd, rm);\n      };\n      P.toPower = P.pow = function(y) {\n        var e, k, pr, r, rm, s, x = this, Ctor = x.constructor, yn = +(y = new Ctor(y));\n        if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\n        x = new Ctor(x);\n        if (x.eq(1)) return x;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (y.eq(1)) return finalise(x, pr, rm);\n        e = mathfloor(y.e / LOG_BASE);\n        if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\n          r = intPow(Ctor, x, k, pr);\n          return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\n        }\n        s = x.s;\n        if (s < 0) {\n          if (e < y.d.length - 1) return new Ctor(NaN);\n          if ((y.d[e] & 1) == 0) s = 1;\n          if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\n            x.s = s;\n            return x;\n          }\n        }\n        k = mathpow(+x, yn);\n        e = k == 0 || !isFinite(k) ? mathfloor(yn * (Math.log(\"0.\" + digitsToString(x.d)) / Math.LN10 + x.e + 1)) : new Ctor(k + \"\").e;\n        if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\n        external = false;\n        Ctor.rounding = x.s = 1;\n        k = Math.min(12, (e + \"\").length);\n        r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\n        if (r.d) {\n          r = finalise(r, pr + 5, 1);\n          if (checkRoundingDigits(r.d, pr, rm)) {\n            e = pr + 10;\n            r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\n            if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\n              r = finalise(r, pr + 1, 0);\n            }\n          }\n        }\n        r.s = s;\n        external = true;\n        Ctor.rounding = rm;\n        return finalise(r, pr, rm);\n      };\n      P.toPrecision = function(sd, rm) {\n        var str, x = this, Ctor = x.constructor;\n        if (sd === void 0) {\n          str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        } else {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          x = finalise(new Ctor(x), sd, rm);\n          str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toSignificantDigits = P.toSD = function(sd, rm) {\n        var x = this, Ctor = x.constructor;\n        if (sd === void 0) {\n          sd = Ctor.precision;\n          rm = Ctor.rounding;\n        } else {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n        }\n        return finalise(new Ctor(x), sd, rm);\n      };\n      P.toString = function() {\n        var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.truncated = P.trunc = function() {\n        return finalise(new this.constructor(this), this.e + 1, 1);\n      };\n      P.valueOf = P.toJSON = function() {\n        var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        return x.isNeg() ? \"-\" + str : str;\n      };\n      function digitsToString(d) {\n        var i, k, ws, indexOfLastWord = d.length - 1, str = \"\", w = d[0];\n        if (indexOfLastWord > 0) {\n          str += w;\n          for (i = 1; i < indexOfLastWord; i++) {\n            ws = d[i] + \"\";\n            k = LOG_BASE - ws.length;\n            if (k) str += getZeroString(k);\n            str += ws;\n          }\n          w = d[i];\n          ws = w + \"\";\n          k = LOG_BASE - ws.length;\n          if (k) str += getZeroString(k);\n        } else if (w === 0) {\n          return \"0\";\n        }\n        for (; w % 10 === 0; ) w /= 10;\n        return str + w;\n      }\n      function checkInt32(i, min2, max2) {\n        if (i !== ~~i || i < min2 || i > max2) {\n          throw Error(invalidArgument + i);\n        }\n      }\n      function checkRoundingDigits(d, i, rm, repeating) {\n        var di, k, r, rd;\n        for (k = d[0]; k >= 10; k /= 10) --i;\n        if (--i < 0) {\n          i += LOG_BASE;\n          di = 0;\n        } else {\n          di = Math.ceil((i + 1) / LOG_BASE);\n          i %= LOG_BASE;\n        }\n        k = mathpow(10, LOG_BASE - i);\n        rd = d[di] % k | 0;\n        if (repeating == null) {\n          if (i < 3) {\n            if (i == 0) rd = rd / 100 | 0;\n            else if (i == 1) rd = rd / 10 | 0;\n            r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 5e4 || rd == 0;\n          } else {\n            r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\n          }\n        } else {\n          if (i < 4) {\n            if (i == 0) rd = rd / 1e3 | 0;\n            else if (i == 1) rd = rd / 100 | 0;\n            else if (i == 2) rd = rd / 10 | 0;\n            r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\n          } else {\n            r = ((repeating || rm < 4) && rd + 1 == k || !repeating && rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 1e3 | 0) == mathpow(10, i - 3) - 1;\n          }\n        }\n        return r;\n      }\n      function convertBase(str, baseIn, baseOut) {\n        var j, arr = [0], arrL, i = 0, strL = str.length;\n        for (; i < strL; ) {\n          for (arrL = arr.length; arrL--; ) arr[arrL] *= baseIn;\n          arr[0] += NUMERALS.indexOf(str.charAt(i++));\n          for (j = 0; j < arr.length; j++) {\n            if (arr[j] > baseOut - 1) {\n              if (arr[j + 1] === void 0) arr[j + 1] = 0;\n              arr[j + 1] += arr[j] / baseOut | 0;\n              arr[j] %= baseOut;\n            }\n          }\n        }\n        return arr.reverse();\n      }\n      function cosine(Ctor, x) {\n        var k, len, y;\n        if (x.isZero()) return x;\n        len = x.d.length;\n        if (len < 32) {\n          k = Math.ceil(len / 3);\n          y = (1 / tinyPow(4, k)).toString();\n        } else {\n          k = 16;\n          y = \"2.3283064365386962890625e-10\";\n        }\n        Ctor.precision += k;\n        x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\n        for (var i = k; i--; ) {\n          var cos2x = x.times(x);\n          x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\n        }\n        Ctor.precision -= k;\n        return x;\n      }\n      var divide = /* @__PURE__ */ function() {\n        function multiplyInteger(x, k, base) {\n          var temp, carry = 0, i = x.length;\n          for (x = x.slice(); i--; ) {\n            temp = x[i] * k + carry;\n            x[i] = temp % base | 0;\n            carry = temp / base | 0;\n          }\n          if (carry) x.unshift(carry);\n          return x;\n        }\n        function compare(a, b, aL, bL) {\n          var i, r;\n          if (aL != bL) {\n            r = aL > bL ? 1 : -1;\n          } else {\n            for (i = r = 0; i < aL; i++) {\n              if (a[i] != b[i]) {\n                r = a[i] > b[i] ? 1 : -1;\n                break;\n              }\n            }\n          }\n          return r;\n        }\n        function subtract(a, b, aL, base) {\n          var i = 0;\n          for (; aL--; ) {\n            a[aL] -= i;\n            i = a[aL] < b[aL] ? 1 : 0;\n            a[aL] = i * base + a[aL] - b[aL];\n          }\n          for (; !a[0] && a.length > 1; ) a.shift();\n        }\n        return function(x, y, pr, rm, dp, base) {\n          var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz, Ctor = x.constructor, sign2 = x.s == y.s ? 1 : -1, xd = x.d, yd = y.d;\n          if (!xd || !xd[0] || !yd || !yd[0]) {\n            return new Ctor(\n              // Return NaN if either NaN, or both Infinity or 0.\n              !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : (\n                // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\n                xd && xd[0] == 0 || !yd ? sign2 * 0 : sign2 / 0\n              )\n            );\n          }\n          if (base) {\n            logBase = 1;\n            e = x.e - y.e;\n          } else {\n            base = BASE;\n            logBase = LOG_BASE;\n            e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\n          }\n          yL = yd.length;\n          xL = xd.length;\n          q = new Ctor(sign2);\n          qd = q.d = [];\n          for (i = 0; yd[i] == (xd[i] || 0); i++) ;\n          if (yd[i] > (xd[i] || 0)) e--;\n          if (pr == null) {\n            sd = pr = Ctor.precision;\n            rm = Ctor.rounding;\n          } else if (dp) {\n            sd = pr + (x.e - y.e) + 1;\n          } else {\n            sd = pr;\n          }\n          if (sd < 0) {\n            qd.push(1);\n            more = true;\n          } else {\n            sd = sd / logBase + 2 | 0;\n            i = 0;\n            if (yL == 1) {\n              k = 0;\n              yd = yd[0];\n              sd++;\n              for (; (i < xL || k) && sd--; i++) {\n                t = k * base + (xd[i] || 0);\n                qd[i] = t / yd | 0;\n                k = t % yd | 0;\n              }\n              more = k || i < xL;\n            } else {\n              k = base / (yd[0] + 1) | 0;\n              if (k > 1) {\n                yd = multiplyInteger(yd, k, base);\n                xd = multiplyInteger(xd, k, base);\n                yL = yd.length;\n                xL = xd.length;\n              }\n              xi = yL;\n              rem = xd.slice(0, yL);\n              remL = rem.length;\n              for (; remL < yL; ) rem[remL++] = 0;\n              yz = yd.slice();\n              yz.unshift(0);\n              yd0 = yd[0];\n              if (yd[1] >= base / 2) ++yd0;\n              do {\n                k = 0;\n                cmp = compare(yd, rem, yL, remL);\n                if (cmp < 0) {\n                  rem0 = rem[0];\n                  if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\n                  k = rem0 / yd0 | 0;\n                  if (k > 1) {\n                    if (k >= base) k = base - 1;\n                    prod = multiplyInteger(yd, k, base);\n                    prodL = prod.length;\n                    remL = rem.length;\n                    cmp = compare(prod, rem, prodL, remL);\n                    if (cmp == 1) {\n                      k--;\n                      subtract(prod, yL < prodL ? yz : yd, prodL, base);\n                    }\n                  } else {\n                    if (k == 0) cmp = k = 1;\n                    prod = yd.slice();\n                  }\n                  prodL = prod.length;\n                  if (prodL < remL) prod.unshift(0);\n                  subtract(rem, prod, remL, base);\n                  if (cmp == -1) {\n                    remL = rem.length;\n                    cmp = compare(yd, rem, yL, remL);\n                    if (cmp < 1) {\n                      k++;\n                      subtract(rem, yL < remL ? yz : yd, remL, base);\n                    }\n                  }\n                  remL = rem.length;\n                } else if (cmp === 0) {\n                  k++;\n                  rem = [0];\n                }\n                qd[i++] = k;\n                if (cmp && rem[0]) {\n                  rem[remL++] = xd[xi] || 0;\n                } else {\n                  rem = [xd[xi]];\n                  remL = 1;\n                }\n              } while ((xi++ < xL || rem[0] !== void 0) && sd--);\n              more = rem[0] !== void 0;\n            }\n            if (!qd[0]) qd.shift();\n          }\n          if (logBase == 1) {\n            q.e = e;\n            inexact = more;\n          } else {\n            for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\n            q.e = i + e * logBase - 1;\n            finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\n          }\n          return q;\n        };\n      }();\n      function finalise(x, sd, rm, isTruncated) {\n        var digits, i, j, k, rd, roundUp, w, xd, xdi, Ctor = x.constructor;\n        out: if (sd != null) {\n          xd = x.d;\n          if (!xd) return x;\n          for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\n          i = sd - digits;\n          if (i < 0) {\n            i += LOG_BASE;\n            j = sd;\n            w = xd[xdi = 0];\n            rd = w / mathpow(10, digits - j - 1) % 10 | 0;\n          } else {\n            xdi = Math.ceil((i + 1) / LOG_BASE);\n            k = xd.length;\n            if (xdi >= k) {\n              if (isTruncated) {\n                for (; k++ <= xdi; ) xd.push(0);\n                w = rd = 0;\n                digits = 1;\n                i %= LOG_BASE;\n                j = i - LOG_BASE + 1;\n              } else {\n                break out;\n              }\n            } else {\n              w = k = xd[xdi];\n              for (digits = 1; k >= 10; k /= 10) digits++;\n              i %= LOG_BASE;\n              j = i - LOG_BASE + digits;\n              rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\n            }\n          }\n          isTruncated = isTruncated || sd < 0 || xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\n          roundUp = rm < 4 ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && // Check whether the digit to the left of the rounding digit is odd.\n          (i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7));\n          if (sd < 1 || !xd[0]) {\n            xd.length = 0;\n            if (roundUp) {\n              sd -= x.e + 1;\n              xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\n              x.e = -sd || 0;\n            } else {\n              xd[0] = x.e = 0;\n            }\n            return x;\n          }\n          if (i == 0) {\n            xd.length = xdi;\n            k = 1;\n            xdi--;\n          } else {\n            xd.length = xdi + 1;\n            k = mathpow(10, LOG_BASE - i);\n            xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\n          }\n          if (roundUp) {\n            for (; ; ) {\n              if (xdi == 0) {\n                for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\n                j = xd[0] += k;\n                for (k = 1; j >= 10; j /= 10) k++;\n                if (i != k) {\n                  x.e++;\n                  if (xd[0] == BASE) xd[0] = 1;\n                }\n                break;\n              } else {\n                xd[xdi] += k;\n                if (xd[xdi] != BASE) break;\n                xd[xdi--] = 0;\n                k = 1;\n              }\n            }\n          }\n          for (i = xd.length; xd[--i] === 0; ) xd.pop();\n        }\n        if (external) {\n          if (x.e > Ctor.maxE) {\n            x.d = null;\n            x.e = NaN;\n          } else if (x.e < Ctor.minE) {\n            x.e = 0;\n            x.d = [0];\n          }\n        }\n        return x;\n      }\n      function finiteToString(x, isExp, sd) {\n        if (!x.isFinite()) return nonFiniteToString(x);\n        var k, e = x.e, str = digitsToString(x.d), len = str.length;\n        if (isExp) {\n          if (sd && (k = sd - len) > 0) {\n            str = str.charAt(0) + \".\" + str.slice(1) + getZeroString(k);\n          } else if (len > 1) {\n            str = str.charAt(0) + \".\" + str.slice(1);\n          }\n          str = str + (x.e < 0 ? \"e\" : \"e+\") + x.e;\n        } else if (e < 0) {\n          str = \"0.\" + getZeroString(-e - 1) + str;\n          if (sd && (k = sd - len) > 0) str += getZeroString(k);\n        } else if (e >= len) {\n          str += getZeroString(e + 1 - len);\n          if (sd && (k = sd - e - 1) > 0) str = str + \".\" + getZeroString(k);\n        } else {\n          if ((k = e + 1) < len) str = str.slice(0, k) + \".\" + str.slice(k);\n          if (sd && (k = sd - len) > 0) {\n            if (e + 1 === len) str += \".\";\n            str += getZeroString(k);\n          }\n        }\n        return str;\n      }\n      function getBase10Exponent(digits, e) {\n        var w = digits[0];\n        for (e *= LOG_BASE; w >= 10; w /= 10) e++;\n        return e;\n      }\n      function getLn10(Ctor, sd, pr) {\n        if (sd > LN10_PRECISION) {\n          external = true;\n          if (pr) Ctor.precision = pr;\n          throw Error(precisionLimitExceeded);\n        }\n        return finalise(new Ctor(LN10), sd, 1, true);\n      }\n      function getPi(Ctor, sd, rm) {\n        if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\n        return finalise(new Ctor(PI), sd, rm, true);\n      }\n      function getPrecision(digits) {\n        var w = digits.length - 1, len = w * LOG_BASE + 1;\n        w = digits[w];\n        if (w) {\n          for (; w % 10 == 0; w /= 10) len--;\n          for (w = digits[0]; w >= 10; w /= 10) len++;\n        }\n        return len;\n      }\n      function getZeroString(k) {\n        var zs = \"\";\n        for (; k--; ) zs += \"0\";\n        return zs;\n      }\n      function intPow(Ctor, x, n, pr) {\n        var isTruncated, r = new Ctor(1), k = Math.ceil(pr / LOG_BASE + 4);\n        external = false;\n        for (; ; ) {\n          if (n % 2) {\n            r = r.times(x);\n            if (truncate(r.d, k)) isTruncated = true;\n          }\n          n = mathfloor(n / 2);\n          if (n === 0) {\n            n = r.d.length - 1;\n            if (isTruncated && r.d[n] === 0) ++r.d[n];\n            break;\n          }\n          x = x.times(x);\n          truncate(x.d, k);\n        }\n        external = true;\n        return r;\n      }\n      function isOdd(n) {\n        return n.d[n.d.length - 1] & 1;\n      }\n      function maxOrMin(Ctor, args, ltgt) {\n        var y, x = new Ctor(args[0]), i = 0;\n        for (; ++i < args.length; ) {\n          y = new Ctor(args[i]);\n          if (!y.s) {\n            x = y;\n            break;\n          } else if (x[ltgt](y)) {\n            x = y;\n          }\n        }\n        return x;\n      }\n      function naturalExponential(x, sd) {\n        var denominator, guard, j, pow2, sum2, t, wpr, rep = 0, i = 0, k = 0, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision;\n        if (!x.d || !x.d[0] || x.e > 17) {\n          return new Ctor(x.d ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 : x.s ? x.s < 0 ? 0 : x : 0 / 0);\n        }\n        if (sd == null) {\n          external = false;\n          wpr = pr;\n        } else {\n          wpr = sd;\n        }\n        t = new Ctor(0.03125);\n        while (x.e > -2) {\n          x = x.times(t);\n          k += 5;\n        }\n        guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\n        wpr += guard;\n        denominator = pow2 = sum2 = new Ctor(1);\n        Ctor.precision = wpr;\n        for (; ; ) {\n          pow2 = finalise(pow2.times(x), wpr, 1);\n          denominator = denominator.times(++i);\n          t = sum2.plus(divide(pow2, denominator, wpr, 1));\n          if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) {\n            j = k;\n            while (j--) sum2 = finalise(sum2.times(sum2), wpr, 1);\n            if (sd == null) {\n              if (rep < 3 && checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) {\n                Ctor.precision = wpr += 10;\n                denominator = pow2 = t = new Ctor(1);\n                i = 0;\n                rep++;\n              } else {\n                return finalise(sum2, Ctor.precision = pr, rm, external = true);\n              }\n            } else {\n              Ctor.precision = pr;\n              return sum2;\n            }\n          }\n          sum2 = t;\n        }\n      }\n      function naturalLogarithm(y, sd) {\n        var c, c0, denominator, e, numerator, rep, sum2, t, wpr, x1, x2, n = 1, guard = 10, x = y, xd = x.d, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision;\n        if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\n          return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\n        }\n        if (sd == null) {\n          external = false;\n          wpr = pr;\n        } else {\n          wpr = sd;\n        }\n        Ctor.precision = wpr += guard;\n        c = digitsToString(xd);\n        c0 = c.charAt(0);\n        if (Math.abs(e = x.e) < 15e14) {\n          while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\n            x = x.times(y);\n            c = digitsToString(x.d);\n            c0 = c.charAt(0);\n            n++;\n          }\n          e = x.e;\n          if (c0 > 1) {\n            x = new Ctor(\"0.\" + c);\n            e++;\n          } else {\n            x = new Ctor(c0 + \".\" + c.slice(1));\n          }\n        } else {\n          t = getLn10(Ctor, wpr + 2, pr).times(e + \"\");\n          x = naturalLogarithm(new Ctor(c0 + \".\" + c.slice(1)), wpr - guard).plus(t);\n          Ctor.precision = pr;\n          return sd == null ? finalise(x, pr, rm, external = true) : x;\n        }\n        x1 = x;\n        sum2 = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\n        x2 = finalise(x.times(x), wpr, 1);\n        denominator = 3;\n        for (; ; ) {\n          numerator = finalise(numerator.times(x2), wpr, 1);\n          t = sum2.plus(divide(numerator, new Ctor(denominator), wpr, 1));\n          if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) {\n            sum2 = sum2.times(2);\n            if (e !== 0) sum2 = sum2.plus(getLn10(Ctor, wpr + 2, pr).times(e + \"\"));\n            sum2 = divide(sum2, new Ctor(n), wpr, 1);\n            if (sd == null) {\n              if (checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) {\n                Ctor.precision = wpr += guard;\n                t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\n                x2 = finalise(x.times(x), wpr, 1);\n                denominator = rep = 1;\n              } else {\n                return finalise(sum2, Ctor.precision = pr, rm, external = true);\n              }\n            } else {\n              Ctor.precision = pr;\n              return sum2;\n            }\n          }\n          sum2 = t;\n          denominator += 2;\n        }\n      }\n      function nonFiniteToString(x) {\n        return String(x.s * x.s / 0);\n      }\n      function parseDecimal(x, str) {\n        var e, i, len;\n        if ((e = str.indexOf(\".\")) > -1) str = str.replace(\".\", \"\");\n        if ((i = str.search(/e/i)) > 0) {\n          if (e < 0) e = i;\n          e += +str.slice(i + 1);\n          str = str.substring(0, i);\n        } else if (e < 0) {\n          e = str.length;\n        }\n        for (i = 0; str.charCodeAt(i) === 48; i++) ;\n        for (len = str.length; str.charCodeAt(len - 1) === 48; --len) ;\n        str = str.slice(i, len);\n        if (str) {\n          len -= i;\n          x.e = e = e - i - 1;\n          x.d = [];\n          i = (e + 1) % LOG_BASE;\n          if (e < 0) i += LOG_BASE;\n          if (i < len) {\n            if (i) x.d.push(+str.slice(0, i));\n            for (len -= LOG_BASE; i < len; ) x.d.push(+str.slice(i, i += LOG_BASE));\n            str = str.slice(i);\n            i = LOG_BASE - str.length;\n          } else {\n            i -= len;\n          }\n          for (; i--; ) str += \"0\";\n          x.d.push(+str);\n          if (external) {\n            if (x.e > x.constructor.maxE) {\n              x.d = null;\n              x.e = NaN;\n            } else if (x.e < x.constructor.minE) {\n              x.e = 0;\n              x.d = [0];\n            }\n          }\n        } else {\n          x.e = 0;\n          x.d = [0];\n        }\n        return x;\n      }\n      function parseOther(x, str) {\n        var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\n        if (str.indexOf(\"_\") > -1) {\n          str = str.replace(/(\\d)_(?=\\d)/g, \"$1\");\n          if (isDecimal.test(str)) return parseDecimal(x, str);\n        } else if (str === \"Infinity\" || str === \"NaN\") {\n          if (!+str) x.s = NaN;\n          x.e = NaN;\n          x.d = null;\n          return x;\n        }\n        if (isHex.test(str)) {\n          base = 16;\n          str = str.toLowerCase();\n        } else if (isBinary.test(str)) {\n          base = 2;\n        } else if (isOctal.test(str)) {\n          base = 8;\n        } else {\n          throw Error(invalidArgument + str);\n        }\n        i = str.search(/p/i);\n        if (i > 0) {\n          p = +str.slice(i + 1);\n          str = str.substring(2, i);\n        } else {\n          str = str.slice(2);\n        }\n        i = str.indexOf(\".\");\n        isFloat = i >= 0;\n        Ctor = x.constructor;\n        if (isFloat) {\n          str = str.replace(\".\", \"\");\n          len = str.length;\n          i = len - i;\n          divisor = intPow(Ctor, new Ctor(base), i, i * 2);\n        }\n        xd = convertBase(str, base, BASE);\n        xe = xd.length - 1;\n        for (i = xe; xd[i] === 0; --i) xd.pop();\n        if (i < 0) return new Ctor(x.s * 0);\n        x.e = getBase10Exponent(xd, xe);\n        x.d = xd;\n        external = false;\n        if (isFloat) x = divide(x, divisor, len * 4);\n        if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal2.pow(2, p));\n        external = true;\n        return x;\n      }\n      function sine(Ctor, x) {\n        var k, len = x.d.length;\n        if (len < 3) {\n          return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\n        }\n        k = 1.4 * Math.sqrt(len);\n        k = k > 16 ? 16 : k | 0;\n        x = x.times(1 / tinyPow(5, k));\n        x = taylorSeries(Ctor, 2, x, x);\n        var sin2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20);\n        for (; k--; ) {\n          sin2_x = x.times(x);\n          x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\n        }\n        return x;\n      }\n      function taylorSeries(Ctor, n, x, y, isHyperbolic) {\n        var j, t, u, x2, i = 1, pr = Ctor.precision, k = Math.ceil(pr / LOG_BASE);\n        external = false;\n        x2 = x.times(x);\n        u = new Ctor(y);\n        for (; ; ) {\n          t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\n          u = isHyperbolic ? y.plus(t) : y.minus(t);\n          y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\n          t = u.plus(y);\n          if (t.d[k] !== void 0) {\n            for (j = k; t.d[j] === u.d[j] && j--; ) ;\n            if (j == -1) break;\n          }\n          j = u;\n          u = y;\n          y = t;\n          t = j;\n          i++;\n        }\n        external = true;\n        t.d.length = k + 1;\n        return t;\n      }\n      function tinyPow(b, e) {\n        var n = b;\n        while (--e) n *= b;\n        return n;\n      }\n      function toLessThanHalfPi(Ctor, x) {\n        var t, isNeg = x.s < 0, pi = getPi(Ctor, Ctor.precision, 1), halfPi = pi.times(0.5);\n        x = x.abs();\n        if (x.lte(halfPi)) {\n          quadrant = isNeg ? 4 : 1;\n          return x;\n        }\n        t = x.divToInt(pi);\n        if (t.isZero()) {\n          quadrant = isNeg ? 3 : 2;\n        } else {\n          x = x.minus(t.times(pi));\n          if (x.lte(halfPi)) {\n            quadrant = isOdd(t) ? isNeg ? 2 : 3 : isNeg ? 4 : 1;\n            return x;\n          }\n          quadrant = isOdd(t) ? isNeg ? 1 : 4 : isNeg ? 3 : 2;\n        }\n        return x.minus(pi).abs();\n      }\n      function toStringBinary(x, baseOut, sd, rm) {\n        var base, e, i, k, len, roundUp, str, xd, y, Ctor = x.constructor, isExp = sd !== void 0;\n        if (isExp) {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n        } else {\n          sd = Ctor.precision;\n          rm = Ctor.rounding;\n        }\n        if (!x.isFinite()) {\n          str = nonFiniteToString(x);\n        } else {\n          str = finiteToString(x);\n          i = str.indexOf(\".\");\n          if (isExp) {\n            base = 2;\n            if (baseOut == 16) {\n              sd = sd * 4 - 3;\n            } else if (baseOut == 8) {\n              sd = sd * 3 - 2;\n            }\n          } else {\n            base = baseOut;\n          }\n          if (i >= 0) {\n            str = str.replace(\".\", \"\");\n            y = new Ctor(1);\n            y.e = str.length - i;\n            y.d = convertBase(finiteToString(y), 10, base);\n            y.e = y.d.length;\n          }\n          xd = convertBase(str, 10, base);\n          e = len = xd.length;\n          for (; xd[--len] == 0; ) xd.pop();\n          if (!xd[0]) {\n            str = isExp ? \"0p+0\" : \"0\";\n          } else {\n            if (i < 0) {\n              e--;\n            } else {\n              x = new Ctor(x);\n              x.d = xd;\n              x.e = e;\n              x = divide(x, y, sd, rm, 0, base);\n              xd = x.d;\n              e = x.e;\n              roundUp = inexact;\n            }\n            i = xd[sd];\n            k = base / 2;\n            roundUp = roundUp || xd[sd + 1] !== void 0;\n            roundUp = rm < 4 ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || rm === (x.s < 0 ? 8 : 7));\n            xd.length = sd;\n            if (roundUp) {\n              for (; ++xd[--sd] > base - 1; ) {\n                xd[sd] = 0;\n                if (!sd) {\n                  ++e;\n                  xd.unshift(1);\n                }\n              }\n            }\n            for (len = xd.length; !xd[len - 1]; --len) ;\n            for (i = 0, str = \"\"; i < len; i++) str += NUMERALS.charAt(xd[i]);\n            if (isExp) {\n              if (len > 1) {\n                if (baseOut == 16 || baseOut == 8) {\n                  i = baseOut == 16 ? 4 : 3;\n                  for (--len; len % i; len++) str += \"0\";\n                  xd = convertBase(str, base, baseOut);\n                  for (len = xd.length; !xd[len - 1]; --len) ;\n                  for (i = 1, str = \"1.\"; i < len; i++) str += NUMERALS.charAt(xd[i]);\n                } else {\n                  str = str.charAt(0) + \".\" + str.slice(1);\n                }\n              }\n              str = str + (e < 0 ? \"p\" : \"p+\") + e;\n            } else if (e < 0) {\n              for (; ++e; ) str = \"0\" + str;\n              str = \"0.\" + str;\n            } else {\n              if (++e > len) for (e -= len; e--; ) str += \"0\";\n              else if (e < len) str = str.slice(0, e) + \".\" + str.slice(e);\n            }\n          }\n          str = (baseOut == 16 ? \"0x\" : baseOut == 2 ? \"0b\" : baseOut == 8 ? \"0o\" : \"\") + str;\n        }\n        return x.s < 0 ? \"-\" + str : str;\n      }\n      function truncate(arr, len) {\n        if (arr.length > len) {\n          arr.length = len;\n          return true;\n        }\n      }\n      function abs(x) {\n        return new this(x).abs();\n      }\n      function acos(x) {\n        return new this(x).acos();\n      }\n      function acosh(x) {\n        return new this(x).acosh();\n      }\n      function add(x, y) {\n        return new this(x).plus(y);\n      }\n      function asin(x) {\n        return new this(x).asin();\n      }\n      function asinh(x) {\n        return new this(x).asinh();\n      }\n      function atan(x) {\n        return new this(x).atan();\n      }\n      function atanh(x) {\n        return new this(x).atanh();\n      }\n      function atan2(y, x) {\n        y = new this(y);\n        x = new this(x);\n        var r, pr = this.precision, rm = this.rounding, wpr = pr + 4;\n        if (!y.s || !x.s) {\n          r = new this(NaN);\n        } else if (!y.d && !x.d) {\n          r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\n          r.s = y.s;\n        } else if (!x.d || y.isZero()) {\n          r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\n          r.s = y.s;\n        } else if (!y.d || x.isZero()) {\n          r = getPi(this, wpr, 1).times(0.5);\n          r.s = y.s;\n        } else if (x.s < 0) {\n          this.precision = wpr;\n          this.rounding = 1;\n          r = this.atan(divide(y, x, wpr, 1));\n          x = getPi(this, wpr, 1);\n          this.precision = pr;\n          this.rounding = rm;\n          r = y.s < 0 ? r.minus(x) : r.plus(x);\n        } else {\n          r = this.atan(divide(y, x, wpr, 1));\n        }\n        return r;\n      }\n      function cbrt(x) {\n        return new this(x).cbrt();\n      }\n      function ceil(x) {\n        return finalise(x = new this(x), x.e + 1, 2);\n      }\n      function clamp(x, min2, max2) {\n        return new this(x).clamp(min2, max2);\n      }\n      function config(obj) {\n        if (!obj || typeof obj !== \"object\") throw Error(decimalError + \"Object expected\");\n        var i, p, v, useDefaults = obj.defaults === true, ps = [\n          \"precision\",\n          1,\n          MAX_DIGITS,\n          \"rounding\",\n          0,\n          8,\n          \"toExpNeg\",\n          -EXP_LIMIT,\n          0,\n          \"toExpPos\",\n          0,\n          EXP_LIMIT,\n          \"maxE\",\n          0,\n          EXP_LIMIT,\n          \"minE\",\n          -EXP_LIMIT,\n          0,\n          \"modulo\",\n          0,\n          9\n        ];\n        for (i = 0; i < ps.length; i += 3) {\n          if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\n          if ((v = obj[p]) !== void 0) {\n            if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\n            else throw Error(invalidArgument + p + \": \" + v);\n          }\n        }\n        if (p = \"crypto\", useDefaults) this[p] = DEFAULTS[p];\n        if ((v = obj[p]) !== void 0) {\n          if (v === true || v === false || v === 0 || v === 1) {\n            if (v) {\n              if (typeof crypto != \"undefined\" && crypto && (crypto.getRandomValues || crypto.randomBytes)) {\n                this[p] = true;\n              } else {\n                throw Error(cryptoUnavailable);\n              }\n            } else {\n              this[p] = false;\n            }\n          } else {\n            throw Error(invalidArgument + p + \": \" + v);\n          }\n        }\n        return this;\n      }\n      function cos(x) {\n        return new this(x).cos();\n      }\n      function cosh(x) {\n        return new this(x).cosh();\n      }\n      function clone(obj) {\n        var i, p, ps;\n        function Decimal3(v) {\n          var e, i2, t, x = this;\n          if (!(x instanceof Decimal3)) return new Decimal3(v);\n          x.constructor = Decimal3;\n          if (isDecimalInstance(v)) {\n            x.s = v.s;\n            if (external) {\n              if (!v.d || v.e > Decimal3.maxE) {\n                x.e = NaN;\n                x.d = null;\n              } else if (v.e < Decimal3.minE) {\n                x.e = 0;\n                x.d = [0];\n              } else {\n                x.e = v.e;\n                x.d = v.d.slice();\n              }\n            } else {\n              x.e = v.e;\n              x.d = v.d ? v.d.slice() : v.d;\n            }\n            return;\n          }\n          t = typeof v;\n          if (t === \"number\") {\n            if (v === 0) {\n              x.s = 1 / v < 0 ? -1 : 1;\n              x.e = 0;\n              x.d = [0];\n              return;\n            }\n            if (v < 0) {\n              v = -v;\n              x.s = -1;\n            } else {\n              x.s = 1;\n            }\n            if (v === ~~v && v < 1e7) {\n              for (e = 0, i2 = v; i2 >= 10; i2 /= 10) e++;\n              if (external) {\n                if (e > Decimal3.maxE) {\n                  x.e = NaN;\n                  x.d = null;\n                } else if (e < Decimal3.minE) {\n                  x.e = 0;\n                  x.d = [0];\n                } else {\n                  x.e = e;\n                  x.d = [v];\n                }\n              } else {\n                x.e = e;\n                x.d = [v];\n              }\n              return;\n            } else if (v * 0 !== 0) {\n              if (!v) x.s = NaN;\n              x.e = NaN;\n              x.d = null;\n              return;\n            }\n            return parseDecimal(x, v.toString());\n          } else if (t !== \"string\") {\n            throw Error(invalidArgument + v);\n          }\n          if ((i2 = v.charCodeAt(0)) === 45) {\n            v = v.slice(1);\n            x.s = -1;\n          } else {\n            if (i2 === 43) v = v.slice(1);\n            x.s = 1;\n          }\n          return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\n        }\n        Decimal3.prototype = P;\n        Decimal3.ROUND_UP = 0;\n        Decimal3.ROUND_DOWN = 1;\n        Decimal3.ROUND_CEIL = 2;\n        Decimal3.ROUND_FLOOR = 3;\n        Decimal3.ROUND_HALF_UP = 4;\n        Decimal3.ROUND_HALF_DOWN = 5;\n        Decimal3.ROUND_HALF_EVEN = 6;\n        Decimal3.ROUND_HALF_CEIL = 7;\n        Decimal3.ROUND_HALF_FLOOR = 8;\n        Decimal3.EUCLID = 9;\n        Decimal3.config = Decimal3.set = config;\n        Decimal3.clone = clone;\n        Decimal3.isDecimal = isDecimalInstance;\n        Decimal3.abs = abs;\n        Decimal3.acos = acos;\n        Decimal3.acosh = acosh;\n        Decimal3.add = add;\n        Decimal3.asin = asin;\n        Decimal3.asinh = asinh;\n        Decimal3.atan = atan;\n        Decimal3.atanh = atanh;\n        Decimal3.atan2 = atan2;\n        Decimal3.cbrt = cbrt;\n        Decimal3.ceil = ceil;\n        Decimal3.clamp = clamp;\n        Decimal3.cos = cos;\n        Decimal3.cosh = cosh;\n        Decimal3.div = div;\n        Decimal3.exp = exp;\n        Decimal3.floor = floor;\n        Decimal3.hypot = hypot;\n        Decimal3.ln = ln;\n        Decimal3.log = log;\n        Decimal3.log10 = log10;\n        Decimal3.log2 = log2;\n        Decimal3.max = max;\n        Decimal3.min = min;\n        Decimal3.mod = mod;\n        Decimal3.mul = mul;\n        Decimal3.pow = pow;\n        Decimal3.random = random;\n        Decimal3.round = round;\n        Decimal3.sign = sign;\n        Decimal3.sin = sin;\n        Decimal3.sinh = sinh;\n        Decimal3.sqrt = sqrt;\n        Decimal3.sub = sub;\n        Decimal3.sum = sum;\n        Decimal3.tan = tan;\n        Decimal3.tanh = tanh;\n        Decimal3.trunc = trunc;\n        if (obj === void 0) obj = {};\n        if (obj) {\n          if (obj.defaults !== true) {\n            ps = [\"precision\", \"rounding\", \"toExpNeg\", \"toExpPos\", \"maxE\", \"minE\", \"modulo\", \"crypto\"];\n            for (i = 0; i < ps.length; ) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\n          }\n        }\n        Decimal3.config(obj);\n        return Decimal3;\n      }\n      function div(x, y) {\n        return new this(x).div(y);\n      }\n      function exp(x) {\n        return new this(x).exp();\n      }\n      function floor(x) {\n        return finalise(x = new this(x), x.e + 1, 3);\n      }\n      function hypot() {\n        var i, n, t = new this(0);\n        external = false;\n        for (i = 0; i < arguments.length; ) {\n          n = new this(arguments[i++]);\n          if (!n.d) {\n            if (n.s) {\n              external = true;\n              return new this(1 / 0);\n            }\n            t = n;\n          } else if (t.d) {\n            t = t.plus(n.times(n));\n          }\n        }\n        external = true;\n        return t.sqrt();\n      }\n      function isDecimalInstance(obj) {\n        return obj instanceof Decimal2 || obj && obj.toStringTag === tag || false;\n      }\n      function ln(x) {\n        return new this(x).ln();\n      }\n      function log(x, y) {\n        return new this(x).log(y);\n      }\n      function log2(x) {\n        return new this(x).log(2);\n      }\n      function log10(x) {\n        return new this(x).log(10);\n      }\n      function max() {\n        return maxOrMin(this, arguments, \"lt\");\n      }\n      function min() {\n        return maxOrMin(this, arguments, \"gt\");\n      }\n      function mod(x, y) {\n        return new this(x).mod(y);\n      }\n      function mul(x, y) {\n        return new this(x).mul(y);\n      }\n      function pow(x, y) {\n        return new this(x).pow(y);\n      }\n      function random(sd) {\n        var d, e, k, n, i = 0, r = new this(1), rd = [];\n        if (sd === void 0) sd = this.precision;\n        else checkInt32(sd, 1, MAX_DIGITS);\n        k = Math.ceil(sd / LOG_BASE);\n        if (!this.crypto) {\n          for (; i < k; ) rd[i++] = Math.random() * 1e7 | 0;\n        } else if (crypto.getRandomValues) {\n          d = crypto.getRandomValues(new Uint32Array(k));\n          for (; i < k; ) {\n            n = d[i];\n            if (n >= 429e7) {\n              d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\n            } else {\n              rd[i++] = n % 1e7;\n            }\n          }\n        } else if (crypto.randomBytes) {\n          d = crypto.randomBytes(k *= 4);\n          for (; i < k; ) {\n            n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 127) << 24);\n            if (n >= 214e7) {\n              crypto.randomBytes(4).copy(d, i);\n            } else {\n              rd.push(n % 1e7);\n              i += 4;\n            }\n          }\n          i = k / 4;\n        } else {\n          throw Error(cryptoUnavailable);\n        }\n        k = rd[--i];\n        sd %= LOG_BASE;\n        if (k && sd) {\n          n = mathpow(10, LOG_BASE - sd);\n          rd[i] = (k / n | 0) * n;\n        }\n        for (; rd[i] === 0; i--) rd.pop();\n        if (i < 0) {\n          e = 0;\n          rd = [0];\n        } else {\n          e = -1;\n          for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\n          for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\n          if (k < LOG_BASE) e -= LOG_BASE - k;\n        }\n        r.e = e;\n        r.d = rd;\n        return r;\n      }\n      function round(x) {\n        return finalise(x = new this(x), x.e + 1, this.rounding);\n      }\n      function sign(x) {\n        x = new this(x);\n        return x.d ? x.d[0] ? x.s : 0 * x.s : x.s || NaN;\n      }\n      function sin(x) {\n        return new this(x).sin();\n      }\n      function sinh(x) {\n        return new this(x).sinh();\n      }\n      function sqrt(x) {\n        return new this(x).sqrt();\n      }\n      function sub(x, y) {\n        return new this(x).sub(y);\n      }\n      function sum() {\n        var i = 0, args = arguments, x = new this(args[i]);\n        external = false;\n        for (; x.s && ++i < args.length; ) x = x.plus(args[i]);\n        external = true;\n        return finalise(x, this.precision, this.rounding);\n      }\n      function tan(x) {\n        return new this(x).tan();\n      }\n      function tanh(x) {\n        return new this(x).tanh();\n      }\n      function trunc(x) {\n        return finalise(x = new this(x), x.e + 1, 1);\n      }\n      Decimal2 = clone(DEFAULTS);\n      Decimal2.prototype.constructor = Decimal2;\n      Decimal2[\"default\"] = Decimal2.Decimal = Decimal2;\n      LN10 = new Decimal2(LN10);\n      PI = new Decimal2(PI);\n      if (typeof define == \"function\" && define.amd) {\n        define(function() {\n          return Decimal2;\n        });\n      } else if (typeof module2 != \"undefined\" && module2.exports) {\n        if (typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\") {\n          P[Symbol[\"for\"](\"nodejs.util.inspect.custom\")] = P.toString;\n          P[Symbol.toStringTag] = \"Decimal\";\n        }\n        module2.exports = Decimal2;\n      } else {\n        if (!globalScope) {\n          globalScope = typeof self != \"undefined\" && self && self.self == self ? self : window;\n        }\n        noConflict = globalScope.Decimal;\n        Decimal2.noConflict = function() {\n          globalScope.Decimal = noConflict;\n          return Decimal2;\n        };\n        globalScope.Decimal = Decimal2;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/bn.js/lib/bn.js\nvar require_bn = __commonJS({\n  \"node_modules/bn.js/lib/bn.js\"(exports2, module2) {\n    (function(module3, exports3) {\n      \"use strict\";\n      function assert(val, msg) {\n        if (!val) throw new Error(msg || \"Assertion failed\");\n      }\n      function inherits(ctor, superCtor) {\n        ctor.super_ = superCtor;\n        var TempCtor = function() {\n        };\n        TempCtor.prototype = superCtor.prototype;\n        ctor.prototype = new TempCtor();\n        ctor.prototype.constructor = ctor;\n      }\n      function BN(number, base, endian) {\n        if (BN.isBN(number)) {\n          return number;\n        }\n        this.negative = 0;\n        this.words = null;\n        this.length = 0;\n        this.red = null;\n        if (number !== null) {\n          if (base === \"le\" || base === \"be\") {\n            endian = base;\n            base = 10;\n          }\n          this._init(number || 0, base || 10, endian || \"be\");\n        }\n      }\n      if (typeof module3 === \"object\") {\n        module3.exports = BN;\n      } else {\n        exports3.BN = BN;\n      }\n      BN.BN = BN;\n      BN.wordSize = 26;\n      var Buffer2;\n      try {\n        if (typeof window !== \"undefined\" && typeof window.Buffer !== \"undefined\") {\n          Buffer2 = window.Buffer;\n        } else {\n          Buffer2 = require(\"buffer\").Buffer;\n        }\n      } catch (e) {\n      }\n      BN.isBN = function isBN(num) {\n        if (num instanceof BN) {\n          return true;\n        }\n        return num !== null && typeof num === \"object\" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n      };\n      BN.max = function max(left, right) {\n        if (left.cmp(right) > 0) return left;\n        return right;\n      };\n      BN.min = function min(left, right) {\n        if (left.cmp(right) < 0) return left;\n        return right;\n      };\n      BN.prototype._init = function init(number, base, endian) {\n        if (typeof number === \"number\") {\n          return this._initNumber(number, base, endian);\n        }\n        if (typeof number === \"object\") {\n          return this._initArray(number, base, endian);\n        }\n        if (base === \"hex\") {\n          base = 16;\n        }\n        assert(base === (base | 0) && base >= 2 && base <= 36);\n        number = number.toString().replace(/\\s+/g, \"\");\n        var start = 0;\n        if (number[0] === \"-\") {\n          start++;\n          this.negative = 1;\n        }\n        if (start < number.length) {\n          if (base === 16) {\n            this._parseHex(number, start, endian);\n          } else {\n            this._parseBase(number, base, start);\n            if (endian === \"le\") {\n              this._initArray(this.toArray(), base, endian);\n            }\n          }\n        }\n      };\n      BN.prototype._initNumber = function _initNumber(number, base, endian) {\n        if (number < 0) {\n          this.negative = 1;\n          number = -number;\n        }\n        if (number < 67108864) {\n          this.words = [number & 67108863];\n          this.length = 1;\n        } else if (number < 4503599627370496) {\n          this.words = [\n            number & 67108863,\n            number / 67108864 & 67108863\n          ];\n          this.length = 2;\n        } else {\n          assert(number < 9007199254740992);\n          this.words = [\n            number & 67108863,\n            number / 67108864 & 67108863,\n            1\n          ];\n          this.length = 3;\n        }\n        if (endian !== \"le\") return;\n        this._initArray(this.toArray(), base, endian);\n      };\n      BN.prototype._initArray = function _initArray(number, base, endian) {\n        assert(typeof number.length === \"number\");\n        if (number.length <= 0) {\n          this.words = [0];\n          this.length = 1;\n          return this;\n        }\n        this.length = Math.ceil(number.length / 3);\n        this.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          this.words[i] = 0;\n        }\n        var j, w;\n        var off = 0;\n        if (endian === \"be\") {\n          for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n            w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;\n            this.words[j] |= w << off & 67108863;\n            this.words[j + 1] = w >>> 26 - off & 67108863;\n            off += 24;\n            if (off >= 26) {\n              off -= 26;\n              j++;\n            }\n          }\n        } else if (endian === \"le\") {\n          for (i = 0, j = 0; i < number.length; i += 3) {\n            w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;\n            this.words[j] |= w << off & 67108863;\n            this.words[j + 1] = w >>> 26 - off & 67108863;\n            off += 24;\n            if (off >= 26) {\n              off -= 26;\n              j++;\n            }\n          }\n        }\n        return this.strip();\n      };\n      function parseHex4Bits(string, index) {\n        var c = string.charCodeAt(index);\n        if (c >= 65 && c <= 70) {\n          return c - 55;\n        } else if (c >= 97 && c <= 102) {\n          return c - 87;\n        } else {\n          return c - 48 & 15;\n        }\n      }\n      function parseHexByte(string, lowerBound, index) {\n        var r = parseHex4Bits(string, index);\n        if (index - 1 >= lowerBound) {\n          r |= parseHex4Bits(string, index - 1) << 4;\n        }\n        return r;\n      }\n      BN.prototype._parseHex = function _parseHex(number, start, endian) {\n        this.length = Math.ceil((number.length - start) / 6);\n        this.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          this.words[i] = 0;\n        }\n        var off = 0;\n        var j = 0;\n        var w;\n        if (endian === \"be\") {\n          for (i = number.length - 1; i >= start; i -= 2) {\n            w = parseHexByte(number, start, i) << off;\n            this.words[j] |= w & 67108863;\n            if (off >= 18) {\n              off -= 18;\n              j += 1;\n              this.words[j] |= w >>> 26;\n            } else {\n              off += 8;\n            }\n          }\n        } else {\n          var parseLength = number.length - start;\n          for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n            w = parseHexByte(number, start, i) << off;\n            this.words[j] |= w & 67108863;\n            if (off >= 18) {\n              off -= 18;\n              j += 1;\n              this.words[j] |= w >>> 26;\n            } else {\n              off += 8;\n            }\n          }\n        }\n        this.strip();\n      };\n      function parseBase(str, start, end, mul) {\n        var r = 0;\n        var len = Math.min(str.length, end);\n        for (var i = start; i < len; i++) {\n          var c = str.charCodeAt(i) - 48;\n          r *= mul;\n          if (c >= 49) {\n            r += c - 49 + 10;\n          } else if (c >= 17) {\n            r += c - 17 + 10;\n          } else {\n            r += c;\n          }\n        }\n        return r;\n      }\n      BN.prototype._parseBase = function _parseBase(number, base, start) {\n        this.words = [0];\n        this.length = 1;\n        for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base) {\n          limbLen++;\n        }\n        limbLen--;\n        limbPow = limbPow / base | 0;\n        var total = number.length - start;\n        var mod = total % limbLen;\n        var end = Math.min(total, total - mod) + start;\n        var word = 0;\n        for (var i = start; i < end; i += limbLen) {\n          word = parseBase(number, i, i + limbLen, base);\n          this.imuln(limbPow);\n          if (this.words[0] + word < 67108864) {\n            this.words[0] += word;\n          } else {\n            this._iaddn(word);\n          }\n        }\n        if (mod !== 0) {\n          var pow = 1;\n          word = parseBase(number, i, number.length, base);\n          for (i = 0; i < mod; i++) {\n            pow *= base;\n          }\n          this.imuln(pow);\n          if (this.words[0] + word < 67108864) {\n            this.words[0] += word;\n          } else {\n            this._iaddn(word);\n          }\n        }\n        this.strip();\n      };\n      BN.prototype.copy = function copy(dest) {\n        dest.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          dest.words[i] = this.words[i];\n        }\n        dest.length = this.length;\n        dest.negative = this.negative;\n        dest.red = this.red;\n      };\n      BN.prototype.clone = function clone() {\n        var r = new BN(null);\n        this.copy(r);\n        return r;\n      };\n      BN.prototype._expand = function _expand(size) {\n        while (this.length < size) {\n          this.words[this.length++] = 0;\n        }\n        return this;\n      };\n      BN.prototype.strip = function strip() {\n        while (this.length > 1 && this.words[this.length - 1] === 0) {\n          this.length--;\n        }\n        return this._normSign();\n      };\n      BN.prototype._normSign = function _normSign() {\n        if (this.length === 1 && this.words[0] === 0) {\n          this.negative = 0;\n        }\n        return this;\n      };\n      BN.prototype.inspect = function inspect() {\n        return (this.red ? \"<BN-R: \" : \"<BN: \") + this.toString(16) + \">\";\n      };\n      var zeros = [\n        \"\",\n        \"0\",\n        \"00\",\n        \"000\",\n        \"0000\",\n        \"00000\",\n        \"000000\",\n        \"0000000\",\n        \"00000000\",\n        \"000000000\",\n        \"0000000000\",\n        \"00000000000\",\n        \"000000000000\",\n        \"0000000000000\",\n        \"00000000000000\",\n        \"000000000000000\",\n        \"0000000000000000\",\n        \"00000000000000000\",\n        \"000000000000000000\",\n        \"0000000000000000000\",\n        \"00000000000000000000\",\n        \"000000000000000000000\",\n        \"0000000000000000000000\",\n        \"00000000000000000000000\",\n        \"000000000000000000000000\",\n        \"0000000000000000000000000\"\n      ];\n      var groupSizes = [\n        0,\n        0,\n        25,\n        16,\n        12,\n        11,\n        10,\n        9,\n        8,\n        8,\n        7,\n        7,\n        7,\n        7,\n        6,\n        6,\n        6,\n        6,\n        6,\n        6,\n        6,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5\n      ];\n      var groupBases = [\n        0,\n        0,\n        33554432,\n        43046721,\n        16777216,\n        48828125,\n        60466176,\n        40353607,\n        16777216,\n        43046721,\n        1e7,\n        19487171,\n        35831808,\n        62748517,\n        7529536,\n        11390625,\n        16777216,\n        24137569,\n        34012224,\n        47045881,\n        64e6,\n        4084101,\n        5153632,\n        6436343,\n        7962624,\n        9765625,\n        11881376,\n        14348907,\n        17210368,\n        20511149,\n        243e5,\n        28629151,\n        33554432,\n        39135393,\n        45435424,\n        52521875,\n        60466176\n      ];\n      BN.prototype.toString = function toString(base, padding) {\n        base = base || 10;\n        padding = padding | 0 || 1;\n        var out;\n        if (base === 16 || base === \"hex\") {\n          out = \"\";\n          var off = 0;\n          var carry = 0;\n          for (var i = 0; i < this.length; i++) {\n            var w = this.words[i];\n            var word = ((w << off | carry) & 16777215).toString(16);\n            carry = w >>> 24 - off & 16777215;\n            if (carry !== 0 || i !== this.length - 1) {\n              out = zeros[6 - word.length] + word + out;\n            } else {\n              out = word + out;\n            }\n            off += 2;\n            if (off >= 26) {\n              off -= 26;\n              i--;\n            }\n          }\n          if (carry !== 0) {\n            out = carry.toString(16) + out;\n          }\n          while (out.length % padding !== 0) {\n            out = \"0\" + out;\n          }\n          if (this.negative !== 0) {\n            out = \"-\" + out;\n          }\n          return out;\n        }\n        if (base === (base | 0) && base >= 2 && base <= 36) {\n          var groupSize = groupSizes[base];\n          var groupBase = groupBases[base];\n          out = \"\";\n          var c = this.clone();\n          c.negative = 0;\n          while (!c.isZero()) {\n            var r = c.modn(groupBase).toString(base);\n            c = c.idivn(groupBase);\n            if (!c.isZero()) {\n              out = zeros[groupSize - r.length] + r + out;\n            } else {\n              out = r + out;\n            }\n          }\n          if (this.isZero()) {\n            out = \"0\" + out;\n          }\n          while (out.length % padding !== 0) {\n            out = \"0\" + out;\n          }\n          if (this.negative !== 0) {\n            out = \"-\" + out;\n          }\n          return out;\n        }\n        assert(false, \"Base should be between 2 and 36\");\n      };\n      BN.prototype.toNumber = function toNumber() {\n        var ret = this.words[0];\n        if (this.length === 2) {\n          ret += this.words[1] * 67108864;\n        } else if (this.length === 3 && this.words[2] === 1) {\n          ret += 4503599627370496 + this.words[1] * 67108864;\n        } else if (this.length > 2) {\n          assert(false, \"Number can only safely store up to 53 bits\");\n        }\n        return this.negative !== 0 ? -ret : ret;\n      };\n      BN.prototype.toJSON = function toJSON() {\n        return this.toString(16);\n      };\n      BN.prototype.toBuffer = function toBuffer(endian, length) {\n        assert(typeof Buffer2 !== \"undefined\");\n        return this.toArrayLike(Buffer2, endian, length);\n      };\n      BN.prototype.toArray = function toArray(endian, length) {\n        return this.toArrayLike(Array, endian, length);\n      };\n      BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {\n        var byteLength = this.byteLength();\n        var reqLength = length || Math.max(1, byteLength);\n        assert(byteLength <= reqLength, \"byte array longer than desired length\");\n        assert(reqLength > 0, \"Requested array length <= 0\");\n        this.strip();\n        var littleEndian = endian === \"le\";\n        var res = new ArrayType(reqLength);\n        var b, i;\n        var q = this.clone();\n        if (!littleEndian) {\n          for (i = 0; i < reqLength - byteLength; i++) {\n            res[i] = 0;\n          }\n          for (i = 0; !q.isZero(); i++) {\n            b = q.andln(255);\n            q.iushrn(8);\n            res[reqLength - i - 1] = b;\n          }\n        } else {\n          for (i = 0; !q.isZero(); i++) {\n            b = q.andln(255);\n            q.iushrn(8);\n            res[i] = b;\n          }\n          for (; i < reqLength; i++) {\n            res[i] = 0;\n          }\n        }\n        return res;\n      };\n      if (Math.clz32) {\n        BN.prototype._countBits = function _countBits(w) {\n          return 32 - Math.clz32(w);\n        };\n      } else {\n        BN.prototype._countBits = function _countBits(w) {\n          var t = w;\n          var r = 0;\n          if (t >= 4096) {\n            r += 13;\n            t >>>= 13;\n          }\n          if (t >= 64) {\n            r += 7;\n            t >>>= 7;\n          }\n          if (t >= 8) {\n            r += 4;\n            t >>>= 4;\n          }\n          if (t >= 2) {\n            r += 2;\n            t >>>= 2;\n          }\n          return r + t;\n        };\n      }\n      BN.prototype._zeroBits = function _zeroBits(w) {\n        if (w === 0) return 26;\n        var t = w;\n        var r = 0;\n        if ((t & 8191) === 0) {\n          r += 13;\n          t >>>= 13;\n        }\n        if ((t & 127) === 0) {\n          r += 7;\n          t >>>= 7;\n        }\n        if ((t & 15) === 0) {\n          r += 4;\n          t >>>= 4;\n        }\n        if ((t & 3) === 0) {\n          r += 2;\n          t >>>= 2;\n        }\n        if ((t & 1) === 0) {\n          r++;\n        }\n        return r;\n      };\n      BN.prototype.bitLength = function bitLength() {\n        var w = this.words[this.length - 1];\n        var hi = this._countBits(w);\n        return (this.length - 1) * 26 + hi;\n      };\n      function toBitArray(num) {\n        var w = new Array(num.bitLength());\n        for (var bit = 0; bit < w.length; bit++) {\n          var off = bit / 26 | 0;\n          var wbit = bit % 26;\n          w[bit] = (num.words[off] & 1 << wbit) >>> wbit;\n        }\n        return w;\n      }\n      BN.prototype.zeroBits = function zeroBits() {\n        if (this.isZero()) return 0;\n        var r = 0;\n        for (var i = 0; i < this.length; i++) {\n          var b = this._zeroBits(this.words[i]);\n          r += b;\n          if (b !== 26) break;\n        }\n        return r;\n      };\n      BN.prototype.byteLength = function byteLength() {\n        return Math.ceil(this.bitLength() / 8);\n      };\n      BN.prototype.toTwos = function toTwos(width) {\n        if (this.negative !== 0) {\n          return this.abs().inotn(width).iaddn(1);\n        }\n        return this.clone();\n      };\n      BN.prototype.fromTwos = function fromTwos(width) {\n        if (this.testn(width - 1)) {\n          return this.notn(width).iaddn(1).ineg();\n        }\n        return this.clone();\n      };\n      BN.prototype.isNeg = function isNeg() {\n        return this.negative !== 0;\n      };\n      BN.prototype.neg = function neg() {\n        return this.clone().ineg();\n      };\n      BN.prototype.ineg = function ineg() {\n        if (!this.isZero()) {\n          this.negative ^= 1;\n        }\n        return this;\n      };\n      BN.prototype.iuor = function iuor(num) {\n        while (this.length < num.length) {\n          this.words[this.length++] = 0;\n        }\n        for (var i = 0; i < num.length; i++) {\n          this.words[i] = this.words[i] | num.words[i];\n        }\n        return this.strip();\n      };\n      BN.prototype.ior = function ior(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuor(num);\n      };\n      BN.prototype.or = function or(num) {\n        if (this.length > num.length) return this.clone().ior(num);\n        return num.clone().ior(this);\n      };\n      BN.prototype.uor = function uor(num) {\n        if (this.length > num.length) return this.clone().iuor(num);\n        return num.clone().iuor(this);\n      };\n      BN.prototype.iuand = function iuand(num) {\n        var b;\n        if (this.length > num.length) {\n          b = num;\n        } else {\n          b = this;\n        }\n        for (var i = 0; i < b.length; i++) {\n          this.words[i] = this.words[i] & num.words[i];\n        }\n        this.length = b.length;\n        return this.strip();\n      };\n      BN.prototype.iand = function iand(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuand(num);\n      };\n      BN.prototype.and = function and(num) {\n        if (this.length > num.length) return this.clone().iand(num);\n        return num.clone().iand(this);\n      };\n      BN.prototype.uand = function uand(num) {\n        if (this.length > num.length) return this.clone().iuand(num);\n        return num.clone().iuand(this);\n      };\n      BN.prototype.iuxor = function iuxor(num) {\n        var a;\n        var b;\n        if (this.length > num.length) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        for (var i = 0; i < b.length; i++) {\n          this.words[i] = a.words[i] ^ b.words[i];\n        }\n        if (this !== a) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        this.length = a.length;\n        return this.strip();\n      };\n      BN.prototype.ixor = function ixor(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuxor(num);\n      };\n      BN.prototype.xor = function xor(num) {\n        if (this.length > num.length) return this.clone().ixor(num);\n        return num.clone().ixor(this);\n      };\n      BN.prototype.uxor = function uxor(num) {\n        if (this.length > num.length) return this.clone().iuxor(num);\n        return num.clone().iuxor(this);\n      };\n      BN.prototype.inotn = function inotn(width) {\n        assert(typeof width === \"number\" && width >= 0);\n        var bytesNeeded = Math.ceil(width / 26) | 0;\n        var bitsLeft = width % 26;\n        this._expand(bytesNeeded);\n        if (bitsLeft > 0) {\n          bytesNeeded--;\n        }\n        for (var i = 0; i < bytesNeeded; i++) {\n          this.words[i] = ~this.words[i] & 67108863;\n        }\n        if (bitsLeft > 0) {\n          this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;\n        }\n        return this.strip();\n      };\n      BN.prototype.notn = function notn(width) {\n        return this.clone().inotn(width);\n      };\n      BN.prototype.setn = function setn(bit, val) {\n        assert(typeof bit === \"number\" && bit >= 0);\n        var off = bit / 26 | 0;\n        var wbit = bit % 26;\n        this._expand(off + 1);\n        if (val) {\n          this.words[off] = this.words[off] | 1 << wbit;\n        } else {\n          this.words[off] = this.words[off] & ~(1 << wbit);\n        }\n        return this.strip();\n      };\n      BN.prototype.iadd = function iadd(num) {\n        var r;\n        if (this.negative !== 0 && num.negative === 0) {\n          this.negative = 0;\n          r = this.isub(num);\n          this.negative ^= 1;\n          return this._normSign();\n        } else if (this.negative === 0 && num.negative !== 0) {\n          num.negative = 0;\n          r = this.isub(num);\n          num.negative = 1;\n          return r._normSign();\n        }\n        var a, b;\n        if (this.length > num.length) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        var carry = 0;\n        for (var i = 0; i < b.length; i++) {\n          r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n          this.words[i] = r & 67108863;\n          carry = r >>> 26;\n        }\n        for (; carry !== 0 && i < a.length; i++) {\n          r = (a.words[i] | 0) + carry;\n          this.words[i] = r & 67108863;\n          carry = r >>> 26;\n        }\n        this.length = a.length;\n        if (carry !== 0) {\n          this.words[this.length] = carry;\n          this.length++;\n        } else if (a !== this) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        return this;\n      };\n      BN.prototype.add = function add(num) {\n        var res;\n        if (num.negative !== 0 && this.negative === 0) {\n          num.negative = 0;\n          res = this.sub(num);\n          num.negative ^= 1;\n          return res;\n        } else if (num.negative === 0 && this.negative !== 0) {\n          this.negative = 0;\n          res = num.sub(this);\n          this.negative = 1;\n          return res;\n        }\n        if (this.length > num.length) return this.clone().iadd(num);\n        return num.clone().iadd(this);\n      };\n      BN.prototype.isub = function isub(num) {\n        if (num.negative !== 0) {\n          num.negative = 0;\n          var r = this.iadd(num);\n          num.negative = 1;\n          return r._normSign();\n        } else if (this.negative !== 0) {\n          this.negative = 0;\n          this.iadd(num);\n          this.negative = 1;\n          return this._normSign();\n        }\n        var cmp = this.cmp(num);\n        if (cmp === 0) {\n          this.negative = 0;\n          this.length = 1;\n          this.words[0] = 0;\n          return this;\n        }\n        var a, b;\n        if (cmp > 0) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        var carry = 0;\n        for (var i = 0; i < b.length; i++) {\n          r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n          carry = r >> 26;\n          this.words[i] = r & 67108863;\n        }\n        for (; carry !== 0 && i < a.length; i++) {\n          r = (a.words[i] | 0) + carry;\n          carry = r >> 26;\n          this.words[i] = r & 67108863;\n        }\n        if (carry === 0 && i < a.length && a !== this) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        this.length = Math.max(this.length, i);\n        if (a !== this) {\n          this.negative = 1;\n        }\n        return this.strip();\n      };\n      BN.prototype.sub = function sub(num) {\n        return this.clone().isub(num);\n      };\n      function smallMulTo(self2, num, out) {\n        out.negative = num.negative ^ self2.negative;\n        var len = self2.length + num.length | 0;\n        out.length = len;\n        len = len - 1 | 0;\n        var a = self2.words[0] | 0;\n        var b = num.words[0] | 0;\n        var r = a * b;\n        var lo = r & 67108863;\n        var carry = r / 67108864 | 0;\n        out.words[0] = lo;\n        for (var k = 1; k < len; k++) {\n          var ncarry = carry >>> 26;\n          var rword = carry & 67108863;\n          var maxJ = Math.min(k, num.length - 1);\n          for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) {\n            var i = k - j | 0;\n            a = self2.words[i] | 0;\n            b = num.words[j] | 0;\n            r = a * b + rword;\n            ncarry += r / 67108864 | 0;\n            rword = r & 67108863;\n          }\n          out.words[k] = rword | 0;\n          carry = ncarry | 0;\n        }\n        if (carry !== 0) {\n          out.words[k] = carry | 0;\n        } else {\n          out.length--;\n        }\n        return out.strip();\n      }\n      var comb10MulTo = function comb10MulTo2(self2, num, out) {\n        var a = self2.words;\n        var b = num.words;\n        var o = out.words;\n        var c = 0;\n        var lo;\n        var mid;\n        var hi;\n        var a0 = a[0] | 0;\n        var al0 = a0 & 8191;\n        var ah0 = a0 >>> 13;\n        var a1 = a[1] | 0;\n        var al1 = a1 & 8191;\n        var ah1 = a1 >>> 13;\n        var a2 = a[2] | 0;\n        var al2 = a2 & 8191;\n        var ah2 = a2 >>> 13;\n        var a3 = a[3] | 0;\n        var al3 = a3 & 8191;\n        var ah3 = a3 >>> 13;\n        var a4 = a[4] | 0;\n        var al4 = a4 & 8191;\n        var ah4 = a4 >>> 13;\n        var a5 = a[5] | 0;\n        var al5 = a5 & 8191;\n        var ah5 = a5 >>> 13;\n        var a6 = a[6] | 0;\n        var al6 = a6 & 8191;\n        var ah6 = a6 >>> 13;\n        var a7 = a[7] | 0;\n        var al7 = a7 & 8191;\n        var ah7 = a7 >>> 13;\n        var a8 = a[8] | 0;\n        var al8 = a8 & 8191;\n        var ah8 = a8 >>> 13;\n        var a9 = a[9] | 0;\n        var al9 = a9 & 8191;\n        var ah9 = a9 >>> 13;\n        var b0 = b[0] | 0;\n        var bl0 = b0 & 8191;\n        var bh0 = b0 >>> 13;\n        var b1 = b[1] | 0;\n        var bl1 = b1 & 8191;\n        var bh1 = b1 >>> 13;\n        var b2 = b[2] | 0;\n        var bl2 = b2 & 8191;\n        var bh2 = b2 >>> 13;\n        var b3 = b[3] | 0;\n        var bl3 = b3 & 8191;\n        var bh3 = b3 >>> 13;\n        var b4 = b[4] | 0;\n        var bl4 = b4 & 8191;\n        var bh4 = b4 >>> 13;\n        var b5 = b[5] | 0;\n        var bl5 = b5 & 8191;\n        var bh5 = b5 >>> 13;\n        var b6 = b[6] | 0;\n        var bl6 = b6 & 8191;\n        var bh6 = b6 >>> 13;\n        var b7 = b[7] | 0;\n        var bl7 = b7 & 8191;\n        var bh7 = b7 >>> 13;\n        var b8 = b[8] | 0;\n        var bl8 = b8 & 8191;\n        var bh8 = b8 >>> 13;\n        var b9 = b[9] | 0;\n        var bl9 = b9 & 8191;\n        var bh9 = b9 >>> 13;\n        out.negative = self2.negative ^ num.negative;\n        out.length = 19;\n        lo = Math.imul(al0, bl0);\n        mid = Math.imul(al0, bh0);\n        mid = mid + Math.imul(ah0, bl0) | 0;\n        hi = Math.imul(ah0, bh0);\n        var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;\n        w0 &= 67108863;\n        lo = Math.imul(al1, bl0);\n        mid = Math.imul(al1, bh0);\n        mid = mid + Math.imul(ah1, bl0) | 0;\n        hi = Math.imul(ah1, bh0);\n        lo = lo + Math.imul(al0, bl1) | 0;\n        mid = mid + Math.imul(al0, bh1) | 0;\n        mid = mid + Math.imul(ah0, bl1) | 0;\n        hi = hi + Math.imul(ah0, bh1) | 0;\n        var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;\n        w1 &= 67108863;\n        lo = Math.imul(al2, bl0);\n        mid = Math.imul(al2, bh0);\n        mid = mid + Math.imul(ah2, bl0) | 0;\n        hi = Math.imul(ah2, bh0);\n        lo = lo + Math.imul(al1, bl1) | 0;\n        mid = mid + Math.imul(al1, bh1) | 0;\n        mid = mid + Math.imul(ah1, bl1) | 0;\n        hi = hi + Math.imul(ah1, bh1) | 0;\n        lo = lo + Math.imul(al0, bl2) | 0;\n        mid = mid + Math.imul(al0, bh2) | 0;\n        mid = mid + Math.imul(ah0, bl2) | 0;\n        hi = hi + Math.imul(ah0, bh2) | 0;\n        var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;\n        w2 &= 67108863;\n        lo = Math.imul(al3, bl0);\n        mid = Math.imul(al3, bh0);\n        mid = mid + Math.imul(ah3, bl0) | 0;\n        hi = Math.imul(ah3, bh0);\n        lo = lo + Math.imul(al2, bl1) | 0;\n        mid = mid + Math.imul(al2, bh1) | 0;\n        mid = mid + Math.imul(ah2, bl1) | 0;\n        hi = hi + Math.imul(ah2, bh1) | 0;\n        lo = lo + Math.imul(al1, bl2) | 0;\n        mid = mid + Math.imul(al1, bh2) | 0;\n        mid = mid + Math.imul(ah1, bl2) | 0;\n        hi = hi + Math.imul(ah1, bh2) | 0;\n        lo = lo + Math.imul(al0, bl3) | 0;\n        mid = mid + Math.imul(al0, bh3) | 0;\n        mid = mid + Math.imul(ah0, bl3) | 0;\n        hi = hi + Math.imul(ah0, bh3) | 0;\n        var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;\n        w3 &= 67108863;\n        lo = Math.imul(al4, bl0);\n        mid = Math.imul(al4, bh0);\n        mid = mid + Math.imul(ah4, bl0) | 0;\n        hi = Math.imul(ah4, bh0);\n        lo = lo + Math.imul(al3, bl1) | 0;\n        mid = mid + Math.imul(al3, bh1) | 0;\n        mid = mid + Math.imul(ah3, bl1) | 0;\n        hi = hi + Math.imul(ah3, bh1) | 0;\n        lo = lo + Math.imul(al2, bl2) | 0;\n        mid = mid + Math.imul(al2, bh2) | 0;\n        mid = mid + Math.imul(ah2, bl2) | 0;\n        hi = hi + Math.imul(ah2, bh2) | 0;\n        lo = lo + Math.imul(al1, bl3) | 0;\n        mid = mid + Math.imul(al1, bh3) | 0;\n        mid = mid + Math.imul(ah1, bl3) | 0;\n        hi = hi + Math.imul(ah1, bh3) | 0;\n        lo = lo + Math.imul(al0, bl4) | 0;\n        mid = mid + Math.imul(al0, bh4) | 0;\n        mid = mid + Math.imul(ah0, bl4) | 0;\n        hi = hi + Math.imul(ah0, bh4) | 0;\n        var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;\n        w4 &= 67108863;\n        lo = Math.imul(al5, bl0);\n        mid = Math.imul(al5, bh0);\n        mid = mid + Math.imul(ah5, bl0) | 0;\n        hi = Math.imul(ah5, bh0);\n        lo = lo + Math.imul(al4, bl1) | 0;\n        mid = mid + Math.imul(al4, bh1) | 0;\n        mid = mid + Math.imul(ah4, bl1) | 0;\n        hi = hi + Math.imul(ah4, bh1) | 0;\n        lo = lo + Math.imul(al3, bl2) | 0;\n        mid = mid + Math.imul(al3, bh2) | 0;\n        mid = mid + Math.imul(ah3, bl2) | 0;\n        hi = hi + Math.imul(ah3, bh2) | 0;\n        lo = lo + Math.imul(al2, bl3) | 0;\n        mid = mid + Math.imul(al2, bh3) | 0;\n        mid = mid + Math.imul(ah2, bl3) | 0;\n        hi = hi + Math.imul(ah2, bh3) | 0;\n        lo = lo + Math.imul(al1, bl4) | 0;\n        mid = mid + Math.imul(al1, bh4) | 0;\n        mid = mid + Math.imul(ah1, bl4) | 0;\n        hi = hi + Math.imul(ah1, bh4) | 0;\n        lo = lo + Math.imul(al0, bl5) | 0;\n        mid = mid + Math.imul(al0, bh5) | 0;\n        mid = mid + Math.imul(ah0, bl5) | 0;\n        hi = hi + Math.imul(ah0, bh5) | 0;\n        var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;\n        w5 &= 67108863;\n        lo = Math.imul(al6, bl0);\n        mid = Math.imul(al6, bh0);\n        mid = mid + Math.imul(ah6, bl0) | 0;\n        hi = Math.imul(ah6, bh0);\n        lo = lo + Math.imul(al5, bl1) | 0;\n        mid = mid + Math.imul(al5, bh1) | 0;\n        mid = mid + Math.imul(ah5, bl1) | 0;\n        hi = hi + Math.imul(ah5, bh1) | 0;\n        lo = lo + Math.imul(al4, bl2) | 0;\n        mid = mid + Math.imul(al4, bh2) | 0;\n        mid = mid + Math.imul(ah4, bl2) | 0;\n        hi = hi + Math.imul(ah4, bh2) | 0;\n        lo = lo + Math.imul(al3, bl3) | 0;\n        mid = mid + Math.imul(al3, bh3) | 0;\n        mid = mid + Math.imul(ah3, bl3) | 0;\n        hi = hi + Math.imul(ah3, bh3) | 0;\n        lo = lo + Math.imul(al2, bl4) | 0;\n        mid = mid + Math.imul(al2, bh4) | 0;\n        mid = mid + Math.imul(ah2, bl4) | 0;\n        hi = hi + Math.imul(ah2, bh4) | 0;\n        lo = lo + Math.imul(al1, bl5) | 0;\n        mid = mid + Math.imul(al1, bh5) | 0;\n        mid = mid + Math.imul(ah1, bl5) | 0;\n        hi = hi + Math.imul(ah1, bh5) | 0;\n        lo = lo + Math.imul(al0, bl6) | 0;\n        mid = mid + Math.imul(al0, bh6) | 0;\n        mid = mid + Math.imul(ah0, bl6) | 0;\n        hi = hi + Math.imul(ah0, bh6) | 0;\n        var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;\n        w6 &= 67108863;\n        lo = Math.imul(al7, bl0);\n        mid = Math.imul(al7, bh0);\n        mid = mid + Math.imul(ah7, bl0) | 0;\n        hi = Math.imul(ah7, bh0);\n        lo = lo + Math.imul(al6, bl1) | 0;\n        mid = mid + Math.imul(al6, bh1) | 0;\n        mid = mid + Math.imul(ah6, bl1) | 0;\n        hi = hi + Math.imul(ah6, bh1) | 0;\n        lo = lo + Math.imul(al5, bl2) | 0;\n        mid = mid + Math.imul(al5, bh2) | 0;\n        mid = mid + Math.imul(ah5, bl2) | 0;\n        hi = hi + Math.imul(ah5, bh2) | 0;\n        lo = lo + Math.imul(al4, bl3) | 0;\n        mid = mid + Math.imul(al4, bh3) | 0;\n        mid = mid + Math.imul(ah4, bl3) | 0;\n        hi = hi + Math.imul(ah4, bh3) | 0;\n        lo = lo + Math.imul(al3, bl4) | 0;\n        mid = mid + Math.imul(al3, bh4) | 0;\n        mid = mid + Math.imul(ah3, bl4) | 0;\n        hi = hi + Math.imul(ah3, bh4) | 0;\n        lo = lo + Math.imul(al2, bl5) | 0;\n        mid = mid + Math.imul(al2, bh5) | 0;\n        mid = mid + Math.imul(ah2, bl5) | 0;\n        hi = hi + Math.imul(ah2, bh5) | 0;\n        lo = lo + Math.imul(al1, bl6) | 0;\n        mid = mid + Math.imul(al1, bh6) | 0;\n        mid = mid + Math.imul(ah1, bl6) | 0;\n        hi = hi + Math.imul(ah1, bh6) | 0;\n        lo = lo + Math.imul(al0, bl7) | 0;\n        mid = mid + Math.imul(al0, bh7) | 0;\n        mid = mid + Math.imul(ah0, bl7) | 0;\n        hi = hi + Math.imul(ah0, bh7) | 0;\n        var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;\n        w7 &= 67108863;\n        lo = Math.imul(al8, bl0);\n        mid = Math.imul(al8, bh0);\n        mid = mid + Math.imul(ah8, bl0) | 0;\n        hi = Math.imul(ah8, bh0);\n        lo = lo + Math.imul(al7, bl1) | 0;\n        mid = mid + Math.imul(al7, bh1) | 0;\n        mid = mid + Math.imul(ah7, bl1) | 0;\n        hi = hi + Math.imul(ah7, bh1) | 0;\n        lo = lo + Math.imul(al6, bl2) | 0;\n        mid = mid + Math.imul(al6, bh2) | 0;\n        mid = mid + Math.imul(ah6, bl2) | 0;\n        hi = hi + Math.imul(ah6, bh2) | 0;\n        lo = lo + Math.imul(al5, bl3) | 0;\n        mid = mid + Math.imul(al5, bh3) | 0;\n        mid = mid + Math.imul(ah5, bl3) | 0;\n        hi = hi + Math.imul(ah5, bh3) | 0;\n        lo = lo + Math.imul(al4, bl4) | 0;\n        mid = mid + Math.imul(al4, bh4) | 0;\n        mid = mid + Math.imul(ah4, bl4) | 0;\n        hi = hi + Math.imul(ah4, bh4) | 0;\n        lo = lo + Math.imul(al3, bl5) | 0;\n        mid = mid + Math.imul(al3, bh5) | 0;\n        mid = mid + Math.imul(ah3, bl5) | 0;\n        hi = hi + Math.imul(ah3, bh5) | 0;\n        lo = lo + Math.imul(al2, bl6) | 0;\n        mid = mid + Math.imul(al2, bh6) | 0;\n        mid = mid + Math.imul(ah2, bl6) | 0;\n        hi = hi + Math.imul(ah2, bh6) | 0;\n        lo = lo + Math.imul(al1, bl7) | 0;\n        mid = mid + Math.imul(al1, bh7) | 0;\n        mid = mid + Math.imul(ah1, bl7) | 0;\n        hi = hi + Math.imul(ah1, bh7) | 0;\n        lo = lo + Math.imul(al0, bl8) | 0;\n        mid = mid + Math.imul(al0, bh8) | 0;\n        mid = mid + Math.imul(ah0, bl8) | 0;\n        hi = hi + Math.imul(ah0, bh8) | 0;\n        var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;\n        w8 &= 67108863;\n        lo = Math.imul(al9, bl0);\n        mid = Math.imul(al9, bh0);\n        mid = mid + Math.imul(ah9, bl0) | 0;\n        hi = Math.imul(ah9, bh0);\n        lo = lo + Math.imul(al8, bl1) | 0;\n        mid = mid + Math.imul(al8, bh1) | 0;\n        mid = mid + Math.imul(ah8, bl1) | 0;\n        hi = hi + Math.imul(ah8, bh1) | 0;\n        lo = lo + Math.imul(al7, bl2) | 0;\n        mid = mid + Math.imul(al7, bh2) | 0;\n        mid = mid + Math.imul(ah7, bl2) | 0;\n        hi = hi + Math.imul(ah7, bh2) | 0;\n        lo = lo + Math.imul(al6, bl3) | 0;\n        mid = mid + Math.imul(al6, bh3) | 0;\n        mid = mid + Math.imul(ah6, bl3) | 0;\n        hi = hi + Math.imul(ah6, bh3) | 0;\n        lo = lo + Math.imul(al5, bl4) | 0;\n        mid = mid + Math.imul(al5, bh4) | 0;\n        mid = mid + Math.imul(ah5, bl4) | 0;\n        hi = hi + Math.imul(ah5, bh4) | 0;\n        lo = lo + Math.imul(al4, bl5) | 0;\n        mid = mid + Math.imul(al4, bh5) | 0;\n        mid = mid + Math.imul(ah4, bl5) | 0;\n        hi = hi + Math.imul(ah4, bh5) | 0;\n        lo = lo + Math.imul(al3, bl6) | 0;\n        mid = mid + Math.imul(al3, bh6) | 0;\n        mid = mid + Math.imul(ah3, bl6) | 0;\n        hi = hi + Math.imul(ah3, bh6) | 0;\n        lo = lo + Math.imul(al2, bl7) | 0;\n        mid = mid + Math.imul(al2, bh7) | 0;\n        mid = mid + Math.imul(ah2, bl7) | 0;\n        hi = hi + Math.imul(ah2, bh7) | 0;\n        lo = lo + Math.imul(al1, bl8) | 0;\n        mid = mid + Math.imul(al1, bh8) | 0;\n        mid = mid + Math.imul(ah1, bl8) | 0;\n        hi = hi + Math.imul(ah1, bh8) | 0;\n        lo = lo + Math.imul(al0, bl9) | 0;\n        mid = mid + Math.imul(al0, bh9) | 0;\n        mid = mid + Math.imul(ah0, bl9) | 0;\n        hi = hi + Math.imul(ah0, bh9) | 0;\n        var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;\n        w9 &= 67108863;\n        lo = Math.imul(al9, bl1);\n        mid = Math.imul(al9, bh1);\n        mid = mid + Math.imul(ah9, bl1) | 0;\n        hi = Math.imul(ah9, bh1);\n        lo = lo + Math.imul(al8, bl2) | 0;\n        mid = mid + Math.imul(al8, bh2) | 0;\n        mid = mid + Math.imul(ah8, bl2) | 0;\n        hi = hi + Math.imul(ah8, bh2) | 0;\n        lo = lo + Math.imul(al7, bl3) | 0;\n        mid = mid + Math.imul(al7, bh3) | 0;\n        mid = mid + Math.imul(ah7, bl3) | 0;\n        hi = hi + Math.imul(ah7, bh3) | 0;\n        lo = lo + Math.imul(al6, bl4) | 0;\n        mid = mid + Math.imul(al6, bh4) | 0;\n        mid = mid + Math.imul(ah6, bl4) | 0;\n        hi = hi + Math.imul(ah6, bh4) | 0;\n        lo = lo + Math.imul(al5, bl5) | 0;\n        mid = mid + Math.imul(al5, bh5) | 0;\n        mid = mid + Math.imul(ah5, bl5) | 0;\n        hi = hi + Math.imul(ah5, bh5) | 0;\n        lo = lo + Math.imul(al4, bl6) | 0;\n        mid = mid + Math.imul(al4, bh6) | 0;\n        mid = mid + Math.imul(ah4, bl6) | 0;\n        hi = hi + Math.imul(ah4, bh6) | 0;\n        lo = lo + Math.imul(al3, bl7) | 0;\n        mid = mid + Math.imul(al3, bh7) | 0;\n        mid = mid + Math.imul(ah3, bl7) | 0;\n        hi = hi + Math.imul(ah3, bh7) | 0;\n        lo = lo + Math.imul(al2, bl8) | 0;\n        mid = mid + Math.imul(al2, bh8) | 0;\n        mid = mid + Math.imul(ah2, bl8) | 0;\n        hi = hi + Math.imul(ah2, bh8) | 0;\n        lo = lo + Math.imul(al1, bl9) | 0;\n        mid = mid + Math.imul(al1, bh9) | 0;\n        mid = mid + Math.imul(ah1, bl9) | 0;\n        hi = hi + Math.imul(ah1, bh9) | 0;\n        var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;\n        w10 &= 67108863;\n        lo = Math.imul(al9, bl2);\n        mid = Math.imul(al9, bh2);\n        mid = mid + Math.imul(ah9, bl2) | 0;\n        hi = Math.imul(ah9, bh2);\n        lo = lo + Math.imul(al8, bl3) | 0;\n        mid = mid + Math.imul(al8, bh3) | 0;\n        mid = mid + Math.imul(ah8, bl3) | 0;\n        hi = hi + Math.imul(ah8, bh3) | 0;\n        lo = lo + Math.imul(al7, bl4) | 0;\n        mid = mid + Math.imul(al7, bh4) | 0;\n        mid = mid + Math.imul(ah7, bl4) | 0;\n        hi = hi + Math.imul(ah7, bh4) | 0;\n        lo = lo + Math.imul(al6, bl5) | 0;\n        mid = mid + Math.imul(al6, bh5) | 0;\n        mid = mid + Math.imul(ah6, bl5) | 0;\n        hi = hi + Math.imul(ah6, bh5) | 0;\n        lo = lo + Math.imul(al5, bl6) | 0;\n        mid = mid + Math.imul(al5, bh6) | 0;\n        mid = mid + Math.imul(ah5, bl6) | 0;\n        hi = hi + Math.imul(ah5, bh6) | 0;\n        lo = lo + Math.imul(al4, bl7) | 0;\n        mid = mid + Math.imul(al4, bh7) | 0;\n        mid = mid + Math.imul(ah4, bl7) | 0;\n        hi = hi + Math.imul(ah4, bh7) | 0;\n        lo = lo + Math.imul(al3, bl8) | 0;\n        mid = mid + Math.imul(al3, bh8) | 0;\n        mid = mid + Math.imul(ah3, bl8) | 0;\n        hi = hi + Math.imul(ah3, bh8) | 0;\n        lo = lo + Math.imul(al2, bl9) | 0;\n        mid = mid + Math.imul(al2, bh9) | 0;\n        mid = mid + Math.imul(ah2, bl9) | 0;\n        hi = hi + Math.imul(ah2, bh9) | 0;\n        var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;\n        w11 &= 67108863;\n        lo = Math.imul(al9, bl3);\n        mid = Math.imul(al9, bh3);\n        mid = mid + Math.imul(ah9, bl3) | 0;\n        hi = Math.imul(ah9, bh3);\n        lo = lo + Math.imul(al8, bl4) | 0;\n        mid = mid + Math.imul(al8, bh4) | 0;\n        mid = mid + Math.imul(ah8, bl4) | 0;\n        hi = hi + Math.imul(ah8, bh4) | 0;\n        lo = lo + Math.imul(al7, bl5) | 0;\n        mid = mid + Math.imul(al7, bh5) | 0;\n        mid = mid + Math.imul(ah7, bl5) | 0;\n        hi = hi + Math.imul(ah7, bh5) | 0;\n        lo = lo + Math.imul(al6, bl6) | 0;\n        mid = mid + Math.imul(al6, bh6) | 0;\n        mid = mid + Math.imul(ah6, bl6) | 0;\n        hi = hi + Math.imul(ah6, bh6) | 0;\n        lo = lo + Math.imul(al5, bl7) | 0;\n        mid = mid + Math.imul(al5, bh7) | 0;\n        mid = mid + Math.imul(ah5, bl7) | 0;\n        hi = hi + Math.imul(ah5, bh7) | 0;\n        lo = lo + Math.imul(al4, bl8) | 0;\n        mid = mid + Math.imul(al4, bh8) | 0;\n        mid = mid + Math.imul(ah4, bl8) | 0;\n        hi = hi + Math.imul(ah4, bh8) | 0;\n        lo = lo + Math.imul(al3, bl9) | 0;\n        mid = mid + Math.imul(al3, bh9) | 0;\n        mid = mid + Math.imul(ah3, bl9) | 0;\n        hi = hi + Math.imul(ah3, bh9) | 0;\n        var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;\n        w12 &= 67108863;\n        lo = Math.imul(al9, bl4);\n        mid = Math.imul(al9, bh4);\n        mid = mid + Math.imul(ah9, bl4) | 0;\n        hi = Math.imul(ah9, bh4);\n        lo = lo + Math.imul(al8, bl5) | 0;\n        mid = mid + Math.imul(al8, bh5) | 0;\n        mid = mid + Math.imul(ah8, bl5) | 0;\n        hi = hi + Math.imul(ah8, bh5) | 0;\n        lo = lo + Math.imul(al7, bl6) | 0;\n        mid = mid + Math.imul(al7, bh6) | 0;\n        mid = mid + Math.imul(ah7, bl6) | 0;\n        hi = hi + Math.imul(ah7, bh6) | 0;\n        lo = lo + Math.imul(al6, bl7) | 0;\n        mid = mid + Math.imul(al6, bh7) | 0;\n        mid = mid + Math.imul(ah6, bl7) | 0;\n        hi = hi + Math.imul(ah6, bh7) | 0;\n        lo = lo + Math.imul(al5, bl8) | 0;\n        mid = mid + Math.imul(al5, bh8) | 0;\n        mid = mid + Math.imul(ah5, bl8) | 0;\n        hi = hi + Math.imul(ah5, bh8) | 0;\n        lo = lo + Math.imul(al4, bl9) | 0;\n        mid = mid + Math.imul(al4, bh9) | 0;\n        mid = mid + Math.imul(ah4, bl9) | 0;\n        hi = hi + Math.imul(ah4, bh9) | 0;\n        var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;\n        w13 &= 67108863;\n        lo = Math.imul(al9, bl5);\n        mid = Math.imul(al9, bh5);\n        mid = mid + Math.imul(ah9, bl5) | 0;\n        hi = Math.imul(ah9, bh5);\n        lo = lo + Math.imul(al8, bl6) | 0;\n        mid = mid + Math.imul(al8, bh6) | 0;\n        mid = mid + Math.imul(ah8, bl6) | 0;\n        hi = hi + Math.imul(ah8, bh6) | 0;\n        lo = lo + Math.imul(al7, bl7) | 0;\n        mid = mid + Math.imul(al7, bh7) | 0;\n        mid = mid + Math.imul(ah7, bl7) | 0;\n        hi = hi + Math.imul(ah7, bh7) | 0;\n        lo = lo + Math.imul(al6, bl8) | 0;\n        mid = mid + Math.imul(al6, bh8) | 0;\n        mid = mid + Math.imul(ah6, bl8) | 0;\n        hi = hi + Math.imul(ah6, bh8) | 0;\n        lo = lo + Math.imul(al5, bl9) | 0;\n        mid = mid + Math.imul(al5, bh9) | 0;\n        mid = mid + Math.imul(ah5, bl9) | 0;\n        hi = hi + Math.imul(ah5, bh9) | 0;\n        var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;\n        w14 &= 67108863;\n        lo = Math.imul(al9, bl6);\n        mid = Math.imul(al9, bh6);\n        mid = mid + Math.imul(ah9, bl6) | 0;\n        hi = Math.imul(ah9, bh6);\n        lo = lo + Math.imul(al8, bl7) | 0;\n        mid = mid + Math.imul(al8, bh7) | 0;\n        mid = mid + Math.imul(ah8, bl7) | 0;\n        hi = hi + Math.imul(ah8, bh7) | 0;\n        lo = lo + Math.imul(al7, bl8) | 0;\n        mid = mid + Math.imul(al7, bh8) | 0;\n        mid = mid + Math.imul(ah7, bl8) | 0;\n        hi = hi + Math.imul(ah7, bh8) | 0;\n        lo = lo + Math.imul(al6, bl9) | 0;\n        mid = mid + Math.imul(al6, bh9) | 0;\n        mid = mid + Math.imul(ah6, bl9) | 0;\n        hi = hi + Math.imul(ah6, bh9) | 0;\n        var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;\n        w15 &= 67108863;\n        lo = Math.imul(al9, bl7);\n        mid = Math.imul(al9, bh7);\n        mid = mid + Math.imul(ah9, bl7) | 0;\n        hi = Math.imul(ah9, bh7);\n        lo = lo + Math.imul(al8, bl8) | 0;\n        mid = mid + Math.imul(al8, bh8) | 0;\n        mid = mid + Math.imul(ah8, bl8) | 0;\n        hi = hi + Math.imul(ah8, bh8) | 0;\n        lo = lo + Math.imul(al7, bl9) | 0;\n        mid = mid + Math.imul(al7, bh9) | 0;\n        mid = mid + Math.imul(ah7, bl9) | 0;\n        hi = hi + Math.imul(ah7, bh9) | 0;\n        var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;\n        w16 &= 67108863;\n        lo = Math.imul(al9, bl8);\n        mid = Math.imul(al9, bh8);\n        mid = mid + Math.imul(ah9, bl8) | 0;\n        hi = Math.imul(ah9, bh8);\n        lo = lo + Math.imul(al8, bl9) | 0;\n        mid = mid + Math.imul(al8, bh9) | 0;\n        mid = mid + Math.imul(ah8, bl9) | 0;\n        hi = hi + Math.imul(ah8, bh9) | 0;\n        var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;\n        w17 &= 67108863;\n        lo = Math.imul(al9, bl9);\n        mid = Math.imul(al9, bh9);\n        mid = mid + Math.imul(ah9, bl9) | 0;\n        hi = Math.imul(ah9, bh9);\n        var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;\n        w18 &= 67108863;\n        o[0] = w0;\n        o[1] = w1;\n        o[2] = w2;\n        o[3] = w3;\n        o[4] = w4;\n        o[5] = w5;\n        o[6] = w6;\n        o[7] = w7;\n        o[8] = w8;\n        o[9] = w9;\n        o[10] = w10;\n        o[11] = w11;\n        o[12] = w12;\n        o[13] = w13;\n        o[14] = w14;\n        o[15] = w15;\n        o[16] = w16;\n        o[17] = w17;\n        o[18] = w18;\n        if (c !== 0) {\n          o[19] = c;\n          out.length++;\n        }\n        return out;\n      };\n      if (!Math.imul) {\n        comb10MulTo = smallMulTo;\n      }\n      function bigMulTo(self2, num, out) {\n        out.negative = num.negative ^ self2.negative;\n        out.length = self2.length + num.length;\n        var carry = 0;\n        var hncarry = 0;\n        for (var k = 0; k < out.length - 1; k++) {\n          var ncarry = hncarry;\n          hncarry = 0;\n          var rword = carry & 67108863;\n          var maxJ = Math.min(k, num.length - 1);\n          for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) {\n            var i = k - j;\n            var a = self2.words[i] | 0;\n            var b = num.words[j] | 0;\n            var r = a * b;\n            var lo = r & 67108863;\n            ncarry = ncarry + (r / 67108864 | 0) | 0;\n            lo = lo + rword | 0;\n            rword = lo & 67108863;\n            ncarry = ncarry + (lo >>> 26) | 0;\n            hncarry += ncarry >>> 26;\n            ncarry &= 67108863;\n          }\n          out.words[k] = rword;\n          carry = ncarry;\n          ncarry = hncarry;\n        }\n        if (carry !== 0) {\n          out.words[k] = carry;\n        } else {\n          out.length--;\n        }\n        return out.strip();\n      }\n      function jumboMulTo(self2, num, out) {\n        var fftm = new FFTM();\n        return fftm.mulp(self2, num, out);\n      }\n      BN.prototype.mulTo = function mulTo(num, out) {\n        var res;\n        var len = this.length + num.length;\n        if (this.length === 10 && num.length === 10) {\n          res = comb10MulTo(this, num, out);\n        } else if (len < 63) {\n          res = smallMulTo(this, num, out);\n        } else if (len < 1024) {\n          res = bigMulTo(this, num, out);\n        } else {\n          res = jumboMulTo(this, num, out);\n        }\n        return res;\n      };\n      function FFTM(x, y) {\n        this.x = x;\n        this.y = y;\n      }\n      FFTM.prototype.makeRBT = function makeRBT(N) {\n        var t = new Array(N);\n        var l = BN.prototype._countBits(N) - 1;\n        for (var i = 0; i < N; i++) {\n          t[i] = this.revBin(i, l, N);\n        }\n        return t;\n      };\n      FFTM.prototype.revBin = function revBin(x, l, N) {\n        if (x === 0 || x === N - 1) return x;\n        var rb = 0;\n        for (var i = 0; i < l; i++) {\n          rb |= (x & 1) << l - i - 1;\n          x >>= 1;\n        }\n        return rb;\n      };\n      FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {\n        for (var i = 0; i < N; i++) {\n          rtws[i] = rws[rbt[i]];\n          itws[i] = iws[rbt[i]];\n        }\n      };\n      FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {\n        this.permute(rbt, rws, iws, rtws, itws, N);\n        for (var s = 1; s < N; s <<= 1) {\n          var l = s << 1;\n          var rtwdf = Math.cos(2 * Math.PI / l);\n          var itwdf = Math.sin(2 * Math.PI / l);\n          for (var p = 0; p < N; p += l) {\n            var rtwdf_ = rtwdf;\n            var itwdf_ = itwdf;\n            for (var j = 0; j < s; j++) {\n              var re = rtws[p + j];\n              var ie = itws[p + j];\n              var ro = rtws[p + j + s];\n              var io = itws[p + j + s];\n              var rx = rtwdf_ * ro - itwdf_ * io;\n              io = rtwdf_ * io + itwdf_ * ro;\n              ro = rx;\n              rtws[p + j] = re + ro;\n              itws[p + j] = ie + io;\n              rtws[p + j + s] = re - ro;\n              itws[p + j + s] = ie - io;\n              if (j !== l) {\n                rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n                itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n                rtwdf_ = rx;\n              }\n            }\n          }\n        }\n      };\n      FFTM.prototype.guessLen13b = function guessLen13b(n, m) {\n        var N = Math.max(m, n) | 1;\n        var odd = N & 1;\n        var i = 0;\n        for (N = N / 2 | 0; N; N = N >>> 1) {\n          i++;\n        }\n        return 1 << i + 1 + odd;\n      };\n      FFTM.prototype.conjugate = function conjugate(rws, iws, N) {\n        if (N <= 1) return;\n        for (var i = 0; i < N / 2; i++) {\n          var t = rws[i];\n          rws[i] = rws[N - i - 1];\n          rws[N - i - 1] = t;\n          t = iws[i];\n          iws[i] = -iws[N - i - 1];\n          iws[N - i - 1] = -t;\n        }\n      };\n      FFTM.prototype.normalize13b = function normalize13b(ws, N) {\n        var carry = 0;\n        for (var i = 0; i < N / 2; i++) {\n          var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;\n          ws[i] = w & 67108863;\n          if (w < 67108864) {\n            carry = 0;\n          } else {\n            carry = w / 67108864 | 0;\n          }\n        }\n        return ws;\n      };\n      FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {\n        var carry = 0;\n        for (var i = 0; i < len; i++) {\n          carry = carry + (ws[i] | 0);\n          rws[2 * i] = carry & 8191;\n          carry = carry >>> 13;\n          rws[2 * i + 1] = carry & 8191;\n          carry = carry >>> 13;\n        }\n        for (i = 2 * len; i < N; ++i) {\n          rws[i] = 0;\n        }\n        assert(carry === 0);\n        assert((carry & ~8191) === 0);\n      };\n      FFTM.prototype.stub = function stub(N) {\n        var ph = new Array(N);\n        for (var i = 0; i < N; i++) {\n          ph[i] = 0;\n        }\n        return ph;\n      };\n      FFTM.prototype.mulp = function mulp(x, y, out) {\n        var N = 2 * this.guessLen13b(x.length, y.length);\n        var rbt = this.makeRBT(N);\n        var _ = this.stub(N);\n        var rws = new Array(N);\n        var rwst = new Array(N);\n        var iwst = new Array(N);\n        var nrws = new Array(N);\n        var nrwst = new Array(N);\n        var niwst = new Array(N);\n        var rmws = out.words;\n        rmws.length = N;\n        this.convert13b(x.words, x.length, rws, N);\n        this.convert13b(y.words, y.length, nrws, N);\n        this.transform(rws, _, rwst, iwst, N, rbt);\n        this.transform(nrws, _, nrwst, niwst, N, rbt);\n        for (var i = 0; i < N; i++) {\n          var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n          iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n          rwst[i] = rx;\n        }\n        this.conjugate(rwst, iwst, N);\n        this.transform(rwst, iwst, rmws, _, N, rbt);\n        this.conjugate(rmws, _, N);\n        this.normalize13b(rmws, N);\n        out.negative = x.negative ^ y.negative;\n        out.length = x.length + y.length;\n        return out.strip();\n      };\n      BN.prototype.mul = function mul(num) {\n        var out = new BN(null);\n        out.words = new Array(this.length + num.length);\n        return this.mulTo(num, out);\n      };\n      BN.prototype.mulf = function mulf(num) {\n        var out = new BN(null);\n        out.words = new Array(this.length + num.length);\n        return jumboMulTo(this, num, out);\n      };\n      BN.prototype.imul = function imul(num) {\n        return this.clone().mulTo(num, this);\n      };\n      BN.prototype.imuln = function imuln(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        var carry = 0;\n        for (var i = 0; i < this.length; i++) {\n          var w = (this.words[i] | 0) * num;\n          var lo = (w & 67108863) + (carry & 67108863);\n          carry >>= 26;\n          carry += w / 67108864 | 0;\n          carry += lo >>> 26;\n          this.words[i] = lo & 67108863;\n        }\n        if (carry !== 0) {\n          this.words[i] = carry;\n          this.length++;\n        }\n        return this;\n      };\n      BN.prototype.muln = function muln(num) {\n        return this.clone().imuln(num);\n      };\n      BN.prototype.sqr = function sqr() {\n        return this.mul(this);\n      };\n      BN.prototype.isqr = function isqr() {\n        return this.imul(this.clone());\n      };\n      BN.prototype.pow = function pow(num) {\n        var w = toBitArray(num);\n        if (w.length === 0) return new BN(1);\n        var res = this;\n        for (var i = 0; i < w.length; i++, res = res.sqr()) {\n          if (w[i] !== 0) break;\n        }\n        if (++i < w.length) {\n          for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n            if (w[i] === 0) continue;\n            res = res.mul(q);\n          }\n        }\n        return res;\n      };\n      BN.prototype.iushln = function iushln(bits) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var r = bits % 26;\n        var s = (bits - r) / 26;\n        var carryMask = 67108863 >>> 26 - r << 26 - r;\n        var i;\n        if (r !== 0) {\n          var carry = 0;\n          for (i = 0; i < this.length; i++) {\n            var newCarry = this.words[i] & carryMask;\n            var c = (this.words[i] | 0) - newCarry << r;\n            this.words[i] = c | carry;\n            carry = newCarry >>> 26 - r;\n          }\n          if (carry) {\n            this.words[i] = carry;\n            this.length++;\n          }\n        }\n        if (s !== 0) {\n          for (i = this.length - 1; i >= 0; i--) {\n            this.words[i + s] = this.words[i];\n          }\n          for (i = 0; i < s; i++) {\n            this.words[i] = 0;\n          }\n          this.length += s;\n        }\n        return this.strip();\n      };\n      BN.prototype.ishln = function ishln(bits) {\n        assert(this.negative === 0);\n        return this.iushln(bits);\n      };\n      BN.prototype.iushrn = function iushrn(bits, hint, extended) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var h;\n        if (hint) {\n          h = (hint - hint % 26) / 26;\n        } else {\n          h = 0;\n        }\n        var r = bits % 26;\n        var s = Math.min((bits - r) / 26, this.length);\n        var mask = 67108863 ^ 67108863 >>> r << r;\n        var maskedWords = extended;\n        h -= s;\n        h = Math.max(0, h);\n        if (maskedWords) {\n          for (var i = 0; i < s; i++) {\n            maskedWords.words[i] = this.words[i];\n          }\n          maskedWords.length = s;\n        }\n        if (s === 0) {\n        } else if (this.length > s) {\n          this.length -= s;\n          for (i = 0; i < this.length; i++) {\n            this.words[i] = this.words[i + s];\n          }\n        } else {\n          this.words[0] = 0;\n          this.length = 1;\n        }\n        var carry = 0;\n        for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n          var word = this.words[i] | 0;\n          this.words[i] = carry << 26 - r | word >>> r;\n          carry = word & mask;\n        }\n        if (maskedWords && carry !== 0) {\n          maskedWords.words[maskedWords.length++] = carry;\n        }\n        if (this.length === 0) {\n          this.words[0] = 0;\n          this.length = 1;\n        }\n        return this.strip();\n      };\n      BN.prototype.ishrn = function ishrn(bits, hint, extended) {\n        assert(this.negative === 0);\n        return this.iushrn(bits, hint, extended);\n      };\n      BN.prototype.shln = function shln(bits) {\n        return this.clone().ishln(bits);\n      };\n      BN.prototype.ushln = function ushln(bits) {\n        return this.clone().iushln(bits);\n      };\n      BN.prototype.shrn = function shrn(bits) {\n        return this.clone().ishrn(bits);\n      };\n      BN.prototype.ushrn = function ushrn(bits) {\n        return this.clone().iushrn(bits);\n      };\n      BN.prototype.testn = function testn(bit) {\n        assert(typeof bit === \"number\" && bit >= 0);\n        var r = bit % 26;\n        var s = (bit - r) / 26;\n        var q = 1 << r;\n        if (this.length <= s) return false;\n        var w = this.words[s];\n        return !!(w & q);\n      };\n      BN.prototype.imaskn = function imaskn(bits) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var r = bits % 26;\n        var s = (bits - r) / 26;\n        assert(this.negative === 0, \"imaskn works only with positive numbers\");\n        if (this.length <= s) {\n          return this;\n        }\n        if (r !== 0) {\n          s++;\n        }\n        this.length = Math.min(s, this.length);\n        if (r !== 0) {\n          var mask = 67108863 ^ 67108863 >>> r << r;\n          this.words[this.length - 1] &= mask;\n        }\n        return this.strip();\n      };\n      BN.prototype.maskn = function maskn(bits) {\n        return this.clone().imaskn(bits);\n      };\n      BN.prototype.iaddn = function iaddn(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        if (num < 0) return this.isubn(-num);\n        if (this.negative !== 0) {\n          if (this.length === 1 && (this.words[0] | 0) < num) {\n            this.words[0] = num - (this.words[0] | 0);\n            this.negative = 0;\n            return this;\n          }\n          this.negative = 0;\n          this.isubn(num);\n          this.negative = 1;\n          return this;\n        }\n        return this._iaddn(num);\n      };\n      BN.prototype._iaddn = function _iaddn(num) {\n        this.words[0] += num;\n        for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) {\n          this.words[i] -= 67108864;\n          if (i === this.length - 1) {\n            this.words[i + 1] = 1;\n          } else {\n            this.words[i + 1]++;\n          }\n        }\n        this.length = Math.max(this.length, i + 1);\n        return this;\n      };\n      BN.prototype.isubn = function isubn(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        if (num < 0) return this.iaddn(-num);\n        if (this.negative !== 0) {\n          this.negative = 0;\n          this.iaddn(num);\n          this.negative = 1;\n          return this;\n        }\n        this.words[0] -= num;\n        if (this.length === 1 && this.words[0] < 0) {\n          this.words[0] = -this.words[0];\n          this.negative = 1;\n        } else {\n          for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n            this.words[i] += 67108864;\n            this.words[i + 1] -= 1;\n          }\n        }\n        return this.strip();\n      };\n      BN.prototype.addn = function addn(num) {\n        return this.clone().iaddn(num);\n      };\n      BN.prototype.subn = function subn(num) {\n        return this.clone().isubn(num);\n      };\n      BN.prototype.iabs = function iabs() {\n        this.negative = 0;\n        return this;\n      };\n      BN.prototype.abs = function abs() {\n        return this.clone().iabs();\n      };\n      BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {\n        var len = num.length + shift;\n        var i;\n        this._expand(len);\n        var w;\n        var carry = 0;\n        for (i = 0; i < num.length; i++) {\n          w = (this.words[i + shift] | 0) + carry;\n          var right = (num.words[i] | 0) * mul;\n          w -= right & 67108863;\n          carry = (w >> 26) - (right / 67108864 | 0);\n          this.words[i + shift] = w & 67108863;\n        }\n        for (; i < this.length - shift; i++) {\n          w = (this.words[i + shift] | 0) + carry;\n          carry = w >> 26;\n          this.words[i + shift] = w & 67108863;\n        }\n        if (carry === 0) return this.strip();\n        assert(carry === -1);\n        carry = 0;\n        for (i = 0; i < this.length; i++) {\n          w = -(this.words[i] | 0) + carry;\n          carry = w >> 26;\n          this.words[i] = w & 67108863;\n        }\n        this.negative = 1;\n        return this.strip();\n      };\n      BN.prototype._wordDiv = function _wordDiv(num, mode) {\n        var shift = this.length - num.length;\n        var a = this.clone();\n        var b = num;\n        var bhi = b.words[b.length - 1] | 0;\n        var bhiBits = this._countBits(bhi);\n        shift = 26 - bhiBits;\n        if (shift !== 0) {\n          b = b.ushln(shift);\n          a.iushln(shift);\n          bhi = b.words[b.length - 1] | 0;\n        }\n        var m = a.length - b.length;\n        var q;\n        if (mode !== \"mod\") {\n          q = new BN(null);\n          q.length = m + 1;\n          q.words = new Array(q.length);\n          for (var i = 0; i < q.length; i++) {\n            q.words[i] = 0;\n          }\n        }\n        var diff = a.clone()._ishlnsubmul(b, 1, m);\n        if (diff.negative === 0) {\n          a = diff;\n          if (q) {\n            q.words[m] = 1;\n          }\n        }\n        for (var j = m - 1; j >= 0; j--) {\n          var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);\n          qj = Math.min(qj / bhi | 0, 67108863);\n          a._ishlnsubmul(b, qj, j);\n          while (a.negative !== 0) {\n            qj--;\n            a.negative = 0;\n            a._ishlnsubmul(b, 1, j);\n            if (!a.isZero()) {\n              a.negative ^= 1;\n            }\n          }\n          if (q) {\n            q.words[j] = qj;\n          }\n        }\n        if (q) {\n          q.strip();\n        }\n        a.strip();\n        if (mode !== \"div\" && shift !== 0) {\n          a.iushrn(shift);\n        }\n        return {\n          div: q || null,\n          mod: a\n        };\n      };\n      BN.prototype.divmod = function divmod(num, mode, positive) {\n        assert(!num.isZero());\n        if (this.isZero()) {\n          return {\n            div: new BN(0),\n            mod: new BN(0)\n          };\n        }\n        var div, mod, res;\n        if (this.negative !== 0 && num.negative === 0) {\n          res = this.neg().divmod(num, mode);\n          if (mode !== \"mod\") {\n            div = res.div.neg();\n          }\n          if (mode !== \"div\") {\n            mod = res.mod.neg();\n            if (positive && mod.negative !== 0) {\n              mod.iadd(num);\n            }\n          }\n          return {\n            div,\n            mod\n          };\n        }\n        if (this.negative === 0 && num.negative !== 0) {\n          res = this.divmod(num.neg(), mode);\n          if (mode !== \"mod\") {\n            div = res.div.neg();\n          }\n          return {\n            div,\n            mod: res.mod\n          };\n        }\n        if ((this.negative & num.negative) !== 0) {\n          res = this.neg().divmod(num.neg(), mode);\n          if (mode !== \"div\") {\n            mod = res.mod.neg();\n            if (positive && mod.negative !== 0) {\n              mod.isub(num);\n            }\n          }\n          return {\n            div: res.div,\n            mod\n          };\n        }\n        if (num.length > this.length || this.cmp(num) < 0) {\n          return {\n            div: new BN(0),\n            mod: this\n          };\n        }\n        if (num.length === 1) {\n          if (mode === \"div\") {\n            return {\n              div: this.divn(num.words[0]),\n              mod: null\n            };\n          }\n          if (mode === \"mod\") {\n            return {\n              div: null,\n              mod: new BN(this.modn(num.words[0]))\n            };\n          }\n          return {\n            div: this.divn(num.words[0]),\n            mod: new BN(this.modn(num.words[0]))\n          };\n        }\n        return this._wordDiv(num, mode);\n      };\n      BN.prototype.div = function div(num) {\n        return this.divmod(num, \"div\", false).div;\n      };\n      BN.prototype.mod = function mod(num) {\n        return this.divmod(num, \"mod\", false).mod;\n      };\n      BN.prototype.umod = function umod(num) {\n        return this.divmod(num, \"mod\", true).mod;\n      };\n      BN.prototype.divRound = function divRound(num) {\n        var dm = this.divmod(num);\n        if (dm.mod.isZero()) return dm.div;\n        var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n        var half = num.ushrn(1);\n        var r2 = num.andln(1);\n        var cmp = mod.cmp(half);\n        if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n        return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n      };\n      BN.prototype.modn = function modn(num) {\n        assert(num <= 67108863);\n        var p = (1 << 26) % num;\n        var acc = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          acc = (p * acc + (this.words[i] | 0)) % num;\n        }\n        return acc;\n      };\n      BN.prototype.idivn = function idivn(num) {\n        assert(num <= 67108863);\n        var carry = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          var w = (this.words[i] | 0) + carry * 67108864;\n          this.words[i] = w / num | 0;\n          carry = w % num;\n        }\n        return this.strip();\n      };\n      BN.prototype.divn = function divn(num) {\n        return this.clone().idivn(num);\n      };\n      BN.prototype.egcd = function egcd(p) {\n        assert(p.negative === 0);\n        assert(!p.isZero());\n        var x = this;\n        var y = p.clone();\n        if (x.negative !== 0) {\n          x = x.umod(p);\n        } else {\n          x = x.clone();\n        }\n        var A = new BN(1);\n        var B = new BN(0);\n        var C = new BN(0);\n        var D = new BN(1);\n        var g = 0;\n        while (x.isEven() && y.isEven()) {\n          x.iushrn(1);\n          y.iushrn(1);\n          ++g;\n        }\n        var yp = y.clone();\n        var xp = x.clone();\n        while (!x.isZero()) {\n          for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ;\n          if (i > 0) {\n            x.iushrn(i);\n            while (i-- > 0) {\n              if (A.isOdd() || B.isOdd()) {\n                A.iadd(yp);\n                B.isub(xp);\n              }\n              A.iushrn(1);\n              B.iushrn(1);\n            }\n          }\n          for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ;\n          if (j > 0) {\n            y.iushrn(j);\n            while (j-- > 0) {\n              if (C.isOdd() || D.isOdd()) {\n                C.iadd(yp);\n                D.isub(xp);\n              }\n              C.iushrn(1);\n              D.iushrn(1);\n            }\n          }\n          if (x.cmp(y) >= 0) {\n            x.isub(y);\n            A.isub(C);\n            B.isub(D);\n          } else {\n            y.isub(x);\n            C.isub(A);\n            D.isub(B);\n          }\n        }\n        return {\n          a: C,\n          b: D,\n          gcd: y.iushln(g)\n        };\n      };\n      BN.prototype._invmp = function _invmp(p) {\n        assert(p.negative === 0);\n        assert(!p.isZero());\n        var a = this;\n        var b = p.clone();\n        if (a.negative !== 0) {\n          a = a.umod(p);\n        } else {\n          a = a.clone();\n        }\n        var x1 = new BN(1);\n        var x2 = new BN(0);\n        var delta = b.clone();\n        while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n          for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ;\n          if (i > 0) {\n            a.iushrn(i);\n            while (i-- > 0) {\n              if (x1.isOdd()) {\n                x1.iadd(delta);\n              }\n              x1.iushrn(1);\n            }\n          }\n          for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ;\n          if (j > 0) {\n            b.iushrn(j);\n            while (j-- > 0) {\n              if (x2.isOdd()) {\n                x2.iadd(delta);\n              }\n              x2.iushrn(1);\n            }\n          }\n          if (a.cmp(b) >= 0) {\n            a.isub(b);\n            x1.isub(x2);\n          } else {\n            b.isub(a);\n            x2.isub(x1);\n          }\n        }\n        var res;\n        if (a.cmpn(1) === 0) {\n          res = x1;\n        } else {\n          res = x2;\n        }\n        if (res.cmpn(0) < 0) {\n          res.iadd(p);\n        }\n        return res;\n      };\n      BN.prototype.gcd = function gcd(num) {\n        if (this.isZero()) return num.abs();\n        if (num.isZero()) return this.abs();\n        var a = this.clone();\n        var b = num.clone();\n        a.negative = 0;\n        b.negative = 0;\n        for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n          a.iushrn(1);\n          b.iushrn(1);\n        }\n        do {\n          while (a.isEven()) {\n            a.iushrn(1);\n          }\n          while (b.isEven()) {\n            b.iushrn(1);\n          }\n          var r = a.cmp(b);\n          if (r < 0) {\n            var t = a;\n            a = b;\n            b = t;\n          } else if (r === 0 || b.cmpn(1) === 0) {\n            break;\n          }\n          a.isub(b);\n        } while (true);\n        return b.iushln(shift);\n      };\n      BN.prototype.invm = function invm(num) {\n        return this.egcd(num).a.umod(num);\n      };\n      BN.prototype.isEven = function isEven() {\n        return (this.words[0] & 1) === 0;\n      };\n      BN.prototype.isOdd = function isOdd() {\n        return (this.words[0] & 1) === 1;\n      };\n      BN.prototype.andln = function andln(num) {\n        return this.words[0] & num;\n      };\n      BN.prototype.bincn = function bincn(bit) {\n        assert(typeof bit === \"number\");\n        var r = bit % 26;\n        var s = (bit - r) / 26;\n        var q = 1 << r;\n        if (this.length <= s) {\n          this._expand(s + 1);\n          this.words[s] |= q;\n          return this;\n        }\n        var carry = q;\n        for (var i = s; carry !== 0 && i < this.length; i++) {\n          var w = this.words[i] | 0;\n          w += carry;\n          carry = w >>> 26;\n          w &= 67108863;\n          this.words[i] = w;\n        }\n        if (carry !== 0) {\n          this.words[i] = carry;\n          this.length++;\n        }\n        return this;\n      };\n      BN.prototype.isZero = function isZero() {\n        return this.length === 1 && this.words[0] === 0;\n      };\n      BN.prototype.cmpn = function cmpn(num) {\n        var negative = num < 0;\n        if (this.negative !== 0 && !negative) return -1;\n        if (this.negative === 0 && negative) return 1;\n        this.strip();\n        var res;\n        if (this.length > 1) {\n          res = 1;\n        } else {\n          if (negative) {\n            num = -num;\n          }\n          assert(num <= 67108863, \"Number is too big\");\n          var w = this.words[0] | 0;\n          res = w === num ? 0 : w < num ? -1 : 1;\n        }\n        if (this.negative !== 0) return -res | 0;\n        return res;\n      };\n      BN.prototype.cmp = function cmp(num) {\n        if (this.negative !== 0 && num.negative === 0) return -1;\n        if (this.negative === 0 && num.negative !== 0) return 1;\n        var res = this.ucmp(num);\n        if (this.negative !== 0) return -res | 0;\n        return res;\n      };\n      BN.prototype.ucmp = function ucmp(num) {\n        if (this.length > num.length) return 1;\n        if (this.length < num.length) return -1;\n        var res = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          var a = this.words[i] | 0;\n          var b = num.words[i] | 0;\n          if (a === b) continue;\n          if (a < b) {\n            res = -1;\n          } else if (a > b) {\n            res = 1;\n          }\n          break;\n        }\n        return res;\n      };\n      BN.prototype.gtn = function gtn(num) {\n        return this.cmpn(num) === 1;\n      };\n      BN.prototype.gt = function gt(num) {\n        return this.cmp(num) === 1;\n      };\n      BN.prototype.gten = function gten(num) {\n        return this.cmpn(num) >= 0;\n      };\n      BN.prototype.gte = function gte(num) {\n        return this.cmp(num) >= 0;\n      };\n      BN.prototype.ltn = function ltn(num) {\n        return this.cmpn(num) === -1;\n      };\n      BN.prototype.lt = function lt(num) {\n        return this.cmp(num) === -1;\n      };\n      BN.prototype.lten = function lten(num) {\n        return this.cmpn(num) <= 0;\n      };\n      BN.prototype.lte = function lte(num) {\n        return this.cmp(num) <= 0;\n      };\n      BN.prototype.eqn = function eqn(num) {\n        return this.cmpn(num) === 0;\n      };\n      BN.prototype.eq = function eq(num) {\n        return this.cmp(num) === 0;\n      };\n      BN.red = function red(num) {\n        return new Red(num);\n      };\n      BN.prototype.toRed = function toRed(ctx) {\n        assert(!this.red, \"Already a number in reduction context\");\n        assert(this.negative === 0, \"red works only with positives\");\n        return ctx.convertTo(this)._forceRed(ctx);\n      };\n      BN.prototype.fromRed = function fromRed() {\n        assert(this.red, \"fromRed works only with numbers in reduction context\");\n        return this.red.convertFrom(this);\n      };\n      BN.prototype._forceRed = function _forceRed(ctx) {\n        this.red = ctx;\n        return this;\n      };\n      BN.prototype.forceRed = function forceRed(ctx) {\n        assert(!this.red, \"Already a number in reduction context\");\n        return this._forceRed(ctx);\n      };\n      BN.prototype.redAdd = function redAdd(num) {\n        assert(this.red, \"redAdd works only with red numbers\");\n        return this.red.add(this, num);\n      };\n      BN.prototype.redIAdd = function redIAdd(num) {\n        assert(this.red, \"redIAdd works only with red numbers\");\n        return this.red.iadd(this, num);\n      };\n      BN.prototype.redSub = function redSub(num) {\n        assert(this.red, \"redSub works only with red numbers\");\n        return this.red.sub(this, num);\n      };\n      BN.prototype.redISub = function redISub(num) {\n        assert(this.red, \"redISub works only with red numbers\");\n        return this.red.isub(this, num);\n      };\n      BN.prototype.redShl = function redShl(num) {\n        assert(this.red, \"redShl works only with red numbers\");\n        return this.red.shl(this, num);\n      };\n      BN.prototype.redMul = function redMul(num) {\n        assert(this.red, \"redMul works only with red numbers\");\n        this.red._verify2(this, num);\n        return this.red.mul(this, num);\n      };\n      BN.prototype.redIMul = function redIMul(num) {\n        assert(this.red, \"redMul works only with red numbers\");\n        this.red._verify2(this, num);\n        return this.red.imul(this, num);\n      };\n      BN.prototype.redSqr = function redSqr() {\n        assert(this.red, \"redSqr works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.sqr(this);\n      };\n      BN.prototype.redISqr = function redISqr() {\n        assert(this.red, \"redISqr works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.isqr(this);\n      };\n      BN.prototype.redSqrt = function redSqrt() {\n        assert(this.red, \"redSqrt works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.sqrt(this);\n      };\n      BN.prototype.redInvm = function redInvm() {\n        assert(this.red, \"redInvm works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.invm(this);\n      };\n      BN.prototype.redNeg = function redNeg() {\n        assert(this.red, \"redNeg works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.neg(this);\n      };\n      BN.prototype.redPow = function redPow(num) {\n        assert(this.red && !num.red, \"redPow(normalNum)\");\n        this.red._verify1(this);\n        return this.red.pow(this, num);\n      };\n      var primes = {\n        k256: null,\n        p224: null,\n        p192: null,\n        p25519: null\n      };\n      function MPrime(name2, p) {\n        this.name = name2;\n        this.p = new BN(p, 16);\n        this.n = this.p.bitLength();\n        this.k = new BN(1).iushln(this.n).isub(this.p);\n        this.tmp = this._tmp();\n      }\n      MPrime.prototype._tmp = function _tmp() {\n        var tmp = new BN(null);\n        tmp.words = new Array(Math.ceil(this.n / 13));\n        return tmp;\n      };\n      MPrime.prototype.ireduce = function ireduce(num) {\n        var r = num;\n        var rlen;\n        do {\n          this.split(r, this.tmp);\n          r = this.imulK(r);\n          r = r.iadd(this.tmp);\n          rlen = r.bitLength();\n        } while (rlen > this.n);\n        var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n        if (cmp === 0) {\n          r.words[0] = 0;\n          r.length = 1;\n        } else if (cmp > 0) {\n          r.isub(this.p);\n        } else {\n          if (r.strip !== void 0) {\n            r.strip();\n          } else {\n            r._strip();\n          }\n        }\n        return r;\n      };\n      MPrime.prototype.split = function split(input, out) {\n        input.iushrn(this.n, 0, out);\n      };\n      MPrime.prototype.imulK = function imulK(num) {\n        return num.imul(this.k);\n      };\n      function K256() {\n        MPrime.call(\n          this,\n          \"k256\",\n          \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\"\n        );\n      }\n      inherits(K256, MPrime);\n      K256.prototype.split = function split(input, output) {\n        var mask = 4194303;\n        var outLen = Math.min(input.length, 9);\n        for (var i = 0; i < outLen; i++) {\n          output.words[i] = input.words[i];\n        }\n        output.length = outLen;\n        if (input.length <= 9) {\n          input.words[0] = 0;\n          input.length = 1;\n          return;\n        }\n        var prev = input.words[9];\n        output.words[output.length++] = prev & mask;\n        for (i = 10; i < input.length; i++) {\n          var next = input.words[i] | 0;\n          input.words[i - 10] = (next & mask) << 4 | prev >>> 22;\n          prev = next;\n        }\n        prev >>>= 22;\n        input.words[i - 10] = prev;\n        if (prev === 0 && input.length > 10) {\n          input.length -= 10;\n        } else {\n          input.length -= 9;\n        }\n      };\n      K256.prototype.imulK = function imulK(num) {\n        num.words[num.length] = 0;\n        num.words[num.length + 1] = 0;\n        num.length += 2;\n        var lo = 0;\n        for (var i = 0; i < num.length; i++) {\n          var w = num.words[i] | 0;\n          lo += w * 977;\n          num.words[i] = lo & 67108863;\n          lo = w * 64 + (lo / 67108864 | 0);\n        }\n        if (num.words[num.length - 1] === 0) {\n          num.length--;\n          if (num.words[num.length - 1] === 0) {\n            num.length--;\n          }\n        }\n        return num;\n      };\n      function P224() {\n        MPrime.call(\n          this,\n          \"p224\",\n          \"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\"\n        );\n      }\n      inherits(P224, MPrime);\n      function P192() {\n        MPrime.call(\n          this,\n          \"p192\",\n          \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\"\n        );\n      }\n      inherits(P192, MPrime);\n      function P25519() {\n        MPrime.call(\n          this,\n          \"25519\",\n          \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\"\n        );\n      }\n      inherits(P25519, MPrime);\n      P25519.prototype.imulK = function imulK(num) {\n        var carry = 0;\n        for (var i = 0; i < num.length; i++) {\n          var hi = (num.words[i] | 0) * 19 + carry;\n          var lo = hi & 67108863;\n          hi >>>= 26;\n          num.words[i] = lo;\n          carry = hi;\n        }\n        if (carry !== 0) {\n          num.words[num.length++] = carry;\n        }\n        return num;\n      };\n      BN._prime = function prime(name2) {\n        if (primes[name2]) return primes[name2];\n        var prime2;\n        if (name2 === \"k256\") {\n          prime2 = new K256();\n        } else if (name2 === \"p224\") {\n          prime2 = new P224();\n        } else if (name2 === \"p192\") {\n          prime2 = new P192();\n        } else if (name2 === \"p25519\") {\n          prime2 = new P25519();\n        } else {\n          throw new Error(\"Unknown prime \" + name2);\n        }\n        primes[name2] = prime2;\n        return prime2;\n      };\n      function Red(m) {\n        if (typeof m === \"string\") {\n          var prime = BN._prime(m);\n          this.m = prime.p;\n          this.prime = prime;\n        } else {\n          assert(m.gtn(1), \"modulus must be greater than 1\");\n          this.m = m;\n          this.prime = null;\n        }\n      }\n      Red.prototype._verify1 = function _verify1(a) {\n        assert(a.negative === 0, \"red works only with positives\");\n        assert(a.red, \"red works only with red numbers\");\n      };\n      Red.prototype._verify2 = function _verify2(a, b) {\n        assert((a.negative | b.negative) === 0, \"red works only with positives\");\n        assert(\n          a.red && a.red === b.red,\n          \"red works only with red numbers\"\n        );\n      };\n      Red.prototype.imod = function imod(a) {\n        if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n        return a.umod(this.m)._forceRed(this);\n      };\n      Red.prototype.neg = function neg(a) {\n        if (a.isZero()) {\n          return a.clone();\n        }\n        return this.m.sub(a)._forceRed(this);\n      };\n      Red.prototype.add = function add(a, b) {\n        this._verify2(a, b);\n        var res = a.add(b);\n        if (res.cmp(this.m) >= 0) {\n          res.isub(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Red.prototype.iadd = function iadd(a, b) {\n        this._verify2(a, b);\n        var res = a.iadd(b);\n        if (res.cmp(this.m) >= 0) {\n          res.isub(this.m);\n        }\n        return res;\n      };\n      Red.prototype.sub = function sub(a, b) {\n        this._verify2(a, b);\n        var res = a.sub(b);\n        if (res.cmpn(0) < 0) {\n          res.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Red.prototype.isub = function isub(a, b) {\n        this._verify2(a, b);\n        var res = a.isub(b);\n        if (res.cmpn(0) < 0) {\n          res.iadd(this.m);\n        }\n        return res;\n      };\n      Red.prototype.shl = function shl(a, num) {\n        this._verify1(a);\n        return this.imod(a.ushln(num));\n      };\n      Red.prototype.imul = function imul(a, b) {\n        this._verify2(a, b);\n        return this.imod(a.imul(b));\n      };\n      Red.prototype.mul = function mul(a, b) {\n        this._verify2(a, b);\n        return this.imod(a.mul(b));\n      };\n      Red.prototype.isqr = function isqr(a) {\n        return this.imul(a, a.clone());\n      };\n      Red.prototype.sqr = function sqr(a) {\n        return this.mul(a, a);\n      };\n      Red.prototype.sqrt = function sqrt(a) {\n        if (a.isZero()) return a.clone();\n        var mod3 = this.m.andln(3);\n        assert(mod3 % 2 === 1);\n        if (mod3 === 3) {\n          var pow = this.m.add(new BN(1)).iushrn(2);\n          return this.pow(a, pow);\n        }\n        var q = this.m.subn(1);\n        var s = 0;\n        while (!q.isZero() && q.andln(1) === 0) {\n          s++;\n          q.iushrn(1);\n        }\n        assert(!q.isZero());\n        var one = new BN(1).toRed(this);\n        var nOne = one.redNeg();\n        var lpow = this.m.subn(1).iushrn(1);\n        var z = this.m.bitLength();\n        z = new BN(2 * z * z).toRed(this);\n        while (this.pow(z, lpow).cmp(nOne) !== 0) {\n          z.redIAdd(nOne);\n        }\n        var c = this.pow(z, q);\n        var r = this.pow(a, q.addn(1).iushrn(1));\n        var t = this.pow(a, q);\n        var m = s;\n        while (t.cmp(one) !== 0) {\n          var tmp = t;\n          for (var i = 0; tmp.cmp(one) !== 0; i++) {\n            tmp = tmp.redSqr();\n          }\n          assert(i < m);\n          var b = this.pow(c, new BN(1).iushln(m - i - 1));\n          r = r.redMul(b);\n          c = b.redSqr();\n          t = t.redMul(c);\n          m = i;\n        }\n        return r;\n      };\n      Red.prototype.invm = function invm(a) {\n        var inv = a._invmp(this.m);\n        if (inv.negative !== 0) {\n          inv.negative = 0;\n          return this.imod(inv).redNeg();\n        } else {\n          return this.imod(inv);\n        }\n      };\n      Red.prototype.pow = function pow(a, num) {\n        if (num.isZero()) return new BN(1).toRed(this);\n        if (num.cmpn(1) === 0) return a.clone();\n        var windowSize = 4;\n        var wnd = new Array(1 << windowSize);\n        wnd[0] = new BN(1).toRed(this);\n        wnd[1] = a;\n        for (var i = 2; i < wnd.length; i++) {\n          wnd[i] = this.mul(wnd[i - 1], a);\n        }\n        var res = wnd[0];\n        var current = 0;\n        var currentLen = 0;\n        var start = num.bitLength() % 26;\n        if (start === 0) {\n          start = 26;\n        }\n        for (i = num.length - 1; i >= 0; i--) {\n          var word = num.words[i];\n          for (var j = start - 1; j >= 0; j--) {\n            var bit = word >> j & 1;\n            if (res !== wnd[0]) {\n              res = this.sqr(res);\n            }\n            if (bit === 0 && current === 0) {\n              currentLen = 0;\n              continue;\n            }\n            current <<= 1;\n            current |= bit;\n            currentLen++;\n            if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n            res = this.mul(res, wnd[current]);\n            currentLen = 0;\n            current = 0;\n          }\n          start = 26;\n        }\n        return res;\n      };\n      Red.prototype.convertTo = function convertTo(num) {\n        var r = num.umod(this.m);\n        return r === num ? r.clone() : r;\n      };\n      Red.prototype.convertFrom = function convertFrom(num) {\n        var res = num.clone();\n        res.red = null;\n        return res;\n      };\n      BN.mont = function mont(num) {\n        return new Mont(num);\n      };\n      function Mont(m) {\n        Red.call(this, m);\n        this.shift = this.m.bitLength();\n        if (this.shift % 26 !== 0) {\n          this.shift += 26 - this.shift % 26;\n        }\n        this.r = new BN(1).iushln(this.shift);\n        this.r2 = this.imod(this.r.sqr());\n        this.rinv = this.r._invmp(this.m);\n        this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n        this.minv = this.minv.umod(this.r);\n        this.minv = this.r.sub(this.minv);\n      }\n      inherits(Mont, Red);\n      Mont.prototype.convertTo = function convertTo(num) {\n        return this.imod(num.ushln(this.shift));\n      };\n      Mont.prototype.convertFrom = function convertFrom(num) {\n        var r = this.imod(num.mul(this.rinv));\n        r.red = null;\n        return r;\n      };\n      Mont.prototype.imul = function imul(a, b) {\n        if (a.isZero() || b.isZero()) {\n          a.words[0] = 0;\n          a.length = 1;\n          return a;\n        }\n        var t = a.imul(b);\n        var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n        var u = t.isub(c).iushrn(this.shift);\n        var res = u;\n        if (u.cmp(this.m) >= 0) {\n          res = u.isub(this.m);\n        } else if (u.cmpn(0) < 0) {\n          res = u.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Mont.prototype.mul = function mul(a, b) {\n        if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n        var t = a.mul(b);\n        var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n        var u = t.isub(c).iushrn(this.shift);\n        var res = u;\n        if (u.cmp(this.m) >= 0) {\n          res = u.isub(this.m);\n        } else if (u.cmpn(0) < 0) {\n          res = u.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Mont.prototype.invm = function invm(a) {\n        var res = this.imod(a._invmp(this.m).mul(this.r2));\n        return res._forceRed(this);\n      };\n    })(typeof module2 === \"undefined\" || module2, exports2);\n  }\n});\n\n// node_modules/@ethersproject/logger/lib/_version.js\nvar require_version = __commonJS({\n  \"node_modules/@ethersproject/logger/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"logger/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/logger/lib/index.js\nvar require_lib = __commonJS({\n  \"node_modules/@ethersproject/logger/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Logger = exports2.ErrorCode = exports2.LogLevel = void 0;\n    var _permanentCensorErrors = false;\n    var _censorErrors = false;\n    var LogLevels = { debug: 1, \"default\": 2, info: 2, warning: 3, error: 4, off: 5 };\n    var _logLevel = LogLevels[\"default\"];\n    var _version_1 = require_version();\n    var _globalLogger = null;\n    function _checkNormalize() {\n      try {\n        var missing_1 = [];\n        [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].forEach(function(form) {\n          try {\n            if (\"test\".normalize(form) !== \"test\") {\n              throw new Error(\"bad normalize\");\n            }\n            ;\n          } catch (error) {\n            missing_1.push(form);\n          }\n        });\n        if (missing_1.length) {\n          throw new Error(\"missing \" + missing_1.join(\", \"));\n        }\n        if (String.fromCharCode(233).normalize(\"NFD\") !== String.fromCharCode(101, 769)) {\n          throw new Error(\"broken implementation\");\n        }\n      } catch (error) {\n        return error.message;\n      }\n      return null;\n    }\n    var _normalizeError = _checkNormalize();\n    var LogLevel;\n    (function(LogLevel2) {\n      LogLevel2[\"DEBUG\"] = \"DEBUG\";\n      LogLevel2[\"INFO\"] = \"INFO\";\n      LogLevel2[\"WARNING\"] = \"WARNING\";\n      LogLevel2[\"ERROR\"] = \"ERROR\";\n      LogLevel2[\"OFF\"] = \"OFF\";\n    })(LogLevel = exports2.LogLevel || (exports2.LogLevel = {}));\n    var ErrorCode;\n    (function(ErrorCode2) {\n      ErrorCode2[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n      ErrorCode2[\"NOT_IMPLEMENTED\"] = \"NOT_IMPLEMENTED\";\n      ErrorCode2[\"UNSUPPORTED_OPERATION\"] = \"UNSUPPORTED_OPERATION\";\n      ErrorCode2[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n      ErrorCode2[\"SERVER_ERROR\"] = \"SERVER_ERROR\";\n      ErrorCode2[\"TIMEOUT\"] = \"TIMEOUT\";\n      ErrorCode2[\"BUFFER_OVERRUN\"] = \"BUFFER_OVERRUN\";\n      ErrorCode2[\"NUMERIC_FAULT\"] = \"NUMERIC_FAULT\";\n      ErrorCode2[\"MISSING_NEW\"] = \"MISSING_NEW\";\n      ErrorCode2[\"INVALID_ARGUMENT\"] = \"INVALID_ARGUMENT\";\n      ErrorCode2[\"MISSING_ARGUMENT\"] = \"MISSING_ARGUMENT\";\n      ErrorCode2[\"UNEXPECTED_ARGUMENT\"] = \"UNEXPECTED_ARGUMENT\";\n      ErrorCode2[\"CALL_EXCEPTION\"] = \"CALL_EXCEPTION\";\n      ErrorCode2[\"INSUFFICIENT_FUNDS\"] = \"INSUFFICIENT_FUNDS\";\n      ErrorCode2[\"NONCE_EXPIRED\"] = \"NONCE_EXPIRED\";\n      ErrorCode2[\"REPLACEMENT_UNDERPRICED\"] = \"REPLACEMENT_UNDERPRICED\";\n      ErrorCode2[\"UNPREDICTABLE_GAS_LIMIT\"] = \"UNPREDICTABLE_GAS_LIMIT\";\n      ErrorCode2[\"TRANSACTION_REPLACED\"] = \"TRANSACTION_REPLACED\";\n    })(ErrorCode = exports2.ErrorCode || (exports2.ErrorCode = {}));\n    var HEX = \"0123456789abcdef\";\n    var Logger = (\n      /** @class */\n      function() {\n        function Logger2(version) {\n          Object.defineProperty(this, \"version\", {\n            enumerable: true,\n            value: version,\n            writable: false\n          });\n        }\n        Logger2.prototype._log = function(logLevel, args) {\n          var level = logLevel.toLowerCase();\n          if (LogLevels[level] == null) {\n            this.throwArgumentError(\"invalid log level name\", \"logLevel\", logLevel);\n          }\n          if (_logLevel > LogLevels[level]) {\n            return;\n          }\n          console.log.apply(console, args);\n        };\n        Logger2.prototype.debug = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.DEBUG, args);\n        };\n        Logger2.prototype.info = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.INFO, args);\n        };\n        Logger2.prototype.warn = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.WARNING, args);\n        };\n        Logger2.prototype.makeError = function(message, code, params) {\n          if (_censorErrors) {\n            return this.makeError(\"censored error\", code, {});\n          }\n          if (!code) {\n            code = Logger2.errors.UNKNOWN_ERROR;\n          }\n          if (!params) {\n            params = {};\n          }\n          var messageDetails = [];\n          Object.keys(params).forEach(function(key) {\n            var value = params[key];\n            try {\n              if (value instanceof Uint8Array) {\n                var hex = \"\";\n                for (var i = 0; i < value.length; i++) {\n                  hex += HEX[value[i] >> 4];\n                  hex += HEX[value[i] & 15];\n                }\n                messageDetails.push(key + \"=Uint8Array(0x\" + hex + \")\");\n              } else {\n                messageDetails.push(key + \"=\" + JSON.stringify(value));\n              }\n            } catch (error2) {\n              messageDetails.push(key + \"=\" + JSON.stringify(params[key].toString()));\n            }\n          });\n          messageDetails.push(\"code=\" + code);\n          messageDetails.push(\"version=\" + this.version);\n          var reason = message;\n          if (messageDetails.length) {\n            message += \" (\" + messageDetails.join(\", \") + \")\";\n          }\n          var error = new Error(message);\n          error.reason = reason;\n          error.code = code;\n          Object.keys(params).forEach(function(key) {\n            error[key] = params[key];\n          });\n          return error;\n        };\n        Logger2.prototype.throwError = function(message, code, params) {\n          throw this.makeError(message, code, params);\n        };\n        Logger2.prototype.throwArgumentError = function(message, name2, value) {\n          return this.throwError(message, Logger2.errors.INVALID_ARGUMENT, {\n            argument: name2,\n            value\n          });\n        };\n        Logger2.prototype.assert = function(condition, message, code, params) {\n          if (!!condition) {\n            return;\n          }\n          this.throwError(message, code, params);\n        };\n        Logger2.prototype.assertArgument = function(condition, message, name2, value) {\n          if (!!condition) {\n            return;\n          }\n          this.throwArgumentError(message, name2, value);\n        };\n        Logger2.prototype.checkNormalize = function(message) {\n          if (message == null) {\n            message = \"platform missing String.prototype.normalize\";\n          }\n          if (_normalizeError) {\n            this.throwError(\"platform missing String.prototype.normalize\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"String.prototype.normalize\",\n              form: _normalizeError\n            });\n          }\n        };\n        Logger2.prototype.checkSafeUint53 = function(value, message) {\n          if (typeof value !== \"number\") {\n            return;\n          }\n          if (message == null) {\n            message = \"value not safe\";\n          }\n          if (value < 0 || value >= 9007199254740991) {\n            this.throwError(message, Logger2.errors.NUMERIC_FAULT, {\n              operation: \"checkSafeInteger\",\n              fault: \"out-of-safe-range\",\n              value\n            });\n          }\n          if (value % 1) {\n            this.throwError(message, Logger2.errors.NUMERIC_FAULT, {\n              operation: \"checkSafeInteger\",\n              fault: \"non-integer\",\n              value\n            });\n          }\n        };\n        Logger2.prototype.checkArgumentCount = function(count, expectedCount, message) {\n          if (message) {\n            message = \": \" + message;\n          } else {\n            message = \"\";\n          }\n          if (count < expectedCount) {\n            this.throwError(\"missing argument\" + message, Logger2.errors.MISSING_ARGUMENT, {\n              count,\n              expectedCount\n            });\n          }\n          if (count > expectedCount) {\n            this.throwError(\"too many arguments\" + message, Logger2.errors.UNEXPECTED_ARGUMENT, {\n              count,\n              expectedCount\n            });\n          }\n        };\n        Logger2.prototype.checkNew = function(target, kind) {\n          if (target === Object || target == null) {\n            this.throwError(\"missing new\", Logger2.errors.MISSING_NEW, { name: kind.name });\n          }\n        };\n        Logger2.prototype.checkAbstract = function(target, kind) {\n          if (target === kind) {\n            this.throwError(\"cannot instantiate abstract class \" + JSON.stringify(kind.name) + \" directly; use a sub-class\", Logger2.errors.UNSUPPORTED_OPERATION, { name: target.name, operation: \"new\" });\n          } else if (target === Object || target == null) {\n            this.throwError(\"missing new\", Logger2.errors.MISSING_NEW, { name: kind.name });\n          }\n        };\n        Logger2.globalLogger = function() {\n          if (!_globalLogger) {\n            _globalLogger = new Logger2(_version_1.version);\n          }\n          return _globalLogger;\n        };\n        Logger2.setCensorship = function(censorship, permanent) {\n          if (!censorship && permanent) {\n            this.globalLogger().throwError(\"cannot permanently disable censorship\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setCensorship\"\n            });\n          }\n          if (_permanentCensorErrors) {\n            if (!censorship) {\n              return;\n            }\n            this.globalLogger().throwError(\"error censorship permanent\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setCensorship\"\n            });\n          }\n          _censorErrors = !!censorship;\n          _permanentCensorErrors = !!permanent;\n        };\n        Logger2.setLogLevel = function(logLevel) {\n          var level = LogLevels[logLevel.toLowerCase()];\n          if (level == null) {\n            Logger2.globalLogger().warn(\"invalid log level - \" + logLevel);\n            return;\n          }\n          _logLevel = level;\n        };\n        Logger2.from = function(version) {\n          return new Logger2(version);\n        };\n        Logger2.errors = ErrorCode;\n        Logger2.levels = LogLevel;\n        return Logger2;\n      }()\n    );\n    exports2.Logger = Logger;\n  }\n});\n\n// node_modules/@ethersproject/bytes/lib/_version.js\nvar require_version2 = __commonJS({\n  \"node_modules/@ethersproject/bytes/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"bytes/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/bytes/lib/index.js\nvar require_lib2 = __commonJS({\n  \"node_modules/@ethersproject/bytes/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.joinSignature = exports2.splitSignature = exports2.hexZeroPad = exports2.hexStripZeros = exports2.hexValue = exports2.hexConcat = exports2.hexDataSlice = exports2.hexDataLength = exports2.hexlify = exports2.isHexString = exports2.zeroPad = exports2.stripZeros = exports2.concat = exports2.arrayify = exports2.isBytes = exports2.isBytesLike = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version2();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isHexable(value) {\n      return !!value.toHexString;\n    }\n    function addSlice(array) {\n      if (array.slice) {\n        return array;\n      }\n      array.slice = function() {\n        var args = Array.prototype.slice.call(arguments);\n        return addSlice(new Uint8Array(Array.prototype.slice.apply(array, args)));\n      };\n      return array;\n    }\n    function isBytesLike(value) {\n      return isHexString(value) && !(value.length % 2) || isBytes(value);\n    }\n    exports2.isBytesLike = isBytesLike;\n    function isInteger(value) {\n      return typeof value === \"number\" && value == value && value % 1 === 0;\n    }\n    function isBytes(value) {\n      if (value == null) {\n        return false;\n      }\n      if (value.constructor === Uint8Array) {\n        return true;\n      }\n      if (typeof value === \"string\") {\n        return false;\n      }\n      if (!isInteger(value.length) || value.length < 0) {\n        return false;\n      }\n      for (var i = 0; i < value.length; i++) {\n        var v = value[i];\n        if (!isInteger(v) || v < 0 || v >= 256) {\n          return false;\n        }\n      }\n      return true;\n    }\n    exports2.isBytes = isBytes;\n    function arrayify(value, options) {\n      if (!options) {\n        options = {};\n      }\n      if (typeof value === \"number\") {\n        logger.checkSafeUint53(value, \"invalid arrayify value\");\n        var result = [];\n        while (value) {\n          result.unshift(value & 255);\n          value = parseInt(String(value / 256));\n        }\n        if (result.length === 0) {\n          result.push(0);\n        }\n        return addSlice(new Uint8Array(result));\n      }\n      if (options.allowMissingPrefix && typeof value === \"string\" && value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (isHexable(value)) {\n        value = value.toHexString();\n      }\n      if (isHexString(value)) {\n        var hex = value.substring(2);\n        if (hex.length % 2) {\n          if (options.hexPad === \"left\") {\n            hex = \"0x0\" + hex.substring(2);\n          } else if (options.hexPad === \"right\") {\n            hex += \"0\";\n          } else {\n            logger.throwArgumentError(\"hex data is odd-length\", \"value\", value);\n          }\n        }\n        var result = [];\n        for (var i = 0; i < hex.length; i += 2) {\n          result.push(parseInt(hex.substring(i, i + 2), 16));\n        }\n        return addSlice(new Uint8Array(result));\n      }\n      if (isBytes(value)) {\n        return addSlice(new Uint8Array(value));\n      }\n      return logger.throwArgumentError(\"invalid arrayify value\", \"value\", value);\n    }\n    exports2.arrayify = arrayify;\n    function concat(items) {\n      var objects = items.map(function(item) {\n        return arrayify(item);\n      });\n      var length = objects.reduce(function(accum, item) {\n        return accum + item.length;\n      }, 0);\n      var result = new Uint8Array(length);\n      objects.reduce(function(offset, object) {\n        result.set(object, offset);\n        return offset + object.length;\n      }, 0);\n      return addSlice(result);\n    }\n    exports2.concat = concat;\n    function stripZeros(value) {\n      var result = arrayify(value);\n      if (result.length === 0) {\n        return result;\n      }\n      var start = 0;\n      while (start < result.length && result[start] === 0) {\n        start++;\n      }\n      if (start) {\n        result = result.slice(start);\n      }\n      return result;\n    }\n    exports2.stripZeros = stripZeros;\n    function zeroPad(value, length) {\n      value = arrayify(value);\n      if (value.length > length) {\n        logger.throwArgumentError(\"value out of range\", \"value\", arguments[0]);\n      }\n      var result = new Uint8Array(length);\n      result.set(value, length - value.length);\n      return addSlice(result);\n    }\n    exports2.zeroPad = zeroPad;\n    function isHexString(value, length) {\n      if (typeof value !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n        return false;\n      }\n      if (length && value.length !== 2 + 2 * length) {\n        return false;\n      }\n      return true;\n    }\n    exports2.isHexString = isHexString;\n    var HexCharacters = \"0123456789abcdef\";\n    function hexlify(value, options) {\n      if (!options) {\n        options = {};\n      }\n      if (typeof value === \"number\") {\n        logger.checkSafeUint53(value, \"invalid hexlify value\");\n        var hex = \"\";\n        while (value) {\n          hex = HexCharacters[value & 15] + hex;\n          value = Math.floor(value / 16);\n        }\n        if (hex.length) {\n          if (hex.length % 2) {\n            hex = \"0\" + hex;\n          }\n          return \"0x\" + hex;\n        }\n        return \"0x00\";\n      }\n      if (typeof value === \"bigint\") {\n        value = value.toString(16);\n        if (value.length % 2) {\n          return \"0x0\" + value;\n        }\n        return \"0x\" + value;\n      }\n      if (options.allowMissingPrefix && typeof value === \"string\" && value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (isHexable(value)) {\n        return value.toHexString();\n      }\n      if (isHexString(value)) {\n        if (value.length % 2) {\n          if (options.hexPad === \"left\") {\n            value = \"0x0\" + value.substring(2);\n          } else if (options.hexPad === \"right\") {\n            value += \"0\";\n          } else {\n            logger.throwArgumentError(\"hex data is odd-length\", \"value\", value);\n          }\n        }\n        return value.toLowerCase();\n      }\n      if (isBytes(value)) {\n        var result = \"0x\";\n        for (var i = 0; i < value.length; i++) {\n          var v = value[i];\n          result += HexCharacters[(v & 240) >> 4] + HexCharacters[v & 15];\n        }\n        return result;\n      }\n      return logger.throwArgumentError(\"invalid hexlify value\", \"value\", value);\n    }\n    exports2.hexlify = hexlify;\n    function hexDataLength(data) {\n      if (typeof data !== \"string\") {\n        data = hexlify(data);\n      } else if (!isHexString(data) || data.length % 2) {\n        return null;\n      }\n      return (data.length - 2) / 2;\n    }\n    exports2.hexDataLength = hexDataLength;\n    function hexDataSlice(data, offset, endOffset) {\n      if (typeof data !== \"string\") {\n        data = hexlify(data);\n      } else if (!isHexString(data) || data.length % 2) {\n        logger.throwArgumentError(\"invalid hexData\", \"value\", data);\n      }\n      offset = 2 + 2 * offset;\n      if (endOffset != null) {\n        return \"0x\" + data.substring(offset, 2 + 2 * endOffset);\n      }\n      return \"0x\" + data.substring(offset);\n    }\n    exports2.hexDataSlice = hexDataSlice;\n    function hexConcat(items) {\n      var result = \"0x\";\n      items.forEach(function(item) {\n        result += hexlify(item).substring(2);\n      });\n      return result;\n    }\n    exports2.hexConcat = hexConcat;\n    function hexValue(value) {\n      var trimmed = hexStripZeros(hexlify(value, { hexPad: \"left\" }));\n      if (trimmed === \"0x\") {\n        return \"0x0\";\n      }\n      return trimmed;\n    }\n    exports2.hexValue = hexValue;\n    function hexStripZeros(value) {\n      if (typeof value !== \"string\") {\n        value = hexlify(value);\n      }\n      if (!isHexString(value)) {\n        logger.throwArgumentError(\"invalid hex string\", \"value\", value);\n      }\n      value = value.substring(2);\n      var offset = 0;\n      while (offset < value.length && value[offset] === \"0\") {\n        offset++;\n      }\n      return \"0x\" + value.substring(offset);\n    }\n    exports2.hexStripZeros = hexStripZeros;\n    function hexZeroPad(value, length) {\n      if (typeof value !== \"string\") {\n        value = hexlify(value);\n      } else if (!isHexString(value)) {\n        logger.throwArgumentError(\"invalid hex string\", \"value\", value);\n      }\n      if (value.length > 2 * length + 2) {\n        logger.throwArgumentError(\"value out of range\", \"value\", arguments[1]);\n      }\n      while (value.length < 2 * length + 2) {\n        value = \"0x0\" + value.substring(2);\n      }\n      return value;\n    }\n    exports2.hexZeroPad = hexZeroPad;\n    function splitSignature(signature) {\n      var result = {\n        r: \"0x\",\n        s: \"0x\",\n        _vs: \"0x\",\n        recoveryParam: 0,\n        v: 0\n      };\n      if (isBytesLike(signature)) {\n        var bytes = arrayify(signature);\n        if (bytes.length !== 65) {\n          logger.throwArgumentError(\"invalid signature string; must be 65 bytes\", \"signature\", signature);\n        }\n        result.r = hexlify(bytes.slice(0, 32));\n        result.s = hexlify(bytes.slice(32, 64));\n        result.v = bytes[64];\n        if (result.v < 27) {\n          if (result.v === 0 || result.v === 1) {\n            result.v += 27;\n          } else {\n            logger.throwArgumentError(\"signature invalid v byte\", \"signature\", signature);\n          }\n        }\n        result.recoveryParam = 1 - result.v % 2;\n        if (result.recoveryParam) {\n          bytes[32] |= 128;\n        }\n        result._vs = hexlify(bytes.slice(32, 64));\n      } else {\n        result.r = signature.r;\n        result.s = signature.s;\n        result.v = signature.v;\n        result.recoveryParam = signature.recoveryParam;\n        result._vs = signature._vs;\n        if (result._vs != null) {\n          var vs_1 = zeroPad(arrayify(result._vs), 32);\n          result._vs = hexlify(vs_1);\n          var recoveryParam = vs_1[0] >= 128 ? 1 : 0;\n          if (result.recoveryParam == null) {\n            result.recoveryParam = recoveryParam;\n          } else if (result.recoveryParam !== recoveryParam) {\n            logger.throwArgumentError(\"signature recoveryParam mismatch _vs\", \"signature\", signature);\n          }\n          vs_1[0] &= 127;\n          var s = hexlify(vs_1);\n          if (result.s == null) {\n            result.s = s;\n          } else if (result.s !== s) {\n            logger.throwArgumentError(\"signature v mismatch _vs\", \"signature\", signature);\n          }\n        }\n        if (result.recoveryParam == null) {\n          if (result.v == null) {\n            logger.throwArgumentError(\"signature missing v and recoveryParam\", \"signature\", signature);\n          } else if (result.v === 0 || result.v === 1) {\n            result.recoveryParam = result.v;\n          } else {\n            result.recoveryParam = 1 - result.v % 2;\n          }\n        } else {\n          if (result.v == null) {\n            result.v = 27 + result.recoveryParam;\n          } else {\n            var recId = result.v === 0 || result.v === 1 ? result.v : 1 - result.v % 2;\n            if (result.recoveryParam !== recId) {\n              logger.throwArgumentError(\"signature recoveryParam mismatch v\", \"signature\", signature);\n            }\n          }\n        }\n        if (result.r == null || !isHexString(result.r)) {\n          logger.throwArgumentError(\"signature missing or invalid r\", \"signature\", signature);\n        } else {\n          result.r = hexZeroPad(result.r, 32);\n        }\n        if (result.s == null || !isHexString(result.s)) {\n          logger.throwArgumentError(\"signature missing or invalid s\", \"signature\", signature);\n        } else {\n          result.s = hexZeroPad(result.s, 32);\n        }\n        var vs = arrayify(result.s);\n        if (vs[0] >= 128) {\n          logger.throwArgumentError(\"signature s out of range\", \"signature\", signature);\n        }\n        if (result.recoveryParam) {\n          vs[0] |= 128;\n        }\n        var _vs = hexlify(vs);\n        if (result._vs) {\n          if (!isHexString(result._vs)) {\n            logger.throwArgumentError(\"signature invalid _vs\", \"signature\", signature);\n          }\n          result._vs = hexZeroPad(result._vs, 32);\n        }\n        if (result._vs == null) {\n          result._vs = _vs;\n        } else if (result._vs !== _vs) {\n          logger.throwArgumentError(\"signature _vs mismatch v and s\", \"signature\", signature);\n        }\n      }\n      return result;\n    }\n    exports2.splitSignature = splitSignature;\n    function joinSignature(signature) {\n      signature = splitSignature(signature);\n      return hexlify(concat([\n        signature.r,\n        signature.s,\n        signature.recoveryParam ? \"0x1c\" : \"0x1b\"\n      ]));\n    }\n    exports2.joinSignature = joinSignature;\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/_version.js\nvar require_version3 = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"bignumber/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/bignumber.js\nvar require_bignumber = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/bignumber.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._base16To36 = exports2._base36To16 = exports2.BigNumber = exports2.isBigNumberish = void 0;\n    var bn_js_1 = __importDefault(require_bn());\n    var BN = bn_js_1.default.BN;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version3();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _constructorGuard = {};\n    var MAX_SAFE = 9007199254740991;\n    function isBigNumberish(value) {\n      return value != null && (BigNumber.isBigNumber(value) || typeof value === \"number\" && value % 1 === 0 || typeof value === \"string\" && !!value.match(/^-?[0-9]+$/) || (0, bytes_1.isHexString)(value) || typeof value === \"bigint\" || (0, bytes_1.isBytes)(value));\n    }\n    exports2.isBigNumberish = isBigNumberish;\n    var _warnedToStringRadix = false;\n    var BigNumber = (\n      /** @class */\n      function() {\n        function BigNumber2(constructorGuard, hex) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, BigNumber2);\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot call constructor directly; use BigNumber.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new (BigNumber)\"\n            });\n          }\n          this._hex = hex;\n          this._isBigNumber = true;\n          Object.freeze(this);\n        }\n        BigNumber2.prototype.fromTwos = function(value) {\n          return toBigNumber(toBN(this).fromTwos(value));\n        };\n        BigNumber2.prototype.toTwos = function(value) {\n          return toBigNumber(toBN(this).toTwos(value));\n        };\n        BigNumber2.prototype.abs = function() {\n          if (this._hex[0] === \"-\") {\n            return BigNumber2.from(this._hex.substring(1));\n          }\n          return this;\n        };\n        BigNumber2.prototype.add = function(other) {\n          return toBigNumber(toBN(this).add(toBN(other)));\n        };\n        BigNumber2.prototype.sub = function(other) {\n          return toBigNumber(toBN(this).sub(toBN(other)));\n        };\n        BigNumber2.prototype.div = function(other) {\n          var o = BigNumber2.from(other);\n          if (o.isZero()) {\n            throwFault(\"division by zero\", \"div\");\n          }\n          return toBigNumber(toBN(this).div(toBN(other)));\n        };\n        BigNumber2.prototype.mul = function(other) {\n          return toBigNumber(toBN(this).mul(toBN(other)));\n        };\n        BigNumber2.prototype.mod = function(other) {\n          var value = toBN(other);\n          if (value.isNeg()) {\n            throwFault(\"cannot modulo negative values\", \"mod\");\n          }\n          return toBigNumber(toBN(this).umod(value));\n        };\n        BigNumber2.prototype.pow = function(other) {\n          var value = toBN(other);\n          if (value.isNeg()) {\n            throwFault(\"cannot raise to negative values\", \"pow\");\n          }\n          return toBigNumber(toBN(this).pow(value));\n        };\n        BigNumber2.prototype.and = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'and' negative values\", \"and\");\n          }\n          return toBigNumber(toBN(this).and(value));\n        };\n        BigNumber2.prototype.or = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'or' negative values\", \"or\");\n          }\n          return toBigNumber(toBN(this).or(value));\n        };\n        BigNumber2.prototype.xor = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'xor' negative values\", \"xor\");\n          }\n          return toBigNumber(toBN(this).xor(value));\n        };\n        BigNumber2.prototype.mask = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot mask negative values\", \"mask\");\n          }\n          return toBigNumber(toBN(this).maskn(value));\n        };\n        BigNumber2.prototype.shl = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot shift negative values\", \"shl\");\n          }\n          return toBigNumber(toBN(this).shln(value));\n        };\n        BigNumber2.prototype.shr = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot shift negative values\", \"shr\");\n          }\n          return toBigNumber(toBN(this).shrn(value));\n        };\n        BigNumber2.prototype.eq = function(other) {\n          return toBN(this).eq(toBN(other));\n        };\n        BigNumber2.prototype.lt = function(other) {\n          return toBN(this).lt(toBN(other));\n        };\n        BigNumber2.prototype.lte = function(other) {\n          return toBN(this).lte(toBN(other));\n        };\n        BigNumber2.prototype.gt = function(other) {\n          return toBN(this).gt(toBN(other));\n        };\n        BigNumber2.prototype.gte = function(other) {\n          return toBN(this).gte(toBN(other));\n        };\n        BigNumber2.prototype.isNegative = function() {\n          return this._hex[0] === \"-\";\n        };\n        BigNumber2.prototype.isZero = function() {\n          return toBN(this).isZero();\n        };\n        BigNumber2.prototype.toNumber = function() {\n          try {\n            return toBN(this).toNumber();\n          } catch (error) {\n            throwFault(\"overflow\", \"toNumber\", this.toString());\n          }\n          return null;\n        };\n        BigNumber2.prototype.toBigInt = function() {\n          try {\n            return BigInt(this.toString());\n          } catch (e) {\n          }\n          return logger.throwError(\"this platform does not support BigInt\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            value: this.toString()\n          });\n        };\n        BigNumber2.prototype.toString = function() {\n          if (arguments.length > 0) {\n            if (arguments[0] === 10) {\n              if (!_warnedToStringRadix) {\n                _warnedToStringRadix = true;\n                logger.warn(\"BigNumber.toString does not accept any parameters; base-10 is assumed\");\n              }\n            } else if (arguments[0] === 16) {\n              logger.throwError(\"BigNumber.toString does not accept any parameters; use bigNumber.toHexString()\", logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {});\n            } else {\n              logger.throwError(\"BigNumber.toString does not accept parameters\", logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {});\n            }\n          }\n          return toBN(this).toString(10);\n        };\n        BigNumber2.prototype.toHexString = function() {\n          return this._hex;\n        };\n        BigNumber2.prototype.toJSON = function(key) {\n          return { type: \"BigNumber\", hex: this.toHexString() };\n        };\n        BigNumber2.from = function(value) {\n          if (value instanceof BigNumber2) {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            if (value.match(/^-?0x[0-9a-f]+$/i)) {\n              return new BigNumber2(_constructorGuard, toHex(value));\n            }\n            if (value.match(/^-?[0-9]+$/)) {\n              return new BigNumber2(_constructorGuard, toHex(new BN(value)));\n            }\n            return logger.throwArgumentError(\"invalid BigNumber string\", \"value\", value);\n          }\n          if (typeof value === \"number\") {\n            if (value % 1) {\n              throwFault(\"underflow\", \"BigNumber.from\", value);\n            }\n            if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n              throwFault(\"overflow\", \"BigNumber.from\", value);\n            }\n            return BigNumber2.from(String(value));\n          }\n          var anyValue = value;\n          if (typeof anyValue === \"bigint\") {\n            return BigNumber2.from(anyValue.toString());\n          }\n          if ((0, bytes_1.isBytes)(anyValue)) {\n            return BigNumber2.from((0, bytes_1.hexlify)(anyValue));\n          }\n          if (anyValue) {\n            if (anyValue.toHexString) {\n              var hex = anyValue.toHexString();\n              if (typeof hex === \"string\") {\n                return BigNumber2.from(hex);\n              }\n            } else {\n              var hex = anyValue._hex;\n              if (hex == null && anyValue.type === \"BigNumber\") {\n                hex = anyValue.hex;\n              }\n              if (typeof hex === \"string\") {\n                if ((0, bytes_1.isHexString)(hex) || hex[0] === \"-\" && (0, bytes_1.isHexString)(hex.substring(1))) {\n                  return BigNumber2.from(hex);\n                }\n              }\n            }\n          }\n          return logger.throwArgumentError(\"invalid BigNumber value\", \"value\", value);\n        };\n        BigNumber2.isBigNumber = function(value) {\n          return !!(value && value._isBigNumber);\n        };\n        return BigNumber2;\n      }()\n    );\n    exports2.BigNumber = BigNumber;\n    function toHex(value) {\n      if (typeof value !== \"string\") {\n        return toHex(value.toString(16));\n      }\n      if (value[0] === \"-\") {\n        value = value.substring(1);\n        if (value[0] === \"-\") {\n          logger.throwArgumentError(\"invalid hex\", \"value\", value);\n        }\n        value = toHex(value);\n        if (value === \"0x00\") {\n          return value;\n        }\n        return \"-\" + value;\n      }\n      if (value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (value === \"0x\") {\n        return \"0x00\";\n      }\n      if (value.length % 2) {\n        value = \"0x0\" + value.substring(2);\n      }\n      while (value.length > 4 && value.substring(0, 4) === \"0x00\") {\n        value = \"0x\" + value.substring(4);\n      }\n      return value;\n    }\n    function toBigNumber(value) {\n      return BigNumber.from(toHex(value));\n    }\n    function toBN(value) {\n      var hex = BigNumber.from(value).toHexString();\n      if (hex[0] === \"-\") {\n        return new BN(\"-\" + hex.substring(3), 16);\n      }\n      return new BN(hex.substring(2), 16);\n    }\n    function throwFault(fault, operation, value) {\n      var params = { fault, operation };\n      if (value != null) {\n        params.value = value;\n      }\n      return logger.throwError(fault, logger_1.Logger.errors.NUMERIC_FAULT, params);\n    }\n    function _base36To16(value) {\n      return new BN(value, 36).toString(16);\n    }\n    exports2._base36To16 = _base36To16;\n    function _base16To36(value) {\n      return new BN(value, 16).toString(36);\n    }\n    exports2._base16To36 = _base16To36;\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/fixednumber.js\nvar require_fixednumber = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/fixednumber.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FixedNumber = exports2.FixedFormat = exports2.parseFixed = exports2.formatFixed = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version3();\n    var logger = new logger_1.Logger(_version_1.version);\n    var bignumber_1 = require_bignumber();\n    var _constructorGuard = {};\n    var Zero = bignumber_1.BigNumber.from(0);\n    var NegativeOne = bignumber_1.BigNumber.from(-1);\n    function throwFault(message, fault, operation, value) {\n      var params = { fault, operation };\n      if (value !== void 0) {\n        params.value = value;\n      }\n      return logger.throwError(message, logger_1.Logger.errors.NUMERIC_FAULT, params);\n    }\n    var zeros = \"0\";\n    while (zeros.length < 256) {\n      zeros += zeros;\n    }\n    function getMultiplier(decimals) {\n      if (typeof decimals !== \"number\") {\n        try {\n          decimals = bignumber_1.BigNumber.from(decimals).toNumber();\n        } catch (e) {\n        }\n      }\n      if (typeof decimals === \"number\" && decimals >= 0 && decimals <= 256 && !(decimals % 1)) {\n        return \"1\" + zeros.substring(0, decimals);\n      }\n      return logger.throwArgumentError(\"invalid decimal size\", \"decimals\", decimals);\n    }\n    function formatFixed(value, decimals) {\n      if (decimals == null) {\n        decimals = 0;\n      }\n      var multiplier = getMultiplier(decimals);\n      value = bignumber_1.BigNumber.from(value);\n      var negative = value.lt(Zero);\n      if (negative) {\n        value = value.mul(NegativeOne);\n      }\n      var fraction = value.mod(multiplier).toString();\n      while (fraction.length < multiplier.length - 1) {\n        fraction = \"0\" + fraction;\n      }\n      fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1];\n      var whole = value.div(multiplier).toString();\n      if (multiplier.length === 1) {\n        value = whole;\n      } else {\n        value = whole + \".\" + fraction;\n      }\n      if (negative) {\n        value = \"-\" + value;\n      }\n      return value;\n    }\n    exports2.formatFixed = formatFixed;\n    function parseFixed(value, decimals) {\n      if (decimals == null) {\n        decimals = 0;\n      }\n      var multiplier = getMultiplier(decimals);\n      if (typeof value !== \"string\" || !value.match(/^-?[0-9.]+$/)) {\n        logger.throwArgumentError(\"invalid decimal value\", \"value\", value);\n      }\n      var negative = value.substring(0, 1) === \"-\";\n      if (negative) {\n        value = value.substring(1);\n      }\n      if (value === \".\") {\n        logger.throwArgumentError(\"missing value\", \"value\", value);\n      }\n      var comps = value.split(\".\");\n      if (comps.length > 2) {\n        logger.throwArgumentError(\"too many decimal points\", \"value\", value);\n      }\n      var whole = comps[0], fraction = comps[1];\n      if (!whole) {\n        whole = \"0\";\n      }\n      if (!fraction) {\n        fraction = \"0\";\n      }\n      while (fraction[fraction.length - 1] === \"0\") {\n        fraction = fraction.substring(0, fraction.length - 1);\n      }\n      if (fraction.length > multiplier.length - 1) {\n        throwFault(\"fractional component exceeds decimals\", \"underflow\", \"parseFixed\");\n      }\n      if (fraction === \"\") {\n        fraction = \"0\";\n      }\n      while (fraction.length < multiplier.length - 1) {\n        fraction += \"0\";\n      }\n      var wholeValue = bignumber_1.BigNumber.from(whole);\n      var fractionValue = bignumber_1.BigNumber.from(fraction);\n      var wei = wholeValue.mul(multiplier).add(fractionValue);\n      if (negative) {\n        wei = wei.mul(NegativeOne);\n      }\n      return wei;\n    }\n    exports2.parseFixed = parseFixed;\n    var FixedFormat = (\n      /** @class */\n      function() {\n        function FixedFormat2(constructorGuard, signed, width, decimals) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot use FixedFormat constructor; use FixedFormat.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new FixedFormat\"\n            });\n          }\n          this.signed = signed;\n          this.width = width;\n          this.decimals = decimals;\n          this.name = (signed ? \"\" : \"u\") + \"fixed\" + String(width) + \"x\" + String(decimals);\n          this._multiplier = getMultiplier(decimals);\n          Object.freeze(this);\n        }\n        FixedFormat2.from = function(value) {\n          if (value instanceof FixedFormat2) {\n            return value;\n          }\n          if (typeof value === \"number\") {\n            value = \"fixed128x\" + value;\n          }\n          var signed = true;\n          var width = 128;\n          var decimals = 18;\n          if (typeof value === \"string\") {\n            if (value === \"fixed\") {\n            } else if (value === \"ufixed\") {\n              signed = false;\n            } else {\n              var match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/);\n              if (!match) {\n                logger.throwArgumentError(\"invalid fixed format\", \"format\", value);\n              }\n              signed = match[1] !== \"u\";\n              width = parseInt(match[2]);\n              decimals = parseInt(match[3]);\n            }\n          } else if (value) {\n            var check = function(key, type, defaultValue) {\n              if (value[key] == null) {\n                return defaultValue;\n              }\n              if (typeof value[key] !== type) {\n                logger.throwArgumentError(\"invalid fixed format (\" + key + \" not \" + type + \")\", \"format.\" + key, value[key]);\n              }\n              return value[key];\n            };\n            signed = check(\"signed\", \"boolean\", signed);\n            width = check(\"width\", \"number\", width);\n            decimals = check(\"decimals\", \"number\", decimals);\n          }\n          if (width % 8) {\n            logger.throwArgumentError(\"invalid fixed format width (not byte aligned)\", \"format.width\", width);\n          }\n          if (decimals > 80) {\n            logger.throwArgumentError(\"invalid fixed format (decimals too large)\", \"format.decimals\", decimals);\n          }\n          return new FixedFormat2(_constructorGuard, signed, width, decimals);\n        };\n        return FixedFormat2;\n      }()\n    );\n    exports2.FixedFormat = FixedFormat;\n    var FixedNumber = (\n      /** @class */\n      function() {\n        function FixedNumber2(constructorGuard, hex, value, format) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, FixedNumber2);\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot use FixedNumber constructor; use FixedNumber.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new FixedFormat\"\n            });\n          }\n          this.format = format;\n          this._hex = hex;\n          this._value = value;\n          this._isFixedNumber = true;\n          Object.freeze(this);\n        }\n        FixedNumber2.prototype._checkFormat = function(other) {\n          if (this.format.name !== other.format.name) {\n            logger.throwArgumentError(\"incompatible format; use fixedNumber.toFormat\", \"other\", other);\n          }\n        };\n        FixedNumber2.prototype.addUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.add(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.subUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.sub(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.mulUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.mul(b).div(this.format._multiplier), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.divUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.mul(this.format._multiplier).div(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.floor = function() {\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          var result = FixedNumber2.from(comps[0], this.format);\n          var hasFraction = !comps[1].match(/^(0*)$/);\n          if (this.isNegative() && hasFraction) {\n            result = result.subUnsafe(ONE.toFormat(result.format));\n          }\n          return result;\n        };\n        FixedNumber2.prototype.ceiling = function() {\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          var result = FixedNumber2.from(comps[0], this.format);\n          var hasFraction = !comps[1].match(/^(0*)$/);\n          if (!this.isNegative() && hasFraction) {\n            result = result.addUnsafe(ONE.toFormat(result.format));\n          }\n          return result;\n        };\n        FixedNumber2.prototype.round = function(decimals) {\n          if (decimals == null) {\n            decimals = 0;\n          }\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          if (decimals < 0 || decimals > 80 || decimals % 1) {\n            logger.throwArgumentError(\"invalid decimal count\", \"decimals\", decimals);\n          }\n          if (comps[1].length <= decimals) {\n            return this;\n          }\n          var factor = FixedNumber2.from(\"1\" + zeros.substring(0, decimals), this.format);\n          var bump = BUMP.toFormat(this.format);\n          return this.mulUnsafe(factor).addUnsafe(bump).floor().divUnsafe(factor);\n        };\n        FixedNumber2.prototype.isZero = function() {\n          return this._value === \"0.0\" || this._value === \"0\";\n        };\n        FixedNumber2.prototype.isNegative = function() {\n          return this._value[0] === \"-\";\n        };\n        FixedNumber2.prototype.toString = function() {\n          return this._value;\n        };\n        FixedNumber2.prototype.toHexString = function(width) {\n          if (width == null) {\n            return this._hex;\n          }\n          if (width % 8) {\n            logger.throwArgumentError(\"invalid byte width\", \"width\", width);\n          }\n          var hex = bignumber_1.BigNumber.from(this._hex).fromTwos(this.format.width).toTwos(width).toHexString();\n          return (0, bytes_1.hexZeroPad)(hex, width / 8);\n        };\n        FixedNumber2.prototype.toUnsafeFloat = function() {\n          return parseFloat(this.toString());\n        };\n        FixedNumber2.prototype.toFormat = function(format) {\n          return FixedNumber2.fromString(this._value, format);\n        };\n        FixedNumber2.fromValue = function(value, decimals, format) {\n          if (format == null && decimals != null && !(0, bignumber_1.isBigNumberish)(decimals)) {\n            format = decimals;\n            decimals = null;\n          }\n          if (decimals == null) {\n            decimals = 0;\n          }\n          if (format == null) {\n            format = \"fixed\";\n          }\n          return FixedNumber2.fromString(formatFixed(value, decimals), FixedFormat.from(format));\n        };\n        FixedNumber2.fromString = function(value, format) {\n          if (format == null) {\n            format = \"fixed\";\n          }\n          var fixedFormat = FixedFormat.from(format);\n          var numeric = parseFixed(value, fixedFormat.decimals);\n          if (!fixedFormat.signed && numeric.lt(Zero)) {\n            throwFault(\"unsigned value cannot be negative\", \"overflow\", \"value\", value);\n          }\n          var hex = null;\n          if (fixedFormat.signed) {\n            hex = numeric.toTwos(fixedFormat.width).toHexString();\n          } else {\n            hex = numeric.toHexString();\n            hex = (0, bytes_1.hexZeroPad)(hex, fixedFormat.width / 8);\n          }\n          var decimal = formatFixed(numeric, fixedFormat.decimals);\n          return new FixedNumber2(_constructorGuard, hex, decimal, fixedFormat);\n        };\n        FixedNumber2.fromBytes = function(value, format) {\n          if (format == null) {\n            format = \"fixed\";\n          }\n          var fixedFormat = FixedFormat.from(format);\n          if ((0, bytes_1.arrayify)(value).length > fixedFormat.width / 8) {\n            throw new Error(\"overflow\");\n          }\n          var numeric = bignumber_1.BigNumber.from(value);\n          if (fixedFormat.signed) {\n            numeric = numeric.fromTwos(fixedFormat.width);\n          }\n          var hex = numeric.toTwos((fixedFormat.signed ? 0 : 1) + fixedFormat.width).toHexString();\n          var decimal = formatFixed(numeric, fixedFormat.decimals);\n          return new FixedNumber2(_constructorGuard, hex, decimal, fixedFormat);\n        };\n        FixedNumber2.from = function(value, format) {\n          if (typeof value === \"string\") {\n            return FixedNumber2.fromString(value, format);\n          }\n          if ((0, bytes_1.isBytes)(value)) {\n            return FixedNumber2.fromBytes(value, format);\n          }\n          try {\n            return FixedNumber2.fromValue(value, 0, format);\n          } catch (error) {\n            if (error.code !== logger_1.Logger.errors.INVALID_ARGUMENT) {\n              throw error;\n            }\n          }\n          return logger.throwArgumentError(\"invalid FixedNumber value\", \"value\", value);\n        };\n        FixedNumber2.isFixedNumber = function(value) {\n          return !!(value && value._isFixedNumber);\n        };\n        return FixedNumber2;\n      }()\n    );\n    exports2.FixedNumber = FixedNumber;\n    var ONE = FixedNumber.from(1);\n    var BUMP = FixedNumber.from(\"0.5\");\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/index.js\nvar require_lib3 = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._base36To16 = exports2._base16To36 = exports2.parseFixed = exports2.FixedNumber = exports2.FixedFormat = exports2.formatFixed = exports2.BigNumber = void 0;\n    var bignumber_1 = require_bignumber();\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return bignumber_1.BigNumber;\n    } });\n    var fixednumber_1 = require_fixednumber();\n    Object.defineProperty(exports2, \"formatFixed\", { enumerable: true, get: function() {\n      return fixednumber_1.formatFixed;\n    } });\n    Object.defineProperty(exports2, \"FixedFormat\", { enumerable: true, get: function() {\n      return fixednumber_1.FixedFormat;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return fixednumber_1.FixedNumber;\n    } });\n    Object.defineProperty(exports2, \"parseFixed\", { enumerable: true, get: function() {\n      return fixednumber_1.parseFixed;\n    } });\n    var bignumber_2 = require_bignumber();\n    Object.defineProperty(exports2, \"_base16To36\", { enumerable: true, get: function() {\n      return bignumber_2._base16To36;\n    } });\n    Object.defineProperty(exports2, \"_base36To16\", { enumerable: true, get: function() {\n      return bignumber_2._base36To16;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/properties/lib/_version.js\nvar require_version4 = __commonJS({\n  \"node_modules/@ethersproject/properties/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"properties/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/properties/lib/index.js\nvar require_lib4 = __commonJS({\n  \"node_modules/@ethersproject/properties/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Description = exports2.deepCopy = exports2.shallowCopy = exports2.checkProperties = exports2.resolveProperties = exports2.getStatic = exports2.defineReadOnly = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version4();\n    var logger = new logger_1.Logger(_version_1.version);\n    function defineReadOnly(object, name2, value) {\n      Object.defineProperty(object, name2, {\n        enumerable: true,\n        value,\n        writable: false\n      });\n    }\n    exports2.defineReadOnly = defineReadOnly;\n    function getStatic(ctor, key) {\n      for (var i = 0; i < 32; i++) {\n        if (ctor[key]) {\n          return ctor[key];\n        }\n        if (!ctor.prototype || typeof ctor.prototype !== \"object\") {\n          break;\n        }\n        ctor = Object.getPrototypeOf(ctor.prototype).constructor;\n      }\n      return null;\n    }\n    exports2.getStatic = getStatic;\n    function resolveProperties(object) {\n      return __awaiter(this, void 0, void 0, function() {\n        var promises, results;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              promises = Object.keys(object).map(function(key) {\n                var value = object[key];\n                return Promise.resolve(value).then(function(v) {\n                  return { key, value: v };\n                });\n              });\n              return [4, Promise.all(promises)];\n            case 1:\n              results = _a.sent();\n              return [2, results.reduce(function(accum, result) {\n                accum[result.key] = result.value;\n                return accum;\n              }, {})];\n          }\n        });\n      });\n    }\n    exports2.resolveProperties = resolveProperties;\n    function checkProperties(object, properties) {\n      if (!object || typeof object !== \"object\") {\n        logger.throwArgumentError(\"invalid object\", \"object\", object);\n      }\n      Object.keys(object).forEach(function(key) {\n        if (!properties[key]) {\n          logger.throwArgumentError(\"invalid object key - \" + key, \"transaction:\" + key, object);\n        }\n      });\n    }\n    exports2.checkProperties = checkProperties;\n    function shallowCopy(object) {\n      var result = {};\n      for (var key in object) {\n        result[key] = object[key];\n      }\n      return result;\n    }\n    exports2.shallowCopy = shallowCopy;\n    var opaque = { bigint: true, boolean: true, \"function\": true, number: true, string: true };\n    function _isFrozen(object) {\n      if (object === void 0 || object === null || opaque[typeof object]) {\n        return true;\n      }\n      if (Array.isArray(object) || typeof object === \"object\") {\n        if (!Object.isFrozen(object)) {\n          return false;\n        }\n        var keys = Object.keys(object);\n        for (var i = 0; i < keys.length; i++) {\n          var value = null;\n          try {\n            value = object[keys[i]];\n          } catch (error) {\n            continue;\n          }\n          if (!_isFrozen(value)) {\n            return false;\n          }\n        }\n        return true;\n      }\n      return logger.throwArgumentError(\"Cannot deepCopy \" + typeof object, \"object\", object);\n    }\n    function _deepCopy(object) {\n      if (_isFrozen(object)) {\n        return object;\n      }\n      if (Array.isArray(object)) {\n        return Object.freeze(object.map(function(item) {\n          return deepCopy(item);\n        }));\n      }\n      if (typeof object === \"object\") {\n        var result = {};\n        for (var key in object) {\n          var value = object[key];\n          if (value === void 0) {\n            continue;\n          }\n          defineReadOnly(result, key, deepCopy(value));\n        }\n        return result;\n      }\n      return logger.throwArgumentError(\"Cannot deepCopy \" + typeof object, \"object\", object);\n    }\n    function deepCopy(object) {\n      return _deepCopy(object);\n    }\n    exports2.deepCopy = deepCopy;\n    var Description = (\n      /** @class */\n      /* @__PURE__ */ function() {\n        function Description2(info) {\n          for (var key in info) {\n            this[key] = deepCopy(info[key]);\n          }\n        }\n        return Description2;\n      }()\n    );\n    exports2.Description = Description;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/_version.js\nvar require_version5 = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abi/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/fragments.js\nvar require_fragments = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/fragments.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ErrorFragment = exports2.FunctionFragment = exports2.ConstructorFragment = exports2.EventFragment = exports2.Fragment = exports2.ParamType = exports2.FormatTypes = void 0;\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _constructorGuard = {};\n    var ModifiersBytes = { calldata: true, memory: true, storage: true };\n    var ModifiersNest = { calldata: true, memory: true };\n    function checkModifier(type, name2) {\n      if (type === \"bytes\" || type === \"string\") {\n        if (ModifiersBytes[name2]) {\n          return true;\n        }\n      } else if (type === \"address\") {\n        if (name2 === \"payable\") {\n          return true;\n        }\n      } else if (type.indexOf(\"[\") >= 0 || type === \"tuple\") {\n        if (ModifiersNest[name2]) {\n          return true;\n        }\n      }\n      if (ModifiersBytes[name2] || name2 === \"payable\") {\n        logger.throwArgumentError(\"invalid modifier\", \"name\", name2);\n      }\n      return false;\n    }\n    function parseParamType(param, allowIndexed) {\n      var originalParam = param;\n      function throwError(i2) {\n        logger.throwArgumentError(\"unexpected character at position \" + i2, \"param\", param);\n      }\n      param = param.replace(/\\s/g, \" \");\n      function newNode(parent2) {\n        var node2 = { type: \"\", name: \"\", parent: parent2, state: { allowType: true } };\n        if (allowIndexed) {\n          node2.indexed = false;\n        }\n        return node2;\n      }\n      var parent = { type: \"\", name: \"\", state: { allowType: true } };\n      var node = parent;\n      for (var i = 0; i < param.length; i++) {\n        var c = param[i];\n        switch (c) {\n          case \"(\":\n            if (node.state.allowType && node.type === \"\") {\n              node.type = \"tuple\";\n            } else if (!node.state.allowParams) {\n              throwError(i);\n            }\n            node.state.allowType = false;\n            node.type = verifyType(node.type);\n            node.components = [newNode(node)];\n            node = node.components[0];\n            break;\n          case \")\":\n            delete node.state;\n            if (node.name === \"indexed\") {\n              if (!allowIndexed) {\n                throwError(i);\n              }\n              node.indexed = true;\n              node.name = \"\";\n            }\n            if (checkModifier(node.type, node.name)) {\n              node.name = \"\";\n            }\n            node.type = verifyType(node.type);\n            var child = node;\n            node = node.parent;\n            if (!node) {\n              throwError(i);\n            }\n            delete child.parent;\n            node.state.allowParams = false;\n            node.state.allowName = true;\n            node.state.allowArray = true;\n            break;\n          case \",\":\n            delete node.state;\n            if (node.name === \"indexed\") {\n              if (!allowIndexed) {\n                throwError(i);\n              }\n              node.indexed = true;\n              node.name = \"\";\n            }\n            if (checkModifier(node.type, node.name)) {\n              node.name = \"\";\n            }\n            node.type = verifyType(node.type);\n            var sibling = newNode(node.parent);\n            node.parent.components.push(sibling);\n            delete node.parent;\n            node = sibling;\n            break;\n          case \" \":\n            if (node.state.allowType) {\n              if (node.type !== \"\") {\n                node.type = verifyType(node.type);\n                delete node.state.allowType;\n                node.state.allowName = true;\n                node.state.allowParams = true;\n              }\n            }\n            if (node.state.allowName) {\n              if (node.name !== \"\") {\n                if (node.name === \"indexed\") {\n                  if (!allowIndexed) {\n                    throwError(i);\n                  }\n                  if (node.indexed) {\n                    throwError(i);\n                  }\n                  node.indexed = true;\n                  node.name = \"\";\n                } else if (checkModifier(node.type, node.name)) {\n                  node.name = \"\";\n                } else {\n                  node.state.allowName = false;\n                }\n              }\n            }\n            break;\n          case \"[\":\n            if (!node.state.allowArray) {\n              throwError(i);\n            }\n            node.type += c;\n            node.state.allowArray = false;\n            node.state.allowName = false;\n            node.state.readArray = true;\n            break;\n          case \"]\":\n            if (!node.state.readArray) {\n              throwError(i);\n            }\n            node.type += c;\n            node.state.readArray = false;\n            node.state.allowArray = true;\n            node.state.allowName = true;\n            break;\n          default:\n            if (node.state.allowType) {\n              node.type += c;\n              node.state.allowParams = true;\n              node.state.allowArray = true;\n            } else if (node.state.allowName) {\n              node.name += c;\n              delete node.state.allowArray;\n            } else if (node.state.readArray) {\n              node.type += c;\n            } else {\n              throwError(i);\n            }\n        }\n      }\n      if (node.parent) {\n        logger.throwArgumentError(\"unexpected eof\", \"param\", param);\n      }\n      delete parent.state;\n      if (node.name === \"indexed\") {\n        if (!allowIndexed) {\n          throwError(originalParam.length - 7);\n        }\n        if (node.indexed) {\n          throwError(originalParam.length - 7);\n        }\n        node.indexed = true;\n        node.name = \"\";\n      } else if (checkModifier(node.type, node.name)) {\n        node.name = \"\";\n      }\n      parent.type = verifyType(parent.type);\n      return parent;\n    }\n    function populate(object, params) {\n      for (var key in params) {\n        (0, properties_1.defineReadOnly)(object, key, params[key]);\n      }\n    }\n    exports2.FormatTypes = Object.freeze({\n      // Bare formatting, as is needed for computing a sighash of an event or function\n      sighash: \"sighash\",\n      // Human-Readable with Minimal spacing and without names (compact human-readable)\n      minimal: \"minimal\",\n      // Human-Readable with nice spacing, including all names\n      full: \"full\",\n      // JSON-format a la Solidity\n      json: \"json\"\n    });\n    var paramTypeArray = new RegExp(/^(.*)\\[([0-9]*)\\]$/);\n    var ParamType = (\n      /** @class */\n      function() {\n        function ParamType2(constructorGuard, params) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"use fromString\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new ParamType()\"\n            });\n          }\n          populate(this, params);\n          var match = this.type.match(paramTypeArray);\n          if (match) {\n            populate(this, {\n              arrayLength: parseInt(match[2] || \"-1\"),\n              arrayChildren: ParamType2.fromObject({\n                type: match[1],\n                components: this.components\n              }),\n              baseType: \"array\"\n            });\n          } else {\n            populate(this, {\n              arrayLength: null,\n              arrayChildren: null,\n              baseType: this.components != null ? \"tuple\" : this.type\n            });\n          }\n          this._isParamType = true;\n          Object.freeze(this);\n        }\n        ParamType2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            var result_1 = {\n              type: this.baseType === \"tuple\" ? \"tuple\" : this.type,\n              name: this.name || void 0\n            };\n            if (typeof this.indexed === \"boolean\") {\n              result_1.indexed = this.indexed;\n            }\n            if (this.components) {\n              result_1.components = this.components.map(function(comp) {\n                return JSON.parse(comp.format(format));\n              });\n            }\n            return JSON.stringify(result_1);\n          }\n          var result = \"\";\n          if (this.baseType === \"array\") {\n            result += this.arrayChildren.format(format);\n            result += \"[\" + (this.arrayLength < 0 ? \"\" : String(this.arrayLength)) + \"]\";\n          } else {\n            if (this.baseType === \"tuple\") {\n              if (format !== exports2.FormatTypes.sighash) {\n                result += this.type;\n              }\n              result += \"(\" + this.components.map(function(comp) {\n                return comp.format(format);\n              }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \")\";\n            } else {\n              result += this.type;\n            }\n          }\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.indexed === true) {\n              result += \" indexed\";\n            }\n            if (format === exports2.FormatTypes.full && this.name) {\n              result += \" \" + this.name;\n            }\n          }\n          return result;\n        };\n        ParamType2.from = function(value, allowIndexed) {\n          if (typeof value === \"string\") {\n            return ParamType2.fromString(value, allowIndexed);\n          }\n          return ParamType2.fromObject(value);\n        };\n        ParamType2.fromObject = function(value) {\n          if (ParamType2.isParamType(value)) {\n            return value;\n          }\n          return new ParamType2(_constructorGuard, {\n            name: value.name || null,\n            type: verifyType(value.type),\n            indexed: value.indexed == null ? null : !!value.indexed,\n            components: value.components ? value.components.map(ParamType2.fromObject) : null\n          });\n        };\n        ParamType2.fromString = function(value, allowIndexed) {\n          function ParamTypify(node) {\n            return ParamType2.fromObject({\n              name: node.name,\n              type: node.type,\n              indexed: node.indexed,\n              components: node.components\n            });\n          }\n          return ParamTypify(parseParamType(value, !!allowIndexed));\n        };\n        ParamType2.isParamType = function(value) {\n          return !!(value != null && value._isParamType);\n        };\n        return ParamType2;\n      }()\n    );\n    exports2.ParamType = ParamType;\n    function parseParams(value, allowIndex) {\n      return splitNesting(value).map(function(param) {\n        return ParamType.fromString(param, allowIndex);\n      });\n    }\n    var Fragment = (\n      /** @class */\n      function() {\n        function Fragment2(constructorGuard, params) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"use a static from method\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new Fragment()\"\n            });\n          }\n          populate(this, params);\n          this._isFragment = true;\n          Object.freeze(this);\n        }\n        Fragment2.from = function(value) {\n          if (Fragment2.isFragment(value)) {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            return Fragment2.fromString(value);\n          }\n          return Fragment2.fromObject(value);\n        };\n        Fragment2.fromObject = function(value) {\n          if (Fragment2.isFragment(value)) {\n            return value;\n          }\n          switch (value.type) {\n            case \"function\":\n              return FunctionFragment.fromObject(value);\n            case \"event\":\n              return EventFragment.fromObject(value);\n            case \"constructor\":\n              return ConstructorFragment.fromObject(value);\n            case \"error\":\n              return ErrorFragment.fromObject(value);\n            case \"fallback\":\n            case \"receive\":\n              return null;\n          }\n          return logger.throwArgumentError(\"invalid fragment object\", \"value\", value);\n        };\n        Fragment2.fromString = function(value) {\n          value = value.replace(/\\s/g, \" \");\n          value = value.replace(/\\(/g, \" (\").replace(/\\)/g, \") \").replace(/\\s+/g, \" \");\n          value = value.trim();\n          if (value.split(\" \")[0] === \"event\") {\n            return EventFragment.fromString(value.substring(5).trim());\n          } else if (value.split(\" \")[0] === \"function\") {\n            return FunctionFragment.fromString(value.substring(8).trim());\n          } else if (value.split(\"(\")[0].trim() === \"constructor\") {\n            return ConstructorFragment.fromString(value.trim());\n          } else if (value.split(\" \")[0] === \"error\") {\n            return ErrorFragment.fromString(value.substring(5).trim());\n          }\n          return logger.throwArgumentError(\"unsupported fragment\", \"value\", value);\n        };\n        Fragment2.isFragment = function(value) {\n          return !!(value && value._isFragment);\n        };\n        return Fragment2;\n      }()\n    );\n    exports2.Fragment = Fragment;\n    var EventFragment = (\n      /** @class */\n      function(_super) {\n        __extends(EventFragment2, _super);\n        function EventFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"event\",\n              anonymous: this.anonymous,\n              name: this.name,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          var result = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result += \"event \";\n          }\n          result += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.anonymous) {\n              result += \"anonymous \";\n            }\n          }\n          return result.trim();\n        };\n        EventFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return EventFragment2.fromString(value);\n          }\n          return EventFragment2.fromObject(value);\n        };\n        EventFragment2.fromObject = function(value) {\n          if (EventFragment2.isEventFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"event\") {\n            logger.throwArgumentError(\"invalid event object\", \"value\", value);\n          }\n          var params = {\n            name: verifyIdentifier(value.name),\n            anonymous: value.anonymous,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            type: \"event\"\n          };\n          return new EventFragment2(_constructorGuard, params);\n        };\n        EventFragment2.fromString = function(value) {\n          var match = value.match(regexParen);\n          if (!match) {\n            logger.throwArgumentError(\"invalid event string\", \"value\", value);\n          }\n          var anonymous = false;\n          match[3].split(\" \").forEach(function(modifier) {\n            switch (modifier.trim()) {\n              case \"anonymous\":\n                anonymous = true;\n                break;\n              case \"\":\n                break;\n              default:\n                logger.warn(\"unknown modifier: \" + modifier);\n            }\n          });\n          return EventFragment2.fromObject({\n            name: match[1].trim(),\n            anonymous,\n            inputs: parseParams(match[2], true),\n            type: \"event\"\n          });\n        };\n        EventFragment2.isEventFragment = function(value) {\n          return value && value._isFragment && value.type === \"event\";\n        };\n        return EventFragment2;\n      }(Fragment)\n    );\n    exports2.EventFragment = EventFragment;\n    function parseGas(value, params) {\n      params.gas = null;\n      var comps = value.split(\"@\");\n      if (comps.length !== 1) {\n        if (comps.length > 2) {\n          logger.throwArgumentError(\"invalid human-readable ABI signature\", \"value\", value);\n        }\n        if (!comps[1].match(/^[0-9]+$/)) {\n          logger.throwArgumentError(\"invalid human-readable ABI signature gas\", \"value\", value);\n        }\n        params.gas = bignumber_1.BigNumber.from(comps[1]);\n        return comps[0];\n      }\n      return value;\n    }\n    function parseModifiers(value, params) {\n      params.constant = false;\n      params.payable = false;\n      params.stateMutability = \"nonpayable\";\n      value.split(\" \").forEach(function(modifier) {\n        switch (modifier.trim()) {\n          case \"constant\":\n            params.constant = true;\n            break;\n          case \"payable\":\n            params.payable = true;\n            params.stateMutability = \"payable\";\n            break;\n          case \"nonpayable\":\n            params.payable = false;\n            params.stateMutability = \"nonpayable\";\n            break;\n          case \"pure\":\n            params.constant = true;\n            params.stateMutability = \"pure\";\n            break;\n          case \"view\":\n            params.constant = true;\n            params.stateMutability = \"view\";\n            break;\n          case \"external\":\n          case \"public\":\n          case \"\":\n            break;\n          default:\n            console.log(\"unknown modifier: \" + modifier);\n        }\n      });\n    }\n    function verifyState(value) {\n      var result = {\n        constant: false,\n        payable: true,\n        stateMutability: \"payable\"\n      };\n      if (value.stateMutability != null) {\n        result.stateMutability = value.stateMutability;\n        result.constant = result.stateMutability === \"view\" || result.stateMutability === \"pure\";\n        if (value.constant != null) {\n          if (!!value.constant !== result.constant) {\n            logger.throwArgumentError(\"cannot have constant function with mutability \" + result.stateMutability, \"value\", value);\n          }\n        }\n        result.payable = result.stateMutability === \"payable\";\n        if (value.payable != null) {\n          if (!!value.payable !== result.payable) {\n            logger.throwArgumentError(\"cannot have payable function with mutability \" + result.stateMutability, \"value\", value);\n          }\n        }\n      } else if (value.payable != null) {\n        result.payable = !!value.payable;\n        if (value.constant == null && !result.payable && value.type !== \"constructor\") {\n          logger.throwArgumentError(\"unable to determine stateMutability\", \"value\", value);\n        }\n        result.constant = !!value.constant;\n        if (result.constant) {\n          result.stateMutability = \"view\";\n        } else {\n          result.stateMutability = result.payable ? \"payable\" : \"nonpayable\";\n        }\n        if (result.payable && result.constant) {\n          logger.throwArgumentError(\"cannot have constant payable function\", \"value\", value);\n        }\n      } else if (value.constant != null) {\n        result.constant = !!value.constant;\n        result.payable = !result.constant;\n        result.stateMutability = result.constant ? \"view\" : \"payable\";\n      } else if (value.type !== \"constructor\") {\n        logger.throwArgumentError(\"unable to determine stateMutability\", \"value\", value);\n      }\n      return result;\n    }\n    var ConstructorFragment = (\n      /** @class */\n      function(_super) {\n        __extends(ConstructorFragment2, _super);\n        function ConstructorFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ConstructorFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"constructor\",\n              stateMutability: this.stateMutability !== \"nonpayable\" ? this.stateMutability : void 0,\n              payable: this.payable,\n              gas: this.gas ? this.gas.toNumber() : void 0,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          if (format === exports2.FormatTypes.sighash) {\n            logger.throwError(\"cannot format a constructor for sighash\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"format(sighash)\"\n            });\n          }\n          var result = \"constructor(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (this.stateMutability && this.stateMutability !== \"nonpayable\") {\n            result += this.stateMutability + \" \";\n          }\n          return result.trim();\n        };\n        ConstructorFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return ConstructorFragment2.fromString(value);\n          }\n          return ConstructorFragment2.fromObject(value);\n        };\n        ConstructorFragment2.fromObject = function(value) {\n          if (ConstructorFragment2.isConstructorFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"constructor\") {\n            logger.throwArgumentError(\"invalid constructor object\", \"value\", value);\n          }\n          var state = verifyState(value);\n          if (state.constant) {\n            logger.throwArgumentError(\"constructor cannot be constant\", \"value\", value);\n          }\n          var params = {\n            name: null,\n            type: value.type,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            payable: state.payable,\n            stateMutability: state.stateMutability,\n            gas: value.gas ? bignumber_1.BigNumber.from(value.gas) : null\n          };\n          return new ConstructorFragment2(_constructorGuard, params);\n        };\n        ConstructorFragment2.fromString = function(value) {\n          var params = { type: \"constructor\" };\n          value = parseGas(value, params);\n          var parens = value.match(regexParen);\n          if (!parens || parens[1].trim() !== \"constructor\") {\n            logger.throwArgumentError(\"invalid constructor string\", \"value\", value);\n          }\n          params.inputs = parseParams(parens[2].trim(), false);\n          parseModifiers(parens[3].trim(), params);\n          return ConstructorFragment2.fromObject(params);\n        };\n        ConstructorFragment2.isConstructorFragment = function(value) {\n          return value && value._isFragment && value.type === \"constructor\";\n        };\n        return ConstructorFragment2;\n      }(Fragment)\n    );\n    exports2.ConstructorFragment = ConstructorFragment;\n    var FunctionFragment = (\n      /** @class */\n      function(_super) {\n        __extends(FunctionFragment2, _super);\n        function FunctionFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        FunctionFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"function\",\n              name: this.name,\n              constant: this.constant,\n              stateMutability: this.stateMutability !== \"nonpayable\" ? this.stateMutability : void 0,\n              payable: this.payable,\n              gas: this.gas ? this.gas.toNumber() : void 0,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              }),\n              outputs: this.outputs.map(function(output) {\n                return JSON.parse(output.format(format));\n              })\n            });\n          }\n          var result = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result += \"function \";\n          }\n          result += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.stateMutability) {\n              if (this.stateMutability !== \"nonpayable\") {\n                result += this.stateMutability + \" \";\n              }\n            } else if (this.constant) {\n              result += \"view \";\n            }\n            if (this.outputs && this.outputs.length) {\n              result += \"returns (\" + this.outputs.map(function(output) {\n                return output.format(format);\n              }).join(\", \") + \") \";\n            }\n            if (this.gas != null) {\n              result += \"@\" + this.gas.toString() + \" \";\n            }\n          }\n          return result.trim();\n        };\n        FunctionFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return FunctionFragment2.fromString(value);\n          }\n          return FunctionFragment2.fromObject(value);\n        };\n        FunctionFragment2.fromObject = function(value) {\n          if (FunctionFragment2.isFunctionFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"function\") {\n            logger.throwArgumentError(\"invalid function object\", \"value\", value);\n          }\n          var state = verifyState(value);\n          var params = {\n            type: value.type,\n            name: verifyIdentifier(value.name),\n            constant: state.constant,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            outputs: value.outputs ? value.outputs.map(ParamType.fromObject) : [],\n            payable: state.payable,\n            stateMutability: state.stateMutability,\n            gas: value.gas ? bignumber_1.BigNumber.from(value.gas) : null\n          };\n          return new FunctionFragment2(_constructorGuard, params);\n        };\n        FunctionFragment2.fromString = function(value) {\n          var params = { type: \"function\" };\n          value = parseGas(value, params);\n          var comps = value.split(\" returns \");\n          if (comps.length > 2) {\n            logger.throwArgumentError(\"invalid function string\", \"value\", value);\n          }\n          var parens = comps[0].match(regexParen);\n          if (!parens) {\n            logger.throwArgumentError(\"invalid function signature\", \"value\", value);\n          }\n          params.name = parens[1].trim();\n          if (params.name) {\n            verifyIdentifier(params.name);\n          }\n          params.inputs = parseParams(parens[2], false);\n          parseModifiers(parens[3].trim(), params);\n          if (comps.length > 1) {\n            var returns = comps[1].match(regexParen);\n            if (returns[1].trim() != \"\" || returns[3].trim() != \"\") {\n              logger.throwArgumentError(\"unexpected tokens\", \"value\", value);\n            }\n            params.outputs = parseParams(returns[2], false);\n          } else {\n            params.outputs = [];\n          }\n          return FunctionFragment2.fromObject(params);\n        };\n        FunctionFragment2.isFunctionFragment = function(value) {\n          return value && value._isFragment && value.type === \"function\";\n        };\n        return FunctionFragment2;\n      }(ConstructorFragment)\n    );\n    exports2.FunctionFragment = FunctionFragment;\n    function checkForbidden(fragment) {\n      var sig = fragment.format();\n      if (sig === \"Error(string)\" || sig === \"Panic(uint256)\") {\n        logger.throwArgumentError(\"cannot specify user defined \" + sig + \" error\", \"fragment\", fragment);\n      }\n      return fragment;\n    }\n    var ErrorFragment = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorFragment2, _super);\n        function ErrorFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ErrorFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"error\",\n              name: this.name,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          var result = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result += \"error \";\n          }\n          result += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          return result.trim();\n        };\n        ErrorFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return ErrorFragment2.fromString(value);\n          }\n          return ErrorFragment2.fromObject(value);\n        };\n        ErrorFragment2.fromObject = function(value) {\n          if (ErrorFragment2.isErrorFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"error\") {\n            logger.throwArgumentError(\"invalid error object\", \"value\", value);\n          }\n          var params = {\n            type: value.type,\n            name: verifyIdentifier(value.name),\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : []\n          };\n          return checkForbidden(new ErrorFragment2(_constructorGuard, params));\n        };\n        ErrorFragment2.fromString = function(value) {\n          var params = { type: \"error\" };\n          var parens = value.match(regexParen);\n          if (!parens) {\n            logger.throwArgumentError(\"invalid error signature\", \"value\", value);\n          }\n          params.name = parens[1].trim();\n          if (params.name) {\n            verifyIdentifier(params.name);\n          }\n          params.inputs = parseParams(parens[2], false);\n          return checkForbidden(ErrorFragment2.fromObject(params));\n        };\n        ErrorFragment2.isErrorFragment = function(value) {\n          return value && value._isFragment && value.type === \"error\";\n        };\n        return ErrorFragment2;\n      }(Fragment)\n    );\n    exports2.ErrorFragment = ErrorFragment;\n    function verifyType(type) {\n      if (type.match(/^uint($|[^1-9])/)) {\n        type = \"uint256\" + type.substring(4);\n      } else if (type.match(/^int($|[^1-9])/)) {\n        type = \"int256\" + type.substring(3);\n      }\n      return type;\n    }\n    var regexIdentifier = new RegExp(\"^[a-zA-Z$_][a-zA-Z0-9$_]*$\");\n    function verifyIdentifier(value) {\n      if (!value || !value.match(regexIdentifier)) {\n        logger.throwArgumentError('invalid identifier \"' + value + '\"', \"value\", value);\n      }\n      return value;\n    }\n    var regexParen = new RegExp(\"^([^)(]*)\\\\((.*)\\\\)([^)(]*)$\");\n    function splitNesting(value) {\n      value = value.trim();\n      var result = [];\n      var accum = \"\";\n      var depth = 0;\n      for (var offset = 0; offset < value.length; offset++) {\n        var c = value[offset];\n        if (c === \",\" && depth === 0) {\n          result.push(accum);\n          accum = \"\";\n        } else {\n          accum += c;\n          if (c === \"(\") {\n            depth++;\n          } else if (c === \")\") {\n            depth--;\n            if (depth === -1) {\n              logger.throwArgumentError(\"unbalanced parenthesis\", \"value\", value);\n            }\n          }\n        }\n      }\n      if (accum) {\n        result.push(accum);\n      }\n      return result;\n    }\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/abstract-coder.js\nvar require_abstract_coder = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/abstract-coder.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Reader = exports2.Writer = exports2.Coder = exports2.checkResultErrors = void 0;\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    function checkResultErrors(result) {\n      var errors = [];\n      var checkErrors = function(path, object) {\n        if (!Array.isArray(object)) {\n          return;\n        }\n        for (var key in object) {\n          var childPath = path.slice();\n          childPath.push(key);\n          try {\n            checkErrors(childPath, object[key]);\n          } catch (error) {\n            errors.push({ path: childPath, error });\n          }\n        }\n      };\n      checkErrors([], result);\n      return errors;\n    }\n    exports2.checkResultErrors = checkResultErrors;\n    var Coder = (\n      /** @class */\n      function() {\n        function Coder2(name2, type, localName, dynamic) {\n          this.name = name2;\n          this.type = type;\n          this.localName = localName;\n          this.dynamic = dynamic;\n        }\n        Coder2.prototype._throwError = function(message, value) {\n          logger.throwArgumentError(message, this.localName, value);\n        };\n        return Coder2;\n      }()\n    );\n    exports2.Coder = Coder;\n    var Writer = (\n      /** @class */\n      function() {\n        function Writer2(wordSize) {\n          (0, properties_1.defineReadOnly)(this, \"wordSize\", wordSize || 32);\n          this._data = [];\n          this._dataLength = 0;\n          this._padding = new Uint8Array(wordSize);\n        }\n        Object.defineProperty(Writer2.prototype, \"data\", {\n          get: function() {\n            return (0, bytes_1.hexConcat)(this._data);\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Writer2.prototype, \"length\", {\n          get: function() {\n            return this._dataLength;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Writer2.prototype._writeData = function(data) {\n          this._data.push(data);\n          this._dataLength += data.length;\n          return data.length;\n        };\n        Writer2.prototype.appendWriter = function(writer) {\n          return this._writeData((0, bytes_1.concat)(writer._data));\n        };\n        Writer2.prototype.writeBytes = function(value) {\n          var bytes = (0, bytes_1.arrayify)(value);\n          var paddingOffset = bytes.length % this.wordSize;\n          if (paddingOffset) {\n            bytes = (0, bytes_1.concat)([bytes, this._padding.slice(paddingOffset)]);\n          }\n          return this._writeData(bytes);\n        };\n        Writer2.prototype._getValue = function(value) {\n          var bytes = (0, bytes_1.arrayify)(bignumber_1.BigNumber.from(value));\n          if (bytes.length > this.wordSize) {\n            logger.throwError(\"value out-of-bounds\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n              length: this.wordSize,\n              offset: bytes.length\n            });\n          }\n          if (bytes.length % this.wordSize) {\n            bytes = (0, bytes_1.concat)([this._padding.slice(bytes.length % this.wordSize), bytes]);\n          }\n          return bytes;\n        };\n        Writer2.prototype.writeValue = function(value) {\n          return this._writeData(this._getValue(value));\n        };\n        Writer2.prototype.writeUpdatableValue = function() {\n          var _this = this;\n          var offset = this._data.length;\n          this._data.push(this._padding);\n          this._dataLength += this.wordSize;\n          return function(value) {\n            _this._data[offset] = _this._getValue(value);\n          };\n        };\n        return Writer2;\n      }()\n    );\n    exports2.Writer = Writer;\n    var Reader = (\n      /** @class */\n      function() {\n        function Reader2(data, wordSize, coerceFunc, allowLoose) {\n          (0, properties_1.defineReadOnly)(this, \"_data\", (0, bytes_1.arrayify)(data));\n          (0, properties_1.defineReadOnly)(this, \"wordSize\", wordSize || 32);\n          (0, properties_1.defineReadOnly)(this, \"_coerceFunc\", coerceFunc);\n          (0, properties_1.defineReadOnly)(this, \"allowLoose\", allowLoose);\n          this._offset = 0;\n        }\n        Object.defineProperty(Reader2.prototype, \"data\", {\n          get: function() {\n            return (0, bytes_1.hexlify)(this._data);\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Reader2.prototype, \"consumed\", {\n          get: function() {\n            return this._offset;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Reader2.coerce = function(name2, value) {\n          var match = name2.match(\"^u?int([0-9]+)$\");\n          if (match && parseInt(match[1]) <= 48) {\n            value = value.toNumber();\n          }\n          return value;\n        };\n        Reader2.prototype.coerce = function(name2, value) {\n          if (this._coerceFunc) {\n            return this._coerceFunc(name2, value);\n          }\n          return Reader2.coerce(name2, value);\n        };\n        Reader2.prototype._peekBytes = function(offset, length, loose) {\n          var alignedLength = Math.ceil(length / this.wordSize) * this.wordSize;\n          if (this._offset + alignedLength > this._data.length) {\n            if (this.allowLoose && loose && this._offset + length <= this._data.length) {\n              alignedLength = length;\n            } else {\n              logger.throwError(\"data out-of-bounds\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n                length: this._data.length,\n                offset: this._offset + alignedLength\n              });\n            }\n          }\n          return this._data.slice(this._offset, this._offset + alignedLength);\n        };\n        Reader2.prototype.subReader = function(offset) {\n          return new Reader2(this._data.slice(this._offset + offset), this.wordSize, this._coerceFunc, this.allowLoose);\n        };\n        Reader2.prototype.readBytes = function(length, loose) {\n          var bytes = this._peekBytes(0, length, !!loose);\n          this._offset += bytes.length;\n          return bytes.slice(0, length);\n        };\n        Reader2.prototype.readValue = function() {\n          return bignumber_1.BigNumber.from(this.readBytes(this.wordSize));\n        };\n        return Reader2;\n      }()\n    );\n    exports2.Reader = Reader;\n  }\n});\n\n// node_modules/js-sha3/src/sha3.js\nvar require_sha3 = __commonJS({\n  \"node_modules/js-sha3/src/sha3.js\"(exports2, module2) {\n    (function() {\n      \"use strict\";\n      var INPUT_ERROR = \"input is invalid type\";\n      var FINALIZE_ERROR = \"finalize already called\";\n      var WINDOW = typeof window === \"object\";\n      var root = WINDOW ? window : {};\n      if (root.JS_SHA3_NO_WINDOW) {\n        WINDOW = false;\n      }\n      var WEB_WORKER = !WINDOW && typeof self === \"object\";\n      var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === \"object\" && process.versions && process.versions.node;\n      if (NODE_JS) {\n        root = global;\n      } else if (WEB_WORKER) {\n        root = self;\n      }\n      var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module2 === \"object\" && module2.exports;\n      var AMD = typeof define === \"function\" && define.amd;\n      var ARRAY_BUFFER = !root.JS_SHA3_NO_ARRAY_BUFFER && typeof ArrayBuffer !== \"undefined\";\n      var HEX_CHARS = \"0123456789abcdef\".split(\"\");\n      var SHAKE_PADDING = [31, 7936, 2031616, 520093696];\n      var CSHAKE_PADDING = [4, 1024, 262144, 67108864];\n      var KECCAK_PADDING = [1, 256, 65536, 16777216];\n      var PADDING = [6, 1536, 393216, 100663296];\n      var SHIFT = [0, 8, 16, 24];\n      var RC = [\n        1,\n        0,\n        32898,\n        0,\n        32906,\n        2147483648,\n        2147516416,\n        2147483648,\n        32907,\n        0,\n        2147483649,\n        0,\n        2147516545,\n        2147483648,\n        32777,\n        2147483648,\n        138,\n        0,\n        136,\n        0,\n        2147516425,\n        0,\n        2147483658,\n        0,\n        2147516555,\n        0,\n        139,\n        2147483648,\n        32905,\n        2147483648,\n        32771,\n        2147483648,\n        32770,\n        2147483648,\n        128,\n        2147483648,\n        32778,\n        0,\n        2147483658,\n        2147483648,\n        2147516545,\n        2147483648,\n        32896,\n        2147483648,\n        2147483649,\n        0,\n        2147516424,\n        2147483648\n      ];\n      var BITS = [224, 256, 384, 512];\n      var SHAKE_BITS = [128, 256];\n      var OUTPUT_TYPES = [\"hex\", \"buffer\", \"arrayBuffer\", \"array\", \"digest\"];\n      var CSHAKE_BYTEPAD = {\n        \"128\": 168,\n        \"256\": 136\n      };\n      if (root.JS_SHA3_NO_NODE_JS || !Array.isArray) {\n        Array.isArray = function(obj) {\n          return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n      }\n      if (ARRAY_BUFFER && (root.JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {\n        ArrayBuffer.isView = function(obj) {\n          return typeof obj === \"object\" && obj.buffer && obj.buffer.constructor === ArrayBuffer;\n        };\n      }\n      var createOutputMethod = function(bits2, padding, outputType) {\n        return function(message) {\n          return new Keccak(bits2, padding, bits2).update(message)[outputType]();\n        };\n      };\n      var createShakeOutputMethod = function(bits2, padding, outputType) {\n        return function(message, outputBits) {\n          return new Keccak(bits2, padding, outputBits).update(message)[outputType]();\n        };\n      };\n      var createCshakeOutputMethod = function(bits2, padding, outputType) {\n        return function(message, outputBits, n, s) {\n          return methods[\"cshake\" + bits2].update(message, outputBits, n, s)[outputType]();\n        };\n      };\n      var createKmacOutputMethod = function(bits2, padding, outputType) {\n        return function(key, message, outputBits, s) {\n          return methods[\"kmac\" + bits2].update(key, message, outputBits, s)[outputType]();\n        };\n      };\n      var createOutputMethods = function(method, createMethod2, bits2, padding) {\n        for (var i2 = 0; i2 < OUTPUT_TYPES.length; ++i2) {\n          var type = OUTPUT_TYPES[i2];\n          method[type] = createMethod2(bits2, padding, type);\n        }\n        return method;\n      };\n      var createMethod = function(bits2, padding) {\n        var method = createOutputMethod(bits2, padding, \"hex\");\n        method.create = function() {\n          return new Keccak(bits2, padding, bits2);\n        };\n        method.update = function(message) {\n          return method.create().update(message);\n        };\n        return createOutputMethods(method, createOutputMethod, bits2, padding);\n      };\n      var createShakeMethod = function(bits2, padding) {\n        var method = createShakeOutputMethod(bits2, padding, \"hex\");\n        method.create = function(outputBits) {\n          return new Keccak(bits2, padding, outputBits);\n        };\n        method.update = function(message, outputBits) {\n          return method.create(outputBits).update(message);\n        };\n        return createOutputMethods(method, createShakeOutputMethod, bits2, padding);\n      };\n      var createCshakeMethod = function(bits2, padding) {\n        var w = CSHAKE_BYTEPAD[bits2];\n        var method = createCshakeOutputMethod(bits2, padding, \"hex\");\n        method.create = function(outputBits, n, s) {\n          if (!n && !s) {\n            return methods[\"shake\" + bits2].create(outputBits);\n          } else {\n            return new Keccak(bits2, padding, outputBits).bytepad([n, s], w);\n          }\n        };\n        method.update = function(message, outputBits, n, s) {\n          return method.create(outputBits, n, s).update(message);\n        };\n        return createOutputMethods(method, createCshakeOutputMethod, bits2, padding);\n      };\n      var createKmacMethod = function(bits2, padding) {\n        var w = CSHAKE_BYTEPAD[bits2];\n        var method = createKmacOutputMethod(bits2, padding, \"hex\");\n        method.create = function(key, outputBits, s) {\n          return new Kmac(bits2, padding, outputBits).bytepad([\"KMAC\", s], w).bytepad([key], w);\n        };\n        method.update = function(key, message, outputBits, s) {\n          return method.create(key, outputBits, s).update(message);\n        };\n        return createOutputMethods(method, createKmacOutputMethod, bits2, padding);\n      };\n      var algorithms = [\n        { name: \"keccak\", padding: KECCAK_PADDING, bits: BITS, createMethod },\n        { name: \"sha3\", padding: PADDING, bits: BITS, createMethod },\n        { name: \"shake\", padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod },\n        { name: \"cshake\", padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createCshakeMethod },\n        { name: \"kmac\", padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createKmacMethod }\n      ];\n      var methods = {}, methodNames = [];\n      for (var i = 0; i < algorithms.length; ++i) {\n        var algorithm = algorithms[i];\n        var bits = algorithm.bits;\n        for (var j = 0; j < bits.length; ++j) {\n          var methodName = algorithm.name + \"_\" + bits[j];\n          methodNames.push(methodName);\n          methods[methodName] = algorithm.createMethod(bits[j], algorithm.padding);\n          if (algorithm.name !== \"sha3\") {\n            var newMethodName = algorithm.name + bits[j];\n            methodNames.push(newMethodName);\n            methods[newMethodName] = methods[methodName];\n          }\n        }\n      }\n      function Keccak(bits2, padding, outputBits) {\n        this.blocks = [];\n        this.s = [];\n        this.padding = padding;\n        this.outputBits = outputBits;\n        this.reset = true;\n        this.finalized = false;\n        this.block = 0;\n        this.start = 0;\n        this.blockCount = 1600 - (bits2 << 1) >> 5;\n        this.byteCount = this.blockCount << 2;\n        this.outputBlocks = outputBits >> 5;\n        this.extraBytes = (outputBits & 31) >> 3;\n        for (var i2 = 0; i2 < 50; ++i2) {\n          this.s[i2] = 0;\n        }\n      }\n      Keccak.prototype.update = function(message) {\n        if (this.finalized) {\n          throw new Error(FINALIZE_ERROR);\n        }\n        var notString, type = typeof message;\n        if (type !== \"string\") {\n          if (type === \"object\") {\n            if (message === null) {\n              throw new Error(INPUT_ERROR);\n            } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {\n              message = new Uint8Array(message);\n            } else if (!Array.isArray(message)) {\n              if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {\n                throw new Error(INPUT_ERROR);\n              }\n            }\n          } else {\n            throw new Error(INPUT_ERROR);\n          }\n          notString = true;\n        }\n        var blocks = this.blocks, byteCount = this.byteCount, length = message.length, blockCount = this.blockCount, index = 0, s = this.s, i2, code;\n        while (index < length) {\n          if (this.reset) {\n            this.reset = false;\n            blocks[0] = this.block;\n            for (i2 = 1; i2 < blockCount + 1; ++i2) {\n              blocks[i2] = 0;\n            }\n          }\n          if (notString) {\n            for (i2 = this.start; index < length && i2 < byteCount; ++index) {\n              blocks[i2 >> 2] |= message[index] << SHIFT[i2++ & 3];\n            }\n          } else {\n            for (i2 = this.start; index < length && i2 < byteCount; ++index) {\n              code = message.charCodeAt(index);\n              if (code < 128) {\n                blocks[i2 >> 2] |= code << SHIFT[i2++ & 3];\n              } else if (code < 2048) {\n                blocks[i2 >> 2] |= (192 | code >> 6) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              } else if (code < 55296 || code >= 57344) {\n                blocks[i2 >> 2] |= (224 | code >> 12) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 6 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              } else {\n                code = 65536 + ((code & 1023) << 10 | message.charCodeAt(++index) & 1023);\n                blocks[i2 >> 2] |= (240 | code >> 18) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 12 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 6 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              }\n            }\n          }\n          this.lastByteIndex = i2;\n          if (i2 >= byteCount) {\n            this.start = i2 - byteCount;\n            this.block = blocks[blockCount];\n            for (i2 = 0; i2 < blockCount; ++i2) {\n              s[i2] ^= blocks[i2];\n            }\n            f(s);\n            this.reset = true;\n          } else {\n            this.start = i2;\n          }\n        }\n        return this;\n      };\n      Keccak.prototype.encode = function(x, right) {\n        var o = x & 255, n = 1;\n        var bytes = [o];\n        x = x >> 8;\n        o = x & 255;\n        while (o > 0) {\n          bytes.unshift(o);\n          x = x >> 8;\n          o = x & 255;\n          ++n;\n        }\n        if (right) {\n          bytes.push(n);\n        } else {\n          bytes.unshift(n);\n        }\n        this.update(bytes);\n        return bytes.length;\n      };\n      Keccak.prototype.encodeString = function(str) {\n        var notString, type = typeof str;\n        if (type !== \"string\") {\n          if (type === \"object\") {\n            if (str === null) {\n              throw new Error(INPUT_ERROR);\n            } else if (ARRAY_BUFFER && str.constructor === ArrayBuffer) {\n              str = new Uint8Array(str);\n            } else if (!Array.isArray(str)) {\n              if (!ARRAY_BUFFER || !ArrayBuffer.isView(str)) {\n                throw new Error(INPUT_ERROR);\n              }\n            }\n          } else {\n            throw new Error(INPUT_ERROR);\n          }\n          notString = true;\n        }\n        var bytes = 0, length = str.length;\n        if (notString) {\n          bytes = length;\n        } else {\n          for (var i2 = 0; i2 < str.length; ++i2) {\n            var code = str.charCodeAt(i2);\n            if (code < 128) {\n              bytes += 1;\n            } else if (code < 2048) {\n              bytes += 2;\n            } else if (code < 55296 || code >= 57344) {\n              bytes += 3;\n            } else {\n              code = 65536 + ((code & 1023) << 10 | str.charCodeAt(++i2) & 1023);\n              bytes += 4;\n            }\n          }\n        }\n        bytes += this.encode(bytes * 8);\n        this.update(str);\n        return bytes;\n      };\n      Keccak.prototype.bytepad = function(strs, w) {\n        var bytes = this.encode(w);\n        for (var i2 = 0; i2 < strs.length; ++i2) {\n          bytes += this.encodeString(strs[i2]);\n        }\n        var paddingBytes = w - bytes % w;\n        var zeros = [];\n        zeros.length = paddingBytes;\n        this.update(zeros);\n        return this;\n      };\n      Keccak.prototype.finalize = function() {\n        if (this.finalized) {\n          return;\n        }\n        this.finalized = true;\n        var blocks = this.blocks, i2 = this.lastByteIndex, blockCount = this.blockCount, s = this.s;\n        blocks[i2 >> 2] |= this.padding[i2 & 3];\n        if (this.lastByteIndex === this.byteCount) {\n          blocks[0] = blocks[blockCount];\n          for (i2 = 1; i2 < blockCount + 1; ++i2) {\n            blocks[i2] = 0;\n          }\n        }\n        blocks[blockCount - 1] |= 2147483648;\n        for (i2 = 0; i2 < blockCount; ++i2) {\n          s[i2] ^= blocks[i2];\n        }\n        f(s);\n      };\n      Keccak.prototype.toString = Keccak.prototype.hex = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var hex = \"\", block;\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            block = s[i2];\n            hex += HEX_CHARS[block >> 4 & 15] + HEX_CHARS[block & 15] + HEX_CHARS[block >> 12 & 15] + HEX_CHARS[block >> 8 & 15] + HEX_CHARS[block >> 20 & 15] + HEX_CHARS[block >> 16 & 15] + HEX_CHARS[block >> 28 & 15] + HEX_CHARS[block >> 24 & 15];\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n            i2 = 0;\n          }\n        }\n        if (extraBytes) {\n          block = s[i2];\n          hex += HEX_CHARS[block >> 4 & 15] + HEX_CHARS[block & 15];\n          if (extraBytes > 1) {\n            hex += HEX_CHARS[block >> 12 & 15] + HEX_CHARS[block >> 8 & 15];\n          }\n          if (extraBytes > 2) {\n            hex += HEX_CHARS[block >> 20 & 15] + HEX_CHARS[block >> 16 & 15];\n          }\n        }\n        return hex;\n      };\n      Keccak.prototype.arrayBuffer = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var bytes = this.outputBits >> 3;\n        var buffer;\n        if (extraBytes) {\n          buffer = new ArrayBuffer(outputBlocks + 1 << 2);\n        } else {\n          buffer = new ArrayBuffer(bytes);\n        }\n        var array = new Uint32Array(buffer);\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            array[j2] = s[i2];\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n          }\n        }\n        if (extraBytes) {\n          array[i2] = s[i2];\n          buffer = buffer.slice(0, bytes);\n        }\n        return buffer;\n      };\n      Keccak.prototype.buffer = Keccak.prototype.arrayBuffer;\n      Keccak.prototype.digest = Keccak.prototype.array = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var array = [], offset, block;\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            offset = j2 << 2;\n            block = s[i2];\n            array[offset] = block & 255;\n            array[offset + 1] = block >> 8 & 255;\n            array[offset + 2] = block >> 16 & 255;\n            array[offset + 3] = block >> 24 & 255;\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n          }\n        }\n        if (extraBytes) {\n          offset = j2 << 2;\n          block = s[i2];\n          array[offset] = block & 255;\n          if (extraBytes > 1) {\n            array[offset + 1] = block >> 8 & 255;\n          }\n          if (extraBytes > 2) {\n            array[offset + 2] = block >> 16 & 255;\n          }\n        }\n        return array;\n      };\n      function Kmac(bits2, padding, outputBits) {\n        Keccak.call(this, bits2, padding, outputBits);\n      }\n      Kmac.prototype = new Keccak();\n      Kmac.prototype.finalize = function() {\n        this.encode(this.outputBits, true);\n        return Keccak.prototype.finalize.call(this);\n      };\n      var f = function(s) {\n        var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;\n        for (n = 0; n < 48; n += 2) {\n          c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];\n          c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];\n          c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];\n          c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];\n          c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];\n          c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];\n          c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];\n          c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];\n          c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];\n          c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];\n          h = c8 ^ (c2 << 1 | c3 >>> 31);\n          l = c9 ^ (c3 << 1 | c2 >>> 31);\n          s[0] ^= h;\n          s[1] ^= l;\n          s[10] ^= h;\n          s[11] ^= l;\n          s[20] ^= h;\n          s[21] ^= l;\n          s[30] ^= h;\n          s[31] ^= l;\n          s[40] ^= h;\n          s[41] ^= l;\n          h = c0 ^ (c4 << 1 | c5 >>> 31);\n          l = c1 ^ (c5 << 1 | c4 >>> 31);\n          s[2] ^= h;\n          s[3] ^= l;\n          s[12] ^= h;\n          s[13] ^= l;\n          s[22] ^= h;\n          s[23] ^= l;\n          s[32] ^= h;\n          s[33] ^= l;\n          s[42] ^= h;\n          s[43] ^= l;\n          h = c2 ^ (c6 << 1 | c7 >>> 31);\n          l = c3 ^ (c7 << 1 | c6 >>> 31);\n          s[4] ^= h;\n          s[5] ^= l;\n          s[14] ^= h;\n          s[15] ^= l;\n          s[24] ^= h;\n          s[25] ^= l;\n          s[34] ^= h;\n          s[35] ^= l;\n          s[44] ^= h;\n          s[45] ^= l;\n          h = c4 ^ (c8 << 1 | c9 >>> 31);\n          l = c5 ^ (c9 << 1 | c8 >>> 31);\n          s[6] ^= h;\n          s[7] ^= l;\n          s[16] ^= h;\n          s[17] ^= l;\n          s[26] ^= h;\n          s[27] ^= l;\n          s[36] ^= h;\n          s[37] ^= l;\n          s[46] ^= h;\n          s[47] ^= l;\n          h = c6 ^ (c0 << 1 | c1 >>> 31);\n          l = c7 ^ (c1 << 1 | c0 >>> 31);\n          s[8] ^= h;\n          s[9] ^= l;\n          s[18] ^= h;\n          s[19] ^= l;\n          s[28] ^= h;\n          s[29] ^= l;\n          s[38] ^= h;\n          s[39] ^= l;\n          s[48] ^= h;\n          s[49] ^= l;\n          b0 = s[0];\n          b1 = s[1];\n          b32 = s[11] << 4 | s[10] >>> 28;\n          b33 = s[10] << 4 | s[11] >>> 28;\n          b14 = s[20] << 3 | s[21] >>> 29;\n          b15 = s[21] << 3 | s[20] >>> 29;\n          b46 = s[31] << 9 | s[30] >>> 23;\n          b47 = s[30] << 9 | s[31] >>> 23;\n          b28 = s[40] << 18 | s[41] >>> 14;\n          b29 = s[41] << 18 | s[40] >>> 14;\n          b20 = s[2] << 1 | s[3] >>> 31;\n          b21 = s[3] << 1 | s[2] >>> 31;\n          b2 = s[13] << 12 | s[12] >>> 20;\n          b3 = s[12] << 12 | s[13] >>> 20;\n          b34 = s[22] << 10 | s[23] >>> 22;\n          b35 = s[23] << 10 | s[22] >>> 22;\n          b16 = s[33] << 13 | s[32] >>> 19;\n          b17 = s[32] << 13 | s[33] >>> 19;\n          b48 = s[42] << 2 | s[43] >>> 30;\n          b49 = s[43] << 2 | s[42] >>> 30;\n          b40 = s[5] << 30 | s[4] >>> 2;\n          b41 = s[4] << 30 | s[5] >>> 2;\n          b22 = s[14] << 6 | s[15] >>> 26;\n          b23 = s[15] << 6 | s[14] >>> 26;\n          b4 = s[25] << 11 | s[24] >>> 21;\n          b5 = s[24] << 11 | s[25] >>> 21;\n          b36 = s[34] << 15 | s[35] >>> 17;\n          b37 = s[35] << 15 | s[34] >>> 17;\n          b18 = s[45] << 29 | s[44] >>> 3;\n          b19 = s[44] << 29 | s[45] >>> 3;\n          b10 = s[6] << 28 | s[7] >>> 4;\n          b11 = s[7] << 28 | s[6] >>> 4;\n          b42 = s[17] << 23 | s[16] >>> 9;\n          b43 = s[16] << 23 | s[17] >>> 9;\n          b24 = s[26] << 25 | s[27] >>> 7;\n          b25 = s[27] << 25 | s[26] >>> 7;\n          b6 = s[36] << 21 | s[37] >>> 11;\n          b7 = s[37] << 21 | s[36] >>> 11;\n          b38 = s[47] << 24 | s[46] >>> 8;\n          b39 = s[46] << 24 | s[47] >>> 8;\n          b30 = s[8] << 27 | s[9] >>> 5;\n          b31 = s[9] << 27 | s[8] >>> 5;\n          b12 = s[18] << 20 | s[19] >>> 12;\n          b13 = s[19] << 20 | s[18] >>> 12;\n          b44 = s[29] << 7 | s[28] >>> 25;\n          b45 = s[28] << 7 | s[29] >>> 25;\n          b26 = s[38] << 8 | s[39] >>> 24;\n          b27 = s[39] << 8 | s[38] >>> 24;\n          b8 = s[48] << 14 | s[49] >>> 18;\n          b9 = s[49] << 14 | s[48] >>> 18;\n          s[0] = b0 ^ ~b2 & b4;\n          s[1] = b1 ^ ~b3 & b5;\n          s[10] = b10 ^ ~b12 & b14;\n          s[11] = b11 ^ ~b13 & b15;\n          s[20] = b20 ^ ~b22 & b24;\n          s[21] = b21 ^ ~b23 & b25;\n          s[30] = b30 ^ ~b32 & b34;\n          s[31] = b31 ^ ~b33 & b35;\n          s[40] = b40 ^ ~b42 & b44;\n          s[41] = b41 ^ ~b43 & b45;\n          s[2] = b2 ^ ~b4 & b6;\n          s[3] = b3 ^ ~b5 & b7;\n          s[12] = b12 ^ ~b14 & b16;\n          s[13] = b13 ^ ~b15 & b17;\n          s[22] = b22 ^ ~b24 & b26;\n          s[23] = b23 ^ ~b25 & b27;\n          s[32] = b32 ^ ~b34 & b36;\n          s[33] = b33 ^ ~b35 & b37;\n          s[42] = b42 ^ ~b44 & b46;\n          s[43] = b43 ^ ~b45 & b47;\n          s[4] = b4 ^ ~b6 & b8;\n          s[5] = b5 ^ ~b7 & b9;\n          s[14] = b14 ^ ~b16 & b18;\n          s[15] = b15 ^ ~b17 & b19;\n          s[24] = b24 ^ ~b26 & b28;\n          s[25] = b25 ^ ~b27 & b29;\n          s[34] = b34 ^ ~b36 & b38;\n          s[35] = b35 ^ ~b37 & b39;\n          s[44] = b44 ^ ~b46 & b48;\n          s[45] = b45 ^ ~b47 & b49;\n          s[6] = b6 ^ ~b8 & b0;\n          s[7] = b7 ^ ~b9 & b1;\n          s[16] = b16 ^ ~b18 & b10;\n          s[17] = b17 ^ ~b19 & b11;\n          s[26] = b26 ^ ~b28 & b20;\n          s[27] = b27 ^ ~b29 & b21;\n          s[36] = b36 ^ ~b38 & b30;\n          s[37] = b37 ^ ~b39 & b31;\n          s[46] = b46 ^ ~b48 & b40;\n          s[47] = b47 ^ ~b49 & b41;\n          s[8] = b8 ^ ~b0 & b2;\n          s[9] = b9 ^ ~b1 & b3;\n          s[18] = b18 ^ ~b10 & b12;\n          s[19] = b19 ^ ~b11 & b13;\n          s[28] = b28 ^ ~b20 & b22;\n          s[29] = b29 ^ ~b21 & b23;\n          s[38] = b38 ^ ~b30 & b32;\n          s[39] = b39 ^ ~b31 & b33;\n          s[48] = b48 ^ ~b40 & b42;\n          s[49] = b49 ^ ~b41 & b43;\n          s[0] ^= RC[n];\n          s[1] ^= RC[n + 1];\n        }\n      };\n      if (COMMON_JS) {\n        module2.exports = methods;\n      } else {\n        for (i = 0; i < methodNames.length; ++i) {\n          root[methodNames[i]] = methods[methodNames[i]];\n        }\n        if (AMD) {\n          define(function() {\n            return methods;\n          });\n        }\n      }\n    })();\n  }\n});\n\n// node_modules/@ethersproject/keccak256/lib/index.js\nvar require_lib5 = __commonJS({\n  \"node_modules/@ethersproject/keccak256/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.keccak256 = void 0;\n    var js_sha3_1 = __importDefault(require_sha3());\n    var bytes_1 = require_lib2();\n    function keccak256(data) {\n      return \"0x\" + js_sha3_1.default.keccak_256((0, bytes_1.arrayify)(data));\n    }\n    exports2.keccak256 = keccak256;\n  }\n});\n\n// node_modules/@ethersproject/rlp/lib/_version.js\nvar require_version6 = __commonJS({\n  \"node_modules/@ethersproject/rlp/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"rlp/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/rlp/lib/index.js\nvar require_lib6 = __commonJS({\n  \"node_modules/@ethersproject/rlp/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decode = exports2.encode = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version6();\n    var logger = new logger_1.Logger(_version_1.version);\n    function arrayifyInteger(value) {\n      var result = [];\n      while (value) {\n        result.unshift(value & 255);\n        value >>= 8;\n      }\n      return result;\n    }\n    function unarrayifyInteger(data, offset, length) {\n      var result = 0;\n      for (var i = 0; i < length; i++) {\n        result = result * 256 + data[offset + i];\n      }\n      return result;\n    }\n    function _encode(object) {\n      if (Array.isArray(object)) {\n        var payload_1 = [];\n        object.forEach(function(child) {\n          payload_1 = payload_1.concat(_encode(child));\n        });\n        if (payload_1.length <= 55) {\n          payload_1.unshift(192 + payload_1.length);\n          return payload_1;\n        }\n        var length_1 = arrayifyInteger(payload_1.length);\n        length_1.unshift(247 + length_1.length);\n        return length_1.concat(payload_1);\n      }\n      if (!(0, bytes_1.isBytesLike)(object)) {\n        logger.throwArgumentError(\"RLP object must be BytesLike\", \"object\", object);\n      }\n      var data = Array.prototype.slice.call((0, bytes_1.arrayify)(object));\n      if (data.length === 1 && data[0] <= 127) {\n        return data;\n      } else if (data.length <= 55) {\n        data.unshift(128 + data.length);\n        return data;\n      }\n      var length = arrayifyInteger(data.length);\n      length.unshift(183 + length.length);\n      return length.concat(data);\n    }\n    function encode(object) {\n      return (0, bytes_1.hexlify)(_encode(object));\n    }\n    exports2.encode = encode;\n    function _decodeChildren(data, offset, childOffset, length) {\n      var result = [];\n      while (childOffset < offset + 1 + length) {\n        var decoded = _decode(data, childOffset);\n        result.push(decoded.result);\n        childOffset += decoded.consumed;\n        if (childOffset > offset + 1 + length) {\n          logger.throwError(\"child data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n      }\n      return { consumed: 1 + length, result };\n    }\n    function _decode(data, offset) {\n      if (data.length === 0) {\n        logger.throwError(\"data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n      }\n      if (data[offset] >= 248) {\n        var lengthLength = data[offset] - 247;\n        if (offset + 1 + lengthLength > data.length) {\n          logger.throwError(\"data short segment too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var length_2 = unarrayifyInteger(data, offset + 1, lengthLength);\n        if (offset + 1 + lengthLength + length_2 > data.length) {\n          logger.throwError(\"data long segment too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        return _decodeChildren(data, offset, offset + 1 + lengthLength, lengthLength + length_2);\n      } else if (data[offset] >= 192) {\n        var length_3 = data[offset] - 192;\n        if (offset + 1 + length_3 > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        return _decodeChildren(data, offset, offset + 1, length_3);\n      } else if (data[offset] >= 184) {\n        var lengthLength = data[offset] - 183;\n        if (offset + 1 + lengthLength > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var length_4 = unarrayifyInteger(data, offset + 1, lengthLength);\n        if (offset + 1 + lengthLength + length_4 > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var result = (0, bytes_1.hexlify)(data.slice(offset + 1 + lengthLength, offset + 1 + lengthLength + length_4));\n        return { consumed: 1 + lengthLength + length_4, result };\n      } else if (data[offset] >= 128) {\n        var length_5 = data[offset] - 128;\n        if (offset + 1 + length_5 > data.length) {\n          logger.throwError(\"data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var result = (0, bytes_1.hexlify)(data.slice(offset + 1, offset + 1 + length_5));\n        return { consumed: 1 + length_5, result };\n      }\n      return { consumed: 1, result: (0, bytes_1.hexlify)(data[offset]) };\n    }\n    function decode(data) {\n      var bytes = (0, bytes_1.arrayify)(data);\n      var decoded = _decode(bytes, 0);\n      if (decoded.consumed !== bytes.length) {\n        logger.throwArgumentError(\"invalid rlp data\", \"data\", data);\n      }\n      return decoded.result;\n    }\n    exports2.decode = decode;\n  }\n});\n\n// node_modules/@ethersproject/address/lib/_version.js\nvar require_version7 = __commonJS({\n  \"node_modules/@ethersproject/address/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"address/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/address/lib/index.js\nvar require_lib7 = __commonJS({\n  \"node_modules/@ethersproject/address/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getCreate2Address = exports2.getContractAddress = exports2.getIcapAddress = exports2.isAddress = exports2.getAddress = void 0;\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var keccak256_1 = require_lib5();\n    var rlp_1 = require_lib6();\n    var logger_1 = require_lib();\n    var _version_1 = require_version7();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getChecksumAddress(address) {\n      if (!(0, bytes_1.isHexString)(address, 20)) {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      address = address.toLowerCase();\n      var chars = address.substring(2).split(\"\");\n      var expanded = new Uint8Array(40);\n      for (var i2 = 0; i2 < 40; i2++) {\n        expanded[i2] = chars[i2].charCodeAt(0);\n      }\n      var hashed = (0, bytes_1.arrayify)((0, keccak256_1.keccak256)(expanded));\n      for (var i2 = 0; i2 < 40; i2 += 2) {\n        if (hashed[i2 >> 1] >> 4 >= 8) {\n          chars[i2] = chars[i2].toUpperCase();\n        }\n        if ((hashed[i2 >> 1] & 15) >= 8) {\n          chars[i2 + 1] = chars[i2 + 1].toUpperCase();\n        }\n      }\n      return \"0x\" + chars.join(\"\");\n    }\n    var MAX_SAFE_INTEGER = 9007199254740991;\n    function log10(x) {\n      if (Math.log10) {\n        return Math.log10(x);\n      }\n      return Math.log(x) / Math.LN10;\n    }\n    var ibanLookup = {};\n    for (i = 0; i < 10; i++) {\n      ibanLookup[String(i)] = String(i);\n    }\n    var i;\n    for (i = 0; i < 26; i++) {\n      ibanLookup[String.fromCharCode(65 + i)] = String(10 + i);\n    }\n    var i;\n    var safeDigits = Math.floor(log10(MAX_SAFE_INTEGER));\n    function ibanChecksum(address) {\n      address = address.toUpperCase();\n      address = address.substring(4) + address.substring(0, 2) + \"00\";\n      var expanded = address.split(\"\").map(function(c) {\n        return ibanLookup[c];\n      }).join(\"\");\n      while (expanded.length >= safeDigits) {\n        var block = expanded.substring(0, safeDigits);\n        expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);\n      }\n      var checksum = String(98 - parseInt(expanded, 10) % 97);\n      while (checksum.length < 2) {\n        checksum = \"0\" + checksum;\n      }\n      return checksum;\n    }\n    function getAddress(address) {\n      var result = null;\n      if (typeof address !== \"string\") {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\n        if (address.substring(0, 2) !== \"0x\") {\n          address = \"0x\" + address;\n        }\n        result = getChecksumAddress(address);\n        if (address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) && result !== address) {\n          logger.throwArgumentError(\"bad address checksum\", \"address\", address);\n        }\n      } else if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\n        if (address.substring(2, 4) !== ibanChecksum(address)) {\n          logger.throwArgumentError(\"bad icap checksum\", \"address\", address);\n        }\n        result = (0, bignumber_1._base36To16)(address.substring(4));\n        while (result.length < 40) {\n          result = \"0\" + result;\n        }\n        result = getChecksumAddress(\"0x\" + result);\n      } else {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      return result;\n    }\n    exports2.getAddress = getAddress;\n    function isAddress(address) {\n      try {\n        getAddress(address);\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isAddress = isAddress;\n    function getIcapAddress(address) {\n      var base36 = (0, bignumber_1._base16To36)(getAddress(address).substring(2)).toUpperCase();\n      while (base36.length < 30) {\n        base36 = \"0\" + base36;\n      }\n      return \"XE\" + ibanChecksum(\"XE00\" + base36) + base36;\n    }\n    exports2.getIcapAddress = getIcapAddress;\n    function getContractAddress(transaction) {\n      var from = null;\n      try {\n        from = getAddress(transaction.from);\n      } catch (error) {\n        logger.throwArgumentError(\"missing from address\", \"transaction\", transaction);\n      }\n      var nonce = (0, bytes_1.stripZeros)((0, bytes_1.arrayify)(bignumber_1.BigNumber.from(transaction.nonce).toHexString()));\n      return getAddress((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, rlp_1.encode)([from, nonce])), 12));\n    }\n    exports2.getContractAddress = getContractAddress;\n    function getCreate2Address(from, salt, initCodeHash) {\n      if ((0, bytes_1.hexDataLength)(salt) !== 32) {\n        logger.throwArgumentError(\"salt must be 32 bytes\", \"salt\", salt);\n      }\n      if ((0, bytes_1.hexDataLength)(initCodeHash) !== 32) {\n        logger.throwArgumentError(\"initCodeHash must be 32 bytes\", \"initCodeHash\", initCodeHash);\n      }\n      return getAddress((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.concat)([\"0xff\", getAddress(from), salt, initCodeHash])), 12));\n    }\n    exports2.getCreate2Address = getCreate2Address;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/address.js\nvar require_address = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/address.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AddressCoder = void 0;\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var AddressCoder = (\n      /** @class */\n      function(_super) {\n        __extends(AddressCoder2, _super);\n        function AddressCoder2(localName) {\n          return _super.call(this, \"address\", \"address\", localName, false) || this;\n        }\n        AddressCoder2.prototype.defaultValue = function() {\n          return \"0x0000000000000000000000000000000000000000\";\n        };\n        AddressCoder2.prototype.encode = function(writer, value) {\n          try {\n            value = (0, address_1.getAddress)(value);\n          } catch (error) {\n            this._throwError(error.message, value);\n          }\n          return writer.writeValue(value);\n        };\n        AddressCoder2.prototype.decode = function(reader) {\n          return (0, address_1.getAddress)((0, bytes_1.hexZeroPad)(reader.readValue().toHexString(), 20));\n        };\n        return AddressCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.AddressCoder = AddressCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/anonymous.js\nvar require_anonymous = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/anonymous.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AnonymousCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var AnonymousCoder = (\n      /** @class */\n      function(_super) {\n        __extends(AnonymousCoder2, _super);\n        function AnonymousCoder2(coder) {\n          var _this = _super.call(this, coder.name, coder.type, void 0, coder.dynamic) || this;\n          _this.coder = coder;\n          return _this;\n        }\n        AnonymousCoder2.prototype.defaultValue = function() {\n          return this.coder.defaultValue();\n        };\n        AnonymousCoder2.prototype.encode = function(writer, value) {\n          return this.coder.encode(writer, value);\n        };\n        AnonymousCoder2.prototype.decode = function(reader) {\n          return this.coder.decode(reader);\n        };\n        return AnonymousCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.AnonymousCoder = AnonymousCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/array.js\nvar require_array = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/array.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ArrayCoder = exports2.unpack = exports2.pack = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var abstract_coder_1 = require_abstract_coder();\n    var anonymous_1 = require_anonymous();\n    function pack(writer, coders, values) {\n      var arrayValues = null;\n      if (Array.isArray(values)) {\n        arrayValues = values;\n      } else if (values && typeof values === \"object\") {\n        var unique_1 = {};\n        arrayValues = coders.map(function(coder) {\n          var name2 = coder.localName;\n          if (!name2) {\n            logger.throwError(\"cannot encode object for signature with missing names\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              argument: \"values\",\n              coder,\n              value: values\n            });\n          }\n          if (unique_1[name2]) {\n            logger.throwError(\"cannot encode object for signature with duplicate names\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              argument: \"values\",\n              coder,\n              value: values\n            });\n          }\n          unique_1[name2] = true;\n          return values[name2];\n        });\n      } else {\n        logger.throwArgumentError(\"invalid tuple value\", \"tuple\", values);\n      }\n      if (coders.length !== arrayValues.length) {\n        logger.throwArgumentError(\"types/value length mismatch\", \"tuple\", values);\n      }\n      var staticWriter = new abstract_coder_1.Writer(writer.wordSize);\n      var dynamicWriter = new abstract_coder_1.Writer(writer.wordSize);\n      var updateFuncs = [];\n      coders.forEach(function(coder, index) {\n        var value = arrayValues[index];\n        if (coder.dynamic) {\n          var dynamicOffset_1 = dynamicWriter.length;\n          coder.encode(dynamicWriter, value);\n          var updateFunc_1 = staticWriter.writeUpdatableValue();\n          updateFuncs.push(function(baseOffset) {\n            updateFunc_1(baseOffset + dynamicOffset_1);\n          });\n        } else {\n          coder.encode(staticWriter, value);\n        }\n      });\n      updateFuncs.forEach(function(func) {\n        func(staticWriter.length);\n      });\n      var length = writer.appendWriter(staticWriter);\n      length += writer.appendWriter(dynamicWriter);\n      return length;\n    }\n    exports2.pack = pack;\n    function unpack(reader, coders) {\n      var values = [];\n      var baseReader = reader.subReader(0);\n      coders.forEach(function(coder) {\n        var value = null;\n        if (coder.dynamic) {\n          var offset = reader.readValue();\n          var offsetReader = baseReader.subReader(offset.toNumber());\n          try {\n            value = coder.decode(offsetReader);\n          } catch (error) {\n            if (error.code === logger_1.Logger.errors.BUFFER_OVERRUN) {\n              throw error;\n            }\n            value = error;\n            value.baseType = coder.name;\n            value.name = coder.localName;\n            value.type = coder.type;\n          }\n        } else {\n          try {\n            value = coder.decode(reader);\n          } catch (error) {\n            if (error.code === logger_1.Logger.errors.BUFFER_OVERRUN) {\n              throw error;\n            }\n            value = error;\n            value.baseType = coder.name;\n            value.name = coder.localName;\n            value.type = coder.type;\n          }\n        }\n        if (value != void 0) {\n          values.push(value);\n        }\n      });\n      var uniqueNames = coders.reduce(function(accum, coder) {\n        var name2 = coder.localName;\n        if (name2) {\n          if (!accum[name2]) {\n            accum[name2] = 0;\n          }\n          accum[name2]++;\n        }\n        return accum;\n      }, {});\n      coders.forEach(function(coder, index) {\n        var name2 = coder.localName;\n        if (!name2 || uniqueNames[name2] !== 1) {\n          return;\n        }\n        if (name2 === \"length\") {\n          name2 = \"_length\";\n        }\n        if (values[name2] != null) {\n          return;\n        }\n        var value = values[index];\n        if (value instanceof Error) {\n          Object.defineProperty(values, name2, {\n            enumerable: true,\n            get: function() {\n              throw value;\n            }\n          });\n        } else {\n          values[name2] = value;\n        }\n      });\n      var _loop_1 = function(i2) {\n        var value = values[i2];\n        if (value instanceof Error) {\n          Object.defineProperty(values, i2, {\n            enumerable: true,\n            get: function() {\n              throw value;\n            }\n          });\n        }\n      };\n      for (var i = 0; i < values.length; i++) {\n        _loop_1(i);\n      }\n      return Object.freeze(values);\n    }\n    exports2.unpack = unpack;\n    var ArrayCoder = (\n      /** @class */\n      function(_super) {\n        __extends(ArrayCoder2, _super);\n        function ArrayCoder2(coder, length, localName) {\n          var _this = this;\n          var type = coder.type + \"[\" + (length >= 0 ? length : \"\") + \"]\";\n          var dynamic = length === -1 || coder.dynamic;\n          _this = _super.call(this, \"array\", type, localName, dynamic) || this;\n          _this.coder = coder;\n          _this.length = length;\n          return _this;\n        }\n        ArrayCoder2.prototype.defaultValue = function() {\n          var defaultChild = this.coder.defaultValue();\n          var result = [];\n          for (var i = 0; i < this.length; i++) {\n            result.push(defaultChild);\n          }\n          return result;\n        };\n        ArrayCoder2.prototype.encode = function(writer, value) {\n          if (!Array.isArray(value)) {\n            this._throwError(\"expected array value\", value);\n          }\n          var count = this.length;\n          if (count === -1) {\n            count = value.length;\n            writer.writeValue(value.length);\n          }\n          logger.checkArgumentCount(value.length, count, \"coder array\" + (this.localName ? \" \" + this.localName : \"\"));\n          var coders = [];\n          for (var i = 0; i < value.length; i++) {\n            coders.push(this.coder);\n          }\n          return pack(writer, coders, value);\n        };\n        ArrayCoder2.prototype.decode = function(reader) {\n          var count = this.length;\n          if (count === -1) {\n            count = reader.readValue().toNumber();\n            if (count * 32 > reader._data.length) {\n              logger.throwError(\"insufficient data length\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n                length: reader._data.length,\n                count\n              });\n            }\n          }\n          var coders = [];\n          for (var i = 0; i < count; i++) {\n            coders.push(new anonymous_1.AnonymousCoder(this.coder));\n          }\n          return reader.coerce(this.name, unpack(reader, coders));\n        };\n        return ArrayCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.ArrayCoder = ArrayCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/boolean.js\nvar require_boolean = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/boolean.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BooleanCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var BooleanCoder = (\n      /** @class */\n      function(_super) {\n        __extends(BooleanCoder2, _super);\n        function BooleanCoder2(localName) {\n          return _super.call(this, \"bool\", \"bool\", localName, false) || this;\n        }\n        BooleanCoder2.prototype.defaultValue = function() {\n          return false;\n        };\n        BooleanCoder2.prototype.encode = function(writer, value) {\n          return writer.writeValue(value ? 1 : 0);\n        };\n        BooleanCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.type, !reader.readValue().isZero());\n        };\n        return BooleanCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.BooleanCoder = BooleanCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/bytes.js\nvar require_bytes = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/bytes.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BytesCoder = exports2.DynamicBytesCoder = void 0;\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var DynamicBytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(DynamicBytesCoder2, _super);\n        function DynamicBytesCoder2(type, localName) {\n          return _super.call(this, type, type, localName, true) || this;\n        }\n        DynamicBytesCoder2.prototype.defaultValue = function() {\n          return \"0x\";\n        };\n        DynamicBytesCoder2.prototype.encode = function(writer, value) {\n          value = (0, bytes_1.arrayify)(value);\n          var length = writer.writeValue(value.length);\n          length += writer.writeBytes(value);\n          return length;\n        };\n        DynamicBytesCoder2.prototype.decode = function(reader) {\n          return reader.readBytes(reader.readValue().toNumber(), true);\n        };\n        return DynamicBytesCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.DynamicBytesCoder = DynamicBytesCoder;\n    var BytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(BytesCoder2, _super);\n        function BytesCoder2(localName) {\n          return _super.call(this, \"bytes\", localName) || this;\n        }\n        BytesCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, bytes_1.hexlify)(_super.prototype.decode.call(this, reader)));\n        };\n        return BytesCoder2;\n      }(DynamicBytesCoder)\n    );\n    exports2.BytesCoder = BytesCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/fixed-bytes.js\nvar require_fixed_bytes = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/fixed-bytes.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FixedBytesCoder = void 0;\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var FixedBytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(FixedBytesCoder2, _super);\n        function FixedBytesCoder2(size, localName) {\n          var _this = this;\n          var name2 = \"bytes\" + String(size);\n          _this = _super.call(this, name2, name2, localName, false) || this;\n          _this.size = size;\n          return _this;\n        }\n        FixedBytesCoder2.prototype.defaultValue = function() {\n          return \"0x0000000000000000000000000000000000000000000000000000000000000000\".substring(0, 2 + this.size * 2);\n        };\n        FixedBytesCoder2.prototype.encode = function(writer, value) {\n          var data = (0, bytes_1.arrayify)(value);\n          if (data.length !== this.size) {\n            this._throwError(\"incorrect data length\", value);\n          }\n          return writer.writeBytes(data);\n        };\n        FixedBytesCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, bytes_1.hexlify)(reader.readBytes(this.size)));\n        };\n        return FixedBytesCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.FixedBytesCoder = FixedBytesCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/null.js\nvar require_null = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/null.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NullCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var NullCoder = (\n      /** @class */\n      function(_super) {\n        __extends(NullCoder2, _super);\n        function NullCoder2(localName) {\n          return _super.call(this, \"null\", \"\", localName, false) || this;\n        }\n        NullCoder2.prototype.defaultValue = function() {\n          return null;\n        };\n        NullCoder2.prototype.encode = function(writer, value) {\n          if (value != null) {\n            this._throwError(\"not null\", value);\n          }\n          return writer.writeBytes([]);\n        };\n        NullCoder2.prototype.decode = function(reader) {\n          reader.readBytes(0);\n          return reader.coerce(this.name, null);\n        };\n        return NullCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.NullCoder = NullCoder;\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/addresses.js\nvar require_addresses = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/addresses.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AddressZero = void 0;\n    exports2.AddressZero = \"0x0000000000000000000000000000000000000000\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/bignumbers.js\nvar require_bignumbers = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/bignumbers.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.MaxInt256 = exports2.MinInt256 = exports2.MaxUint256 = exports2.WeiPerEther = exports2.Two = exports2.One = exports2.Zero = exports2.NegativeOne = void 0;\n    var bignumber_1 = require_lib3();\n    var NegativeOne = /* @__PURE__ */ bignumber_1.BigNumber.from(-1);\n    exports2.NegativeOne = NegativeOne;\n    var Zero = /* @__PURE__ */ bignumber_1.BigNumber.from(0);\n    exports2.Zero = Zero;\n    var One = /* @__PURE__ */ bignumber_1.BigNumber.from(1);\n    exports2.One = One;\n    var Two = /* @__PURE__ */ bignumber_1.BigNumber.from(2);\n    exports2.Two = Two;\n    var WeiPerEther = /* @__PURE__ */ bignumber_1.BigNumber.from(\"1000000000000000000\");\n    exports2.WeiPerEther = WeiPerEther;\n    var MaxUint256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    exports2.MaxUint256 = MaxUint256;\n    var MinInt256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"-0x8000000000000000000000000000000000000000000000000000000000000000\");\n    exports2.MinInt256 = MinInt256;\n    var MaxInt256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    exports2.MaxInt256 = MaxInt256;\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/hashes.js\nvar require_hashes = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/hashes.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.HashZero = void 0;\n    exports2.HashZero = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/strings.js\nvar require_strings = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/strings.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherSymbol = void 0;\n    exports2.EtherSymbol = \"\\u039E\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/index.js\nvar require_lib8 = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherSymbol = exports2.HashZero = exports2.MaxInt256 = exports2.MinInt256 = exports2.MaxUint256 = exports2.WeiPerEther = exports2.Two = exports2.One = exports2.Zero = exports2.NegativeOne = exports2.AddressZero = void 0;\n    var addresses_1 = require_addresses();\n    Object.defineProperty(exports2, \"AddressZero\", { enumerable: true, get: function() {\n      return addresses_1.AddressZero;\n    } });\n    var bignumbers_1 = require_bignumbers();\n    Object.defineProperty(exports2, \"NegativeOne\", { enumerable: true, get: function() {\n      return bignumbers_1.NegativeOne;\n    } });\n    Object.defineProperty(exports2, \"Zero\", { enumerable: true, get: function() {\n      return bignumbers_1.Zero;\n    } });\n    Object.defineProperty(exports2, \"One\", { enumerable: true, get: function() {\n      return bignumbers_1.One;\n    } });\n    Object.defineProperty(exports2, \"Two\", { enumerable: true, get: function() {\n      return bignumbers_1.Two;\n    } });\n    Object.defineProperty(exports2, \"WeiPerEther\", { enumerable: true, get: function() {\n      return bignumbers_1.WeiPerEther;\n    } });\n    Object.defineProperty(exports2, \"MaxUint256\", { enumerable: true, get: function() {\n      return bignumbers_1.MaxUint256;\n    } });\n    Object.defineProperty(exports2, \"MinInt256\", { enumerable: true, get: function() {\n      return bignumbers_1.MinInt256;\n    } });\n    Object.defineProperty(exports2, \"MaxInt256\", { enumerable: true, get: function() {\n      return bignumbers_1.MaxInt256;\n    } });\n    var hashes_1 = require_hashes();\n    Object.defineProperty(exports2, \"HashZero\", { enumerable: true, get: function() {\n      return hashes_1.HashZero;\n    } });\n    var strings_1 = require_strings();\n    Object.defineProperty(exports2, \"EtherSymbol\", { enumerable: true, get: function() {\n      return strings_1.EtherSymbol;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/number.js\nvar require_number = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/number.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NumberCoder = void 0;\n    var bignumber_1 = require_lib3();\n    var constants_1 = require_lib8();\n    var abstract_coder_1 = require_abstract_coder();\n    var NumberCoder = (\n      /** @class */\n      function(_super) {\n        __extends(NumberCoder2, _super);\n        function NumberCoder2(size, signed, localName) {\n          var _this = this;\n          var name2 = (signed ? \"int\" : \"uint\") + size * 8;\n          _this = _super.call(this, name2, name2, localName, false) || this;\n          _this.size = size;\n          _this.signed = signed;\n          return _this;\n        }\n        NumberCoder2.prototype.defaultValue = function() {\n          return 0;\n        };\n        NumberCoder2.prototype.encode = function(writer, value) {\n          var v = bignumber_1.BigNumber.from(value);\n          var maxUintValue = constants_1.MaxUint256.mask(writer.wordSize * 8);\n          if (this.signed) {\n            var bounds = maxUintValue.mask(this.size * 8 - 1);\n            if (v.gt(bounds) || v.lt(bounds.add(constants_1.One).mul(constants_1.NegativeOne))) {\n              this._throwError(\"value out-of-bounds\", value);\n            }\n          } else if (v.lt(constants_1.Zero) || v.gt(maxUintValue.mask(this.size * 8))) {\n            this._throwError(\"value out-of-bounds\", value);\n          }\n          v = v.toTwos(this.size * 8).mask(this.size * 8);\n          if (this.signed) {\n            v = v.fromTwos(this.size * 8).toTwos(8 * writer.wordSize);\n          }\n          return writer.writeValue(v);\n        };\n        NumberCoder2.prototype.decode = function(reader) {\n          var value = reader.readValue().mask(this.size * 8);\n          if (this.signed) {\n            value = value.fromTwos(this.size * 8);\n          }\n          return reader.coerce(this.name, value);\n        };\n        return NumberCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.NumberCoder = NumberCoder;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/_version.js\nvar require_version8 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"strings/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/utf8.js\nvar require_utf8 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/utf8.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.toUtf8CodePoints = exports2.toUtf8String = exports2._toUtf8String = exports2._toEscapedUtf8String = exports2.toUtf8Bytes = exports2.Utf8ErrorFuncs = exports2.Utf8ErrorReason = exports2.UnicodeNormalizationForm = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version8();\n    var logger = new logger_1.Logger(_version_1.version);\n    var UnicodeNormalizationForm;\n    (function(UnicodeNormalizationForm2) {\n      UnicodeNormalizationForm2[\"current\"] = \"\";\n      UnicodeNormalizationForm2[\"NFC\"] = \"NFC\";\n      UnicodeNormalizationForm2[\"NFD\"] = \"NFD\";\n      UnicodeNormalizationForm2[\"NFKC\"] = \"NFKC\";\n      UnicodeNormalizationForm2[\"NFKD\"] = \"NFKD\";\n    })(UnicodeNormalizationForm = exports2.UnicodeNormalizationForm || (exports2.UnicodeNormalizationForm = {}));\n    var Utf8ErrorReason;\n    (function(Utf8ErrorReason2) {\n      Utf8ErrorReason2[\"UNEXPECTED_CONTINUE\"] = \"unexpected continuation byte\";\n      Utf8ErrorReason2[\"BAD_PREFIX\"] = \"bad codepoint prefix\";\n      Utf8ErrorReason2[\"OVERRUN\"] = \"string overrun\";\n      Utf8ErrorReason2[\"MISSING_CONTINUE\"] = \"missing continuation byte\";\n      Utf8ErrorReason2[\"OUT_OF_RANGE\"] = \"out of UTF-8 range\";\n      Utf8ErrorReason2[\"UTF16_SURROGATE\"] = \"UTF-16 surrogate\";\n      Utf8ErrorReason2[\"OVERLONG\"] = \"overlong representation\";\n    })(Utf8ErrorReason = exports2.Utf8ErrorReason || (exports2.Utf8ErrorReason = {}));\n    function errorFunc(reason, offset, bytes, output, badCodepoint) {\n      return logger.throwArgumentError(\"invalid codepoint at offset \" + offset + \"; \" + reason, \"bytes\", bytes);\n    }\n    function ignoreFunc(reason, offset, bytes, output, badCodepoint) {\n      if (reason === Utf8ErrorReason.BAD_PREFIX || reason === Utf8ErrorReason.UNEXPECTED_CONTINUE) {\n        var i = 0;\n        for (var o = offset + 1; o < bytes.length; o++) {\n          if (bytes[o] >> 6 !== 2) {\n            break;\n          }\n          i++;\n        }\n        return i;\n      }\n      if (reason === Utf8ErrorReason.OVERRUN) {\n        return bytes.length - offset - 1;\n      }\n      return 0;\n    }\n    function replaceFunc(reason, offset, bytes, output, badCodepoint) {\n      if (reason === Utf8ErrorReason.OVERLONG) {\n        output.push(badCodepoint);\n        return 0;\n      }\n      output.push(65533);\n      return ignoreFunc(reason, offset, bytes, output, badCodepoint);\n    }\n    exports2.Utf8ErrorFuncs = Object.freeze({\n      error: errorFunc,\n      ignore: ignoreFunc,\n      replace: replaceFunc\n    });\n    function getUtf8CodePoints(bytes, onError) {\n      if (onError == null) {\n        onError = exports2.Utf8ErrorFuncs.error;\n      }\n      bytes = (0, bytes_1.arrayify)(bytes);\n      var result = [];\n      var i = 0;\n      while (i < bytes.length) {\n        var c = bytes[i++];\n        if (c >> 7 === 0) {\n          result.push(c);\n          continue;\n        }\n        var extraLength = null;\n        var overlongMask = null;\n        if ((c & 224) === 192) {\n          extraLength = 1;\n          overlongMask = 127;\n        } else if ((c & 240) === 224) {\n          extraLength = 2;\n          overlongMask = 2047;\n        } else if ((c & 248) === 240) {\n          extraLength = 3;\n          overlongMask = 65535;\n        } else {\n          if ((c & 192) === 128) {\n            i += onError(Utf8ErrorReason.UNEXPECTED_CONTINUE, i - 1, bytes, result);\n          } else {\n            i += onError(Utf8ErrorReason.BAD_PREFIX, i - 1, bytes, result);\n          }\n          continue;\n        }\n        if (i - 1 + extraLength >= bytes.length) {\n          i += onError(Utf8ErrorReason.OVERRUN, i - 1, bytes, result);\n          continue;\n        }\n        var res = c & (1 << 8 - extraLength - 1) - 1;\n        for (var j = 0; j < extraLength; j++) {\n          var nextChar = bytes[i];\n          if ((nextChar & 192) != 128) {\n            i += onError(Utf8ErrorReason.MISSING_CONTINUE, i, bytes, result);\n            res = null;\n            break;\n          }\n          ;\n          res = res << 6 | nextChar & 63;\n          i++;\n        }\n        if (res === null) {\n          continue;\n        }\n        if (res > 1114111) {\n          i += onError(Utf8ErrorReason.OUT_OF_RANGE, i - 1 - extraLength, bytes, result, res);\n          continue;\n        }\n        if (res >= 55296 && res <= 57343) {\n          i += onError(Utf8ErrorReason.UTF16_SURROGATE, i - 1 - extraLength, bytes, result, res);\n          continue;\n        }\n        if (res <= overlongMask) {\n          i += onError(Utf8ErrorReason.OVERLONG, i - 1 - extraLength, bytes, result, res);\n          continue;\n        }\n        result.push(res);\n      }\n      return result;\n    }\n    function toUtf8Bytes(str, form) {\n      if (form === void 0) {\n        form = UnicodeNormalizationForm.current;\n      }\n      if (form != UnicodeNormalizationForm.current) {\n        logger.checkNormalize();\n        str = str.normalize(form);\n      }\n      var result = [];\n      for (var i = 0; i < str.length; i++) {\n        var c = str.charCodeAt(i);\n        if (c < 128) {\n          result.push(c);\n        } else if (c < 2048) {\n          result.push(c >> 6 | 192);\n          result.push(c & 63 | 128);\n        } else if ((c & 64512) == 55296) {\n          i++;\n          var c2 = str.charCodeAt(i);\n          if (i >= str.length || (c2 & 64512) !== 56320) {\n            throw new Error(\"invalid utf-8 string\");\n          }\n          var pair = 65536 + ((c & 1023) << 10) + (c2 & 1023);\n          result.push(pair >> 18 | 240);\n          result.push(pair >> 12 & 63 | 128);\n          result.push(pair >> 6 & 63 | 128);\n          result.push(pair & 63 | 128);\n        } else {\n          result.push(c >> 12 | 224);\n          result.push(c >> 6 & 63 | 128);\n          result.push(c & 63 | 128);\n        }\n      }\n      return (0, bytes_1.arrayify)(result);\n    }\n    exports2.toUtf8Bytes = toUtf8Bytes;\n    function escapeChar(value) {\n      var hex = \"0000\" + value.toString(16);\n      return \"\\\\u\" + hex.substring(hex.length - 4);\n    }\n    function _toEscapedUtf8String(bytes, onError) {\n      return '\"' + getUtf8CodePoints(bytes, onError).map(function(codePoint) {\n        if (codePoint < 256) {\n          switch (codePoint) {\n            case 8:\n              return \"\\\\b\";\n            case 9:\n              return \"\\\\t\";\n            case 10:\n              return \"\\\\n\";\n            case 13:\n              return \"\\\\r\";\n            case 34:\n              return '\\\\\"';\n            case 92:\n              return \"\\\\\\\\\";\n          }\n          if (codePoint >= 32 && codePoint < 127) {\n            return String.fromCharCode(codePoint);\n          }\n        }\n        if (codePoint <= 65535) {\n          return escapeChar(codePoint);\n        }\n        codePoint -= 65536;\n        return escapeChar((codePoint >> 10 & 1023) + 55296) + escapeChar((codePoint & 1023) + 56320);\n      }).join(\"\") + '\"';\n    }\n    exports2._toEscapedUtf8String = _toEscapedUtf8String;\n    function _toUtf8String(codePoints) {\n      return codePoints.map(function(codePoint) {\n        if (codePoint <= 65535) {\n          return String.fromCharCode(codePoint);\n        }\n        codePoint -= 65536;\n        return String.fromCharCode((codePoint >> 10 & 1023) + 55296, (codePoint & 1023) + 56320);\n      }).join(\"\");\n    }\n    exports2._toUtf8String = _toUtf8String;\n    function toUtf8String(bytes, onError) {\n      return _toUtf8String(getUtf8CodePoints(bytes, onError));\n    }\n    exports2.toUtf8String = toUtf8String;\n    function toUtf8CodePoints(str, form) {\n      if (form === void 0) {\n        form = UnicodeNormalizationForm.current;\n      }\n      return getUtf8CodePoints(toUtf8Bytes(str, form));\n    }\n    exports2.toUtf8CodePoints = toUtf8CodePoints;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/bytes32.js\nvar require_bytes32 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/bytes32.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parseBytes32String = exports2.formatBytes32String = void 0;\n    var constants_1 = require_lib8();\n    var bytes_1 = require_lib2();\n    var utf8_1 = require_utf8();\n    function formatBytes32String(text) {\n      var bytes = (0, utf8_1.toUtf8Bytes)(text);\n      if (bytes.length > 31) {\n        throw new Error(\"bytes32 string must be less than 32 bytes\");\n      }\n      return (0, bytes_1.hexlify)((0, bytes_1.concat)([bytes, constants_1.HashZero]).slice(0, 32));\n    }\n    exports2.formatBytes32String = formatBytes32String;\n    function parseBytes32String(bytes) {\n      var data = (0, bytes_1.arrayify)(bytes);\n      if (data.length !== 32) {\n        throw new Error(\"invalid bytes32 - not 32 bytes long\");\n      }\n      if (data[31] !== 0) {\n        throw new Error(\"invalid bytes32 string - no null terminator\");\n      }\n      var length = 31;\n      while (data[length - 1] === 0) {\n        length--;\n      }\n      return (0, utf8_1.toUtf8String)(data.slice(0, length));\n    }\n    exports2.parseBytes32String = parseBytes32String;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/idna.js\nvar require_idna = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/idna.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.nameprep = exports2._nameprepTableC = exports2._nameprepTableB2 = exports2._nameprepTableA1 = void 0;\n    var utf8_1 = require_utf8();\n    function bytes2(data) {\n      if (data.length % 4 !== 0) {\n        throw new Error(\"bad data\");\n      }\n      var result = [];\n      for (var i = 0; i < data.length; i += 4) {\n        result.push(parseInt(data.substring(i, i + 4), 16));\n      }\n      return result;\n    }\n    function createTable(data, func) {\n      if (!func) {\n        func = function(value) {\n          return [parseInt(value, 16)];\n        };\n      }\n      var lo = 0;\n      var result = {};\n      data.split(\",\").forEach(function(pair) {\n        var comps = pair.split(\":\");\n        lo += parseInt(comps[0], 16);\n        result[lo] = func(comps[1]);\n      });\n      return result;\n    }\n    function createRangeTable(data) {\n      var hi = 0;\n      return data.split(\",\").map(function(v) {\n        var comps = v.split(\"-\");\n        if (comps.length === 1) {\n          comps[1] = \"0\";\n        } else if (comps[1] === \"\") {\n          comps[1] = \"1\";\n        }\n        var lo = hi + parseInt(comps[0], 16);\n        hi = parseInt(comps[1], 16);\n        return { l: lo, h: hi };\n      });\n    }\n    function matchMap(value, ranges) {\n      var lo = 0;\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        lo += range.l;\n        if (value >= lo && value <= lo + range.h && (value - lo) % (range.d || 1) === 0) {\n          if (range.e && range.e.indexOf(value - lo) !== -1) {\n            continue;\n          }\n          return range;\n        }\n      }\n      return null;\n    }\n    var Table_A_1_ranges = createRangeTable(\"221,13-1b,5f-,40-10,51-f,11-3,3-3,2-2,2-4,8,2,15,2d,28-8,88,48,27-,3-5,11-20,27-,8,28,3-5,12,18,b-a,1c-4,6-16,2-d,2-2,2,1b-4,17-9,8f-,10,f,1f-2,1c-34,33-14e,4,36-,13-,6-2,1a-f,4,9-,3-,17,8,2-2,5-,2,8-,3-,4-8,2-3,3,6-,16-6,2-,7-3,3-,17,8,3,3,3-,2,6-3,3-,4-a,5,2-6,10-b,4,8,2,4,17,8,3,6-,b,4,4-,2-e,2-4,b-10,4,9-,3-,17,8,3-,5-,9-2,3-,4-7,3-3,3,4-3,c-10,3,7-2,4,5-2,3,2,3-2,3-2,4-2,9,4-3,6-2,4,5-8,2-e,d-d,4,9,4,18,b,6-3,8,4,5-6,3-8,3-3,b-11,3,9,4,18,b,6-3,8,4,5-6,3-6,2,3-3,b-11,3,9,4,18,11-3,7-,4,5-8,2-7,3-3,b-11,3,13-2,19,a,2-,8-2,2-3,7,2,9-11,4-b,3b-3,1e-24,3,2-,3,2-,2-5,5,8,4,2,2-,3,e,4-,6,2,7-,b-,3-21,49,23-5,1c-3,9,25,10-,2-2f,23,6,3,8-2,5-5,1b-45,27-9,2a-,2-3,5b-4,45-4,53-5,8,40,2,5-,8,2,5-,28,2,5-,20,2,5-,8,2,5-,8,8,18,20,2,5-,8,28,14-5,1d-22,56-b,277-8,1e-2,52-e,e,8-a,18-8,15-b,e,4,3-b,5e-2,b-15,10,b-5,59-7,2b-555,9d-3,5b-5,17-,7-,27-,7-,9,2,2,2,20-,36,10,f-,7,14-,4,a,54-3,2-6,6-5,9-,1c-10,13-1d,1c-14,3c-,10-6,32-b,240-30,28-18,c-14,a0,115-,3,66-,b-76,5,5-,1d,24,2,5-2,2,8-,35-2,19,f-10,1d-3,311-37f,1b,5a-b,d7-19,d-3,41,57-,68-4,29-3,5f,29-37,2e-2,25-c,2c-2,4e-3,30,78-3,64-,20,19b7-49,51a7-59,48e-2,38-738,2ba5-5b,222f-,3c-94,8-b,6-4,1b,6,2,3,3,6d-20,16e-f,41-,37-7,2e-2,11-f,5-b,18-,b,14,5-3,6,88-,2,bf-2,7-,7-,7-,4-2,8,8-9,8-2ff,20,5-b,1c-b4,27-,27-cbb1,f7-9,28-2,b5-221,56,48,3-,2-,3-,5,d,2,5,3,42,5-,9,8,1d,5,6,2-2,8,153-3,123-3,33-27fd,a6da-5128,21f-5df,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3,2-1d,61-ff7d\");\n    var Table_B_1_flags = \"ad,34f,1806,180b,180c,180d,200b,200c,200d,2060,feff\".split(\",\").map(function(v) {\n      return parseInt(v, 16);\n    });\n    var Table_B_2_ranges = [\n      { h: 25, s: 32, l: 65 },\n      { h: 30, s: 32, e: [23], l: 127 },\n      { h: 54, s: 1, e: [48], l: 64, d: 2 },\n      { h: 14, s: 1, l: 57, d: 2 },\n      { h: 44, s: 1, l: 17, d: 2 },\n      { h: 10, s: 1, e: [2, 6, 8], l: 61, d: 2 },\n      { h: 16, s: 1, l: 68, d: 2 },\n      { h: 84, s: 1, e: [18, 24, 66], l: 19, d: 2 },\n      { h: 26, s: 32, e: [17], l: 435 },\n      { h: 22, s: 1, l: 71, d: 2 },\n      { h: 15, s: 80, l: 40 },\n      { h: 31, s: 32, l: 16 },\n      { h: 32, s: 1, l: 80, d: 2 },\n      { h: 52, s: 1, l: 42, d: 2 },\n      { h: 12, s: 1, l: 55, d: 2 },\n      { h: 40, s: 1, e: [38], l: 15, d: 2 },\n      { h: 14, s: 1, l: 48, d: 2 },\n      { h: 37, s: 48, l: 49 },\n      { h: 148, s: 1, l: 6351, d: 2 },\n      { h: 88, s: 1, l: 160, d: 2 },\n      { h: 15, s: 16, l: 704 },\n      { h: 25, s: 26, l: 854 },\n      { h: 25, s: 32, l: 55915 },\n      { h: 37, s: 40, l: 1247 },\n      { h: 25, s: -119711, l: 53248 },\n      { h: 25, s: -119763, l: 52 },\n      { h: 25, s: -119815, l: 52 },\n      { h: 25, s: -119867, e: [1, 4, 5, 7, 8, 11, 12, 17], l: 52 },\n      { h: 25, s: -119919, l: 52 },\n      { h: 24, s: -119971, e: [2, 7, 8, 17], l: 52 },\n      { h: 24, s: -120023, e: [2, 7, 13, 15, 16, 17], l: 52 },\n      { h: 25, s: -120075, l: 52 },\n      { h: 25, s: -120127, l: 52 },\n      { h: 25, s: -120179, l: 52 },\n      { h: 25, s: -120231, l: 52 },\n      { h: 25, s: -120283, l: 52 },\n      { h: 25, s: -120335, l: 52 },\n      { h: 24, s: -119543, e: [17], l: 56 },\n      { h: 24, s: -119601, e: [17], l: 58 },\n      { h: 24, s: -119659, e: [17], l: 58 },\n      { h: 24, s: -119717, e: [17], l: 58 },\n      { h: 24, s: -119775, e: [17], l: 58 }\n    ];\n    var Table_B_2_lut_abs = createTable(\"b5:3bc,c3:ff,7:73,2:253,5:254,3:256,1:257,5:259,1:25b,3:260,1:263,2:269,1:268,5:26f,1:272,2:275,7:280,3:283,5:288,3:28a,1:28b,5:292,3f:195,1:1bf,29:19e,125:3b9,8b:3b2,1:3b8,1:3c5,3:3c6,1:3c0,1a:3ba,1:3c1,1:3c3,2:3b8,1:3b5,1bc9:3b9,1c:1f76,1:1f77,f:1f7a,1:1f7b,d:1f78,1:1f79,1:1f7c,1:1f7d,107:63,5:25b,4:68,1:68,1:68,3:69,1:69,1:6c,3:6e,4:70,1:71,1:72,1:72,1:72,7:7a,2:3c9,2:7a,2:6b,1:e5,1:62,1:63,3:65,1:66,2:6d,b:3b3,1:3c0,6:64,1b574:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3\");\n    var Table_B_2_lut_rel = createTable(\"179:1,2:1,2:1,5:1,2:1,a:4f,a:1,8:1,2:1,2:1,3:1,5:1,3:1,4:1,2:1,3:1,4:1,8:2,1:1,2:2,1:1,2:2,27:2,195:26,2:25,1:25,1:25,2:40,2:3f,1:3f,33:1,11:-6,1:-9,1ac7:-3a,6d:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,b:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,c:-8,2:-8,2:-8,2:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,49:-8,1:-8,1:-4a,1:-4a,d:-56,1:-56,1:-56,1:-56,d:-8,1:-8,f:-8,1:-8,3:-7\");\n    var Table_B_2_complex = createTable(\"df:00730073,51:00690307,19:02BC006E,a7:006A030C,18a:002003B9,16:03B903080301,20:03C503080301,1d7:05650582,190f:00680331,1:00740308,1:0077030A,1:0079030A,1:006102BE,b6:03C50313,2:03C503130300,2:03C503130301,2:03C503130342,2a:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,3:1F7003B9,1:03B103B9,1:03AC03B9,2:03B10342,1:03B1034203B9,5:03B103B9,6:1F7403B9,1:03B703B9,1:03AE03B9,2:03B70342,1:03B7034203B9,5:03B703B9,6:03B903080300,1:03B903080301,3:03B90342,1:03B903080342,b:03C503080300,1:03C503080301,1:03C10313,2:03C50342,1:03C503080342,b:1F7C03B9,1:03C903B9,1:03CE03B9,2:03C90342,1:03C9034203B9,5:03C903B9,ac:00720073,5b:00B00063,6:00B00066,d:006E006F,a:0073006D,1:00740065006C,1:0074006D,124f:006800700061,2:00610075,2:006F0076,b:00700061,1:006E0061,1:03BC0061,1:006D0061,1:006B0061,1:006B0062,1:006D0062,1:00670062,3:00700066,1:006E0066,1:03BC0066,4:0068007A,1:006B0068007A,1:006D0068007A,1:00670068007A,1:00740068007A,15:00700061,1:006B00700061,1:006D00700061,1:006700700061,8:00700076,1:006E0076,1:03BC0076,1:006D0076,1:006B0076,1:006D0076,1:00700077,1:006E0077,1:03BC0077,1:006D0077,1:006B0077,1:006D0077,1:006B03C9,1:006D03C9,2:00620071,3:00632215006B0067,1:0063006F002E,1:00640062,1:00670079,2:00680070,2:006B006B,1:006B006D,9:00700068,2:00700070006D,1:00700072,2:00730076,1:00770062,c723:00660066,1:00660069,1:0066006C,1:006600660069,1:00660066006C,1:00730074,1:00730074,d:05740576,1:05740565,1:0574056B,1:057E0576,1:0574056D\", bytes2);\n    var Table_C_ranges = createRangeTable(\"80-20,2a0-,39c,32,f71,18e,7f2-f,19-7,30-4,7-5,f81-b,5,a800-20ff,4d1-1f,110,fa-6,d174-7,2e84-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,2,1f-5f,ff7f-20001\");\n    function flatten(values) {\n      return values.reduce(function(accum, value) {\n        value.forEach(function(value2) {\n          accum.push(value2);\n        });\n        return accum;\n      }, []);\n    }\n    function _nameprepTableA1(codepoint) {\n      return !!matchMap(codepoint, Table_A_1_ranges);\n    }\n    exports2._nameprepTableA1 = _nameprepTableA1;\n    function _nameprepTableB2(codepoint) {\n      var range = matchMap(codepoint, Table_B_2_ranges);\n      if (range) {\n        return [codepoint + range.s];\n      }\n      var codes = Table_B_2_lut_abs[codepoint];\n      if (codes) {\n        return codes;\n      }\n      var shift = Table_B_2_lut_rel[codepoint];\n      if (shift) {\n        return [codepoint + shift[0]];\n      }\n      var complex = Table_B_2_complex[codepoint];\n      if (complex) {\n        return complex;\n      }\n      return null;\n    }\n    exports2._nameprepTableB2 = _nameprepTableB2;\n    function _nameprepTableC(codepoint) {\n      return !!matchMap(codepoint, Table_C_ranges);\n    }\n    exports2._nameprepTableC = _nameprepTableC;\n    function nameprep(value) {\n      if (value.match(/^[a-z0-9-]*$/i) && value.length <= 59) {\n        return value.toLowerCase();\n      }\n      var codes = (0, utf8_1.toUtf8CodePoints)(value);\n      codes = flatten(codes.map(function(code) {\n        if (Table_B_1_flags.indexOf(code) >= 0) {\n          return [];\n        }\n        if (code >= 65024 && code <= 65039) {\n          return [];\n        }\n        var codesTableB2 = _nameprepTableB2(code);\n        if (codesTableB2) {\n          return codesTableB2;\n        }\n        return [code];\n      }));\n      codes = (0, utf8_1.toUtf8CodePoints)((0, utf8_1._toUtf8String)(codes), utf8_1.UnicodeNormalizationForm.NFKC);\n      codes.forEach(function(code) {\n        if (_nameprepTableC(code)) {\n          throw new Error(\"STRINGPREP_CONTAINS_PROHIBITED\");\n        }\n      });\n      codes.forEach(function(code) {\n        if (_nameprepTableA1(code)) {\n          throw new Error(\"STRINGPREP_CONTAINS_UNASSIGNED\");\n        }\n      });\n      var name2 = (0, utf8_1._toUtf8String)(codes);\n      if (name2.substring(0, 1) === \"-\" || name2.substring(2, 4) === \"--\" || name2.substring(name2.length - 1) === \"-\") {\n        throw new Error(\"invalid hyphen\");\n      }\n      if (name2.length > 63) {\n        throw new Error(\"too long\");\n      }\n      return name2;\n    }\n    exports2.nameprep = nameprep;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/index.js\nvar require_lib9 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.nameprep = exports2.parseBytes32String = exports2.formatBytes32String = exports2.UnicodeNormalizationForm = exports2.Utf8ErrorReason = exports2.Utf8ErrorFuncs = exports2.toUtf8String = exports2.toUtf8CodePoints = exports2.toUtf8Bytes = exports2._toEscapedUtf8String = void 0;\n    var bytes32_1 = require_bytes32();\n    Object.defineProperty(exports2, \"formatBytes32String\", { enumerable: true, get: function() {\n      return bytes32_1.formatBytes32String;\n    } });\n    Object.defineProperty(exports2, \"parseBytes32String\", { enumerable: true, get: function() {\n      return bytes32_1.parseBytes32String;\n    } });\n    var idna_1 = require_idna();\n    Object.defineProperty(exports2, \"nameprep\", { enumerable: true, get: function() {\n      return idna_1.nameprep;\n    } });\n    var utf8_1 = require_utf8();\n    Object.defineProperty(exports2, \"_toEscapedUtf8String\", { enumerable: true, get: function() {\n      return utf8_1._toEscapedUtf8String;\n    } });\n    Object.defineProperty(exports2, \"toUtf8Bytes\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8Bytes;\n    } });\n    Object.defineProperty(exports2, \"toUtf8CodePoints\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8CodePoints;\n    } });\n    Object.defineProperty(exports2, \"toUtf8String\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8String;\n    } });\n    Object.defineProperty(exports2, \"UnicodeNormalizationForm\", { enumerable: true, get: function() {\n      return utf8_1.UnicodeNormalizationForm;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorFuncs\", { enumerable: true, get: function() {\n      return utf8_1.Utf8ErrorFuncs;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorReason\", { enumerable: true, get: function() {\n      return utf8_1.Utf8ErrorReason;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/string.js\nvar require_string = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/string.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.StringCoder = void 0;\n    var strings_1 = require_lib9();\n    var bytes_1 = require_bytes();\n    var StringCoder = (\n      /** @class */\n      function(_super) {\n        __extends(StringCoder2, _super);\n        function StringCoder2(localName) {\n          return _super.call(this, \"string\", localName) || this;\n        }\n        StringCoder2.prototype.defaultValue = function() {\n          return \"\";\n        };\n        StringCoder2.prototype.encode = function(writer, value) {\n          return _super.prototype.encode.call(this, writer, (0, strings_1.toUtf8Bytes)(value));\n        };\n        StringCoder2.prototype.decode = function(reader) {\n          return (0, strings_1.toUtf8String)(_super.prototype.decode.call(this, reader));\n        };\n        return StringCoder2;\n      }(bytes_1.DynamicBytesCoder)\n    );\n    exports2.StringCoder = StringCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/tuple.js\nvar require_tuple = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/tuple.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TupleCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var array_1 = require_array();\n    var TupleCoder = (\n      /** @class */\n      function(_super) {\n        __extends(TupleCoder2, _super);\n        function TupleCoder2(coders, localName) {\n          var _this = this;\n          var dynamic = false;\n          var types = [];\n          coders.forEach(function(coder) {\n            if (coder.dynamic) {\n              dynamic = true;\n            }\n            types.push(coder.type);\n          });\n          var type = \"tuple(\" + types.join(\",\") + \")\";\n          _this = _super.call(this, \"tuple\", type, localName, dynamic) || this;\n          _this.coders = coders;\n          return _this;\n        }\n        TupleCoder2.prototype.defaultValue = function() {\n          var values = [];\n          this.coders.forEach(function(coder) {\n            values.push(coder.defaultValue());\n          });\n          var uniqueNames = this.coders.reduce(function(accum, coder) {\n            var name2 = coder.localName;\n            if (name2) {\n              if (!accum[name2]) {\n                accum[name2] = 0;\n              }\n              accum[name2]++;\n            }\n            return accum;\n          }, {});\n          this.coders.forEach(function(coder, index) {\n            var name2 = coder.localName;\n            if (!name2 || uniqueNames[name2] !== 1) {\n              return;\n            }\n            if (name2 === \"length\") {\n              name2 = \"_length\";\n            }\n            if (values[name2] != null) {\n              return;\n            }\n            values[name2] = values[index];\n          });\n          return Object.freeze(values);\n        };\n        TupleCoder2.prototype.encode = function(writer, value) {\n          return (0, array_1.pack)(writer, this.coders, value);\n        };\n        TupleCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, array_1.unpack)(reader, this.coders));\n        };\n        return TupleCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.TupleCoder = TupleCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/abi-coder.js\nvar require_abi_coder = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/abi-coder.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.defaultAbiCoder = exports2.AbiCoder = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var abstract_coder_1 = require_abstract_coder();\n    var address_1 = require_address();\n    var array_1 = require_array();\n    var boolean_1 = require_boolean();\n    var bytes_2 = require_bytes();\n    var fixed_bytes_1 = require_fixed_bytes();\n    var null_1 = require_null();\n    var number_1 = require_number();\n    var string_1 = require_string();\n    var tuple_1 = require_tuple();\n    var fragments_1 = require_fragments();\n    var paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);\n    var paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);\n    var AbiCoder = (\n      /** @class */\n      function() {\n        function AbiCoder2(coerceFunc) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, AbiCoder2);\n          (0, properties_1.defineReadOnly)(this, \"coerceFunc\", coerceFunc || null);\n        }\n        AbiCoder2.prototype._getCoder = function(param) {\n          var _this = this;\n          switch (param.baseType) {\n            case \"address\":\n              return new address_1.AddressCoder(param.name);\n            case \"bool\":\n              return new boolean_1.BooleanCoder(param.name);\n            case \"string\":\n              return new string_1.StringCoder(param.name);\n            case \"bytes\":\n              return new bytes_2.BytesCoder(param.name);\n            case \"array\":\n              return new array_1.ArrayCoder(this._getCoder(param.arrayChildren), param.arrayLength, param.name);\n            case \"tuple\":\n              return new tuple_1.TupleCoder((param.components || []).map(function(component) {\n                return _this._getCoder(component);\n              }), param.name);\n            case \"\":\n              return new null_1.NullCoder(param.name);\n          }\n          var match = param.type.match(paramTypeNumber);\n          if (match) {\n            var size = parseInt(match[2] || \"256\");\n            if (size === 0 || size > 256 || size % 8 !== 0) {\n              logger.throwArgumentError(\"invalid \" + match[1] + \" bit length\", \"param\", param);\n            }\n            return new number_1.NumberCoder(size / 8, match[1] === \"int\", param.name);\n          }\n          match = param.type.match(paramTypeBytes);\n          if (match) {\n            var size = parseInt(match[1]);\n            if (size === 0 || size > 32) {\n              logger.throwArgumentError(\"invalid bytes length\", \"param\", param);\n            }\n            return new fixed_bytes_1.FixedBytesCoder(size, param.name);\n          }\n          return logger.throwArgumentError(\"invalid type\", \"type\", param.type);\n        };\n        AbiCoder2.prototype._getWordSize = function() {\n          return 32;\n        };\n        AbiCoder2.prototype._getReader = function(data, allowLoose) {\n          return new abstract_coder_1.Reader(data, this._getWordSize(), this.coerceFunc, allowLoose);\n        };\n        AbiCoder2.prototype._getWriter = function() {\n          return new abstract_coder_1.Writer(this._getWordSize());\n        };\n        AbiCoder2.prototype.getDefaultValue = function(types) {\n          var _this = this;\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          return coder.defaultValue();\n        };\n        AbiCoder2.prototype.encode = function(types, values) {\n          var _this = this;\n          if (types.length !== values.length) {\n            logger.throwError(\"types/values length mismatch\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              count: { types: types.length, values: values.length },\n              value: { types, values }\n            });\n          }\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          var writer = this._getWriter();\n          coder.encode(writer, values);\n          return writer.data;\n        };\n        AbiCoder2.prototype.decode = function(types, data, loose) {\n          var _this = this;\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          return coder.decode(this._getReader((0, bytes_1.arrayify)(data), loose));\n        };\n        return AbiCoder2;\n      }()\n    );\n    exports2.AbiCoder = AbiCoder;\n    exports2.defaultAbiCoder = new AbiCoder();\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/id.js\nvar require_id = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/id.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.id = void 0;\n    var keccak256_1 = require_lib5();\n    var strings_1 = require_lib9();\n    function id(text) {\n      return (0, keccak256_1.keccak256)((0, strings_1.toUtf8Bytes)(text));\n    }\n    exports2.id = id;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/_version.js\nvar require_version9 = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"hash/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/namehash.js\nvar require_namehash = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/namehash.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.namehash = exports2.isValidName = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    var keccak256_1 = require_lib5();\n    var logger_1 = require_lib();\n    var _version_1 = require_version9();\n    var logger = new logger_1.Logger(_version_1.version);\n    var Zeros = new Uint8Array(32);\n    Zeros.fill(0);\n    var Partition = new RegExp(\"^((.*)\\\\.)?([^.]+)$\");\n    function isValidName(name2) {\n      try {\n        var comps = name2.split(\".\");\n        for (var i = 0; i < comps.length; i++) {\n          if ((0, strings_1.nameprep)(comps[i]).length === 0) {\n            throw new Error(\"empty\");\n          }\n        }\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isValidName = isValidName;\n    function namehash(name2) {\n      if (typeof name2 !== \"string\") {\n        logger.throwArgumentError(\"invalid ENS name; not a string\", \"name\", name2);\n      }\n      var current = name2;\n      var result = Zeros;\n      while (current.length) {\n        var partition = current.match(Partition);\n        if (partition == null || partition[2] === \"\") {\n          logger.throwArgumentError(\"invalid ENS address; missing component\", \"name\", name2);\n        }\n        var label = (0, strings_1.toUtf8Bytes)((0, strings_1.nameprep)(partition[3]));\n        result = (0, keccak256_1.keccak256)((0, bytes_1.concat)([result, (0, keccak256_1.keccak256)(label)]));\n        current = partition[2] || \"\";\n      }\n      return (0, bytes_1.hexlify)(result);\n    }\n    exports2.namehash = namehash;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/message.js\nvar require_message = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/message.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.hashMessage = exports2.messagePrefix = void 0;\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var strings_1 = require_lib9();\n    exports2.messagePrefix = \"\u0019Ethereum Signed Message:\\n\";\n    function hashMessage(message) {\n      if (typeof message === \"string\") {\n        message = (0, strings_1.toUtf8Bytes)(message);\n      }\n      return (0, keccak256_1.keccak256)((0, bytes_1.concat)([\n        (0, strings_1.toUtf8Bytes)(exports2.messagePrefix),\n        (0, strings_1.toUtf8Bytes)(String(message.length)),\n        message\n      ]));\n    }\n    exports2.hashMessage = hashMessage;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/typed-data.js\nvar require_typed_data = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/typed-data.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TypedDataEncoder = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version9();\n    var logger = new logger_1.Logger(_version_1.version);\n    var id_1 = require_id();\n    var padding = new Uint8Array(32);\n    padding.fill(0);\n    var NegativeOne = bignumber_1.BigNumber.from(-1);\n    var Zero = bignumber_1.BigNumber.from(0);\n    var One = bignumber_1.BigNumber.from(1);\n    var MaxUint256 = bignumber_1.BigNumber.from(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    function hexPadRight(value) {\n      var bytes = (0, bytes_1.arrayify)(value);\n      var padOffset = bytes.length % 32;\n      if (padOffset) {\n        return (0, bytes_1.hexConcat)([bytes, padding.slice(padOffset)]);\n      }\n      return (0, bytes_1.hexlify)(bytes);\n    }\n    var hexTrue = (0, bytes_1.hexZeroPad)(One.toHexString(), 32);\n    var hexFalse = (0, bytes_1.hexZeroPad)(Zero.toHexString(), 32);\n    var domainFieldTypes = {\n      name: \"string\",\n      version: \"string\",\n      chainId: \"uint256\",\n      verifyingContract: \"address\",\n      salt: \"bytes32\"\n    };\n    var domainFieldNames = [\n      \"name\",\n      \"version\",\n      \"chainId\",\n      \"verifyingContract\",\n      \"salt\"\n    ];\n    function checkString(key) {\n      return function(value) {\n        if (typeof value !== \"string\") {\n          logger.throwArgumentError(\"invalid domain value for \" + JSON.stringify(key), \"domain.\" + key, value);\n        }\n        return value;\n      };\n    }\n    var domainChecks = {\n      name: checkString(\"name\"),\n      version: checkString(\"version\"),\n      chainId: function(value) {\n        try {\n          return bignumber_1.BigNumber.from(value).toString();\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value for \"chainId\"', \"domain.chainId\", value);\n      },\n      verifyingContract: function(value) {\n        try {\n          return (0, address_1.getAddress)(value).toLowerCase();\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value \"verifyingContract\"', \"domain.verifyingContract\", value);\n      },\n      salt: function(value) {\n        try {\n          var bytes = (0, bytes_1.arrayify)(value);\n          if (bytes.length !== 32) {\n            throw new Error(\"bad length\");\n          }\n          return (0, bytes_1.hexlify)(bytes);\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value \"salt\"', \"domain.salt\", value);\n      }\n    };\n    function getBaseEncoder(type) {\n      {\n        var match = type.match(/^(u?)int(\\d*)$/);\n        if (match) {\n          var signed = match[1] === \"\";\n          var width = parseInt(match[2] || \"256\");\n          if (width % 8 !== 0 || width > 256 || match[2] && match[2] !== String(width)) {\n            logger.throwArgumentError(\"invalid numeric width\", \"type\", type);\n          }\n          var boundsUpper_1 = MaxUint256.mask(signed ? width - 1 : width);\n          var boundsLower_1 = signed ? boundsUpper_1.add(One).mul(NegativeOne) : Zero;\n          return function(value) {\n            var v = bignumber_1.BigNumber.from(value);\n            if (v.lt(boundsLower_1) || v.gt(boundsUpper_1)) {\n              logger.throwArgumentError(\"value out-of-bounds for \" + type, \"value\", value);\n            }\n            return (0, bytes_1.hexZeroPad)(v.toTwos(256).toHexString(), 32);\n          };\n        }\n      }\n      {\n        var match = type.match(/^bytes(\\d+)$/);\n        if (match) {\n          var width_1 = parseInt(match[1]);\n          if (width_1 === 0 || width_1 > 32 || match[1] !== String(width_1)) {\n            logger.throwArgumentError(\"invalid bytes width\", \"type\", type);\n          }\n          return function(value) {\n            var bytes = (0, bytes_1.arrayify)(value);\n            if (bytes.length !== width_1) {\n              logger.throwArgumentError(\"invalid length for \" + type, \"value\", value);\n            }\n            return hexPadRight(value);\n          };\n        }\n      }\n      switch (type) {\n        case \"address\":\n          return function(value) {\n            return (0, bytes_1.hexZeroPad)((0, address_1.getAddress)(value), 32);\n          };\n        case \"bool\":\n          return function(value) {\n            return !value ? hexFalse : hexTrue;\n          };\n        case \"bytes\":\n          return function(value) {\n            return (0, keccak256_1.keccak256)(value);\n          };\n        case \"string\":\n          return function(value) {\n            return (0, id_1.id)(value);\n          };\n      }\n      return null;\n    }\n    function encodeType(name2, fields) {\n      return name2 + \"(\" + fields.map(function(_a) {\n        var name3 = _a.name, type = _a.type;\n        return type + \" \" + name3;\n      }).join(\",\") + \")\";\n    }\n    var TypedDataEncoder = (\n      /** @class */\n      function() {\n        function TypedDataEncoder2(types) {\n          (0, properties_1.defineReadOnly)(this, \"types\", Object.freeze((0, properties_1.deepCopy)(types)));\n          (0, properties_1.defineReadOnly)(this, \"_encoderCache\", {});\n          (0, properties_1.defineReadOnly)(this, \"_types\", {});\n          var links = {};\n          var parents = {};\n          var subtypes = {};\n          Object.keys(types).forEach(function(type) {\n            links[type] = {};\n            parents[type] = [];\n            subtypes[type] = {};\n          });\n          var _loop_1 = function(name_12) {\n            var uniqueNames = {};\n            types[name_12].forEach(function(field) {\n              if (uniqueNames[field.name]) {\n                logger.throwArgumentError(\"duplicate variable name \" + JSON.stringify(field.name) + \" in \" + JSON.stringify(name_12), \"types\", types);\n              }\n              uniqueNames[field.name] = true;\n              var baseType = field.type.match(/^([^\\x5b]*)(\\x5b|$)/)[1];\n              if (baseType === name_12) {\n                logger.throwArgumentError(\"circular type reference to \" + JSON.stringify(baseType), \"types\", types);\n              }\n              var encoder = getBaseEncoder(baseType);\n              if (encoder) {\n                return;\n              }\n              if (!parents[baseType]) {\n                logger.throwArgumentError(\"unknown type \" + JSON.stringify(baseType), \"types\", types);\n              }\n              parents[baseType].push(name_12);\n              links[name_12][baseType] = true;\n            });\n          };\n          for (var name_1 in types) {\n            _loop_1(name_1);\n          }\n          var primaryTypes = Object.keys(parents).filter(function(n) {\n            return parents[n].length === 0;\n          });\n          if (primaryTypes.length === 0) {\n            logger.throwArgumentError(\"missing primary type\", \"types\", types);\n          } else if (primaryTypes.length > 1) {\n            logger.throwArgumentError(\"ambiguous primary types or unused types: \" + primaryTypes.map(function(t) {\n              return JSON.stringify(t);\n            }).join(\", \"), \"types\", types);\n          }\n          (0, properties_1.defineReadOnly)(this, \"primaryType\", primaryTypes[0]);\n          function checkCircular(type, found) {\n            if (found[type]) {\n              logger.throwArgumentError(\"circular type reference to \" + JSON.stringify(type), \"types\", types);\n            }\n            found[type] = true;\n            Object.keys(links[type]).forEach(function(child) {\n              if (!parents[child]) {\n                return;\n              }\n              checkCircular(child, found);\n              Object.keys(found).forEach(function(subtype) {\n                subtypes[subtype][child] = true;\n              });\n            });\n            delete found[type];\n          }\n          checkCircular(this.primaryType, {});\n          for (var name_2 in subtypes) {\n            var st = Object.keys(subtypes[name_2]);\n            st.sort();\n            this._types[name_2] = encodeType(name_2, types[name_2]) + st.map(function(t) {\n              return encodeType(t, types[t]);\n            }).join(\"\");\n          }\n        }\n        TypedDataEncoder2.prototype.getEncoder = function(type) {\n          var encoder = this._encoderCache[type];\n          if (!encoder) {\n            encoder = this._encoderCache[type] = this._getEncoder(type);\n          }\n          return encoder;\n        };\n        TypedDataEncoder2.prototype._getEncoder = function(type) {\n          var _this = this;\n          {\n            var encoder = getBaseEncoder(type);\n            if (encoder) {\n              return encoder;\n            }\n          }\n          var match = type.match(/^(.*)(\\x5b(\\d*)\\x5d)$/);\n          if (match) {\n            var subtype_1 = match[1];\n            var subEncoder_1 = this.getEncoder(subtype_1);\n            var length_1 = parseInt(match[3]);\n            return function(value) {\n              if (length_1 >= 0 && value.length !== length_1) {\n                logger.throwArgumentError(\"array length mismatch; expected length ${ arrayLength }\", \"value\", value);\n              }\n              var result = value.map(subEncoder_1);\n              if (_this._types[subtype_1]) {\n                result = result.map(keccak256_1.keccak256);\n              }\n              return (0, keccak256_1.keccak256)((0, bytes_1.hexConcat)(result));\n            };\n          }\n          var fields = this.types[type];\n          if (fields) {\n            var encodedType_1 = (0, id_1.id)(this._types[type]);\n            return function(value) {\n              var values = fields.map(function(_a) {\n                var name2 = _a.name, type2 = _a.type;\n                var result = _this.getEncoder(type2)(value[name2]);\n                if (_this._types[type2]) {\n                  return (0, keccak256_1.keccak256)(result);\n                }\n                return result;\n              });\n              values.unshift(encodedType_1);\n              return (0, bytes_1.hexConcat)(values);\n            };\n          }\n          return logger.throwArgumentError(\"unknown type: \" + type, \"type\", type);\n        };\n        TypedDataEncoder2.prototype.encodeType = function(name2) {\n          var result = this._types[name2];\n          if (!result) {\n            logger.throwArgumentError(\"unknown type: \" + JSON.stringify(name2), \"name\", name2);\n          }\n          return result;\n        };\n        TypedDataEncoder2.prototype.encodeData = function(type, value) {\n          return this.getEncoder(type)(value);\n        };\n        TypedDataEncoder2.prototype.hashStruct = function(name2, value) {\n          return (0, keccak256_1.keccak256)(this.encodeData(name2, value));\n        };\n        TypedDataEncoder2.prototype.encode = function(value) {\n          return this.encodeData(this.primaryType, value);\n        };\n        TypedDataEncoder2.prototype.hash = function(value) {\n          return this.hashStruct(this.primaryType, value);\n        };\n        TypedDataEncoder2.prototype._visit = function(type, value, callback) {\n          var _this = this;\n          {\n            var encoder = getBaseEncoder(type);\n            if (encoder) {\n              return callback(type, value);\n            }\n          }\n          var match = type.match(/^(.*)(\\x5b(\\d*)\\x5d)$/);\n          if (match) {\n            var subtype_2 = match[1];\n            var length_2 = parseInt(match[3]);\n            if (length_2 >= 0 && value.length !== length_2) {\n              logger.throwArgumentError(\"array length mismatch; expected length ${ arrayLength }\", \"value\", value);\n            }\n            return value.map(function(v) {\n              return _this._visit(subtype_2, v, callback);\n            });\n          }\n          var fields = this.types[type];\n          if (fields) {\n            return fields.reduce(function(accum, _a) {\n              var name2 = _a.name, type2 = _a.type;\n              accum[name2] = _this._visit(type2, value[name2], callback);\n              return accum;\n            }, {});\n          }\n          return logger.throwArgumentError(\"unknown type: \" + type, \"type\", type);\n        };\n        TypedDataEncoder2.prototype.visit = function(value, callback) {\n          return this._visit(this.primaryType, value, callback);\n        };\n        TypedDataEncoder2.from = function(types) {\n          return new TypedDataEncoder2(types);\n        };\n        TypedDataEncoder2.getPrimaryType = function(types) {\n          return TypedDataEncoder2.from(types).primaryType;\n        };\n        TypedDataEncoder2.hashStruct = function(name2, types, value) {\n          return TypedDataEncoder2.from(types).hashStruct(name2, value);\n        };\n        TypedDataEncoder2.hashDomain = function(domain) {\n          var domainFields = [];\n          for (var name_3 in domain) {\n            var type = domainFieldTypes[name_3];\n            if (!type) {\n              logger.throwArgumentError(\"invalid typed-data domain key: \" + JSON.stringify(name_3), \"domain\", domain);\n            }\n            domainFields.push({ name: name_3, type });\n          }\n          domainFields.sort(function(a, b) {\n            return domainFieldNames.indexOf(a.name) - domainFieldNames.indexOf(b.name);\n          });\n          return TypedDataEncoder2.hashStruct(\"EIP712Domain\", { EIP712Domain: domainFields }, domain);\n        };\n        TypedDataEncoder2.encode = function(domain, types, value) {\n          return (0, bytes_1.hexConcat)([\n            \"0x1901\",\n            TypedDataEncoder2.hashDomain(domain),\n            TypedDataEncoder2.from(types).hash(value)\n          ]);\n        };\n        TypedDataEncoder2.hash = function(domain, types, value) {\n          return (0, keccak256_1.keccak256)(TypedDataEncoder2.encode(domain, types, value));\n        };\n        TypedDataEncoder2.resolveNames = function(domain, types, value, resolveName) {\n          return __awaiter(this, void 0, void 0, function() {\n            var ensCache, encoder, _a, _b, _i, name_4, _c, _d;\n            return __generator(this, function(_e) {\n              switch (_e.label) {\n                case 0:\n                  domain = (0, properties_1.shallowCopy)(domain);\n                  ensCache = {};\n                  if (domain.verifyingContract && !(0, bytes_1.isHexString)(domain.verifyingContract, 20)) {\n                    ensCache[domain.verifyingContract] = \"0x\";\n                  }\n                  encoder = TypedDataEncoder2.from(types);\n                  encoder.visit(value, function(type, value2) {\n                    if (type === \"address\" && !(0, bytes_1.isHexString)(value2, 20)) {\n                      ensCache[value2] = \"0x\";\n                    }\n                    return value2;\n                  });\n                  _a = [];\n                  for (_b in ensCache)\n                    _a.push(_b);\n                  _i = 0;\n                  _e.label = 1;\n                case 1:\n                  if (!(_i < _a.length)) return [3, 4];\n                  name_4 = _a[_i];\n                  _c = ensCache;\n                  _d = name_4;\n                  return [4, resolveName(name_4)];\n                case 2:\n                  _c[_d] = _e.sent();\n                  _e.label = 3;\n                case 3:\n                  _i++;\n                  return [3, 1];\n                case 4:\n                  if (domain.verifyingContract && ensCache[domain.verifyingContract]) {\n                    domain.verifyingContract = ensCache[domain.verifyingContract];\n                  }\n                  value = encoder.visit(value, function(type, value2) {\n                    if (type === \"address\" && ensCache[value2]) {\n                      return ensCache[value2];\n                    }\n                    return value2;\n                  });\n                  return [2, { domain, value }];\n              }\n            });\n          });\n        };\n        TypedDataEncoder2.getPayload = function(domain, types, value) {\n          TypedDataEncoder2.hashDomain(domain);\n          var domainValues = {};\n          var domainTypes = [];\n          domainFieldNames.forEach(function(name2) {\n            var value2 = domain[name2];\n            if (value2 == null) {\n              return;\n            }\n            domainValues[name2] = domainChecks[name2](value2);\n            domainTypes.push({ name: name2, type: domainFieldTypes[name2] });\n          });\n          var encoder = TypedDataEncoder2.from(types);\n          var typesWithDomain = (0, properties_1.shallowCopy)(types);\n          if (typesWithDomain.EIP712Domain) {\n            logger.throwArgumentError(\"types must not contain EIP712Domain type\", \"types.EIP712Domain\", types);\n          } else {\n            typesWithDomain.EIP712Domain = domainTypes;\n          }\n          encoder.encode(value);\n          return {\n            types: typesWithDomain,\n            domain: domainValues,\n            primaryType: encoder.primaryType,\n            message: encoder.visit(value, function(type, value2) {\n              if (type.match(/^bytes(\\d*)/)) {\n                return (0, bytes_1.hexlify)((0, bytes_1.arrayify)(value2));\n              }\n              if (type.match(/^u?int/)) {\n                return bignumber_1.BigNumber.from(value2).toString();\n              }\n              switch (type) {\n                case \"address\":\n                  return value2.toLowerCase();\n                case \"bool\":\n                  return !!value2;\n                case \"string\":\n                  if (typeof value2 !== \"string\") {\n                    logger.throwArgumentError(\"invalid string\", \"value\", value2);\n                  }\n                  return value2;\n              }\n              return logger.throwArgumentError(\"unsupported type\", \"type\", type);\n            })\n          };\n        };\n        return TypedDataEncoder2;\n      }()\n    );\n    exports2.TypedDataEncoder = TypedDataEncoder;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/index.js\nvar require_lib10 = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._TypedDataEncoder = exports2.hashMessage = exports2.messagePrefix = exports2.isValidName = exports2.namehash = exports2.id = void 0;\n    var id_1 = require_id();\n    Object.defineProperty(exports2, \"id\", { enumerable: true, get: function() {\n      return id_1.id;\n    } });\n    var namehash_1 = require_namehash();\n    Object.defineProperty(exports2, \"isValidName\", { enumerable: true, get: function() {\n      return namehash_1.isValidName;\n    } });\n    Object.defineProperty(exports2, \"namehash\", { enumerable: true, get: function() {\n      return namehash_1.namehash;\n    } });\n    var message_1 = require_message();\n    Object.defineProperty(exports2, \"hashMessage\", { enumerable: true, get: function() {\n      return message_1.hashMessage;\n    } });\n    Object.defineProperty(exports2, \"messagePrefix\", { enumerable: true, get: function() {\n      return message_1.messagePrefix;\n    } });\n    var typed_data_1 = require_typed_data();\n    Object.defineProperty(exports2, \"_TypedDataEncoder\", { enumerable: true, get: function() {\n      return typed_data_1.TypedDataEncoder;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/interface.js\nvar require_interface = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/interface.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Interface = exports2.Indexed = exports2.ErrorDescription = exports2.TransactionDescription = exports2.LogDescription = exports2.checkResultErrors = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var abi_coder_1 = require_abi_coder();\n    var abstract_coder_1 = require_abstract_coder();\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return abstract_coder_1.checkResultErrors;\n    } });\n    var fragments_1 = require_fragments();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var LogDescription = (\n      /** @class */\n      function(_super) {\n        __extends(LogDescription2, _super);\n        function LogDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return LogDescription2;\n      }(properties_1.Description)\n    );\n    exports2.LogDescription = LogDescription;\n    var TransactionDescription = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionDescription2, _super);\n        function TransactionDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return TransactionDescription2;\n      }(properties_1.Description)\n    );\n    exports2.TransactionDescription = TransactionDescription;\n    var ErrorDescription = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorDescription2, _super);\n        function ErrorDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return ErrorDescription2;\n      }(properties_1.Description)\n    );\n    exports2.ErrorDescription = ErrorDescription;\n    var Indexed = (\n      /** @class */\n      function(_super) {\n        __extends(Indexed2, _super);\n        function Indexed2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        Indexed2.isIndexed = function(value) {\n          return !!(value && value._isIndexed);\n        };\n        return Indexed2;\n      }(properties_1.Description)\n    );\n    exports2.Indexed = Indexed;\n    var BuiltinErrors = {\n      \"0x08c379a0\": { signature: \"Error(string)\", name: \"Error\", inputs: [\"string\"], reason: true },\n      \"0x4e487b71\": { signature: \"Panic(uint256)\", name: \"Panic\", inputs: [\"uint256\"] }\n    };\n    function wrapAccessError(property, error) {\n      var wrap = new Error(\"deferred error during ABI decoding triggered accessing \" + property);\n      wrap.error = error;\n      return wrap;\n    }\n    var Interface = (\n      /** @class */\n      function() {\n        function Interface2(fragments) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Interface2);\n          var abi = [];\n          if (typeof fragments === \"string\") {\n            abi = JSON.parse(fragments);\n          } else {\n            abi = fragments;\n          }\n          (0, properties_1.defineReadOnly)(this, \"fragments\", abi.map(function(fragment) {\n            return fragments_1.Fragment.from(fragment);\n          }).filter(function(fragment) {\n            return fragment != null;\n          }));\n          (0, properties_1.defineReadOnly)(this, \"_abiCoder\", (0, properties_1.getStatic)(_newTarget, \"getAbiCoder\")());\n          (0, properties_1.defineReadOnly)(this, \"functions\", {});\n          (0, properties_1.defineReadOnly)(this, \"errors\", {});\n          (0, properties_1.defineReadOnly)(this, \"events\", {});\n          (0, properties_1.defineReadOnly)(this, \"structs\", {});\n          this.fragments.forEach(function(fragment) {\n            var bucket = null;\n            switch (fragment.type) {\n              case \"constructor\":\n                if (_this.deploy) {\n                  logger.warn(\"duplicate definition - constructor\");\n                  return;\n                }\n                (0, properties_1.defineReadOnly)(_this, \"deploy\", fragment);\n                return;\n              case \"function\":\n                bucket = _this.functions;\n                break;\n              case \"event\":\n                bucket = _this.events;\n                break;\n              case \"error\":\n                bucket = _this.errors;\n                break;\n              default:\n                return;\n            }\n            var signature = fragment.format();\n            if (bucket[signature]) {\n              logger.warn(\"duplicate definition - \" + signature);\n              return;\n            }\n            bucket[signature] = fragment;\n          });\n          if (!this.deploy) {\n            (0, properties_1.defineReadOnly)(this, \"deploy\", fragments_1.ConstructorFragment.from({\n              payable: false,\n              type: \"constructor\"\n            }));\n          }\n          (0, properties_1.defineReadOnly)(this, \"_isInterface\", true);\n        }\n        Interface2.prototype.format = function(format) {\n          if (!format) {\n            format = fragments_1.FormatTypes.full;\n          }\n          if (format === fragments_1.FormatTypes.sighash) {\n            logger.throwArgumentError(\"interface does not support formatting sighash\", \"format\", format);\n          }\n          var abi = this.fragments.map(function(fragment) {\n            return fragment.format(format);\n          });\n          if (format === fragments_1.FormatTypes.json) {\n            return JSON.stringify(abi.map(function(j) {\n              return JSON.parse(j);\n            }));\n          }\n          return abi;\n        };\n        Interface2.getAbiCoder = function() {\n          return abi_coder_1.defaultAbiCoder;\n        };\n        Interface2.getAddress = function(address) {\n          return (0, address_1.getAddress)(address);\n        };\n        Interface2.getSighash = function(fragment) {\n          return (0, bytes_1.hexDataSlice)((0, hash_1.id)(fragment.format()), 0, 4);\n        };\n        Interface2.getEventTopic = function(eventFragment) {\n          return (0, hash_1.id)(eventFragment.format());\n        };\n        Interface2.prototype.getFunction = function(nameOrSignatureOrSighash) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrSighash)) {\n            for (var name_1 in this.functions) {\n              if (nameOrSignatureOrSighash === this.getSighash(name_1)) {\n                return this.functions[name_1];\n              }\n            }\n            logger.throwArgumentError(\"no matching function\", \"sighash\", nameOrSignatureOrSighash);\n          }\n          if (nameOrSignatureOrSighash.indexOf(\"(\") === -1) {\n            var name_2 = nameOrSignatureOrSighash.trim();\n            var matching = Object.keys(this.functions).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_2;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching function\", \"name\", name_2);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching functions\", \"name\", name_2);\n            }\n            return this.functions[matching[0]];\n          }\n          var result = this.functions[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()];\n          if (!result) {\n            logger.throwArgumentError(\"no matching function\", \"signature\", nameOrSignatureOrSighash);\n          }\n          return result;\n        };\n        Interface2.prototype.getEvent = function(nameOrSignatureOrTopic) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrTopic)) {\n            var topichash = nameOrSignatureOrTopic.toLowerCase();\n            for (var name_3 in this.events) {\n              if (topichash === this.getEventTopic(name_3)) {\n                return this.events[name_3];\n              }\n            }\n            logger.throwArgumentError(\"no matching event\", \"topichash\", topichash);\n          }\n          if (nameOrSignatureOrTopic.indexOf(\"(\") === -1) {\n            var name_4 = nameOrSignatureOrTopic.trim();\n            var matching = Object.keys(this.events).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_4;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching event\", \"name\", name_4);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching events\", \"name\", name_4);\n            }\n            return this.events[matching[0]];\n          }\n          var result = this.events[fragments_1.EventFragment.fromString(nameOrSignatureOrTopic).format()];\n          if (!result) {\n            logger.throwArgumentError(\"no matching event\", \"signature\", nameOrSignatureOrTopic);\n          }\n          return result;\n        };\n        Interface2.prototype.getError = function(nameOrSignatureOrSighash) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrSighash)) {\n            var getSighash = (0, properties_1.getStatic)(this.constructor, \"getSighash\");\n            for (var name_5 in this.errors) {\n              var error = this.errors[name_5];\n              if (nameOrSignatureOrSighash === getSighash(error)) {\n                return this.errors[name_5];\n              }\n            }\n            logger.throwArgumentError(\"no matching error\", \"sighash\", nameOrSignatureOrSighash);\n          }\n          if (nameOrSignatureOrSighash.indexOf(\"(\") === -1) {\n            var name_6 = nameOrSignatureOrSighash.trim();\n            var matching = Object.keys(this.errors).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_6;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching error\", \"name\", name_6);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching errors\", \"name\", name_6);\n            }\n            return this.errors[matching[0]];\n          }\n          var result = this.errors[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()];\n          if (!result) {\n            logger.throwArgumentError(\"no matching error\", \"signature\", nameOrSignatureOrSighash);\n          }\n          return result;\n        };\n        Interface2.prototype.getSighash = function(fragment) {\n          if (typeof fragment === \"string\") {\n            try {\n              fragment = this.getFunction(fragment);\n            } catch (error) {\n              try {\n                fragment = this.getError(fragment);\n              } catch (_) {\n                throw error;\n              }\n            }\n          }\n          return (0, properties_1.getStatic)(this.constructor, \"getSighash\")(fragment);\n        };\n        Interface2.prototype.getEventTopic = function(eventFragment) {\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          return (0, properties_1.getStatic)(this.constructor, \"getEventTopic\")(eventFragment);\n        };\n        Interface2.prototype._decodeParams = function(params, data) {\n          return this._abiCoder.decode(params, data);\n        };\n        Interface2.prototype._encodeParams = function(params, values) {\n          return this._abiCoder.encode(params, values);\n        };\n        Interface2.prototype.encodeDeploy = function(values) {\n          return this._encodeParams(this.deploy.inputs, values || []);\n        };\n        Interface2.prototype.decodeErrorResult = function(fragment, data) {\n          if (typeof fragment === \"string\") {\n            fragment = this.getError(fragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          if ((0, bytes_1.hexlify)(bytes.slice(0, 4)) !== this.getSighash(fragment)) {\n            logger.throwArgumentError(\"data signature does not match error \" + fragment.name + \".\", \"data\", (0, bytes_1.hexlify)(bytes));\n          }\n          return this._decodeParams(fragment.inputs, bytes.slice(4));\n        };\n        Interface2.prototype.encodeErrorResult = function(fragment, values) {\n          if (typeof fragment === \"string\") {\n            fragment = this.getError(fragment);\n          }\n          return (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.getSighash(fragment),\n            this._encodeParams(fragment.inputs, values || [])\n          ]));\n        };\n        Interface2.prototype.decodeFunctionData = function(functionFragment, data) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          if ((0, bytes_1.hexlify)(bytes.slice(0, 4)) !== this.getSighash(functionFragment)) {\n            logger.throwArgumentError(\"data signature does not match function \" + functionFragment.name + \".\", \"data\", (0, bytes_1.hexlify)(bytes));\n          }\n          return this._decodeParams(functionFragment.inputs, bytes.slice(4));\n        };\n        Interface2.prototype.encodeFunctionData = function(functionFragment, values) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          return (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.getSighash(functionFragment),\n            this._encodeParams(functionFragment.inputs, values || [])\n          ]));\n        };\n        Interface2.prototype.decodeFunctionResult = function(functionFragment, data) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          var reason = null;\n          var errorArgs = null;\n          var errorName = null;\n          var errorSignature = null;\n          switch (bytes.length % this._abiCoder._getWordSize()) {\n            case 0:\n              try {\n                return this._abiCoder.decode(functionFragment.outputs, bytes);\n              } catch (error2) {\n              }\n              break;\n            case 4: {\n              var selector = (0, bytes_1.hexlify)(bytes.slice(0, 4));\n              var builtin = BuiltinErrors[selector];\n              if (builtin) {\n                errorArgs = this._abiCoder.decode(builtin.inputs, bytes.slice(4));\n                errorName = builtin.name;\n                errorSignature = builtin.signature;\n                if (builtin.reason) {\n                  reason = errorArgs[0];\n                }\n              } else {\n                try {\n                  var error = this.getError(selector);\n                  errorArgs = this._abiCoder.decode(error.inputs, bytes.slice(4));\n                  errorName = error.name;\n                  errorSignature = error.format();\n                } catch (error2) {\n                  console.log(error2);\n                }\n              }\n              break;\n            }\n          }\n          return logger.throwError(\"call revert exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n            method: functionFragment.format(),\n            errorArgs,\n            errorName,\n            errorSignature,\n            reason\n          });\n        };\n        Interface2.prototype.encodeFunctionResult = function(functionFragment, values) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          return (0, bytes_1.hexlify)(this._abiCoder.encode(functionFragment.outputs, values || []));\n        };\n        Interface2.prototype.encodeFilterTopics = function(eventFragment, values) {\n          var _this = this;\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          if (values.length > eventFragment.inputs.length) {\n            logger.throwError(\"too many arguments for \" + eventFragment.format(), logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {\n              argument: \"values\",\n              value: values\n            });\n          }\n          var topics = [];\n          if (!eventFragment.anonymous) {\n            topics.push(this.getEventTopic(eventFragment));\n          }\n          var encodeTopic = function(param, value) {\n            if (param.type === \"string\") {\n              return (0, hash_1.id)(value);\n            } else if (param.type === \"bytes\") {\n              return (0, keccak256_1.keccak256)((0, bytes_1.hexlify)(value));\n            }\n            if (param.type === \"address\") {\n              _this._abiCoder.encode([\"address\"], [value]);\n            }\n            return (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(value), 32);\n          };\n          values.forEach(function(value, index) {\n            var param = eventFragment.inputs[index];\n            if (!param.indexed) {\n              if (value != null) {\n                logger.throwArgumentError(\"cannot filter non-indexed parameters; must be null\", \"contract.\" + param.name, value);\n              }\n              return;\n            }\n            if (value == null) {\n              topics.push(null);\n            } else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n              logger.throwArgumentError(\"filtering with tuples or arrays not supported\", \"contract.\" + param.name, value);\n            } else if (Array.isArray(value)) {\n              topics.push(value.map(function(value2) {\n                return encodeTopic(param, value2);\n              }));\n            } else {\n              topics.push(encodeTopic(param, value));\n            }\n          });\n          while (topics.length && topics[topics.length - 1] === null) {\n            topics.pop();\n          }\n          return topics;\n        };\n        Interface2.prototype.encodeEventLog = function(eventFragment, values) {\n          var _this = this;\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          var topics = [];\n          var dataTypes = [];\n          var dataValues = [];\n          if (!eventFragment.anonymous) {\n            topics.push(this.getEventTopic(eventFragment));\n          }\n          if (values.length !== eventFragment.inputs.length) {\n            logger.throwArgumentError(\"event arguments/values mismatch\", \"values\", values);\n          }\n          eventFragment.inputs.forEach(function(param, index) {\n            var value = values[index];\n            if (param.indexed) {\n              if (param.type === \"string\") {\n                topics.push((0, hash_1.id)(value));\n              } else if (param.type === \"bytes\") {\n                topics.push((0, keccak256_1.keccak256)(value));\n              } else if (param.baseType === \"tuple\" || param.baseType === \"array\") {\n                throw new Error(\"not implemented\");\n              } else {\n                topics.push(_this._abiCoder.encode([param.type], [value]));\n              }\n            } else {\n              dataTypes.push(param);\n              dataValues.push(value);\n            }\n          });\n          return {\n            data: this._abiCoder.encode(dataTypes, dataValues),\n            topics\n          };\n        };\n        Interface2.prototype.decodeEventLog = function(eventFragment, data, topics) {\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          if (topics != null && !eventFragment.anonymous) {\n            var topicHash = this.getEventTopic(eventFragment);\n            if (!(0, bytes_1.isHexString)(topics[0], 32) || topics[0].toLowerCase() !== topicHash) {\n              logger.throwError(\"fragment/topic mismatch\", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: \"topics[0]\", expected: topicHash, value: topics[0] });\n            }\n            topics = topics.slice(1);\n          }\n          var indexed = [];\n          var nonIndexed = [];\n          var dynamic = [];\n          eventFragment.inputs.forEach(function(param, index) {\n            if (param.indexed) {\n              if (param.type === \"string\" || param.type === \"bytes\" || param.baseType === \"tuple\" || param.baseType === \"array\") {\n                indexed.push(fragments_1.ParamType.fromObject({ type: \"bytes32\", name: param.name }));\n                dynamic.push(true);\n              } else {\n                indexed.push(param);\n                dynamic.push(false);\n              }\n            } else {\n              nonIndexed.push(param);\n              dynamic.push(false);\n            }\n          });\n          var resultIndexed = topics != null ? this._abiCoder.decode(indexed, (0, bytes_1.concat)(topics)) : null;\n          var resultNonIndexed = this._abiCoder.decode(nonIndexed, data, true);\n          var result = [];\n          var nonIndexedIndex = 0, indexedIndex = 0;\n          eventFragment.inputs.forEach(function(param, index) {\n            if (param.indexed) {\n              if (resultIndexed == null) {\n                result[index] = new Indexed({ _isIndexed: true, hash: null });\n              } else if (dynamic[index]) {\n                result[index] = new Indexed({ _isIndexed: true, hash: resultIndexed[indexedIndex++] });\n              } else {\n                try {\n                  result[index] = resultIndexed[indexedIndex++];\n                } catch (error) {\n                  result[index] = error;\n                }\n              }\n            } else {\n              try {\n                result[index] = resultNonIndexed[nonIndexedIndex++];\n              } catch (error) {\n                result[index] = error;\n              }\n            }\n            if (param.name && result[param.name] == null) {\n              var value_1 = result[index];\n              if (value_1 instanceof Error) {\n                Object.defineProperty(result, param.name, {\n                  enumerable: true,\n                  get: function() {\n                    throw wrapAccessError(\"property \" + JSON.stringify(param.name), value_1);\n                  }\n                });\n              } else {\n                result[param.name] = value_1;\n              }\n            }\n          });\n          var _loop_1 = function(i2) {\n            var value = result[i2];\n            if (value instanceof Error) {\n              Object.defineProperty(result, i2, {\n                enumerable: true,\n                get: function() {\n                  throw wrapAccessError(\"index \" + i2, value);\n                }\n              });\n            }\n          };\n          for (var i = 0; i < result.length; i++) {\n            _loop_1(i);\n          }\n          return Object.freeze(result);\n        };\n        Interface2.prototype.parseTransaction = function(tx) {\n          var fragment = this.getFunction(tx.data.substring(0, 10).toLowerCase());\n          if (!fragment) {\n            return null;\n          }\n          return new TransactionDescription({\n            args: this._abiCoder.decode(fragment.inputs, \"0x\" + tx.data.substring(10)),\n            functionFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            sighash: this.getSighash(fragment),\n            value: bignumber_1.BigNumber.from(tx.value || \"0\")\n          });\n        };\n        Interface2.prototype.parseLog = function(log) {\n          var fragment = this.getEvent(log.topics[0]);\n          if (!fragment || fragment.anonymous) {\n            return null;\n          }\n          return new LogDescription({\n            eventFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            topic: this.getEventTopic(fragment),\n            args: this.decodeEventLog(fragment, log.data, log.topics)\n          });\n        };\n        Interface2.prototype.parseError = function(data) {\n          var hexData = (0, bytes_1.hexlify)(data);\n          var fragment = this.getError(hexData.substring(0, 10).toLowerCase());\n          if (!fragment) {\n            return null;\n          }\n          return new ErrorDescription({\n            args: this._abiCoder.decode(fragment.inputs, \"0x\" + hexData.substring(10)),\n            errorFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            sighash: this.getSighash(fragment)\n          });\n        };\n        Interface2.isInterface = function(value) {\n          return !!(value && value._isInterface);\n        };\n        return Interface2;\n      }()\n    );\n    exports2.Interface = Interface;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/index.js\nvar require_lib11 = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TransactionDescription = exports2.LogDescription = exports2.checkResultErrors = exports2.Indexed = exports2.Interface = exports2.defaultAbiCoder = exports2.AbiCoder = exports2.FormatTypes = exports2.ParamType = exports2.FunctionFragment = exports2.Fragment = exports2.EventFragment = exports2.ErrorFragment = exports2.ConstructorFragment = void 0;\n    var fragments_1 = require_fragments();\n    Object.defineProperty(exports2, \"ConstructorFragment\", { enumerable: true, get: function() {\n      return fragments_1.ConstructorFragment;\n    } });\n    Object.defineProperty(exports2, \"ErrorFragment\", { enumerable: true, get: function() {\n      return fragments_1.ErrorFragment;\n    } });\n    Object.defineProperty(exports2, \"EventFragment\", { enumerable: true, get: function() {\n      return fragments_1.EventFragment;\n    } });\n    Object.defineProperty(exports2, \"FormatTypes\", { enumerable: true, get: function() {\n      return fragments_1.FormatTypes;\n    } });\n    Object.defineProperty(exports2, \"Fragment\", { enumerable: true, get: function() {\n      return fragments_1.Fragment;\n    } });\n    Object.defineProperty(exports2, \"FunctionFragment\", { enumerable: true, get: function() {\n      return fragments_1.FunctionFragment;\n    } });\n    Object.defineProperty(exports2, \"ParamType\", { enumerable: true, get: function() {\n      return fragments_1.ParamType;\n    } });\n    var abi_coder_1 = require_abi_coder();\n    Object.defineProperty(exports2, \"AbiCoder\", { enumerable: true, get: function() {\n      return abi_coder_1.AbiCoder;\n    } });\n    Object.defineProperty(exports2, \"defaultAbiCoder\", { enumerable: true, get: function() {\n      return abi_coder_1.defaultAbiCoder;\n    } });\n    var interface_1 = require_interface();\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return interface_1.checkResultErrors;\n    } });\n    Object.defineProperty(exports2, \"Indexed\", { enumerable: true, get: function() {\n      return interface_1.Indexed;\n    } });\n    Object.defineProperty(exports2, \"Interface\", { enumerable: true, get: function() {\n      return interface_1.Interface;\n    } });\n    Object.defineProperty(exports2, \"LogDescription\", { enumerable: true, get: function() {\n      return interface_1.LogDescription;\n    } });\n    Object.defineProperty(exports2, \"TransactionDescription\", { enumerable: true, get: function() {\n      return interface_1.TransactionDescription;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abstract-provider/lib/_version.js\nvar require_version10 = __commonJS({\n  \"node_modules/@ethersproject/abstract-provider/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abstract-provider/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/abstract-provider/lib/index.js\nvar require_lib12 = __commonJS({\n  \"node_modules/@ethersproject/abstract-provider/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Provider = exports2.TransactionOrderForkEvent = exports2.TransactionForkEvent = exports2.BlockForkEvent = exports2.ForkEvent = void 0;\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version10();\n    var logger = new logger_1.Logger(_version_1.version);\n    var ForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(ForkEvent2, _super);\n        function ForkEvent2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ForkEvent2.isForkEvent = function(value) {\n          return !!(value && value._isForkEvent);\n        };\n        return ForkEvent2;\n      }(properties_1.Description)\n    );\n    exports2.ForkEvent = ForkEvent;\n    var BlockForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(BlockForkEvent2, _super);\n        function BlockForkEvent2(blockHash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(blockHash, 32)) {\n            logger.throwArgumentError(\"invalid blockHash\", \"blockHash\", blockHash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isBlockForkEvent: true,\n            expiry: expiry || 0,\n            blockHash\n          }) || this;\n          return _this;\n        }\n        return BlockForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.BlockForkEvent = BlockForkEvent;\n    var TransactionForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionForkEvent2, _super);\n        function TransactionForkEvent2(hash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(hash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"hash\", hash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isTransactionForkEvent: true,\n            expiry: expiry || 0,\n            hash\n          }) || this;\n          return _this;\n        }\n        return TransactionForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.TransactionForkEvent = TransactionForkEvent;\n    var TransactionOrderForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionOrderForkEvent2, _super);\n        function TransactionOrderForkEvent2(beforeHash, afterHash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(beforeHash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"beforeHash\", beforeHash);\n          }\n          if (!(0, bytes_1.isHexString)(afterHash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"afterHash\", afterHash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isTransactionOrderForkEvent: true,\n            expiry: expiry || 0,\n            beforeHash,\n            afterHash\n          }) || this;\n          return _this;\n        }\n        return TransactionOrderForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.TransactionOrderForkEvent = TransactionOrderForkEvent;\n    var Provider = (\n      /** @class */\n      function() {\n        function Provider2() {\n          var _newTarget = this.constructor;\n          logger.checkAbstract(_newTarget, Provider2);\n          (0, properties_1.defineReadOnly)(this, \"_isProvider\", true);\n        }\n        Provider2.prototype.getFeeData = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var _a, block, gasPrice, maxFeePerGas, maxPriorityFeePerGas;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, (0, properties_1.resolveProperties)({\n                    block: this.getBlock(\"latest\"),\n                    gasPrice: this.getGasPrice().catch(function(error) {\n                      return null;\n                    })\n                  })];\n                case 1:\n                  _a = _b.sent(), block = _a.block, gasPrice = _a.gasPrice;\n                  maxFeePerGas = null, maxPriorityFeePerGas = null;\n                  if (block && block.baseFeePerGas) {\n                    maxPriorityFeePerGas = bignumber_1.BigNumber.from(\"2500000000\");\n                    maxFeePerGas = block.baseFeePerGas.mul(2).add(maxPriorityFeePerGas);\n                  }\n                  return [2, { maxFeePerGas, maxPriorityFeePerGas, gasPrice }];\n              }\n            });\n          });\n        };\n        Provider2.prototype.addListener = function(eventName, listener) {\n          return this.on(eventName, listener);\n        };\n        Provider2.prototype.removeListener = function(eventName, listener) {\n          return this.off(eventName, listener);\n        };\n        Provider2.isProvider = function(value) {\n          return !!(value && value._isProvider);\n        };\n        return Provider2;\n      }()\n    );\n    exports2.Provider = Provider;\n  }\n});\n\n// node_modules/@ethersproject/abstract-signer/lib/_version.js\nvar require_version11 = __commonJS({\n  \"node_modules/@ethersproject/abstract-signer/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abstract-signer/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/abstract-signer/lib/index.js\nvar require_lib13 = __commonJS({\n  \"node_modules/@ethersproject/abstract-signer/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.VoidSigner = exports2.Signer = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version11();\n    var logger = new logger_1.Logger(_version_1.version);\n    var allowedTransactionKeys = [\n      \"accessList\",\n      \"chainId\",\n      \"customData\",\n      \"data\",\n      \"from\",\n      \"gasLimit\",\n      \"gasPrice\",\n      \"maxFeePerGas\",\n      \"maxPriorityFeePerGas\",\n      \"nonce\",\n      \"to\",\n      \"type\",\n      \"value\"\n    ];\n    var forwardErrors = [\n      logger_1.Logger.errors.INSUFFICIENT_FUNDS,\n      logger_1.Logger.errors.NONCE_EXPIRED,\n      logger_1.Logger.errors.REPLACEMENT_UNDERPRICED\n    ];\n    var Signer = (\n      /** @class */\n      function() {\n        function Signer2() {\n          var _newTarget = this.constructor;\n          logger.checkAbstract(_newTarget, Signer2);\n          (0, properties_1.defineReadOnly)(this, \"_isSigner\", true);\n        }\n        Signer2.prototype.getBalance = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getBalance\");\n                  return [4, this.provider.getBalance(this.getAddress(), blockTag)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getTransactionCount = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getTransactionCount\");\n                  return [4, this.provider.getTransactionCount(this.getAddress(), blockTag)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.estimateGas = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"estimateGas\");\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.provider.estimateGas(tx)];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.call = function(transaction, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"call\");\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.provider.call(tx, blockTag)];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.sendTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, signedTx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"sendTransaction\");\n                  return [4, this.populateTransaction(transaction)];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.signTransaction(tx)];\n                case 2:\n                  signedTx = _a.sent();\n                  return [4, this.provider.sendTransaction(signedTx)];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getChainId = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getChainId\");\n                  return [4, this.provider.getNetwork()];\n                case 1:\n                  network = _a.sent();\n                  return [2, network.chainId];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getGasPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getGasPrice\");\n                  return [4, this.provider.getGasPrice()];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getFeeData = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getFeeData\");\n                  return [4, this.provider.getFeeData()];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.resolveName = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"resolveName\");\n                  return [4, this.provider.resolveName(name2)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.checkTransaction = function(transaction) {\n          for (var key in transaction) {\n            if (allowedTransactionKeys.indexOf(key) === -1) {\n              logger.throwArgumentError(\"invalid transaction key: \" + key, \"transaction\", transaction);\n            }\n          }\n          var tx = (0, properties_1.shallowCopy)(transaction);\n          if (tx.from == null) {\n            tx.from = this.getAddress();\n          } else {\n            tx.from = Promise.all([\n              Promise.resolve(tx.from),\n              this.getAddress()\n            ]).then(function(result) {\n              if (result[0].toLowerCase() !== result[1].toLowerCase()) {\n                logger.throwArgumentError(\"from address mismatch\", \"transaction\", transaction);\n              }\n              return result[0];\n            });\n          }\n          return tx;\n        };\n        Signer2.prototype.populateTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, hasEip1559, feeData, gasPrice;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  if (tx.to != null) {\n                    tx.to = Promise.resolve(tx.to).then(function(to) {\n                      return __awaiter(_this, void 0, void 0, function() {\n                        var address;\n                        return __generator(this, function(_a2) {\n                          switch (_a2.label) {\n                            case 0:\n                              if (to == null) {\n                                return [2, null];\n                              }\n                              return [4, this.resolveName(to)];\n                            case 1:\n                              address = _a2.sent();\n                              if (address == null) {\n                                logger.throwArgumentError(\"provided ENS name resolves to null\", \"tx.to\", to);\n                              }\n                              return [2, address];\n                          }\n                        });\n                      });\n                    });\n                    tx.to.catch(function(error) {\n                    });\n                  }\n                  hasEip1559 = tx.maxFeePerGas != null || tx.maxPriorityFeePerGas != null;\n                  if (tx.gasPrice != null && (tx.type === 2 || hasEip1559)) {\n                    logger.throwArgumentError(\"eip-1559 transaction do not support gasPrice\", \"transaction\", transaction);\n                  } else if ((tx.type === 0 || tx.type === 1) && hasEip1559) {\n                    logger.throwArgumentError(\"pre-eip-1559 transaction do not support maxFeePerGas/maxPriorityFeePerGas\", \"transaction\", transaction);\n                  }\n                  if (!((tx.type === 2 || tx.type == null) && (tx.maxFeePerGas != null && tx.maxPriorityFeePerGas != null))) return [3, 2];\n                  tx.type = 2;\n                  return [3, 5];\n                case 2:\n                  if (!(tx.type === 0 || tx.type === 1)) return [3, 3];\n                  if (tx.gasPrice == null) {\n                    tx.gasPrice = this.getGasPrice();\n                  }\n                  return [3, 5];\n                case 3:\n                  return [4, this.getFeeData()];\n                case 4:\n                  feeData = _a.sent();\n                  if (tx.type == null) {\n                    if (feeData.maxFeePerGas != null && feeData.maxPriorityFeePerGas != null) {\n                      tx.type = 2;\n                      if (tx.gasPrice != null) {\n                        gasPrice = tx.gasPrice;\n                        delete tx.gasPrice;\n                        tx.maxFeePerGas = gasPrice;\n                        tx.maxPriorityFeePerGas = gasPrice;\n                      } else {\n                        if (tx.maxFeePerGas == null) {\n                          tx.maxFeePerGas = feeData.maxFeePerGas;\n                        }\n                        if (tx.maxPriorityFeePerGas == null) {\n                          tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n                        }\n                      }\n                    } else if (feeData.gasPrice != null) {\n                      if (hasEip1559) {\n                        logger.throwError(\"network does not support EIP-1559\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                          operation: \"populateTransaction\"\n                        });\n                      }\n                      if (tx.gasPrice == null) {\n                        tx.gasPrice = feeData.gasPrice;\n                      }\n                      tx.type = 0;\n                    } else {\n                      logger.throwError(\"failed to get consistent fee data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                        operation: \"signer.getFeeData\"\n                      });\n                    }\n                  } else if (tx.type === 2) {\n                    if (tx.maxFeePerGas == null) {\n                      tx.maxFeePerGas = feeData.maxFeePerGas;\n                    }\n                    if (tx.maxPriorityFeePerGas == null) {\n                      tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n                    }\n                  }\n                  _a.label = 5;\n                case 5:\n                  if (tx.nonce == null) {\n                    tx.nonce = this.getTransactionCount(\"pending\");\n                  }\n                  if (tx.gasLimit == null) {\n                    tx.gasLimit = this.estimateGas(tx).catch(function(error) {\n                      if (forwardErrors.indexOf(error.code) >= 0) {\n                        throw error;\n                      }\n                      return logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n                        error,\n                        tx\n                      });\n                    });\n                  }\n                  if (tx.chainId == null) {\n                    tx.chainId = this.getChainId();\n                  } else {\n                    tx.chainId = Promise.all([\n                      Promise.resolve(tx.chainId),\n                      this.getChainId()\n                    ]).then(function(results) {\n                      if (results[1] !== 0 && results[0] !== results[1]) {\n                        logger.throwArgumentError(\"chainId address mismatch\", \"transaction\", transaction);\n                      }\n                      return results[0];\n                    });\n                  }\n                  return [4, (0, properties_1.resolveProperties)(tx)];\n                case 6:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype._checkProvider = function(operation) {\n          if (!this.provider) {\n            logger.throwError(\"missing provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: operation || \"_checkProvider\"\n            });\n          }\n        };\n        Signer2.isSigner = function(value) {\n          return !!(value && value._isSigner);\n        };\n        return Signer2;\n      }()\n    );\n    exports2.Signer = Signer;\n    var VoidSigner = (\n      /** @class */\n      function(_super) {\n        __extends(VoidSigner2, _super);\n        function VoidSigner2(address, provider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, VoidSigner2);\n          _this = _super.call(this) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider || null);\n          return _this;\n        }\n        VoidSigner2.prototype.getAddress = function() {\n          return Promise.resolve(this.address);\n        };\n        VoidSigner2.prototype._fail = function(message, operation) {\n          return Promise.resolve().then(function() {\n            logger.throwError(message, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation });\n          });\n        };\n        VoidSigner2.prototype.signMessage = function(message) {\n          return this._fail(\"VoidSigner cannot sign messages\", \"signMessage\");\n        };\n        VoidSigner2.prototype.signTransaction = function(transaction) {\n          return this._fail(\"VoidSigner cannot sign transactions\", \"signTransaction\");\n        };\n        VoidSigner2.prototype._signTypedData = function(domain, types, value) {\n          return this._fail(\"VoidSigner cannot sign typed data\", \"signTypedData\");\n        };\n        VoidSigner2.prototype.connect = function(provider) {\n          return new VoidSigner2(this.address, provider);\n        };\n        return VoidSigner2;\n      }(Signer)\n    );\n    exports2.VoidSigner = VoidSigner;\n  }\n});\n\n// node_modules/elliptic/package.json\nvar require_package = __commonJS({\n  \"node_modules/elliptic/package.json\"(exports2, module2) {\n    module2.exports = {\n      name: \"elliptic\",\n      version: \"6.5.4\",\n      description: \"EC cryptography\",\n      main: \"lib/elliptic.js\",\n      files: [\n        \"lib\"\n      ],\n      scripts: {\n        lint: \"eslint lib test\",\n        \"lint:fix\": \"npm run lint -- --fix\",\n        unit: \"istanbul test _mocha --reporter=spec test/index.js\",\n        test: \"npm run lint && npm run unit\",\n        version: \"grunt dist && git add dist/\"\n      },\n      repository: {\n        type: \"git\",\n        url: \"git@github.com:indutny/elliptic\"\n      },\n      keywords: [\n        \"EC\",\n        \"Elliptic\",\n        \"curve\",\n        \"Cryptography\"\n      ],\n      author: \"Fedor Indutny <fedor@indutny.com>\",\n      license: \"MIT\",\n      bugs: {\n        url: \"https://github.com/indutny/elliptic/issues\"\n      },\n      homepage: \"https://github.com/indutny/elliptic\",\n      devDependencies: {\n        brfs: \"^2.0.2\",\n        coveralls: \"^3.1.0\",\n        eslint: \"^7.6.0\",\n        grunt: \"^1.2.1\",\n        \"grunt-browserify\": \"^5.3.0\",\n        \"grunt-cli\": \"^1.3.2\",\n        \"grunt-contrib-connect\": \"^3.0.0\",\n        \"grunt-contrib-copy\": \"^1.0.0\",\n        \"grunt-contrib-uglify\": \"^5.0.0\",\n        \"grunt-mocha-istanbul\": \"^5.0.2\",\n        \"grunt-saucelabs\": \"^9.0.1\",\n        istanbul: \"^0.4.5\",\n        mocha: \"^8.0.1\"\n      },\n      dependencies: {\n        \"bn.js\": \"^4.11.9\",\n        brorand: \"^1.1.0\",\n        \"hash.js\": \"^1.0.0\",\n        \"hmac-drbg\": \"^1.0.1\",\n        inherits: \"^2.0.4\",\n        \"minimalistic-assert\": \"^1.0.1\",\n        \"minimalistic-crypto-utils\": \"^1.0.1\"\n      }\n    };\n  }\n});\n\n// node_modules/minimalistic-assert/index.js\nvar require_minimalistic_assert = __commonJS({\n  \"node_modules/minimalistic-assert/index.js\"(exports2, module2) {\n    module2.exports = assert;\n    function assert(val, msg) {\n      if (!val)\n        throw new Error(msg || \"Assertion failed\");\n    }\n    assert.equal = function assertEqual(l, r, msg) {\n      if (l != r)\n        throw new Error(msg || \"Assertion failed: \" + l + \" != \" + r);\n    };\n  }\n});\n\n// node_modules/minimalistic-crypto-utils/lib/utils.js\nvar require_utils = __commonJS({\n  \"node_modules/minimalistic-crypto-utils/lib/utils.js\"(exports2) {\n    \"use strict\";\n    var utils = exports2;\n    function toArray(msg, enc) {\n      if (Array.isArray(msg))\n        return msg.slice();\n      if (!msg)\n        return [];\n      var res = [];\n      if (typeof msg !== \"string\") {\n        for (var i = 0; i < msg.length; i++)\n          res[i] = msg[i] | 0;\n        return res;\n      }\n      if (enc === \"hex\") {\n        msg = msg.replace(/[^a-z0-9]+/ig, \"\");\n        if (msg.length % 2 !== 0)\n          msg = \"0\" + msg;\n        for (var i = 0; i < msg.length; i += 2)\n          res.push(parseInt(msg[i] + msg[i + 1], 16));\n      } else {\n        for (var i = 0; i < msg.length; i++) {\n          var c = msg.charCodeAt(i);\n          var hi = c >> 8;\n          var lo = c & 255;\n          if (hi)\n            res.push(hi, lo);\n          else\n            res.push(lo);\n        }\n      }\n      return res;\n    }\n    utils.toArray = toArray;\n    function zero2(word) {\n      if (word.length === 1)\n        return \"0\" + word;\n      else\n        return word;\n    }\n    utils.zero2 = zero2;\n    function toHex(msg) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++)\n        res += zero2(msg[i].toString(16));\n      return res;\n    }\n    utils.toHex = toHex;\n    utils.encode = function encode(arr, enc) {\n      if (enc === \"hex\")\n        return toHex(arr);\n      else\n        return arr;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/utils.js\nvar require_utils2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/utils.js\"(exports2) {\n    \"use strict\";\n    var utils = exports2;\n    var BN = require_bn();\n    var minAssert = require_minimalistic_assert();\n    var minUtils = require_utils();\n    utils.assert = minAssert;\n    utils.toArray = minUtils.toArray;\n    utils.zero2 = minUtils.zero2;\n    utils.toHex = minUtils.toHex;\n    utils.encode = minUtils.encode;\n    function getNAF(num, w, bits) {\n      var naf = new Array(Math.max(num.bitLength(), bits) + 1);\n      naf.fill(0);\n      var ws = 1 << w + 1;\n      var k = num.clone();\n      for (var i = 0; i < naf.length; i++) {\n        var z;\n        var mod = k.andln(ws - 1);\n        if (k.isOdd()) {\n          if (mod > (ws >> 1) - 1)\n            z = (ws >> 1) - mod;\n          else\n            z = mod;\n          k.isubn(z);\n        } else {\n          z = 0;\n        }\n        naf[i] = z;\n        k.iushrn(1);\n      }\n      return naf;\n    }\n    utils.getNAF = getNAF;\n    function getJSF(k1, k2) {\n      var jsf = [\n        [],\n        []\n      ];\n      k1 = k1.clone();\n      k2 = k2.clone();\n      var d1 = 0;\n      var d2 = 0;\n      var m8;\n      while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {\n        var m14 = k1.andln(3) + d1 & 3;\n        var m24 = k2.andln(3) + d2 & 3;\n        if (m14 === 3)\n          m14 = -1;\n        if (m24 === 3)\n          m24 = -1;\n        var u1;\n        if ((m14 & 1) === 0) {\n          u1 = 0;\n        } else {\n          m8 = k1.andln(7) + d1 & 7;\n          if ((m8 === 3 || m8 === 5) && m24 === 2)\n            u1 = -m14;\n          else\n            u1 = m14;\n        }\n        jsf[0].push(u1);\n        var u2;\n        if ((m24 & 1) === 0) {\n          u2 = 0;\n        } else {\n          m8 = k2.andln(7) + d2 & 7;\n          if ((m8 === 3 || m8 === 5) && m14 === 2)\n            u2 = -m24;\n          else\n            u2 = m24;\n        }\n        jsf[1].push(u2);\n        if (2 * d1 === u1 + 1)\n          d1 = 1 - d1;\n        if (2 * d2 === u2 + 1)\n          d2 = 1 - d2;\n        k1.iushrn(1);\n        k2.iushrn(1);\n      }\n      return jsf;\n    }\n    utils.getJSF = getJSF;\n    function cachedProperty(obj, name2, computer) {\n      var key = \"_\" + name2;\n      obj.prototype[name2] = function cachedProperty2() {\n        return this[key] !== void 0 ? this[key] : this[key] = computer.call(this);\n      };\n    }\n    utils.cachedProperty = cachedProperty;\n    function parseBytes(bytes) {\n      return typeof bytes === \"string\" ? utils.toArray(bytes, \"hex\") : bytes;\n    }\n    utils.parseBytes = parseBytes;\n    function intFromLE(bytes) {\n      return new BN(bytes, \"hex\", \"le\");\n    }\n    utils.intFromLE = intFromLE;\n  }\n});\n\n// node_modules/brorand/index.js\nvar require_brorand = __commonJS({\n  \"node_modules/brorand/index.js\"(exports2, module2) {\n    var r;\n    module2.exports = function rand(len) {\n      if (!r)\n        r = new Rand(null);\n      return r.generate(len);\n    };\n    function Rand(rand) {\n      this.rand = rand;\n    }\n    module2.exports.Rand = Rand;\n    Rand.prototype.generate = function generate(len) {\n      return this._rand(len);\n    };\n    Rand.prototype._rand = function _rand(n) {\n      if (this.rand.getBytes)\n        return this.rand.getBytes(n);\n      var res = new Uint8Array(n);\n      for (var i = 0; i < res.length; i++)\n        res[i] = this.rand.getByte();\n      return res;\n    };\n    if (typeof self === \"object\") {\n      if (self.crypto && self.crypto.getRandomValues) {\n        Rand.prototype._rand = function _rand(n) {\n          var arr = new Uint8Array(n);\n          self.crypto.getRandomValues(arr);\n          return arr;\n        };\n      } else if (self.msCrypto && self.msCrypto.getRandomValues) {\n        Rand.prototype._rand = function _rand(n) {\n          var arr = new Uint8Array(n);\n          self.msCrypto.getRandomValues(arr);\n          return arr;\n        };\n      } else if (typeof window === \"object\") {\n        Rand.prototype._rand = function() {\n          throw new Error(\"Not implemented yet\");\n        };\n      }\n    } else {\n      try {\n        crypto2 = require(\"crypto\");\n        if (typeof crypto2.randomBytes !== \"function\")\n          throw new Error(\"Not supported\");\n        Rand.prototype._rand = function _rand(n) {\n          return crypto2.randomBytes(n);\n        };\n      } catch (e) {\n      }\n    }\n    var crypto2;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/base.js\nvar require_base = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/base.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var getNAF = utils.getNAF;\n    var getJSF = utils.getJSF;\n    var assert = utils.assert;\n    function BaseCurve(type, conf) {\n      this.type = type;\n      this.p = new BN(conf.p, 16);\n      this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);\n      this.zero = new BN(0).toRed(this.red);\n      this.one = new BN(1).toRed(this.red);\n      this.two = new BN(2).toRed(this.red);\n      this.n = conf.n && new BN(conf.n, 16);\n      this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);\n      this._wnafT1 = new Array(4);\n      this._wnafT2 = new Array(4);\n      this._wnafT3 = new Array(4);\n      this._wnafT4 = new Array(4);\n      this._bitLength = this.n ? this.n.bitLength() : 0;\n      var adjustCount = this.n && this.p.div(this.n);\n      if (!adjustCount || adjustCount.cmpn(100) > 0) {\n        this.redN = null;\n      } else {\n        this._maxwellTrick = true;\n        this.redN = this.n.toRed(this.red);\n      }\n    }\n    module2.exports = BaseCurve;\n    BaseCurve.prototype.point = function point() {\n      throw new Error(\"Not implemented\");\n    };\n    BaseCurve.prototype.validate = function validate() {\n      throw new Error(\"Not implemented\");\n    };\n    BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {\n      assert(p.precomputed);\n      var doubles = p._getDoubles();\n      var naf = getNAF(k, 1, this._bitLength);\n      var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);\n      I /= 3;\n      var repr = [];\n      var j;\n      var nafW;\n      for (j = 0; j < naf.length; j += doubles.step) {\n        nafW = 0;\n        for (var l = j + doubles.step - 1; l >= j; l--)\n          nafW = (nafW << 1) + naf[l];\n        repr.push(nafW);\n      }\n      var a = this.jpoint(null, null, null);\n      var b = this.jpoint(null, null, null);\n      for (var i = I; i > 0; i--) {\n        for (j = 0; j < repr.length; j++) {\n          nafW = repr[j];\n          if (nafW === i)\n            b = b.mixedAdd(doubles.points[j]);\n          else if (nafW === -i)\n            b = b.mixedAdd(doubles.points[j].neg());\n        }\n        a = a.add(b);\n      }\n      return a.toP();\n    };\n    BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {\n      var w = 4;\n      var nafPoints = p._getNAFPoints(w);\n      w = nafPoints.wnd;\n      var wnd = nafPoints.points;\n      var naf = getNAF(k, w, this._bitLength);\n      var acc = this.jpoint(null, null, null);\n      for (var i = naf.length - 1; i >= 0; i--) {\n        for (var l = 0; i >= 0 && naf[i] === 0; i--)\n          l++;\n        if (i >= 0)\n          l++;\n        acc = acc.dblp(l);\n        if (i < 0)\n          break;\n        var z = naf[i];\n        assert(z !== 0);\n        if (p.type === \"affine\") {\n          if (z > 0)\n            acc = acc.mixedAdd(wnd[z - 1 >> 1]);\n          else\n            acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());\n        } else {\n          if (z > 0)\n            acc = acc.add(wnd[z - 1 >> 1]);\n          else\n            acc = acc.add(wnd[-z - 1 >> 1].neg());\n        }\n      }\n      return p.type === \"affine\" ? acc.toP() : acc;\n    };\n    BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {\n      var wndWidth = this._wnafT1;\n      var wnd = this._wnafT2;\n      var naf = this._wnafT3;\n      var max = 0;\n      var i;\n      var j;\n      var p;\n      for (i = 0; i < len; i++) {\n        p = points[i];\n        var nafPoints = p._getNAFPoints(defW);\n        wndWidth[i] = nafPoints.wnd;\n        wnd[i] = nafPoints.points;\n      }\n      for (i = len - 1; i >= 1; i -= 2) {\n        var a = i - 1;\n        var b = i;\n        if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n          naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);\n          naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);\n          max = Math.max(naf[a].length, max);\n          max = Math.max(naf[b].length, max);\n          continue;\n        }\n        var comb = [\n          points[a],\n          /* 1 */\n          null,\n          /* 3 */\n          null,\n          /* 5 */\n          points[b]\n          /* 7 */\n        ];\n        if (points[a].y.cmp(points[b].y) === 0) {\n          comb[1] = points[a].add(points[b]);\n          comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n        } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {\n          comb[1] = points[a].toJ().mixedAdd(points[b]);\n          comb[2] = points[a].add(points[b].neg());\n        } else {\n          comb[1] = points[a].toJ().mixedAdd(points[b]);\n          comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n        }\n        var index = [\n          -3,\n          /* -1 -1 */\n          -1,\n          /* -1 0 */\n          -5,\n          /* -1 1 */\n          -7,\n          /* 0 -1 */\n          0,\n          /* 0 0 */\n          7,\n          /* 0 1 */\n          5,\n          /* 1 -1 */\n          1,\n          /* 1 0 */\n          3\n          /* 1 1 */\n        ];\n        var jsf = getJSF(coeffs[a], coeffs[b]);\n        max = Math.max(jsf[0].length, max);\n        naf[a] = new Array(max);\n        naf[b] = new Array(max);\n        for (j = 0; j < max; j++) {\n          var ja = jsf[0][j] | 0;\n          var jb = jsf[1][j] | 0;\n          naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];\n          naf[b][j] = 0;\n          wnd[a] = comb;\n        }\n      }\n      var acc = this.jpoint(null, null, null);\n      var tmp = this._wnafT4;\n      for (i = max; i >= 0; i--) {\n        var k = 0;\n        while (i >= 0) {\n          var zero = true;\n          for (j = 0; j < len; j++) {\n            tmp[j] = naf[j][i] | 0;\n            if (tmp[j] !== 0)\n              zero = false;\n          }\n          if (!zero)\n            break;\n          k++;\n          i--;\n        }\n        if (i >= 0)\n          k++;\n        acc = acc.dblp(k);\n        if (i < 0)\n          break;\n        for (j = 0; j < len; j++) {\n          var z = tmp[j];\n          p;\n          if (z === 0)\n            continue;\n          else if (z > 0)\n            p = wnd[j][z - 1 >> 1];\n          else if (z < 0)\n            p = wnd[j][-z - 1 >> 1].neg();\n          if (p.type === \"affine\")\n            acc = acc.mixedAdd(p);\n          else\n            acc = acc.add(p);\n        }\n      }\n      for (i = 0; i < len; i++)\n        wnd[i] = null;\n      if (jacobianResult)\n        return acc;\n      else\n        return acc.toP();\n    };\n    function BasePoint(curve, type) {\n      this.curve = curve;\n      this.type = type;\n      this.precomputed = null;\n    }\n    BaseCurve.BasePoint = BasePoint;\n    BasePoint.prototype.eq = function eq() {\n      throw new Error(\"Not implemented\");\n    };\n    BasePoint.prototype.validate = function validate() {\n      return this.curve.validate(this);\n    };\n    BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n      bytes = utils.toArray(bytes, enc);\n      var len = this.p.byteLength();\n      if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {\n        if (bytes[0] === 6)\n          assert(bytes[bytes.length - 1] % 2 === 0);\n        else if (bytes[0] === 7)\n          assert(bytes[bytes.length - 1] % 2 === 1);\n        var res = this.point(\n          bytes.slice(1, 1 + len),\n          bytes.slice(1 + len, 1 + 2 * len)\n        );\n        return res;\n      } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {\n        return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);\n      }\n      throw new Error(\"Unknown point format\");\n    };\n    BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {\n      return this.encode(enc, true);\n    };\n    BasePoint.prototype._encode = function _encode(compact) {\n      var len = this.curve.p.byteLength();\n      var x = this.getX().toArray(\"be\", len);\n      if (compact)\n        return [this.getY().isEven() ? 2 : 3].concat(x);\n      return [4].concat(x, this.getY().toArray(\"be\", len));\n    };\n    BasePoint.prototype.encode = function encode(enc, compact) {\n      return utils.encode(this._encode(compact), enc);\n    };\n    BasePoint.prototype.precompute = function precompute(power) {\n      if (this.precomputed)\n        return this;\n      var precomputed = {\n        doubles: null,\n        naf: null,\n        beta: null\n      };\n      precomputed.naf = this._getNAFPoints(8);\n      precomputed.doubles = this._getDoubles(4, power);\n      precomputed.beta = this._getBeta();\n      this.precomputed = precomputed;\n      return this;\n    };\n    BasePoint.prototype._hasDoubles = function _hasDoubles(k) {\n      if (!this.precomputed)\n        return false;\n      var doubles = this.precomputed.doubles;\n      if (!doubles)\n        return false;\n      return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);\n    };\n    BasePoint.prototype._getDoubles = function _getDoubles(step, power) {\n      if (this.precomputed && this.precomputed.doubles)\n        return this.precomputed.doubles;\n      var doubles = [this];\n      var acc = this;\n      for (var i = 0; i < power; i += step) {\n        for (var j = 0; j < step; j++)\n          acc = acc.dbl();\n        doubles.push(acc);\n      }\n      return {\n        step,\n        points: doubles\n      };\n    };\n    BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {\n      if (this.precomputed && this.precomputed.naf)\n        return this.precomputed.naf;\n      var res = [this];\n      var max = (1 << wnd) - 1;\n      var dbl = max === 1 ? null : this.dbl();\n      for (var i = 1; i < max; i++)\n        res[i] = res[i - 1].add(dbl);\n      return {\n        wnd,\n        points: res\n      };\n    };\n    BasePoint.prototype._getBeta = function _getBeta() {\n      return null;\n    };\n    BasePoint.prototype.dblp = function dblp(k) {\n      var r = this;\n      for (var i = 0; i < k; i++)\n        r = r.dbl();\n      return r;\n    };\n  }\n});\n\n// node_modules/inherits/inherits_browser.js\nvar require_inherits_browser = __commonJS({\n  \"node_modules/inherits/inherits_browser.js\"(exports2, module2) {\n    if (typeof Object.create === \"function\") {\n      module2.exports = function inherits(ctor, superCtor) {\n        if (superCtor) {\n          ctor.super_ = superCtor;\n          ctor.prototype = Object.create(superCtor.prototype, {\n            constructor: {\n              value: ctor,\n              enumerable: false,\n              writable: true,\n              configurable: true\n            }\n          });\n        }\n      };\n    } else {\n      module2.exports = function inherits(ctor, superCtor) {\n        if (superCtor) {\n          ctor.super_ = superCtor;\n          var TempCtor = function() {\n          };\n          TempCtor.prototype = superCtor.prototype;\n          ctor.prototype = new TempCtor();\n          ctor.prototype.constructor = ctor;\n        }\n      };\n    }\n  }\n});\n\n// node_modules/inherits/inherits.js\nvar require_inherits = __commonJS({\n  \"node_modules/inherits/inherits.js\"(exports2, module2) {\n    try {\n      util = require(\"util\");\n      if (typeof util.inherits !== \"function\") throw \"\";\n      module2.exports = util.inherits;\n    } catch (e) {\n      module2.exports = require_inherits_browser();\n    }\n    var util;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/short.js\nvar require_short = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/short.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var assert = utils.assert;\n    function ShortCurve(conf) {\n      Base.call(this, \"short\", conf);\n      this.a = new BN(conf.a, 16).toRed(this.red);\n      this.b = new BN(conf.b, 16).toRed(this.red);\n      this.tinv = this.two.redInvm();\n      this.zeroA = this.a.fromRed().cmpn(0) === 0;\n      this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;\n      this.endo = this._getEndomorphism(conf);\n      this._endoWnafT1 = new Array(4);\n      this._endoWnafT2 = new Array(4);\n    }\n    inherits(ShortCurve, Base);\n    module2.exports = ShortCurve;\n    ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {\n      if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)\n        return;\n      var beta;\n      var lambda;\n      if (conf.beta) {\n        beta = new BN(conf.beta, 16).toRed(this.red);\n      } else {\n        var betas = this._getEndoRoots(this.p);\n        beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];\n        beta = beta.toRed(this.red);\n      }\n      if (conf.lambda) {\n        lambda = new BN(conf.lambda, 16);\n      } else {\n        var lambdas = this._getEndoRoots(this.n);\n        if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {\n          lambda = lambdas[0];\n        } else {\n          lambda = lambdas[1];\n          assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);\n        }\n      }\n      var basis;\n      if (conf.basis) {\n        basis = conf.basis.map(function(vec) {\n          return {\n            a: new BN(vec.a, 16),\n            b: new BN(vec.b, 16)\n          };\n        });\n      } else {\n        basis = this._getEndoBasis(lambda);\n      }\n      return {\n        beta,\n        lambda,\n        basis\n      };\n    };\n    ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {\n      var red = num === this.p ? this.red : BN.mont(num);\n      var tinv = new BN(2).toRed(red).redInvm();\n      var ntinv = tinv.redNeg();\n      var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);\n      var l1 = ntinv.redAdd(s).fromRed();\n      var l2 = ntinv.redSub(s).fromRed();\n      return [l1, l2];\n    };\n    ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {\n      var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));\n      var u = lambda;\n      var v = this.n.clone();\n      var x1 = new BN(1);\n      var y1 = new BN(0);\n      var x2 = new BN(0);\n      var y2 = new BN(1);\n      var a0;\n      var b0;\n      var a1;\n      var b1;\n      var a2;\n      var b2;\n      var prevR;\n      var i = 0;\n      var r;\n      var x;\n      while (u.cmpn(0) !== 0) {\n        var q = v.div(u);\n        r = v.sub(q.mul(u));\n        x = x2.sub(q.mul(x1));\n        var y = y2.sub(q.mul(y1));\n        if (!a1 && r.cmp(aprxSqrt) < 0) {\n          a0 = prevR.neg();\n          b0 = x1;\n          a1 = r.neg();\n          b1 = x;\n        } else if (a1 && ++i === 2) {\n          break;\n        }\n        prevR = r;\n        v = u;\n        u = r;\n        x2 = x1;\n        x1 = x;\n        y2 = y1;\n        y1 = y;\n      }\n      a2 = r.neg();\n      b2 = x;\n      var len1 = a1.sqr().add(b1.sqr());\n      var len2 = a2.sqr().add(b2.sqr());\n      if (len2.cmp(len1) >= 0) {\n        a2 = a0;\n        b2 = b0;\n      }\n      if (a1.negative) {\n        a1 = a1.neg();\n        b1 = b1.neg();\n      }\n      if (a2.negative) {\n        a2 = a2.neg();\n        b2 = b2.neg();\n      }\n      return [\n        { a: a1, b: b1 },\n        { a: a2, b: b2 }\n      ];\n    };\n    ShortCurve.prototype._endoSplit = function _endoSplit(k) {\n      var basis = this.endo.basis;\n      var v1 = basis[0];\n      var v2 = basis[1];\n      var c1 = v2.b.mul(k).divRound(this.n);\n      var c2 = v1.b.neg().mul(k).divRound(this.n);\n      var p1 = c1.mul(v1.a);\n      var p2 = c2.mul(v2.a);\n      var q1 = c1.mul(v1.b);\n      var q2 = c2.mul(v2.b);\n      var k1 = k.sub(p1).sub(p2);\n      var k2 = q1.add(q2).neg();\n      return { k1, k2 };\n    };\n    ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {\n      x = new BN(x, 16);\n      if (!x.red)\n        x = x.toRed(this.red);\n      var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);\n      var y = y2.redSqrt();\n      if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      var isOdd = y.fromRed().isOdd();\n      if (odd && !isOdd || !odd && isOdd)\n        y = y.redNeg();\n      return this.point(x, y);\n    };\n    ShortCurve.prototype.validate = function validate(point) {\n      if (point.inf)\n        return true;\n      var x = point.x;\n      var y = point.y;\n      var ax = this.a.redMul(x);\n      var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);\n      return y.redSqr().redISub(rhs).cmpn(0) === 0;\n    };\n    ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {\n      var npoints = this._endoWnafT1;\n      var ncoeffs = this._endoWnafT2;\n      for (var i = 0; i < points.length; i++) {\n        var split = this._endoSplit(coeffs[i]);\n        var p = points[i];\n        var beta = p._getBeta();\n        if (split.k1.negative) {\n          split.k1.ineg();\n          p = p.neg(true);\n        }\n        if (split.k2.negative) {\n          split.k2.ineg();\n          beta = beta.neg(true);\n        }\n        npoints[i * 2] = p;\n        npoints[i * 2 + 1] = beta;\n        ncoeffs[i * 2] = split.k1;\n        ncoeffs[i * 2 + 1] = split.k2;\n      }\n      var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);\n      for (var j = 0; j < i * 2; j++) {\n        npoints[j] = null;\n        ncoeffs[j] = null;\n      }\n      return res;\n    };\n    function Point(curve, x, y, isRed) {\n      Base.BasePoint.call(this, curve, \"affine\");\n      if (x === null && y === null) {\n        this.x = null;\n        this.y = null;\n        this.inf = true;\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        if (isRed) {\n          this.x.forceRed(this.curve.red);\n          this.y.forceRed(this.curve.red);\n        }\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.y.red)\n          this.y = this.y.toRed(this.curve.red);\n        this.inf = false;\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    ShortCurve.prototype.point = function point(x, y, isRed) {\n      return new Point(this, x, y, isRed);\n    };\n    ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {\n      return Point.fromJSON(this, obj, red);\n    };\n    Point.prototype._getBeta = function _getBeta() {\n      if (!this.curve.endo)\n        return;\n      var pre = this.precomputed;\n      if (pre && pre.beta)\n        return pre.beta;\n      var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);\n      if (pre) {\n        var curve = this.curve;\n        var endoMul = function(p) {\n          return curve.point(p.x.redMul(curve.endo.beta), p.y);\n        };\n        pre.beta = beta;\n        beta.precomputed = {\n          beta: null,\n          naf: pre.naf && {\n            wnd: pre.naf.wnd,\n            points: pre.naf.points.map(endoMul)\n          },\n          doubles: pre.doubles && {\n            step: pre.doubles.step,\n            points: pre.doubles.points.map(endoMul)\n          }\n        };\n      }\n      return beta;\n    };\n    Point.prototype.toJSON = function toJSON() {\n      if (!this.precomputed)\n        return [this.x, this.y];\n      return [this.x, this.y, this.precomputed && {\n        doubles: this.precomputed.doubles && {\n          step: this.precomputed.doubles.step,\n          points: this.precomputed.doubles.points.slice(1)\n        },\n        naf: this.precomputed.naf && {\n          wnd: this.precomputed.naf.wnd,\n          points: this.precomputed.naf.points.slice(1)\n        }\n      }];\n    };\n    Point.fromJSON = function fromJSON(curve, obj, red) {\n      if (typeof obj === \"string\")\n        obj = JSON.parse(obj);\n      var res = curve.point(obj[0], obj[1], red);\n      if (!obj[2])\n        return res;\n      function obj2point(obj2) {\n        return curve.point(obj2[0], obj2[1], red);\n      }\n      var pre = obj[2];\n      res.precomputed = {\n        beta: null,\n        doubles: pre.doubles && {\n          step: pre.doubles.step,\n          points: [res].concat(pre.doubles.points.map(obj2point))\n        },\n        naf: pre.naf && {\n          wnd: pre.naf.wnd,\n          points: [res].concat(pre.naf.points.map(obj2point))\n        }\n      };\n      return res;\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" y: \" + this.y.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.inf;\n    };\n    Point.prototype.add = function add(p) {\n      if (this.inf)\n        return p;\n      if (p.inf)\n        return this;\n      if (this.eq(p))\n        return this.dbl();\n      if (this.neg().eq(p))\n        return this.curve.point(null, null);\n      if (this.x.cmp(p.x) === 0)\n        return this.curve.point(null, null);\n      var c = this.y.redSub(p.y);\n      if (c.cmpn(0) !== 0)\n        c = c.redMul(this.x.redSub(p.x).redInvm());\n      var nx = c.redSqr().redISub(this.x).redISub(p.x);\n      var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n      return this.curve.point(nx, ny);\n    };\n    Point.prototype.dbl = function dbl() {\n      if (this.inf)\n        return this;\n      var ys1 = this.y.redAdd(this.y);\n      if (ys1.cmpn(0) === 0)\n        return this.curve.point(null, null);\n      var a = this.curve.a;\n      var x2 = this.x.redSqr();\n      var dyinv = ys1.redInvm();\n      var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);\n      var nx = c.redSqr().redISub(this.x.redAdd(this.x));\n      var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n      return this.curve.point(nx, ny);\n    };\n    Point.prototype.getX = function getX() {\n      return this.x.fromRed();\n    };\n    Point.prototype.getY = function getY() {\n      return this.y.fromRed();\n    };\n    Point.prototype.mul = function mul(k) {\n      k = new BN(k, 16);\n      if (this.isInfinity())\n        return this;\n      else if (this._hasDoubles(k))\n        return this.curve._fixedNafMul(this, k);\n      else if (this.curve.endo)\n        return this.curve._endoWnafMulAdd([this], [k]);\n      else\n        return this.curve._wnafMul(this, k);\n    };\n    Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {\n      var points = [this, p2];\n      var coeffs = [k1, k2];\n      if (this.curve.endo)\n        return this.curve._endoWnafMulAdd(points, coeffs);\n      else\n        return this.curve._wnafMulAdd(1, points, coeffs, 2);\n    };\n    Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {\n      var points = [this, p2];\n      var coeffs = [k1, k2];\n      if (this.curve.endo)\n        return this.curve._endoWnafMulAdd(points, coeffs, true);\n      else\n        return this.curve._wnafMulAdd(1, points, coeffs, 2, true);\n    };\n    Point.prototype.eq = function eq(p) {\n      return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);\n    };\n    Point.prototype.neg = function neg(_precompute) {\n      if (this.inf)\n        return this;\n      var res = this.curve.point(this.x, this.y.redNeg());\n      if (_precompute && this.precomputed) {\n        var pre = this.precomputed;\n        var negate = function(p) {\n          return p.neg();\n        };\n        res.precomputed = {\n          naf: pre.naf && {\n            wnd: pre.naf.wnd,\n            points: pre.naf.points.map(negate)\n          },\n          doubles: pre.doubles && {\n            step: pre.doubles.step,\n            points: pre.doubles.points.map(negate)\n          }\n        };\n      }\n      return res;\n    };\n    Point.prototype.toJ = function toJ() {\n      if (this.inf)\n        return this.curve.jpoint(null, null, null);\n      var res = this.curve.jpoint(this.x, this.y, this.curve.one);\n      return res;\n    };\n    function JPoint(curve, x, y, z) {\n      Base.BasePoint.call(this, curve, \"jacobian\");\n      if (x === null && y === null && z === null) {\n        this.x = this.curve.one;\n        this.y = this.curve.one;\n        this.z = new BN(0);\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        this.z = new BN(z, 16);\n      }\n      if (!this.x.red)\n        this.x = this.x.toRed(this.curve.red);\n      if (!this.y.red)\n        this.y = this.y.toRed(this.curve.red);\n      if (!this.z.red)\n        this.z = this.z.toRed(this.curve.red);\n      this.zOne = this.z === this.curve.one;\n    }\n    inherits(JPoint, Base.BasePoint);\n    ShortCurve.prototype.jpoint = function jpoint(x, y, z) {\n      return new JPoint(this, x, y, z);\n    };\n    JPoint.prototype.toP = function toP() {\n      if (this.isInfinity())\n        return this.curve.point(null, null);\n      var zinv = this.z.redInvm();\n      var zinv2 = zinv.redSqr();\n      var ax = this.x.redMul(zinv2);\n      var ay = this.y.redMul(zinv2).redMul(zinv);\n      return this.curve.point(ax, ay);\n    };\n    JPoint.prototype.neg = function neg() {\n      return this.curve.jpoint(this.x, this.y.redNeg(), this.z);\n    };\n    JPoint.prototype.add = function add(p) {\n      if (this.isInfinity())\n        return p;\n      if (p.isInfinity())\n        return this;\n      var pz2 = p.z.redSqr();\n      var z2 = this.z.redSqr();\n      var u1 = this.x.redMul(pz2);\n      var u2 = p.x.redMul(z2);\n      var s1 = this.y.redMul(pz2.redMul(p.z));\n      var s2 = p.y.redMul(z2.redMul(this.z));\n      var h = u1.redSub(u2);\n      var r = s1.redSub(s2);\n      if (h.cmpn(0) === 0) {\n        if (r.cmpn(0) !== 0)\n          return this.curve.jpoint(null, null, null);\n        else\n          return this.dbl();\n      }\n      var h2 = h.redSqr();\n      var h3 = h2.redMul(h);\n      var v = u1.redMul(h2);\n      var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n      var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n      var nz = this.z.redMul(p.z).redMul(h);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.mixedAdd = function mixedAdd(p) {\n      if (this.isInfinity())\n        return p.toJ();\n      if (p.isInfinity())\n        return this;\n      var z2 = this.z.redSqr();\n      var u1 = this.x;\n      var u2 = p.x.redMul(z2);\n      var s1 = this.y;\n      var s2 = p.y.redMul(z2).redMul(this.z);\n      var h = u1.redSub(u2);\n      var r = s1.redSub(s2);\n      if (h.cmpn(0) === 0) {\n        if (r.cmpn(0) !== 0)\n          return this.curve.jpoint(null, null, null);\n        else\n          return this.dbl();\n      }\n      var h2 = h.redSqr();\n      var h3 = h2.redMul(h);\n      var v = u1.redMul(h2);\n      var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n      var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n      var nz = this.z.redMul(h);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.dblp = function dblp(pow) {\n      if (pow === 0)\n        return this;\n      if (this.isInfinity())\n        return this;\n      if (!pow)\n        return this.dbl();\n      var i;\n      if (this.curve.zeroA || this.curve.threeA) {\n        var r = this;\n        for (i = 0; i < pow; i++)\n          r = r.dbl();\n        return r;\n      }\n      var a = this.curve.a;\n      var tinv = this.curve.tinv;\n      var jx = this.x;\n      var jy = this.y;\n      var jz = this.z;\n      var jz4 = jz.redSqr().redSqr();\n      var jyd = jy.redAdd(jy);\n      for (i = 0; i < pow; i++) {\n        var jx2 = jx.redSqr();\n        var jyd2 = jyd.redSqr();\n        var jyd4 = jyd2.redSqr();\n        var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n        var t1 = jx.redMul(jyd2);\n        var nx = c.redSqr().redISub(t1.redAdd(t1));\n        var t2 = t1.redISub(nx);\n        var dny = c.redMul(t2);\n        dny = dny.redIAdd(dny).redISub(jyd4);\n        var nz = jyd.redMul(jz);\n        if (i + 1 < pow)\n          jz4 = jz4.redMul(jyd4);\n        jx = nx;\n        jz = nz;\n        jyd = dny;\n      }\n      return this.curve.jpoint(jx, jyd.redMul(tinv), jz);\n    };\n    JPoint.prototype.dbl = function dbl() {\n      if (this.isInfinity())\n        return this;\n      if (this.curve.zeroA)\n        return this._zeroDbl();\n      else if (this.curve.threeA)\n        return this._threeDbl();\n      else\n        return this._dbl();\n    };\n    JPoint.prototype._zeroDbl = function _zeroDbl() {\n      var nx;\n      var ny;\n      var nz;\n      if (this.zOne) {\n        var xx = this.x.redSqr();\n        var yy = this.y.redSqr();\n        var yyyy = yy.redSqr();\n        var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n        s = s.redIAdd(s);\n        var m = xx.redAdd(xx).redIAdd(xx);\n        var t = m.redSqr().redISub(s).redISub(s);\n        var yyyy8 = yyyy.redIAdd(yyyy);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        nx = t;\n        ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n        nz = this.y.redAdd(this.y);\n      } else {\n        var a = this.x.redSqr();\n        var b = this.y.redSqr();\n        var c = b.redSqr();\n        var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);\n        d = d.redIAdd(d);\n        var e = a.redAdd(a).redIAdd(a);\n        var f = e.redSqr();\n        var c8 = c.redIAdd(c);\n        c8 = c8.redIAdd(c8);\n        c8 = c8.redIAdd(c8);\n        nx = f.redISub(d).redISub(d);\n        ny = e.redMul(d.redISub(nx)).redISub(c8);\n        nz = this.y.redMul(this.z);\n        nz = nz.redIAdd(nz);\n      }\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype._threeDbl = function _threeDbl() {\n      var nx;\n      var ny;\n      var nz;\n      if (this.zOne) {\n        var xx = this.x.redSqr();\n        var yy = this.y.redSqr();\n        var yyyy = yy.redSqr();\n        var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n        s = s.redIAdd(s);\n        var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);\n        var t = m.redSqr().redISub(s).redISub(s);\n        nx = t;\n        var yyyy8 = yyyy.redIAdd(yyyy);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n        nz = this.y.redAdd(this.y);\n      } else {\n        var delta = this.z.redSqr();\n        var gamma = this.y.redSqr();\n        var beta = this.x.redMul(gamma);\n        var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));\n        alpha = alpha.redAdd(alpha).redIAdd(alpha);\n        var beta4 = beta.redIAdd(beta);\n        beta4 = beta4.redIAdd(beta4);\n        var beta8 = beta4.redAdd(beta4);\n        nx = alpha.redSqr().redISub(beta8);\n        nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);\n        var ggamma8 = gamma.redSqr();\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);\n      }\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype._dbl = function _dbl() {\n      var a = this.curve.a;\n      var jx = this.x;\n      var jy = this.y;\n      var jz = this.z;\n      var jz4 = jz.redSqr().redSqr();\n      var jx2 = jx.redSqr();\n      var jy2 = jy.redSqr();\n      var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n      var jxd4 = jx.redAdd(jx);\n      jxd4 = jxd4.redIAdd(jxd4);\n      var t1 = jxd4.redMul(jy2);\n      var nx = c.redSqr().redISub(t1.redAdd(t1));\n      var t2 = t1.redISub(nx);\n      var jyd8 = jy2.redSqr();\n      jyd8 = jyd8.redIAdd(jyd8);\n      jyd8 = jyd8.redIAdd(jyd8);\n      jyd8 = jyd8.redIAdd(jyd8);\n      var ny = c.redMul(t2).redISub(jyd8);\n      var nz = jy.redAdd(jy).redMul(jz);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.trpl = function trpl() {\n      if (!this.curve.zeroA)\n        return this.dbl().add(this);\n      var xx = this.x.redSqr();\n      var yy = this.y.redSqr();\n      var zz = this.z.redSqr();\n      var yyyy = yy.redSqr();\n      var m = xx.redAdd(xx).redIAdd(xx);\n      var mm = m.redSqr();\n      var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n      e = e.redIAdd(e);\n      e = e.redAdd(e).redIAdd(e);\n      e = e.redISub(mm);\n      var ee = e.redSqr();\n      var t = yyyy.redIAdd(yyyy);\n      t = t.redIAdd(t);\n      t = t.redIAdd(t);\n      t = t.redIAdd(t);\n      var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);\n      var yyu4 = yy.redMul(u);\n      yyu4 = yyu4.redIAdd(yyu4);\n      yyu4 = yyu4.redIAdd(yyu4);\n      var nx = this.x.redMul(ee).redISub(yyu4);\n      nx = nx.redIAdd(nx);\n      nx = nx.redIAdd(nx);\n      var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));\n      ny = ny.redIAdd(ny);\n      ny = ny.redIAdd(ny);\n      ny = ny.redIAdd(ny);\n      var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.mul = function mul(k, kbase) {\n      k = new BN(k, kbase);\n      return this.curve._wnafMul(this, k);\n    };\n    JPoint.prototype.eq = function eq(p) {\n      if (p.type === \"affine\")\n        return this.eq(p.toJ());\n      if (this === p)\n        return true;\n      var z2 = this.z.redSqr();\n      var pz2 = p.z.redSqr();\n      if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)\n        return false;\n      var z3 = z2.redMul(this.z);\n      var pz3 = pz2.redMul(p.z);\n      return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;\n    };\n    JPoint.prototype.eqXToP = function eqXToP(x) {\n      var zs = this.z.redSqr();\n      var rx = x.toRed(this.curve.red).redMul(zs);\n      if (this.x.cmp(rx) === 0)\n        return true;\n      var xc = x.clone();\n      var t = this.curve.redN.redMul(zs);\n      for (; ; ) {\n        xc.iadd(this.curve.n);\n        if (xc.cmp(this.curve.p) >= 0)\n          return false;\n        rx.redIAdd(t);\n        if (this.x.cmp(rx) === 0)\n          return true;\n      }\n    };\n    JPoint.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC JPoint Infinity>\";\n      return \"<EC JPoint x: \" + this.x.toString(16, 2) + \" y: \" + this.y.toString(16, 2) + \" z: \" + this.z.toString(16, 2) + \">\";\n    };\n    JPoint.prototype.isInfinity = function isInfinity() {\n      return this.z.cmpn(0) === 0;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/mont.js\nvar require_mont = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/mont.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var utils = require_utils2();\n    function MontCurve(conf) {\n      Base.call(this, \"mont\", conf);\n      this.a = new BN(conf.a, 16).toRed(this.red);\n      this.b = new BN(conf.b, 16).toRed(this.red);\n      this.i4 = new BN(4).toRed(this.red).redInvm();\n      this.two = new BN(2).toRed(this.red);\n      this.a24 = this.i4.redMul(this.a.redAdd(this.two));\n    }\n    inherits(MontCurve, Base);\n    module2.exports = MontCurve;\n    MontCurve.prototype.validate = function validate(point) {\n      var x = point.normalize().x;\n      var x2 = x.redSqr();\n      var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);\n      var y = rhs.redSqrt();\n      return y.redSqr().cmp(rhs) === 0;\n    };\n    function Point(curve, x, z) {\n      Base.BasePoint.call(this, curve, \"projective\");\n      if (x === null && z === null) {\n        this.x = this.curve.one;\n        this.z = this.curve.zero;\n      } else {\n        this.x = new BN(x, 16);\n        this.z = new BN(z, 16);\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.z.red)\n          this.z = this.z.toRed(this.curve.red);\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n      return this.point(utils.toArray(bytes, enc), 1);\n    };\n    MontCurve.prototype.point = function point(x, z) {\n      return new Point(this, x, z);\n    };\n    MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n      return Point.fromJSON(this, obj);\n    };\n    Point.prototype.precompute = function precompute() {\n    };\n    Point.prototype._encode = function _encode() {\n      return this.getX().toArray(\"be\", this.curve.p.byteLength());\n    };\n    Point.fromJSON = function fromJSON(curve, obj) {\n      return new Point(curve, obj[0], obj[1] || curve.one);\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" z: \" + this.z.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.z.cmpn(0) === 0;\n    };\n    Point.prototype.dbl = function dbl() {\n      var a = this.x.redAdd(this.z);\n      var aa = a.redSqr();\n      var b = this.x.redSub(this.z);\n      var bb = b.redSqr();\n      var c = aa.redSub(bb);\n      var nx = aa.redMul(bb);\n      var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));\n      return this.curve.point(nx, nz);\n    };\n    Point.prototype.add = function add() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.diffAdd = function diffAdd(p, diff) {\n      var a = this.x.redAdd(this.z);\n      var b = this.x.redSub(this.z);\n      var c = p.x.redAdd(p.z);\n      var d = p.x.redSub(p.z);\n      var da = d.redMul(a);\n      var cb = c.redMul(b);\n      var nx = diff.z.redMul(da.redAdd(cb).redSqr());\n      var nz = diff.x.redMul(da.redISub(cb).redSqr());\n      return this.curve.point(nx, nz);\n    };\n    Point.prototype.mul = function mul(k) {\n      var t = k.clone();\n      var a = this;\n      var b = this.curve.point(null, null);\n      var c = this;\n      for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1))\n        bits.push(t.andln(1));\n      for (var i = bits.length - 1; i >= 0; i--) {\n        if (bits[i] === 0) {\n          a = a.diffAdd(b, c);\n          b = b.dbl();\n        } else {\n          b = a.diffAdd(b, c);\n          a = a.dbl();\n        }\n      }\n      return b;\n    };\n    Point.prototype.mulAdd = function mulAdd() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.jumlAdd = function jumlAdd() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.eq = function eq(other) {\n      return this.getX().cmp(other.getX()) === 0;\n    };\n    Point.prototype.normalize = function normalize() {\n      this.x = this.x.redMul(this.z.redInvm());\n      this.z = this.curve.one;\n      return this;\n    };\n    Point.prototype.getX = function getX() {\n      this.normalize();\n      return this.x.fromRed();\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/edwards.js\nvar require_edwards = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/edwards.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var assert = utils.assert;\n    function EdwardsCurve(conf) {\n      this.twisted = (conf.a | 0) !== 1;\n      this.mOneA = this.twisted && (conf.a | 0) === -1;\n      this.extended = this.mOneA;\n      Base.call(this, \"edwards\", conf);\n      this.a = new BN(conf.a, 16).umod(this.red.m);\n      this.a = this.a.toRed(this.red);\n      this.c = new BN(conf.c, 16).toRed(this.red);\n      this.c2 = this.c.redSqr();\n      this.d = new BN(conf.d, 16).toRed(this.red);\n      this.dd = this.d.redAdd(this.d);\n      assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);\n      this.oneC = (conf.c | 0) === 1;\n    }\n    inherits(EdwardsCurve, Base);\n    module2.exports = EdwardsCurve;\n    EdwardsCurve.prototype._mulA = function _mulA(num) {\n      if (this.mOneA)\n        return num.redNeg();\n      else\n        return this.a.redMul(num);\n    };\n    EdwardsCurve.prototype._mulC = function _mulC(num) {\n      if (this.oneC)\n        return num;\n      else\n        return this.c.redMul(num);\n    };\n    EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {\n      return this.point(x, y, z, t);\n    };\n    EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {\n      x = new BN(x, 16);\n      if (!x.red)\n        x = x.toRed(this.red);\n      var x2 = x.redSqr();\n      var rhs = this.c2.redSub(this.a.redMul(x2));\n      var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));\n      var y2 = rhs.redMul(lhs.redInvm());\n      var y = y2.redSqrt();\n      if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      var isOdd = y.fromRed().isOdd();\n      if (odd && !isOdd || !odd && isOdd)\n        y = y.redNeg();\n      return this.point(x, y);\n    };\n    EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {\n      y = new BN(y, 16);\n      if (!y.red)\n        y = y.toRed(this.red);\n      var y2 = y.redSqr();\n      var lhs = y2.redSub(this.c2);\n      var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);\n      var x2 = lhs.redMul(rhs.redInvm());\n      if (x2.cmp(this.zero) === 0) {\n        if (odd)\n          throw new Error(\"invalid point\");\n        else\n          return this.point(this.zero, y);\n      }\n      var x = x2.redSqrt();\n      if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      if (x.fromRed().isOdd() !== odd)\n        x = x.redNeg();\n      return this.point(x, y);\n    };\n    EdwardsCurve.prototype.validate = function validate(point) {\n      if (point.isInfinity())\n        return true;\n      point.normalize();\n      var x2 = point.x.redSqr();\n      var y2 = point.y.redSqr();\n      var lhs = x2.redMul(this.a).redAdd(y2);\n      var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));\n      return lhs.cmp(rhs) === 0;\n    };\n    function Point(curve, x, y, z, t) {\n      Base.BasePoint.call(this, curve, \"projective\");\n      if (x === null && y === null && z === null) {\n        this.x = this.curve.zero;\n        this.y = this.curve.one;\n        this.z = this.curve.one;\n        this.t = this.curve.zero;\n        this.zOne = true;\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        this.z = z ? new BN(z, 16) : this.curve.one;\n        this.t = t && new BN(t, 16);\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.y.red)\n          this.y = this.y.toRed(this.curve.red);\n        if (!this.z.red)\n          this.z = this.z.toRed(this.curve.red);\n        if (this.t && !this.t.red)\n          this.t = this.t.toRed(this.curve.red);\n        this.zOne = this.z === this.curve.one;\n        if (this.curve.extended && !this.t) {\n          this.t = this.x.redMul(this.y);\n          if (!this.zOne)\n            this.t = this.t.redMul(this.z.redInvm());\n        }\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n      return Point.fromJSON(this, obj);\n    };\n    EdwardsCurve.prototype.point = function point(x, y, z, t) {\n      return new Point(this, x, y, z, t);\n    };\n    Point.fromJSON = function fromJSON(curve, obj) {\n      return new Point(curve, obj[0], obj[1], obj[2]);\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" y: \" + this.y.fromRed().toString(16, 2) + \" z: \" + this.z.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);\n    };\n    Point.prototype._extDbl = function _extDbl() {\n      var a = this.x.redSqr();\n      var b = this.y.redSqr();\n      var c = this.z.redSqr();\n      c = c.redIAdd(c);\n      var d = this.curve._mulA(a);\n      var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);\n      var g = d.redAdd(b);\n      var f = g.redSub(c);\n      var h = d.redSub(b);\n      var nx = e.redMul(f);\n      var ny = g.redMul(h);\n      var nt = e.redMul(h);\n      var nz = f.redMul(g);\n      return this.curve.point(nx, ny, nz, nt);\n    };\n    Point.prototype._projDbl = function _projDbl() {\n      var b = this.x.redAdd(this.y).redSqr();\n      var c = this.x.redSqr();\n      var d = this.y.redSqr();\n      var nx;\n      var ny;\n      var nz;\n      var e;\n      var h;\n      var j;\n      if (this.curve.twisted) {\n        e = this.curve._mulA(c);\n        var f = e.redAdd(d);\n        if (this.zOne) {\n          nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));\n          ny = f.redMul(e.redSub(d));\n          nz = f.redSqr().redSub(f).redSub(f);\n        } else {\n          h = this.z.redSqr();\n          j = f.redSub(h).redISub(h);\n          nx = b.redSub(c).redISub(d).redMul(j);\n          ny = f.redMul(e.redSub(d));\n          nz = f.redMul(j);\n        }\n      } else {\n        e = c.redAdd(d);\n        h = this.curve._mulC(this.z).redSqr();\n        j = e.redSub(h).redSub(h);\n        nx = this.curve._mulC(b.redISub(e)).redMul(j);\n        ny = this.curve._mulC(e).redMul(c.redISub(d));\n        nz = e.redMul(j);\n      }\n      return this.curve.point(nx, ny, nz);\n    };\n    Point.prototype.dbl = function dbl() {\n      if (this.isInfinity())\n        return this;\n      if (this.curve.extended)\n        return this._extDbl();\n      else\n        return this._projDbl();\n    };\n    Point.prototype._extAdd = function _extAdd(p) {\n      var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));\n      var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));\n      var c = this.t.redMul(this.curve.dd).redMul(p.t);\n      var d = this.z.redMul(p.z.redAdd(p.z));\n      var e = b.redSub(a);\n      var f = d.redSub(c);\n      var g = d.redAdd(c);\n      var h = b.redAdd(a);\n      var nx = e.redMul(f);\n      var ny = g.redMul(h);\n      var nt = e.redMul(h);\n      var nz = f.redMul(g);\n      return this.curve.point(nx, ny, nz, nt);\n    };\n    Point.prototype._projAdd = function _projAdd(p) {\n      var a = this.z.redMul(p.z);\n      var b = a.redSqr();\n      var c = this.x.redMul(p.x);\n      var d = this.y.redMul(p.y);\n      var e = this.curve.d.redMul(c).redMul(d);\n      var f = b.redSub(e);\n      var g = b.redAdd(e);\n      var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);\n      var nx = a.redMul(f).redMul(tmp);\n      var ny;\n      var nz;\n      if (this.curve.twisted) {\n        ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));\n        nz = f.redMul(g);\n      } else {\n        ny = a.redMul(g).redMul(d.redSub(c));\n        nz = this.curve._mulC(f).redMul(g);\n      }\n      return this.curve.point(nx, ny, nz);\n    };\n    Point.prototype.add = function add(p) {\n      if (this.isInfinity())\n        return p;\n      if (p.isInfinity())\n        return this;\n      if (this.curve.extended)\n        return this._extAdd(p);\n      else\n        return this._projAdd(p);\n    };\n    Point.prototype.mul = function mul(k) {\n      if (this._hasDoubles(k))\n        return this.curve._fixedNafMul(this, k);\n      else\n        return this.curve._wnafMul(this, k);\n    };\n    Point.prototype.mulAdd = function mulAdd(k1, p, k2) {\n      return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);\n    };\n    Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {\n      return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);\n    };\n    Point.prototype.normalize = function normalize() {\n      if (this.zOne)\n        return this;\n      var zi = this.z.redInvm();\n      this.x = this.x.redMul(zi);\n      this.y = this.y.redMul(zi);\n      if (this.t)\n        this.t = this.t.redMul(zi);\n      this.z = this.curve.one;\n      this.zOne = true;\n      return this;\n    };\n    Point.prototype.neg = function neg() {\n      return this.curve.point(\n        this.x.redNeg(),\n        this.y,\n        this.z,\n        this.t && this.t.redNeg()\n      );\n    };\n    Point.prototype.getX = function getX() {\n      this.normalize();\n      return this.x.fromRed();\n    };\n    Point.prototype.getY = function getY() {\n      this.normalize();\n      return this.y.fromRed();\n    };\n    Point.prototype.eq = function eq(other) {\n      return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;\n    };\n    Point.prototype.eqXToP = function eqXToP(x) {\n      var rx = x.toRed(this.curve.red).redMul(this.z);\n      if (this.x.cmp(rx) === 0)\n        return true;\n      var xc = x.clone();\n      var t = this.curve.redN.redMul(this.z);\n      for (; ; ) {\n        xc.iadd(this.curve.n);\n        if (xc.cmp(this.curve.p) >= 0)\n          return false;\n        rx.redIAdd(t);\n        if (this.x.cmp(rx) === 0)\n          return true;\n      }\n    };\n    Point.prototype.toP = Point.prototype.normalize;\n    Point.prototype.mixedAdd = Point.prototype.add;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/index.js\nvar require_curve = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/index.js\"(exports2) {\n    \"use strict\";\n    var curve = exports2;\n    curve.base = require_base();\n    curve.short = require_short();\n    curve.mont = require_mont();\n    curve.edwards = require_edwards();\n  }\n});\n\n// node_modules/hash.js/lib/hash/utils.js\nvar require_utils3 = __commonJS({\n  \"node_modules/hash.js/lib/hash/utils.js\"(exports2) {\n    \"use strict\";\n    var assert = require_minimalistic_assert();\n    var inherits = require_inherits();\n    exports2.inherits = inherits;\n    function isSurrogatePair(msg, i) {\n      if ((msg.charCodeAt(i) & 64512) !== 55296) {\n        return false;\n      }\n      if (i < 0 || i + 1 >= msg.length) {\n        return false;\n      }\n      return (msg.charCodeAt(i + 1) & 64512) === 56320;\n    }\n    function toArray(msg, enc) {\n      if (Array.isArray(msg))\n        return msg.slice();\n      if (!msg)\n        return [];\n      var res = [];\n      if (typeof msg === \"string\") {\n        if (!enc) {\n          var p = 0;\n          for (var i = 0; i < msg.length; i++) {\n            var c = msg.charCodeAt(i);\n            if (c < 128) {\n              res[p++] = c;\n            } else if (c < 2048) {\n              res[p++] = c >> 6 | 192;\n              res[p++] = c & 63 | 128;\n            } else if (isSurrogatePair(msg, i)) {\n              c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);\n              res[p++] = c >> 18 | 240;\n              res[p++] = c >> 12 & 63 | 128;\n              res[p++] = c >> 6 & 63 | 128;\n              res[p++] = c & 63 | 128;\n            } else {\n              res[p++] = c >> 12 | 224;\n              res[p++] = c >> 6 & 63 | 128;\n              res[p++] = c & 63 | 128;\n            }\n          }\n        } else if (enc === \"hex\") {\n          msg = msg.replace(/[^a-z0-9]+/ig, \"\");\n          if (msg.length % 2 !== 0)\n            msg = \"0\" + msg;\n          for (i = 0; i < msg.length; i += 2)\n            res.push(parseInt(msg[i] + msg[i + 1], 16));\n        }\n      } else {\n        for (i = 0; i < msg.length; i++)\n          res[i] = msg[i] | 0;\n      }\n      return res;\n    }\n    exports2.toArray = toArray;\n    function toHex(msg) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++)\n        res += zero2(msg[i].toString(16));\n      return res;\n    }\n    exports2.toHex = toHex;\n    function htonl(w) {\n      var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;\n      return res >>> 0;\n    }\n    exports2.htonl = htonl;\n    function toHex32(msg, endian) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++) {\n        var w = msg[i];\n        if (endian === \"little\")\n          w = htonl(w);\n        res += zero8(w.toString(16));\n      }\n      return res;\n    }\n    exports2.toHex32 = toHex32;\n    function zero2(word) {\n      if (word.length === 1)\n        return \"0\" + word;\n      else\n        return word;\n    }\n    exports2.zero2 = zero2;\n    function zero8(word) {\n      if (word.length === 7)\n        return \"0\" + word;\n      else if (word.length === 6)\n        return \"00\" + word;\n      else if (word.length === 5)\n        return \"000\" + word;\n      else if (word.length === 4)\n        return \"0000\" + word;\n      else if (word.length === 3)\n        return \"00000\" + word;\n      else if (word.length === 2)\n        return \"000000\" + word;\n      else if (word.length === 1)\n        return \"0000000\" + word;\n      else\n        return word;\n    }\n    exports2.zero8 = zero8;\n    function join32(msg, start, end, endian) {\n      var len = end - start;\n      assert(len % 4 === 0);\n      var res = new Array(len / 4);\n      for (var i = 0, k = start; i < res.length; i++, k += 4) {\n        var w;\n        if (endian === \"big\")\n          w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];\n        else\n          w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];\n        res[i] = w >>> 0;\n      }\n      return res;\n    }\n    exports2.join32 = join32;\n    function split32(msg, endian) {\n      var res = new Array(msg.length * 4);\n      for (var i = 0, k = 0; i < msg.length; i++, k += 4) {\n        var m = msg[i];\n        if (endian === \"big\") {\n          res[k] = m >>> 24;\n          res[k + 1] = m >>> 16 & 255;\n          res[k + 2] = m >>> 8 & 255;\n          res[k + 3] = m & 255;\n        } else {\n          res[k + 3] = m >>> 24;\n          res[k + 2] = m >>> 16 & 255;\n          res[k + 1] = m >>> 8 & 255;\n          res[k] = m & 255;\n        }\n      }\n      return res;\n    }\n    exports2.split32 = split32;\n    function rotr32(w, b) {\n      return w >>> b | w << 32 - b;\n    }\n    exports2.rotr32 = rotr32;\n    function rotl32(w, b) {\n      return w << b | w >>> 32 - b;\n    }\n    exports2.rotl32 = rotl32;\n    function sum32(a, b) {\n      return a + b >>> 0;\n    }\n    exports2.sum32 = sum32;\n    function sum32_3(a, b, c) {\n      return a + b + c >>> 0;\n    }\n    exports2.sum32_3 = sum32_3;\n    function sum32_4(a, b, c, d) {\n      return a + b + c + d >>> 0;\n    }\n    exports2.sum32_4 = sum32_4;\n    function sum32_5(a, b, c, d, e) {\n      return a + b + c + d + e >>> 0;\n    }\n    exports2.sum32_5 = sum32_5;\n    function sum64(buf, pos, ah, al) {\n      var bh = buf[pos];\n      var bl = buf[pos + 1];\n      var lo = al + bl >>> 0;\n      var hi = (lo < al ? 1 : 0) + ah + bh;\n      buf[pos] = hi >>> 0;\n      buf[pos + 1] = lo;\n    }\n    exports2.sum64 = sum64;\n    function sum64_hi(ah, al, bh, bl) {\n      var lo = al + bl >>> 0;\n      var hi = (lo < al ? 1 : 0) + ah + bh;\n      return hi >>> 0;\n    }\n    exports2.sum64_hi = sum64_hi;\n    function sum64_lo(ah, al, bh, bl) {\n      var lo = al + bl;\n      return lo >>> 0;\n    }\n    exports2.sum64_lo = sum64_lo;\n    function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {\n      var carry = 0;\n      var lo = al;\n      lo = lo + bl >>> 0;\n      carry += lo < al ? 1 : 0;\n      lo = lo + cl >>> 0;\n      carry += lo < cl ? 1 : 0;\n      lo = lo + dl >>> 0;\n      carry += lo < dl ? 1 : 0;\n      var hi = ah + bh + ch + dh + carry;\n      return hi >>> 0;\n    }\n    exports2.sum64_4_hi = sum64_4_hi;\n    function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {\n      var lo = al + bl + cl + dl;\n      return lo >>> 0;\n    }\n    exports2.sum64_4_lo = sum64_4_lo;\n    function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n      var carry = 0;\n      var lo = al;\n      lo = lo + bl >>> 0;\n      carry += lo < al ? 1 : 0;\n      lo = lo + cl >>> 0;\n      carry += lo < cl ? 1 : 0;\n      lo = lo + dl >>> 0;\n      carry += lo < dl ? 1 : 0;\n      lo = lo + el >>> 0;\n      carry += lo < el ? 1 : 0;\n      var hi = ah + bh + ch + dh + eh + carry;\n      return hi >>> 0;\n    }\n    exports2.sum64_5_hi = sum64_5_hi;\n    function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n      var lo = al + bl + cl + dl + el;\n      return lo >>> 0;\n    }\n    exports2.sum64_5_lo = sum64_5_lo;\n    function rotr64_hi(ah, al, num) {\n      var r = al << 32 - num | ah >>> num;\n      return r >>> 0;\n    }\n    exports2.rotr64_hi = rotr64_hi;\n    function rotr64_lo(ah, al, num) {\n      var r = ah << 32 - num | al >>> num;\n      return r >>> 0;\n    }\n    exports2.rotr64_lo = rotr64_lo;\n    function shr64_hi(ah, al, num) {\n      return ah >>> num;\n    }\n    exports2.shr64_hi = shr64_hi;\n    function shr64_lo(ah, al, num) {\n      var r = ah << 32 - num | al >>> num;\n      return r >>> 0;\n    }\n    exports2.shr64_lo = shr64_lo;\n  }\n});\n\n// node_modules/hash.js/lib/hash/common.js\nvar require_common = __commonJS({\n  \"node_modules/hash.js/lib/hash/common.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var assert = require_minimalistic_assert();\n    function BlockHash() {\n      this.pending = null;\n      this.pendingTotal = 0;\n      this.blockSize = this.constructor.blockSize;\n      this.outSize = this.constructor.outSize;\n      this.hmacStrength = this.constructor.hmacStrength;\n      this.padLength = this.constructor.padLength / 8;\n      this.endian = \"big\";\n      this._delta8 = this.blockSize / 8;\n      this._delta32 = this.blockSize / 32;\n    }\n    exports2.BlockHash = BlockHash;\n    BlockHash.prototype.update = function update(msg, enc) {\n      msg = utils.toArray(msg, enc);\n      if (!this.pending)\n        this.pending = msg;\n      else\n        this.pending = this.pending.concat(msg);\n      this.pendingTotal += msg.length;\n      if (this.pending.length >= this._delta8) {\n        msg = this.pending;\n        var r = msg.length % this._delta8;\n        this.pending = msg.slice(msg.length - r, msg.length);\n        if (this.pending.length === 0)\n          this.pending = null;\n        msg = utils.join32(msg, 0, msg.length - r, this.endian);\n        for (var i = 0; i < msg.length; i += this._delta32)\n          this._update(msg, i, i + this._delta32);\n      }\n      return this;\n    };\n    BlockHash.prototype.digest = function digest(enc) {\n      this.update(this._pad());\n      assert(this.pending === null);\n      return this._digest(enc);\n    };\n    BlockHash.prototype._pad = function pad() {\n      var len = this.pendingTotal;\n      var bytes = this._delta8;\n      var k = bytes - (len + this.padLength) % bytes;\n      var res = new Array(k + this.padLength);\n      res[0] = 128;\n      for (var i = 1; i < k; i++)\n        res[i] = 0;\n      len <<= 3;\n      if (this.endian === \"big\") {\n        for (var t = 8; t < this.padLength; t++)\n          res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = len >>> 24 & 255;\n        res[i++] = len >>> 16 & 255;\n        res[i++] = len >>> 8 & 255;\n        res[i++] = len & 255;\n      } else {\n        res[i++] = len & 255;\n        res[i++] = len >>> 8 & 255;\n        res[i++] = len >>> 16 & 255;\n        res[i++] = len >>> 24 & 255;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        for (t = 8; t < this.padLength; t++)\n          res[i++] = 0;\n      }\n      return res;\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/common.js\nvar require_common2 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/common.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var rotr32 = utils.rotr32;\n    function ft_1(s, x, y, z) {\n      if (s === 0)\n        return ch32(x, y, z);\n      if (s === 1 || s === 3)\n        return p32(x, y, z);\n      if (s === 2)\n        return maj32(x, y, z);\n    }\n    exports2.ft_1 = ft_1;\n    function ch32(x, y, z) {\n      return x & y ^ ~x & z;\n    }\n    exports2.ch32 = ch32;\n    function maj32(x, y, z) {\n      return x & y ^ x & z ^ y & z;\n    }\n    exports2.maj32 = maj32;\n    function p32(x, y, z) {\n      return x ^ y ^ z;\n    }\n    exports2.p32 = p32;\n    function s0_256(x) {\n      return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);\n    }\n    exports2.s0_256 = s0_256;\n    function s1_256(x) {\n      return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);\n    }\n    exports2.s1_256 = s1_256;\n    function g0_256(x) {\n      return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;\n    }\n    exports2.g0_256 = g0_256;\n    function g1_256(x) {\n      return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;\n    }\n    exports2.g1_256 = g1_256;\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/1.js\nvar require__ = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/1.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var shaCommon = require_common2();\n    var rotl32 = utils.rotl32;\n    var sum32 = utils.sum32;\n    var sum32_5 = utils.sum32_5;\n    var ft_1 = shaCommon.ft_1;\n    var BlockHash = common.BlockHash;\n    var sha1_K = [\n      1518500249,\n      1859775393,\n      2400959708,\n      3395469782\n    ];\n    function SHA1() {\n      if (!(this instanceof SHA1))\n        return new SHA1();\n      BlockHash.call(this);\n      this.h = [\n        1732584193,\n        4023233417,\n        2562383102,\n        271733878,\n        3285377520\n      ];\n      this.W = new Array(80);\n    }\n    utils.inherits(SHA1, BlockHash);\n    module2.exports = SHA1;\n    SHA1.blockSize = 512;\n    SHA1.outSize = 160;\n    SHA1.hmacStrength = 80;\n    SHA1.padLength = 64;\n    SHA1.prototype._update = function _update(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 16; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i++)\n        W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);\n      var a = this.h[0];\n      var b = this.h[1];\n      var c = this.h[2];\n      var d = this.h[3];\n      var e = this.h[4];\n      for (i = 0; i < W.length; i++) {\n        var s = ~~(i / 20);\n        var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);\n        e = d;\n        d = c;\n        c = rotl32(b, 30);\n        b = a;\n        a = t;\n      }\n      this.h[0] = sum32(this.h[0], a);\n      this.h[1] = sum32(this.h[1], b);\n      this.h[2] = sum32(this.h[2], c);\n      this.h[3] = sum32(this.h[3], d);\n      this.h[4] = sum32(this.h[4], e);\n    };\n    SHA1.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/256.js\nvar require__2 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/256.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var shaCommon = require_common2();\n    var assert = require_minimalistic_assert();\n    var sum32 = utils.sum32;\n    var sum32_4 = utils.sum32_4;\n    var sum32_5 = utils.sum32_5;\n    var ch32 = shaCommon.ch32;\n    var maj32 = shaCommon.maj32;\n    var s0_256 = shaCommon.s0_256;\n    var s1_256 = shaCommon.s1_256;\n    var g0_256 = shaCommon.g0_256;\n    var g1_256 = shaCommon.g1_256;\n    var BlockHash = common.BlockHash;\n    var sha256_K = [\n      1116352408,\n      1899447441,\n      3049323471,\n      3921009573,\n      961987163,\n      1508970993,\n      2453635748,\n      2870763221,\n      3624381080,\n      310598401,\n      607225278,\n      1426881987,\n      1925078388,\n      2162078206,\n      2614888103,\n      3248222580,\n      3835390401,\n      4022224774,\n      264347078,\n      604807628,\n      770255983,\n      1249150122,\n      1555081692,\n      1996064986,\n      2554220882,\n      2821834349,\n      2952996808,\n      3210313671,\n      3336571891,\n      3584528711,\n      113926993,\n      338241895,\n      666307205,\n      773529912,\n      1294757372,\n      1396182291,\n      1695183700,\n      1986661051,\n      2177026350,\n      2456956037,\n      2730485921,\n      2820302411,\n      3259730800,\n      3345764771,\n      3516065817,\n      3600352804,\n      4094571909,\n      275423344,\n      430227734,\n      506948616,\n      659060556,\n      883997877,\n      958139571,\n      1322822218,\n      1537002063,\n      1747873779,\n      1955562222,\n      2024104815,\n      2227730452,\n      2361852424,\n      2428436474,\n      2756734187,\n      3204031479,\n      3329325298\n    ];\n    function SHA256() {\n      if (!(this instanceof SHA256))\n        return new SHA256();\n      BlockHash.call(this);\n      this.h = [\n        1779033703,\n        3144134277,\n        1013904242,\n        2773480762,\n        1359893119,\n        2600822924,\n        528734635,\n        1541459225\n      ];\n      this.k = sha256_K;\n      this.W = new Array(64);\n    }\n    utils.inherits(SHA256, BlockHash);\n    module2.exports = SHA256;\n    SHA256.blockSize = 512;\n    SHA256.outSize = 256;\n    SHA256.hmacStrength = 192;\n    SHA256.padLength = 64;\n    SHA256.prototype._update = function _update(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 16; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i++)\n        W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);\n      var a = this.h[0];\n      var b = this.h[1];\n      var c = this.h[2];\n      var d = this.h[3];\n      var e = this.h[4];\n      var f = this.h[5];\n      var g = this.h[6];\n      var h = this.h[7];\n      assert(this.k.length === W.length);\n      for (i = 0; i < W.length; i++) {\n        var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);\n        var T2 = sum32(s0_256(a), maj32(a, b, c));\n        h = g;\n        g = f;\n        f = e;\n        e = sum32(d, T1);\n        d = c;\n        c = b;\n        b = a;\n        a = sum32(T1, T2);\n      }\n      this.h[0] = sum32(this.h[0], a);\n      this.h[1] = sum32(this.h[1], b);\n      this.h[2] = sum32(this.h[2], c);\n      this.h[3] = sum32(this.h[3], d);\n      this.h[4] = sum32(this.h[4], e);\n      this.h[5] = sum32(this.h[5], f);\n      this.h[6] = sum32(this.h[6], g);\n      this.h[7] = sum32(this.h[7], h);\n    };\n    SHA256.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/224.js\nvar require__3 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/224.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var SHA256 = require__2();\n    function SHA224() {\n      if (!(this instanceof SHA224))\n        return new SHA224();\n      SHA256.call(this);\n      this.h = [\n        3238371032,\n        914150663,\n        812702999,\n        4144912697,\n        4290775857,\n        1750603025,\n        1694076839,\n        3204075428\n      ];\n    }\n    utils.inherits(SHA224, SHA256);\n    module2.exports = SHA224;\n    SHA224.blockSize = 512;\n    SHA224.outSize = 224;\n    SHA224.hmacStrength = 192;\n    SHA224.padLength = 64;\n    SHA224.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h.slice(0, 7), \"big\");\n      else\n        return utils.split32(this.h.slice(0, 7), \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/512.js\nvar require__4 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/512.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var assert = require_minimalistic_assert();\n    var rotr64_hi = utils.rotr64_hi;\n    var rotr64_lo = utils.rotr64_lo;\n    var shr64_hi = utils.shr64_hi;\n    var shr64_lo = utils.shr64_lo;\n    var sum64 = utils.sum64;\n    var sum64_hi = utils.sum64_hi;\n    var sum64_lo = utils.sum64_lo;\n    var sum64_4_hi = utils.sum64_4_hi;\n    var sum64_4_lo = utils.sum64_4_lo;\n    var sum64_5_hi = utils.sum64_5_hi;\n    var sum64_5_lo = utils.sum64_5_lo;\n    var BlockHash = common.BlockHash;\n    var sha512_K = [\n      1116352408,\n      3609767458,\n      1899447441,\n      602891725,\n      3049323471,\n      3964484399,\n      3921009573,\n      2173295548,\n      961987163,\n      4081628472,\n      1508970993,\n      3053834265,\n      2453635748,\n      2937671579,\n      2870763221,\n      3664609560,\n      3624381080,\n      2734883394,\n      310598401,\n      1164996542,\n      607225278,\n      1323610764,\n      1426881987,\n      3590304994,\n      1925078388,\n      4068182383,\n      2162078206,\n      991336113,\n      2614888103,\n      633803317,\n      3248222580,\n      3479774868,\n      3835390401,\n      2666613458,\n      4022224774,\n      944711139,\n      264347078,\n      2341262773,\n      604807628,\n      2007800933,\n      770255983,\n      1495990901,\n      1249150122,\n      1856431235,\n      1555081692,\n      3175218132,\n      1996064986,\n      2198950837,\n      2554220882,\n      3999719339,\n      2821834349,\n      766784016,\n      2952996808,\n      2566594879,\n      3210313671,\n      3203337956,\n      3336571891,\n      1034457026,\n      3584528711,\n      2466948901,\n      113926993,\n      3758326383,\n      338241895,\n      168717936,\n      666307205,\n      1188179964,\n      773529912,\n      1546045734,\n      1294757372,\n      1522805485,\n      1396182291,\n      2643833823,\n      1695183700,\n      2343527390,\n      1986661051,\n      1014477480,\n      2177026350,\n      1206759142,\n      2456956037,\n      344077627,\n      2730485921,\n      1290863460,\n      2820302411,\n      3158454273,\n      3259730800,\n      3505952657,\n      3345764771,\n      106217008,\n      3516065817,\n      3606008344,\n      3600352804,\n      1432725776,\n      4094571909,\n      1467031594,\n      275423344,\n      851169720,\n      430227734,\n      3100823752,\n      506948616,\n      1363258195,\n      659060556,\n      3750685593,\n      883997877,\n      3785050280,\n      958139571,\n      3318307427,\n      1322822218,\n      3812723403,\n      1537002063,\n      2003034995,\n      1747873779,\n      3602036899,\n      1955562222,\n      1575990012,\n      2024104815,\n      1125592928,\n      2227730452,\n      2716904306,\n      2361852424,\n      442776044,\n      2428436474,\n      593698344,\n      2756734187,\n      3733110249,\n      3204031479,\n      2999351573,\n      3329325298,\n      3815920427,\n      3391569614,\n      3928383900,\n      3515267271,\n      566280711,\n      3940187606,\n      3454069534,\n      4118630271,\n      4000239992,\n      116418474,\n      1914138554,\n      174292421,\n      2731055270,\n      289380356,\n      3203993006,\n      460393269,\n      320620315,\n      685471733,\n      587496836,\n      852142971,\n      1086792851,\n      1017036298,\n      365543100,\n      1126000580,\n      2618297676,\n      1288033470,\n      3409855158,\n      1501505948,\n      4234509866,\n      1607167915,\n      987167468,\n      1816402316,\n      1246189591\n    ];\n    function SHA512() {\n      if (!(this instanceof SHA512))\n        return new SHA512();\n      BlockHash.call(this);\n      this.h = [\n        1779033703,\n        4089235720,\n        3144134277,\n        2227873595,\n        1013904242,\n        4271175723,\n        2773480762,\n        1595750129,\n        1359893119,\n        2917565137,\n        2600822924,\n        725511199,\n        528734635,\n        4215389547,\n        1541459225,\n        327033209\n      ];\n      this.k = sha512_K;\n      this.W = new Array(160);\n    }\n    utils.inherits(SHA512, BlockHash);\n    module2.exports = SHA512;\n    SHA512.blockSize = 1024;\n    SHA512.outSize = 512;\n    SHA512.hmacStrength = 192;\n    SHA512.padLength = 128;\n    SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 32; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i += 2) {\n        var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);\n        var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);\n        var c1_hi = W[i - 14];\n        var c1_lo = W[i - 13];\n        var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);\n        var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);\n        var c3_hi = W[i - 32];\n        var c3_lo = W[i - 31];\n        W[i] = sum64_4_hi(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo\n        );\n        W[i + 1] = sum64_4_lo(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo\n        );\n      }\n    };\n    SHA512.prototype._update = function _update(msg, start) {\n      this._prepareBlock(msg, start);\n      var W = this.W;\n      var ah = this.h[0];\n      var al = this.h[1];\n      var bh = this.h[2];\n      var bl = this.h[3];\n      var ch = this.h[4];\n      var cl = this.h[5];\n      var dh = this.h[6];\n      var dl = this.h[7];\n      var eh = this.h[8];\n      var el = this.h[9];\n      var fh = this.h[10];\n      var fl = this.h[11];\n      var gh = this.h[12];\n      var gl = this.h[13];\n      var hh = this.h[14];\n      var hl = this.h[15];\n      assert(this.k.length === W.length);\n      for (var i = 0; i < W.length; i += 2) {\n        var c0_hi = hh;\n        var c0_lo = hl;\n        var c1_hi = s1_512_hi(eh, el);\n        var c1_lo = s1_512_lo(eh, el);\n        var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);\n        var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);\n        var c3_hi = this.k[i];\n        var c3_lo = this.k[i + 1];\n        var c4_hi = W[i];\n        var c4_lo = W[i + 1];\n        var T1_hi = sum64_5_hi(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo,\n          c4_hi,\n          c4_lo\n        );\n        var T1_lo = sum64_5_lo(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo,\n          c4_hi,\n          c4_lo\n        );\n        c0_hi = s0_512_hi(ah, al);\n        c0_lo = s0_512_lo(ah, al);\n        c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);\n        c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);\n        var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);\n        var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);\n        hh = gh;\n        hl = gl;\n        gh = fh;\n        gl = fl;\n        fh = eh;\n        fl = el;\n        eh = sum64_hi(dh, dl, T1_hi, T1_lo);\n        el = sum64_lo(dl, dl, T1_hi, T1_lo);\n        dh = ch;\n        dl = cl;\n        ch = bh;\n        cl = bl;\n        bh = ah;\n        bl = al;\n        ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);\n        al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);\n      }\n      sum64(this.h, 0, ah, al);\n      sum64(this.h, 2, bh, bl);\n      sum64(this.h, 4, ch, cl);\n      sum64(this.h, 6, dh, dl);\n      sum64(this.h, 8, eh, el);\n      sum64(this.h, 10, fh, fl);\n      sum64(this.h, 12, gh, gl);\n      sum64(this.h, 14, hh, hl);\n    };\n    SHA512.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n    function ch64_hi(xh, xl, yh, yl, zh) {\n      var r = xh & yh ^ ~xh & zh;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function ch64_lo(xh, xl, yh, yl, zh, zl) {\n      var r = xl & yl ^ ~xl & zl;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function maj64_hi(xh, xl, yh, yl, zh) {\n      var r = xh & yh ^ xh & zh ^ yh & zh;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function maj64_lo(xh, xl, yh, yl, zh, zl) {\n      var r = xl & yl ^ xl & zl ^ yl & zl;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s0_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 28);\n      var c1_hi = rotr64_hi(xl, xh, 2);\n      var c2_hi = rotr64_hi(xl, xh, 7);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s0_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 28);\n      var c1_lo = rotr64_lo(xl, xh, 2);\n      var c2_lo = rotr64_lo(xl, xh, 7);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s1_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 14);\n      var c1_hi = rotr64_hi(xh, xl, 18);\n      var c2_hi = rotr64_hi(xl, xh, 9);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s1_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 14);\n      var c1_lo = rotr64_lo(xh, xl, 18);\n      var c2_lo = rotr64_lo(xl, xh, 9);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g0_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 1);\n      var c1_hi = rotr64_hi(xh, xl, 8);\n      var c2_hi = shr64_hi(xh, xl, 7);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g0_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 1);\n      var c1_lo = rotr64_lo(xh, xl, 8);\n      var c2_lo = shr64_lo(xh, xl, 7);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g1_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 19);\n      var c1_hi = rotr64_hi(xl, xh, 29);\n      var c2_hi = shr64_hi(xh, xl, 6);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g1_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 19);\n      var c1_lo = rotr64_lo(xl, xh, 29);\n      var c2_lo = shr64_lo(xh, xl, 6);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/384.js\nvar require__5 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/384.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var SHA512 = require__4();\n    function SHA384() {\n      if (!(this instanceof SHA384))\n        return new SHA384();\n      SHA512.call(this);\n      this.h = [\n        3418070365,\n        3238371032,\n        1654270250,\n        914150663,\n        2438529370,\n        812702999,\n        355462360,\n        4144912697,\n        1731405415,\n        4290775857,\n        2394180231,\n        1750603025,\n        3675008525,\n        1694076839,\n        1203062813,\n        3204075428\n      ];\n    }\n    utils.inherits(SHA384, SHA512);\n    module2.exports = SHA384;\n    SHA384.blockSize = 1024;\n    SHA384.outSize = 384;\n    SHA384.hmacStrength = 192;\n    SHA384.padLength = 128;\n    SHA384.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h.slice(0, 12), \"big\");\n      else\n        return utils.split32(this.h.slice(0, 12), \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha.js\nvar require_sha = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha.js\"(exports2) {\n    \"use strict\";\n    exports2.sha1 = require__();\n    exports2.sha224 = require__3();\n    exports2.sha256 = require__2();\n    exports2.sha384 = require__5();\n    exports2.sha512 = require__4();\n  }\n});\n\n// node_modules/hash.js/lib/hash/ripemd.js\nvar require_ripemd = __commonJS({\n  \"node_modules/hash.js/lib/hash/ripemd.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var rotl32 = utils.rotl32;\n    var sum32 = utils.sum32;\n    var sum32_3 = utils.sum32_3;\n    var sum32_4 = utils.sum32_4;\n    var BlockHash = common.BlockHash;\n    function RIPEMD160() {\n      if (!(this instanceof RIPEMD160))\n        return new RIPEMD160();\n      BlockHash.call(this);\n      this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];\n      this.endian = \"little\";\n    }\n    utils.inherits(RIPEMD160, BlockHash);\n    exports2.ripemd160 = RIPEMD160;\n    RIPEMD160.blockSize = 512;\n    RIPEMD160.outSize = 160;\n    RIPEMD160.hmacStrength = 192;\n    RIPEMD160.padLength = 64;\n    RIPEMD160.prototype._update = function update(msg, start) {\n      var A = this.h[0];\n      var B = this.h[1];\n      var C = this.h[2];\n      var D = this.h[3];\n      var E = this.h[4];\n      var Ah = A;\n      var Bh = B;\n      var Ch = C;\n      var Dh = D;\n      var Eh = E;\n      for (var j = 0; j < 80; j++) {\n        var T = sum32(\n          rotl32(\n            sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),\n            s[j]\n          ),\n          E\n        );\n        A = E;\n        E = D;\n        D = rotl32(C, 10);\n        C = B;\n        B = T;\n        T = sum32(\n          rotl32(\n            sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),\n            sh[j]\n          ),\n          Eh\n        );\n        Ah = Eh;\n        Eh = Dh;\n        Dh = rotl32(Ch, 10);\n        Ch = Bh;\n        Bh = T;\n      }\n      T = sum32_3(this.h[1], C, Dh);\n      this.h[1] = sum32_3(this.h[2], D, Eh);\n      this.h[2] = sum32_3(this.h[3], E, Ah);\n      this.h[3] = sum32_3(this.h[4], A, Bh);\n      this.h[4] = sum32_3(this.h[0], B, Ch);\n      this.h[0] = T;\n    };\n    RIPEMD160.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"little\");\n      else\n        return utils.split32(this.h, \"little\");\n    };\n    function f(j, x, y, z) {\n      if (j <= 15)\n        return x ^ y ^ z;\n      else if (j <= 31)\n        return x & y | ~x & z;\n      else if (j <= 47)\n        return (x | ~y) ^ z;\n      else if (j <= 63)\n        return x & z | y & ~z;\n      else\n        return x ^ (y | ~z);\n    }\n    function K(j) {\n      if (j <= 15)\n        return 0;\n      else if (j <= 31)\n        return 1518500249;\n      else if (j <= 47)\n        return 1859775393;\n      else if (j <= 63)\n        return 2400959708;\n      else\n        return 2840853838;\n    }\n    function Kh(j) {\n      if (j <= 15)\n        return 1352829926;\n      else if (j <= 31)\n        return 1548603684;\n      else if (j <= 47)\n        return 1836072691;\n      else if (j <= 63)\n        return 2053994217;\n      else\n        return 0;\n    }\n    var r = [\n      0,\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14,\n      15,\n      7,\n      4,\n      13,\n      1,\n      10,\n      6,\n      15,\n      3,\n      12,\n      0,\n      9,\n      5,\n      2,\n      14,\n      11,\n      8,\n      3,\n      10,\n      14,\n      4,\n      9,\n      15,\n      8,\n      1,\n      2,\n      7,\n      0,\n      6,\n      13,\n      11,\n      5,\n      12,\n      1,\n      9,\n      11,\n      10,\n      0,\n      8,\n      12,\n      4,\n      13,\n      3,\n      7,\n      15,\n      14,\n      5,\n      6,\n      2,\n      4,\n      0,\n      5,\n      9,\n      7,\n      12,\n      2,\n      10,\n      14,\n      1,\n      3,\n      8,\n      11,\n      6,\n      15,\n      13\n    ];\n    var rh = [\n      5,\n      14,\n      7,\n      0,\n      9,\n      2,\n      11,\n      4,\n      13,\n      6,\n      15,\n      8,\n      1,\n      10,\n      3,\n      12,\n      6,\n      11,\n      3,\n      7,\n      0,\n      13,\n      5,\n      10,\n      14,\n      15,\n      8,\n      12,\n      4,\n      9,\n      1,\n      2,\n      15,\n      5,\n      1,\n      3,\n      7,\n      14,\n      6,\n      9,\n      11,\n      8,\n      12,\n      2,\n      10,\n      0,\n      4,\n      13,\n      8,\n      6,\n      4,\n      1,\n      3,\n      11,\n      15,\n      0,\n      5,\n      12,\n      2,\n      13,\n      9,\n      7,\n      10,\n      14,\n      12,\n      15,\n      10,\n      4,\n      1,\n      5,\n      8,\n      7,\n      6,\n      2,\n      13,\n      14,\n      0,\n      3,\n      9,\n      11\n    ];\n    var s = [\n      11,\n      14,\n      15,\n      12,\n      5,\n      8,\n      7,\n      9,\n      11,\n      13,\n      14,\n      15,\n      6,\n      7,\n      9,\n      8,\n      7,\n      6,\n      8,\n      13,\n      11,\n      9,\n      7,\n      15,\n      7,\n      12,\n      15,\n      9,\n      11,\n      7,\n      13,\n      12,\n      11,\n      13,\n      6,\n      7,\n      14,\n      9,\n      13,\n      15,\n      14,\n      8,\n      13,\n      6,\n      5,\n      12,\n      7,\n      5,\n      11,\n      12,\n      14,\n      15,\n      14,\n      15,\n      9,\n      8,\n      9,\n      14,\n      5,\n      6,\n      8,\n      6,\n      5,\n      12,\n      9,\n      15,\n      5,\n      11,\n      6,\n      8,\n      13,\n      12,\n      5,\n      12,\n      13,\n      14,\n      11,\n      8,\n      5,\n      6\n    ];\n    var sh = [\n      8,\n      9,\n      9,\n      11,\n      13,\n      15,\n      15,\n      5,\n      7,\n      7,\n      8,\n      11,\n      14,\n      14,\n      12,\n      6,\n      9,\n      13,\n      15,\n      7,\n      12,\n      8,\n      9,\n      11,\n      7,\n      7,\n      12,\n      7,\n      6,\n      15,\n      13,\n      11,\n      9,\n      7,\n      15,\n      11,\n      8,\n      6,\n      6,\n      14,\n      12,\n      13,\n      5,\n      14,\n      13,\n      13,\n      7,\n      5,\n      15,\n      5,\n      8,\n      11,\n      14,\n      14,\n      6,\n      14,\n      6,\n      9,\n      12,\n      9,\n      12,\n      5,\n      15,\n      8,\n      8,\n      5,\n      12,\n      9,\n      12,\n      5,\n      14,\n      6,\n      8,\n      13,\n      6,\n      5,\n      15,\n      13,\n      11,\n      11\n    ];\n  }\n});\n\n// node_modules/hash.js/lib/hash/hmac.js\nvar require_hmac = __commonJS({\n  \"node_modules/hash.js/lib/hash/hmac.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var assert = require_minimalistic_assert();\n    function Hmac(hash, key, enc) {\n      if (!(this instanceof Hmac))\n        return new Hmac(hash, key, enc);\n      this.Hash = hash;\n      this.blockSize = hash.blockSize / 8;\n      this.outSize = hash.outSize / 8;\n      this.inner = null;\n      this.outer = null;\n      this._init(utils.toArray(key, enc));\n    }\n    module2.exports = Hmac;\n    Hmac.prototype._init = function init(key) {\n      if (key.length > this.blockSize)\n        key = new this.Hash().update(key).digest();\n      assert(key.length <= this.blockSize);\n      for (var i = key.length; i < this.blockSize; i++)\n        key.push(0);\n      for (i = 0; i < key.length; i++)\n        key[i] ^= 54;\n      this.inner = new this.Hash().update(key);\n      for (i = 0; i < key.length; i++)\n        key[i] ^= 106;\n      this.outer = new this.Hash().update(key);\n    };\n    Hmac.prototype.update = function update(msg, enc) {\n      this.inner.update(msg, enc);\n      return this;\n    };\n    Hmac.prototype.digest = function digest(enc) {\n      this.outer.update(this.inner.digest());\n      return this.outer.digest(enc);\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash.js\nvar require_hash = __commonJS({\n  \"node_modules/hash.js/lib/hash.js\"(exports2) {\n    var hash = exports2;\n    hash.utils = require_utils3();\n    hash.common = require_common();\n    hash.sha = require_sha();\n    hash.ripemd = require_ripemd();\n    hash.hmac = require_hmac();\n    hash.sha1 = hash.sha.sha1;\n    hash.sha256 = hash.sha.sha256;\n    hash.sha224 = hash.sha.sha224;\n    hash.sha384 = hash.sha.sha384;\n    hash.sha512 = hash.sha.sha512;\n    hash.ripemd160 = hash.ripemd.ripemd160;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js\nvar require_secp256k1 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js\"(exports2, module2) {\n    module2.exports = {\n      doubles: {\n        step: 4,\n        points: [\n          [\n            \"e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a\",\n            \"f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821\"\n          ],\n          [\n            \"8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508\",\n            \"11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\"\n          ],\n          [\n            \"175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739\",\n            \"d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695\"\n          ],\n          [\n            \"363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640\",\n            \"4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9\"\n          ],\n          [\n            \"8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c\",\n            \"4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36\"\n          ],\n          [\n            \"723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda\",\n            \"96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f\"\n          ],\n          [\n            \"eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa\",\n            \"5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999\"\n          ],\n          [\n            \"100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0\",\n            \"cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09\"\n          ],\n          [\n            \"e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d\",\n            \"9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d\"\n          ],\n          [\n            \"feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d\",\n            \"e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088\"\n          ],\n          [\n            \"da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1\",\n            \"9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d\"\n          ],\n          [\n            \"53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0\",\n            \"5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8\"\n          ],\n          [\n            \"8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047\",\n            \"10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a\"\n          ],\n          [\n            \"385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862\",\n            \"283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453\"\n          ],\n          [\n            \"6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7\",\n            \"7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160\"\n          ],\n          [\n            \"3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd\",\n            \"56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0\"\n          ],\n          [\n            \"85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83\",\n            \"7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6\"\n          ],\n          [\n            \"948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a\",\n            \"53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589\"\n          ],\n          [\n            \"6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8\",\n            \"bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17\"\n          ],\n          [\n            \"e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d\",\n            \"4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda\"\n          ],\n          [\n            \"e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725\",\n            \"7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd\"\n          ],\n          [\n            \"213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754\",\n            \"4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2\"\n          ],\n          [\n            \"4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c\",\n            \"17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6\"\n          ],\n          [\n            \"fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6\",\n            \"6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f\"\n          ],\n          [\n            \"76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39\",\n            \"c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01\"\n          ],\n          [\n            \"c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891\",\n            \"893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3\"\n          ],\n          [\n            \"d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b\",\n            \"febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f\"\n          ],\n          [\n            \"b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03\",\n            \"2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7\"\n          ],\n          [\n            \"e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d\",\n            \"eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78\"\n          ],\n          [\n            \"a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070\",\n            \"7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1\"\n          ],\n          [\n            \"90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4\",\n            \"e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150\"\n          ],\n          [\n            \"8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da\",\n            \"662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82\"\n          ],\n          [\n            \"e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11\",\n            \"1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc\"\n          ],\n          [\n            \"8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e\",\n            \"efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b\"\n          ],\n          [\n            \"e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41\",\n            \"2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51\"\n          ],\n          [\n            \"b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef\",\n            \"67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45\"\n          ],\n          [\n            \"d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8\",\n            \"db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120\"\n          ],\n          [\n            \"324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d\",\n            \"648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84\"\n          ],\n          [\n            \"4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96\",\n            \"35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d\"\n          ],\n          [\n            \"9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd\",\n            \"ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d\"\n          ],\n          [\n            \"6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5\",\n            \"9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8\"\n          ],\n          [\n            \"a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266\",\n            \"40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8\"\n          ],\n          [\n            \"7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71\",\n            \"34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac\"\n          ],\n          [\n            \"928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac\",\n            \"c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f\"\n          ],\n          [\n            \"85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751\",\n            \"1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962\"\n          ],\n          [\n            \"ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e\",\n            \"493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907\"\n          ],\n          [\n            \"827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241\",\n            \"c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec\"\n          ],\n          [\n            \"eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3\",\n            \"be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d\"\n          ],\n          [\n            \"e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f\",\n            \"4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414\"\n          ],\n          [\n            \"1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19\",\n            \"aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd\"\n          ],\n          [\n            \"146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be\",\n            \"b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0\"\n          ],\n          [\n            \"fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9\",\n            \"6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811\"\n          ],\n          [\n            \"da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2\",\n            \"8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1\"\n          ],\n          [\n            \"a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13\",\n            \"7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c\"\n          ],\n          [\n            \"174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c\",\n            \"ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73\"\n          ],\n          [\n            \"959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba\",\n            \"2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd\"\n          ],\n          [\n            \"d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151\",\n            \"e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405\"\n          ],\n          [\n            \"64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073\",\n            \"d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589\"\n          ],\n          [\n            \"8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458\",\n            \"38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e\"\n          ],\n          [\n            \"13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b\",\n            \"69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27\"\n          ],\n          [\n            \"bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366\",\n            \"d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1\"\n          ],\n          [\n            \"8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa\",\n            \"40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482\"\n          ],\n          [\n            \"8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0\",\n            \"620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945\"\n          ],\n          [\n            \"dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787\",\n            \"7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573\"\n          ],\n          [\n            \"f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e\",\n            \"ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82\"\n          ]\n        ]\n      },\n      naf: {\n        wnd: 7,\n        points: [\n          [\n            \"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9\",\n            \"388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672\"\n          ],\n          [\n            \"2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4\",\n            \"d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6\"\n          ],\n          [\n            \"5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc\",\n            \"6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da\"\n          ],\n          [\n            \"acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe\",\n            \"cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37\"\n          ],\n          [\n            \"774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb\",\n            \"d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b\"\n          ],\n          [\n            \"f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8\",\n            \"ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81\"\n          ],\n          [\n            \"d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e\",\n            \"581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58\"\n          ],\n          [\n            \"defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34\",\n            \"4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77\"\n          ],\n          [\n            \"2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c\",\n            \"85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a\"\n          ],\n          [\n            \"352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5\",\n            \"321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c\"\n          ],\n          [\n            \"2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f\",\n            \"2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67\"\n          ],\n          [\n            \"9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714\",\n            \"73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402\"\n          ],\n          [\n            \"daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729\",\n            \"a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55\"\n          ],\n          [\n            \"c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db\",\n            \"2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482\"\n          ],\n          [\n            \"6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4\",\n            \"e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82\"\n          ],\n          [\n            \"1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5\",\n            \"b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396\"\n          ],\n          [\n            \"605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479\",\n            \"2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49\"\n          ],\n          [\n            \"62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d\",\n            \"80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf\"\n          ],\n          [\n            \"80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f\",\n            \"1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a\"\n          ],\n          [\n            \"7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb\",\n            \"d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7\"\n          ],\n          [\n            \"d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9\",\n            \"eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933\"\n          ],\n          [\n            \"49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963\",\n            \"758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a\"\n          ],\n          [\n            \"77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74\",\n            \"958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6\"\n          ],\n          [\n            \"f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530\",\n            \"e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37\"\n          ],\n          [\n            \"463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b\",\n            \"5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e\"\n          ],\n          [\n            \"f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247\",\n            \"cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6\"\n          ],\n          [\n            \"caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1\",\n            \"cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476\"\n          ],\n          [\n            \"2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120\",\n            \"4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40\"\n          ],\n          [\n            \"7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435\",\n            \"91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61\"\n          ],\n          [\n            \"754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18\",\n            \"673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683\"\n          ],\n          [\n            \"e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8\",\n            \"59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5\"\n          ],\n          [\n            \"186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb\",\n            \"3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b\"\n          ],\n          [\n            \"df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f\",\n            \"55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417\"\n          ],\n          [\n            \"5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143\",\n            \"efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868\"\n          ],\n          [\n            \"290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba\",\n            \"e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a\"\n          ],\n          [\n            \"af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45\",\n            \"f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6\"\n          ],\n          [\n            \"766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a\",\n            \"744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996\"\n          ],\n          [\n            \"59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e\",\n            \"c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e\"\n          ],\n          [\n            \"f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8\",\n            \"e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d\"\n          ],\n          [\n            \"7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c\",\n            \"30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2\"\n          ],\n          [\n            \"948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519\",\n            \"e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e\"\n          ],\n          [\n            \"7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab\",\n            \"100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437\"\n          ],\n          [\n            \"3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca\",\n            \"ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311\"\n          ],\n          [\n            \"d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf\",\n            \"8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4\"\n          ],\n          [\n            \"1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610\",\n            \"68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575\"\n          ],\n          [\n            \"733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4\",\n            \"f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d\"\n          ],\n          [\n            \"15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c\",\n            \"d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d\"\n          ],\n          [\n            \"a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940\",\n            \"edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629\"\n          ],\n          [\n            \"e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980\",\n            \"a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06\"\n          ],\n          [\n            \"311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3\",\n            \"66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374\"\n          ],\n          [\n            \"34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf\",\n            \"9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee\"\n          ],\n          [\n            \"f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63\",\n            \"4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1\"\n          ],\n          [\n            \"d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448\",\n            \"fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b\"\n          ],\n          [\n            \"32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf\",\n            \"5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661\"\n          ],\n          [\n            \"7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5\",\n            \"8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6\"\n          ],\n          [\n            \"ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6\",\n            \"8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e\"\n          ],\n          [\n            \"16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5\",\n            \"5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d\"\n          ],\n          [\n            \"eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99\",\n            \"f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc\"\n          ],\n          [\n            \"78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51\",\n            \"f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4\"\n          ],\n          [\n            \"494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5\",\n            \"42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c\"\n          ],\n          [\n            \"a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5\",\n            \"204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b\"\n          ],\n          [\n            \"c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997\",\n            \"4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913\"\n          ],\n          [\n            \"841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881\",\n            \"73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154\"\n          ],\n          [\n            \"5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5\",\n            \"39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865\"\n          ],\n          [\n            \"36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66\",\n            \"d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc\"\n          ],\n          [\n            \"336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726\",\n            \"ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224\"\n          ],\n          [\n            \"8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede\",\n            \"6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e\"\n          ],\n          [\n            \"1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94\",\n            \"60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6\"\n          ],\n          [\n            \"85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31\",\n            \"3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511\"\n          ],\n          [\n            \"29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51\",\n            \"b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b\"\n          ],\n          [\n            \"a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252\",\n            \"ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2\"\n          ],\n          [\n            \"4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5\",\n            \"cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c\"\n          ],\n          [\n            \"d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b\",\n            \"6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3\"\n          ],\n          [\n            \"ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4\",\n            \"322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d\"\n          ],\n          [\n            \"af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f\",\n            \"6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700\"\n          ],\n          [\n            \"e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889\",\n            \"2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4\"\n          ],\n          [\n            \"591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246\",\n            \"b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196\"\n          ],\n          [\n            \"11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984\",\n            \"998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4\"\n          ],\n          [\n            \"3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a\",\n            \"b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257\"\n          ],\n          [\n            \"cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030\",\n            \"bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13\"\n          ],\n          [\n            \"c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197\",\n            \"6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096\"\n          ],\n          [\n            \"c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593\",\n            \"c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38\"\n          ],\n          [\n            \"a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef\",\n            \"21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f\"\n          ],\n          [\n            \"347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38\",\n            \"60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448\"\n          ],\n          [\n            \"da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a\",\n            \"49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a\"\n          ],\n          [\n            \"c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111\",\n            \"5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4\"\n          ],\n          [\n            \"4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502\",\n            \"7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437\"\n          ],\n          [\n            \"3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea\",\n            \"be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7\"\n          ],\n          [\n            \"cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26\",\n            \"8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d\"\n          ],\n          [\n            \"b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986\",\n            \"39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a\"\n          ],\n          [\n            \"d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e\",\n            \"62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54\"\n          ],\n          [\n            \"48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4\",\n            \"25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77\"\n          ],\n          [\n            \"dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda\",\n            \"ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517\"\n          ],\n          [\n            \"6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859\",\n            \"cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10\"\n          ],\n          [\n            \"e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f\",\n            \"f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125\"\n          ],\n          [\n            \"eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c\",\n            \"6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e\"\n          ],\n          [\n            \"13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942\",\n            \"fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1\"\n          ],\n          [\n            \"ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a\",\n            \"1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2\"\n          ],\n          [\n            \"b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80\",\n            \"5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423\"\n          ],\n          [\n            \"ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d\",\n            \"438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8\"\n          ],\n          [\n            \"8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1\",\n            \"cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758\"\n          ],\n          [\n            \"52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63\",\n            \"c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375\"\n          ],\n          [\n            \"e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352\",\n            \"6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d\"\n          ],\n          [\n            \"7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193\",\n            \"ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec\"\n          ],\n          [\n            \"5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00\",\n            \"9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0\"\n          ],\n          [\n            \"32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58\",\n            \"ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c\"\n          ],\n          [\n            \"e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7\",\n            \"d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4\"\n          ],\n          [\n            \"8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8\",\n            \"c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f\"\n          ],\n          [\n            \"4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e\",\n            \"67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649\"\n          ],\n          [\n            \"3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d\",\n            \"cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826\"\n          ],\n          [\n            \"674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b\",\n            \"299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5\"\n          ],\n          [\n            \"d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f\",\n            \"f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87\"\n          ],\n          [\n            \"30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6\",\n            \"462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b\"\n          ],\n          [\n            \"be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297\",\n            \"62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc\"\n          ],\n          [\n            \"93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a\",\n            \"7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c\"\n          ],\n          [\n            \"b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c\",\n            \"ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f\"\n          ],\n          [\n            \"d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52\",\n            \"4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a\"\n          ],\n          [\n            \"d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb\",\n            \"bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46\"\n          ],\n          [\n            \"463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065\",\n            \"bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f\"\n          ],\n          [\n            \"7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917\",\n            \"603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03\"\n          ],\n          [\n            \"74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9\",\n            \"cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08\"\n          ],\n          [\n            \"30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3\",\n            \"553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8\"\n          ],\n          [\n            \"9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57\",\n            \"712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373\"\n          ],\n          [\n            \"176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66\",\n            \"ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3\"\n          ],\n          [\n            \"75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8\",\n            \"9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8\"\n          ],\n          [\n            \"809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721\",\n            \"9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1\"\n          ],\n          [\n            \"1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180\",\n            \"4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9\"\n          ]\n        ]\n      }\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curves.js\nvar require_curves = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curves.js\"(exports2) {\n    \"use strict\";\n    var curves = exports2;\n    var hash = require_hash();\n    var curve = require_curve();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function PresetCurve(options) {\n      if (options.type === \"short\")\n        this.curve = new curve.short(options);\n      else if (options.type === \"edwards\")\n        this.curve = new curve.edwards(options);\n      else\n        this.curve = new curve.mont(options);\n      this.g = this.curve.g;\n      this.n = this.curve.n;\n      this.hash = options.hash;\n      assert(this.g.validate(), \"Invalid curve\");\n      assert(this.g.mul(this.n).isInfinity(), \"Invalid curve, G*N != O\");\n    }\n    curves.PresetCurve = PresetCurve;\n    function defineCurve(name2, options) {\n      Object.defineProperty(curves, name2, {\n        configurable: true,\n        enumerable: true,\n        get: function() {\n          var curve2 = new PresetCurve(options);\n          Object.defineProperty(curves, name2, {\n            configurable: true,\n            enumerable: true,\n            value: curve2\n          });\n          return curve2;\n        }\n      });\n    }\n    defineCurve(\"p192\", {\n      type: \"short\",\n      prime: \"p192\",\n      p: \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\",\n      a: \"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc\",\n      b: \"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1\",\n      n: \"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012\",\n        \"07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811\"\n      ]\n    });\n    defineCurve(\"p224\", {\n      type: \"short\",\n      prime: \"p224\",\n      p: \"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\",\n      a: \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe\",\n      b: \"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4\",\n      n: \"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21\",\n        \"bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34\"\n      ]\n    });\n    defineCurve(\"p256\", {\n      type: \"short\",\n      prime: null,\n      p: \"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff\",\n      a: \"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc\",\n      b: \"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b\",\n      n: \"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296\",\n        \"4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5\"\n      ]\n    });\n    defineCurve(\"p384\", {\n      type: \"short\",\n      prime: null,\n      p: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff\",\n      a: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc\",\n      b: \"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef\",\n      n: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973\",\n      hash: hash.sha384,\n      gRed: false,\n      g: [\n        \"aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7\",\n        \"3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f\"\n      ]\n    });\n    defineCurve(\"p521\", {\n      type: \"short\",\n      prime: null,\n      p: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff\",\n      a: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc\",\n      b: \"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00\",\n      n: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409\",\n      hash: hash.sha512,\n      gRed: false,\n      g: [\n        \"000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66\",\n        \"00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650\"\n      ]\n    });\n    defineCurve(\"curve25519\", {\n      type: \"mont\",\n      prime: \"p25519\",\n      p: \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",\n      a: \"76d06\",\n      b: \"1\",\n      n: \"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"9\"\n      ]\n    });\n    defineCurve(\"ed25519\", {\n      type: \"edwards\",\n      prime: \"p25519\",\n      p: \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",\n      a: \"-1\",\n      c: \"1\",\n      // -121665 * (121666^(-1)) (mod P)\n      d: \"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3\",\n      n: \"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a\",\n        // 4/5\n        \"6666666666666666666666666666666666666666666666666666666666666658\"\n      ]\n    });\n    var pre;\n    try {\n      pre = require_secp256k1();\n    } catch (e) {\n      pre = void 0;\n    }\n    defineCurve(\"secp256k1\", {\n      type: \"short\",\n      prime: \"k256\",\n      p: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\",\n      a: \"0\",\n      b: \"7\",\n      n: \"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141\",\n      h: \"1\",\n      hash: hash.sha256,\n      // Precomputed endomorphism\n      beta: \"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee\",\n      lambda: \"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72\",\n      basis: [\n        {\n          a: \"3086d221a7d46bcde86c90e49284eb15\",\n          b: \"-e4437ed6010e88286f547fa90abfe4c3\"\n        },\n        {\n          a: \"114ca50f7a8e2f3f657c1108d9d44cfd8\",\n          b: \"3086d221a7d46bcde86c90e49284eb15\"\n        }\n      ],\n      gRed: false,\n      g: [\n        \"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\n        \"483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        pre\n      ]\n    });\n  }\n});\n\n// node_modules/hmac-drbg/lib/hmac-drbg.js\nvar require_hmac_drbg = __commonJS({\n  \"node_modules/hmac-drbg/lib/hmac-drbg.js\"(exports2, module2) {\n    \"use strict\";\n    var hash = require_hash();\n    var utils = require_utils();\n    var assert = require_minimalistic_assert();\n    function HmacDRBG(options) {\n      if (!(this instanceof HmacDRBG))\n        return new HmacDRBG(options);\n      this.hash = options.hash;\n      this.predResist = !!options.predResist;\n      this.outLen = this.hash.outSize;\n      this.minEntropy = options.minEntropy || this.hash.hmacStrength;\n      this._reseed = null;\n      this.reseedInterval = null;\n      this.K = null;\n      this.V = null;\n      var entropy = utils.toArray(options.entropy, options.entropyEnc || \"hex\");\n      var nonce = utils.toArray(options.nonce, options.nonceEnc || \"hex\");\n      var pers = utils.toArray(options.pers, options.persEnc || \"hex\");\n      assert(\n        entropy.length >= this.minEntropy / 8,\n        \"Not enough entropy. Minimum is: \" + this.minEntropy + \" bits\"\n      );\n      this._init(entropy, nonce, pers);\n    }\n    module2.exports = HmacDRBG;\n    HmacDRBG.prototype._init = function init(entropy, nonce, pers) {\n      var seed = entropy.concat(nonce).concat(pers);\n      this.K = new Array(this.outLen / 8);\n      this.V = new Array(this.outLen / 8);\n      for (var i = 0; i < this.V.length; i++) {\n        this.K[i] = 0;\n        this.V[i] = 1;\n      }\n      this._update(seed);\n      this._reseed = 1;\n      this.reseedInterval = 281474976710656;\n    };\n    HmacDRBG.prototype._hmac = function hmac() {\n      return new hash.hmac(this.hash, this.K);\n    };\n    HmacDRBG.prototype._update = function update(seed) {\n      var kmac = this._hmac().update(this.V).update([0]);\n      if (seed)\n        kmac = kmac.update(seed);\n      this.K = kmac.digest();\n      this.V = this._hmac().update(this.V).digest();\n      if (!seed)\n        return;\n      this.K = this._hmac().update(this.V).update([1]).update(seed).digest();\n      this.V = this._hmac().update(this.V).digest();\n    };\n    HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {\n      if (typeof entropyEnc !== \"string\") {\n        addEnc = add;\n        add = entropyEnc;\n        entropyEnc = null;\n      }\n      entropy = utils.toArray(entropy, entropyEnc);\n      add = utils.toArray(add, addEnc);\n      assert(\n        entropy.length >= this.minEntropy / 8,\n        \"Not enough entropy. Minimum is: \" + this.minEntropy + \" bits\"\n      );\n      this._update(entropy.concat(add || []));\n      this._reseed = 1;\n    };\n    HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {\n      if (this._reseed > this.reseedInterval)\n        throw new Error(\"Reseed is required\");\n      if (typeof enc !== \"string\") {\n        addEnc = add;\n        add = enc;\n        enc = null;\n      }\n      if (add) {\n        add = utils.toArray(add, addEnc || \"hex\");\n        this._update(add);\n      }\n      var temp = [];\n      while (temp.length < len) {\n        this.V = this._hmac().update(this.V).digest();\n        temp = temp.concat(this.V);\n      }\n      var res = temp.slice(0, len);\n      this._update(add);\n      this._reseed++;\n      return utils.encode(res, enc);\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/key.js\nvar require_key = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/key.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function KeyPair(ec, options) {\n      this.ec = ec;\n      this.priv = null;\n      this.pub = null;\n      if (options.priv)\n        this._importPrivate(options.priv, options.privEnc);\n      if (options.pub)\n        this._importPublic(options.pub, options.pubEnc);\n    }\n    module2.exports = KeyPair;\n    KeyPair.fromPublic = function fromPublic(ec, pub, enc) {\n      if (pub instanceof KeyPair)\n        return pub;\n      return new KeyPair(ec, {\n        pub,\n        pubEnc: enc\n      });\n    };\n    KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {\n      if (priv instanceof KeyPair)\n        return priv;\n      return new KeyPair(ec, {\n        priv,\n        privEnc: enc\n      });\n    };\n    KeyPair.prototype.validate = function validate() {\n      var pub = this.getPublic();\n      if (pub.isInfinity())\n        return { result: false, reason: \"Invalid public key\" };\n      if (!pub.validate())\n        return { result: false, reason: \"Public key is not a point\" };\n      if (!pub.mul(this.ec.curve.n).isInfinity())\n        return { result: false, reason: \"Public key * N != O\" };\n      return { result: true, reason: null };\n    };\n    KeyPair.prototype.getPublic = function getPublic(compact, enc) {\n      if (typeof compact === \"string\") {\n        enc = compact;\n        compact = null;\n      }\n      if (!this.pub)\n        this.pub = this.ec.g.mul(this.priv);\n      if (!enc)\n        return this.pub;\n      return this.pub.encode(enc, compact);\n    };\n    KeyPair.prototype.getPrivate = function getPrivate(enc) {\n      if (enc === \"hex\")\n        return this.priv.toString(16, 2);\n      else\n        return this.priv;\n    };\n    KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {\n      this.priv = new BN(key, enc || 16);\n      this.priv = this.priv.umod(this.ec.curve.n);\n    };\n    KeyPair.prototype._importPublic = function _importPublic(key, enc) {\n      if (key.x || key.y) {\n        if (this.ec.curve.type === \"mont\") {\n          assert(key.x, \"Need x coordinate\");\n        } else if (this.ec.curve.type === \"short\" || this.ec.curve.type === \"edwards\") {\n          assert(key.x && key.y, \"Need both x and y coordinate\");\n        }\n        this.pub = this.ec.curve.point(key.x, key.y);\n        return;\n      }\n      this.pub = this.ec.curve.decodePoint(key, enc);\n    };\n    KeyPair.prototype.derive = function derive(pub) {\n      if (!pub.validate()) {\n        assert(pub.validate(), \"public point not validated\");\n      }\n      return pub.mul(this.priv).getX();\n    };\n    KeyPair.prototype.sign = function sign(msg, enc, options) {\n      return this.ec.sign(msg, this, enc, options);\n    };\n    KeyPair.prototype.verify = function verify(msg, signature) {\n      return this.ec.verify(msg, signature, this);\n    };\n    KeyPair.prototype.inspect = function inspect() {\n      return \"<Key priv: \" + (this.priv && this.priv.toString(16, 2)) + \" pub: \" + (this.pub && this.pub.inspect()) + \" >\";\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/signature.js\nvar require_signature = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/signature.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function Signature(options, enc) {\n      if (options instanceof Signature)\n        return options;\n      if (this._importDER(options, enc))\n        return;\n      assert(options.r && options.s, \"Signature without r or s\");\n      this.r = new BN(options.r, 16);\n      this.s = new BN(options.s, 16);\n      if (options.recoveryParam === void 0)\n        this.recoveryParam = null;\n      else\n        this.recoveryParam = options.recoveryParam;\n    }\n    module2.exports = Signature;\n    function Position() {\n      this.place = 0;\n    }\n    function getLength(buf, p) {\n      var initial = buf[p.place++];\n      if (!(initial & 128)) {\n        return initial;\n      }\n      var octetLen = initial & 15;\n      if (octetLen === 0 || octetLen > 4) {\n        return false;\n      }\n      var val = 0;\n      for (var i = 0, off = p.place; i < octetLen; i++, off++) {\n        val <<= 8;\n        val |= buf[off];\n        val >>>= 0;\n      }\n      if (val <= 127) {\n        return false;\n      }\n      p.place = off;\n      return val;\n    }\n    function rmPadding(buf) {\n      var i = 0;\n      var len = buf.length - 1;\n      while (!buf[i] && !(buf[i + 1] & 128) && i < len) {\n        i++;\n      }\n      if (i === 0) {\n        return buf;\n      }\n      return buf.slice(i);\n    }\n    Signature.prototype._importDER = function _importDER(data, enc) {\n      data = utils.toArray(data, enc);\n      var p = new Position();\n      if (data[p.place++] !== 48) {\n        return false;\n      }\n      var len = getLength(data, p);\n      if (len === false) {\n        return false;\n      }\n      if (len + p.place !== data.length) {\n        return false;\n      }\n      if (data[p.place++] !== 2) {\n        return false;\n      }\n      var rlen = getLength(data, p);\n      if (rlen === false) {\n        return false;\n      }\n      var r = data.slice(p.place, rlen + p.place);\n      p.place += rlen;\n      if (data[p.place++] !== 2) {\n        return false;\n      }\n      var slen = getLength(data, p);\n      if (slen === false) {\n        return false;\n      }\n      if (data.length !== slen + p.place) {\n        return false;\n      }\n      var s = data.slice(p.place, slen + p.place);\n      if (r[0] === 0) {\n        if (r[1] & 128) {\n          r = r.slice(1);\n        } else {\n          return false;\n        }\n      }\n      if (s[0] === 0) {\n        if (s[1] & 128) {\n          s = s.slice(1);\n        } else {\n          return false;\n        }\n      }\n      this.r = new BN(r);\n      this.s = new BN(s);\n      this.recoveryParam = null;\n      return true;\n    };\n    function constructLength(arr, len) {\n      if (len < 128) {\n        arr.push(len);\n        return;\n      }\n      var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);\n      arr.push(octets | 128);\n      while (--octets) {\n        arr.push(len >>> (octets << 3) & 255);\n      }\n      arr.push(len);\n    }\n    Signature.prototype.toDER = function toDER(enc) {\n      var r = this.r.toArray();\n      var s = this.s.toArray();\n      if (r[0] & 128)\n        r = [0].concat(r);\n      if (s[0] & 128)\n        s = [0].concat(s);\n      r = rmPadding(r);\n      s = rmPadding(s);\n      while (!s[0] && !(s[1] & 128)) {\n        s = s.slice(1);\n      }\n      var arr = [2];\n      constructLength(arr, r.length);\n      arr = arr.concat(r);\n      arr.push(2);\n      constructLength(arr, s.length);\n      var backHalf = arr.concat(s);\n      var res = [48];\n      constructLength(res, backHalf.length);\n      res = res.concat(backHalf);\n      return utils.encode(res, enc);\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/index.js\nvar require_ec = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/index.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var HmacDRBG = require_hmac_drbg();\n    var utils = require_utils2();\n    var curves = require_curves();\n    var rand = require_brorand();\n    var assert = utils.assert;\n    var KeyPair = require_key();\n    var Signature = require_signature();\n    function EC(options) {\n      if (!(this instanceof EC))\n        return new EC(options);\n      if (typeof options === \"string\") {\n        assert(\n          Object.prototype.hasOwnProperty.call(curves, options),\n          \"Unknown curve \" + options\n        );\n        options = curves[options];\n      }\n      if (options instanceof curves.PresetCurve)\n        options = { curve: options };\n      this.curve = options.curve.curve;\n      this.n = this.curve.n;\n      this.nh = this.n.ushrn(1);\n      this.g = this.curve.g;\n      this.g = options.curve.g;\n      this.g.precompute(options.curve.n.bitLength() + 1);\n      this.hash = options.hash || options.curve.hash;\n    }\n    module2.exports = EC;\n    EC.prototype.keyPair = function keyPair(options) {\n      return new KeyPair(this, options);\n    };\n    EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {\n      return KeyPair.fromPrivate(this, priv, enc);\n    };\n    EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {\n      return KeyPair.fromPublic(this, pub, enc);\n    };\n    EC.prototype.genKeyPair = function genKeyPair(options) {\n      if (!options)\n        options = {};\n      var drbg = new HmacDRBG({\n        hash: this.hash,\n        pers: options.pers,\n        persEnc: options.persEnc || \"utf8\",\n        entropy: options.entropy || rand(this.hash.hmacStrength),\n        entropyEnc: options.entropy && options.entropyEnc || \"utf8\",\n        nonce: this.n.toArray()\n      });\n      var bytes = this.n.byteLength();\n      var ns2 = this.n.sub(new BN(2));\n      for (; ; ) {\n        var priv = new BN(drbg.generate(bytes));\n        if (priv.cmp(ns2) > 0)\n          continue;\n        priv.iaddn(1);\n        return this.keyFromPrivate(priv);\n      }\n    };\n    EC.prototype._truncateToN = function _truncateToN(msg, truncOnly) {\n      var delta = msg.byteLength() * 8 - this.n.bitLength();\n      if (delta > 0)\n        msg = msg.ushrn(delta);\n      if (!truncOnly && msg.cmp(this.n) >= 0)\n        return msg.sub(this.n);\n      else\n        return msg;\n    };\n    EC.prototype.sign = function sign(msg, key, enc, options) {\n      if (typeof enc === \"object\") {\n        options = enc;\n        enc = null;\n      }\n      if (!options)\n        options = {};\n      key = this.keyFromPrivate(key, enc);\n      msg = this._truncateToN(new BN(msg, 16));\n      var bytes = this.n.byteLength();\n      var bkey = key.getPrivate().toArray(\"be\", bytes);\n      var nonce = msg.toArray(\"be\", bytes);\n      var drbg = new HmacDRBG({\n        hash: this.hash,\n        entropy: bkey,\n        nonce,\n        pers: options.pers,\n        persEnc: options.persEnc || \"utf8\"\n      });\n      var ns1 = this.n.sub(new BN(1));\n      for (var iter = 0; ; iter++) {\n        var k = options.k ? options.k(iter) : new BN(drbg.generate(this.n.byteLength()));\n        k = this._truncateToN(k, true);\n        if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)\n          continue;\n        var kp = this.g.mul(k);\n        if (kp.isInfinity())\n          continue;\n        var kpX = kp.getX();\n        var r = kpX.umod(this.n);\n        if (r.cmpn(0) === 0)\n          continue;\n        var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));\n        s = s.umod(this.n);\n        if (s.cmpn(0) === 0)\n          continue;\n        var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);\n        if (options.canonical && s.cmp(this.nh) > 0) {\n          s = this.n.sub(s);\n          recoveryParam ^= 1;\n        }\n        return new Signature({ r, s, recoveryParam });\n      }\n    };\n    EC.prototype.verify = function verify(msg, signature, key, enc) {\n      msg = this._truncateToN(new BN(msg, 16));\n      key = this.keyFromPublic(key, enc);\n      signature = new Signature(signature, \"hex\");\n      var r = signature.r;\n      var s = signature.s;\n      if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)\n        return false;\n      if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)\n        return false;\n      var sinv = s.invm(this.n);\n      var u1 = sinv.mul(msg).umod(this.n);\n      var u2 = sinv.mul(r).umod(this.n);\n      var p;\n      if (!this.curve._maxwellTrick) {\n        p = this.g.mulAdd(u1, key.getPublic(), u2);\n        if (p.isInfinity())\n          return false;\n        return p.getX().umod(this.n).cmp(r) === 0;\n      }\n      p = this.g.jmulAdd(u1, key.getPublic(), u2);\n      if (p.isInfinity())\n        return false;\n      return p.eqXToP(r);\n    };\n    EC.prototype.recoverPubKey = function(msg, signature, j, enc) {\n      assert((3 & j) === j, \"The recovery param is more than two bits\");\n      signature = new Signature(signature, enc);\n      var n = this.n;\n      var e = new BN(msg);\n      var r = signature.r;\n      var s = signature.s;\n      var isYOdd = j & 1;\n      var isSecondKey = j >> 1;\n      if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)\n        throw new Error(\"Unable to find sencond key candinate\");\n      if (isSecondKey)\n        r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);\n      else\n        r = this.curve.pointFromX(r, isYOdd);\n      var rInv = signature.r.invm(n);\n      var s1 = n.sub(e).mul(rInv).umod(n);\n      var s2 = s.mul(rInv).umod(n);\n      return this.g.mulAdd(s1, r, s2);\n    };\n    EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {\n      signature = new Signature(signature, enc);\n      if (signature.recoveryParam !== null)\n        return signature.recoveryParam;\n      for (var i = 0; i < 4; i++) {\n        var Qprime;\n        try {\n          Qprime = this.recoverPubKey(e, signature, i);\n        } catch (e2) {\n          continue;\n        }\n        if (Qprime.eq(Q))\n          return i;\n      }\n      throw new Error(\"Unable to find valid recovery factor\");\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/key.js\nvar require_key2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/key.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var parseBytes = utils.parseBytes;\n    var cachedProperty = utils.cachedProperty;\n    function KeyPair(eddsa, params) {\n      this.eddsa = eddsa;\n      this._secret = parseBytes(params.secret);\n      if (eddsa.isPoint(params.pub))\n        this._pub = params.pub;\n      else\n        this._pubBytes = parseBytes(params.pub);\n    }\n    KeyPair.fromPublic = function fromPublic(eddsa, pub) {\n      if (pub instanceof KeyPair)\n        return pub;\n      return new KeyPair(eddsa, { pub });\n    };\n    KeyPair.fromSecret = function fromSecret(eddsa, secret) {\n      if (secret instanceof KeyPair)\n        return secret;\n      return new KeyPair(eddsa, { secret });\n    };\n    KeyPair.prototype.secret = function secret() {\n      return this._secret;\n    };\n    cachedProperty(KeyPair, \"pubBytes\", function pubBytes() {\n      return this.eddsa.encodePoint(this.pub());\n    });\n    cachedProperty(KeyPair, \"pub\", function pub() {\n      if (this._pubBytes)\n        return this.eddsa.decodePoint(this._pubBytes);\n      return this.eddsa.g.mul(this.priv());\n    });\n    cachedProperty(KeyPair, \"privBytes\", function privBytes() {\n      var eddsa = this.eddsa;\n      var hash = this.hash();\n      var lastIx = eddsa.encodingLength - 1;\n      var a = hash.slice(0, eddsa.encodingLength);\n      a[0] &= 248;\n      a[lastIx] &= 127;\n      a[lastIx] |= 64;\n      return a;\n    });\n    cachedProperty(KeyPair, \"priv\", function priv() {\n      return this.eddsa.decodeInt(this.privBytes());\n    });\n    cachedProperty(KeyPair, \"hash\", function hash() {\n      return this.eddsa.hash().update(this.secret()).digest();\n    });\n    cachedProperty(KeyPair, \"messagePrefix\", function messagePrefix() {\n      return this.hash().slice(this.eddsa.encodingLength);\n    });\n    KeyPair.prototype.sign = function sign(message) {\n      assert(this._secret, \"KeyPair can only verify\");\n      return this.eddsa.sign(message, this);\n    };\n    KeyPair.prototype.verify = function verify(message, sig) {\n      return this.eddsa.verify(message, sig, this);\n    };\n    KeyPair.prototype.getSecret = function getSecret(enc) {\n      assert(this._secret, \"KeyPair is public only\");\n      return utils.encode(this.secret(), enc);\n    };\n    KeyPair.prototype.getPublic = function getPublic(enc) {\n      return utils.encode(this.pubBytes(), enc);\n    };\n    module2.exports = KeyPair;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/signature.js\nvar require_signature2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/signature.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var cachedProperty = utils.cachedProperty;\n    var parseBytes = utils.parseBytes;\n    function Signature(eddsa, sig) {\n      this.eddsa = eddsa;\n      if (typeof sig !== \"object\")\n        sig = parseBytes(sig);\n      if (Array.isArray(sig)) {\n        sig = {\n          R: sig.slice(0, eddsa.encodingLength),\n          S: sig.slice(eddsa.encodingLength)\n        };\n      }\n      assert(sig.R && sig.S, \"Signature without R or S\");\n      if (eddsa.isPoint(sig.R))\n        this._R = sig.R;\n      if (sig.S instanceof BN)\n        this._S = sig.S;\n      this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;\n      this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;\n    }\n    cachedProperty(Signature, \"S\", function S() {\n      return this.eddsa.decodeInt(this.Sencoded());\n    });\n    cachedProperty(Signature, \"R\", function R() {\n      return this.eddsa.decodePoint(this.Rencoded());\n    });\n    cachedProperty(Signature, \"Rencoded\", function Rencoded() {\n      return this.eddsa.encodePoint(this.R());\n    });\n    cachedProperty(Signature, \"Sencoded\", function Sencoded() {\n      return this.eddsa.encodeInt(this.S());\n    });\n    Signature.prototype.toBytes = function toBytes() {\n      return this.Rencoded().concat(this.Sencoded());\n    };\n    Signature.prototype.toHex = function toHex() {\n      return utils.encode(this.toBytes(), \"hex\").toUpperCase();\n    };\n    module2.exports = Signature;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/index.js\nvar require_eddsa = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/index.js\"(exports2, module2) {\n    \"use strict\";\n    var hash = require_hash();\n    var curves = require_curves();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var parseBytes = utils.parseBytes;\n    var KeyPair = require_key2();\n    var Signature = require_signature2();\n    function EDDSA(curve) {\n      assert(curve === \"ed25519\", \"only tested with ed25519 so far\");\n      if (!(this instanceof EDDSA))\n        return new EDDSA(curve);\n      curve = curves[curve].curve;\n      this.curve = curve;\n      this.g = curve.g;\n      this.g.precompute(curve.n.bitLength() + 1);\n      this.pointClass = curve.point().constructor;\n      this.encodingLength = Math.ceil(curve.n.bitLength() / 8);\n      this.hash = hash.sha512;\n    }\n    module2.exports = EDDSA;\n    EDDSA.prototype.sign = function sign(message, secret) {\n      message = parseBytes(message);\n      var key = this.keyFromSecret(secret);\n      var r = this.hashInt(key.messagePrefix(), message);\n      var R = this.g.mul(r);\n      var Rencoded = this.encodePoint(R);\n      var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());\n      var S = r.add(s_).umod(this.curve.n);\n      return this.makeSignature({ R, S, Rencoded });\n    };\n    EDDSA.prototype.verify = function verify(message, sig, pub) {\n      message = parseBytes(message);\n      sig = this.makeSignature(sig);\n      var key = this.keyFromPublic(pub);\n      var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);\n      var SG = this.g.mul(sig.S());\n      var RplusAh = sig.R().add(key.pub().mul(h));\n      return RplusAh.eq(SG);\n    };\n    EDDSA.prototype.hashInt = function hashInt() {\n      var hash2 = this.hash();\n      for (var i = 0; i < arguments.length; i++)\n        hash2.update(arguments[i]);\n      return utils.intFromLE(hash2.digest()).umod(this.curve.n);\n    };\n    EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {\n      return KeyPair.fromPublic(this, pub);\n    };\n    EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {\n      return KeyPair.fromSecret(this, secret);\n    };\n    EDDSA.prototype.makeSignature = function makeSignature(sig) {\n      if (sig instanceof Signature)\n        return sig;\n      return new Signature(this, sig);\n    };\n    EDDSA.prototype.encodePoint = function encodePoint(point) {\n      var enc = point.getY().toArray(\"le\", this.encodingLength);\n      enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;\n      return enc;\n    };\n    EDDSA.prototype.decodePoint = function decodePoint(bytes) {\n      bytes = utils.parseBytes(bytes);\n      var lastIx = bytes.length - 1;\n      var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);\n      var xIsOdd = (bytes[lastIx] & 128) !== 0;\n      var y = utils.intFromLE(normed);\n      return this.curve.pointFromY(y, xIsOdd);\n    };\n    EDDSA.prototype.encodeInt = function encodeInt(num) {\n      return num.toArray(\"le\", this.encodingLength);\n    };\n    EDDSA.prototype.decodeInt = function decodeInt(bytes) {\n      return utils.intFromLE(bytes);\n    };\n    EDDSA.prototype.isPoint = function isPoint(val) {\n      return val instanceof this.pointClass;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic.js\nvar require_elliptic = __commonJS({\n  \"node_modules/elliptic/lib/elliptic.js\"(exports2) {\n    \"use strict\";\n    var elliptic = exports2;\n    elliptic.version = require_package().version;\n    elliptic.utils = require_utils2();\n    elliptic.rand = require_brorand();\n    elliptic.curve = require_curve();\n    elliptic.curves = require_curves();\n    elliptic.ec = require_ec();\n    elliptic.eddsa = require_eddsa();\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/elliptic.js\nvar require_elliptic2 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/elliptic.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EC = void 0;\n    var elliptic_1 = __importDefault(require_elliptic());\n    var EC = elliptic_1.default.ec;\n    exports2.EC = EC;\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/_version.js\nvar require_version12 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"signing-key/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/index.js\nvar require_lib14 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.computePublicKey = exports2.recoverPublicKey = exports2.SigningKey = void 0;\n    var elliptic_1 = require_elliptic2();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version12();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _curve = null;\n    function getCurve() {\n      if (!_curve) {\n        _curve = new elliptic_1.EC(\"secp256k1\");\n      }\n      return _curve;\n    }\n    var SigningKey = (\n      /** @class */\n      function() {\n        function SigningKey2(privateKey) {\n          (0, properties_1.defineReadOnly)(this, \"curve\", \"secp256k1\");\n          (0, properties_1.defineReadOnly)(this, \"privateKey\", (0, bytes_1.hexlify)(privateKey));\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          (0, properties_1.defineReadOnly)(this, \"publicKey\", \"0x\" + keyPair.getPublic(false, \"hex\"));\n          (0, properties_1.defineReadOnly)(this, \"compressedPublicKey\", \"0x\" + keyPair.getPublic(true, \"hex\"));\n          (0, properties_1.defineReadOnly)(this, \"_isSigningKey\", true);\n        }\n        SigningKey2.prototype._addPoint = function(other) {\n          var p0 = getCurve().keyFromPublic((0, bytes_1.arrayify)(this.publicKey));\n          var p1 = getCurve().keyFromPublic((0, bytes_1.arrayify)(other));\n          return \"0x\" + p0.pub.add(p1.pub).encodeCompressed(\"hex\");\n        };\n        SigningKey2.prototype.signDigest = function(digest) {\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          var digestBytes = (0, bytes_1.arrayify)(digest);\n          if (digestBytes.length !== 32) {\n            logger.throwArgumentError(\"bad digest length\", \"digest\", digest);\n          }\n          var signature = keyPair.sign(digestBytes, { canonical: true });\n          return (0, bytes_1.splitSignature)({\n            recoveryParam: signature.recoveryParam,\n            r: (0, bytes_1.hexZeroPad)(\"0x\" + signature.r.toString(16), 32),\n            s: (0, bytes_1.hexZeroPad)(\"0x\" + signature.s.toString(16), 32)\n          });\n        };\n        SigningKey2.prototype.computeSharedSecret = function(otherKey) {\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          var otherKeyPair = getCurve().keyFromPublic((0, bytes_1.arrayify)(computePublicKey(otherKey)));\n          return (0, bytes_1.hexZeroPad)(\"0x\" + keyPair.derive(otherKeyPair.getPublic()).toString(16), 32);\n        };\n        SigningKey2.isSigningKey = function(value) {\n          return !!(value && value._isSigningKey);\n        };\n        return SigningKey2;\n      }()\n    );\n    exports2.SigningKey = SigningKey;\n    function recoverPublicKey(digest, signature) {\n      var sig = (0, bytes_1.splitSignature)(signature);\n      var rs = { r: (0, bytes_1.arrayify)(sig.r), s: (0, bytes_1.arrayify)(sig.s) };\n      return \"0x\" + getCurve().recoverPubKey((0, bytes_1.arrayify)(digest), rs, sig.recoveryParam).encode(\"hex\", false);\n    }\n    exports2.recoverPublicKey = recoverPublicKey;\n    function computePublicKey(key, compressed) {\n      var bytes = (0, bytes_1.arrayify)(key);\n      if (bytes.length === 32) {\n        var signingKey = new SigningKey(bytes);\n        if (compressed) {\n          return \"0x\" + getCurve().keyFromPrivate(bytes).getPublic(true, \"hex\");\n        }\n        return signingKey.publicKey;\n      } else if (bytes.length === 33) {\n        if (compressed) {\n          return (0, bytes_1.hexlify)(bytes);\n        }\n        return \"0x\" + getCurve().keyFromPublic(bytes).getPublic(false, \"hex\");\n      } else if (bytes.length === 65) {\n        if (!compressed) {\n          return (0, bytes_1.hexlify)(bytes);\n        }\n        return \"0x\" + getCurve().keyFromPublic(bytes).getPublic(true, \"hex\");\n      }\n      return logger.throwArgumentError(\"invalid public or private key\", \"key\", \"[REDACTED]\");\n    }\n    exports2.computePublicKey = computePublicKey;\n  }\n});\n\n// node_modules/@ethersproject/transactions/lib/_version.js\nvar require_version13 = __commonJS({\n  \"node_modules/@ethersproject/transactions/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"transactions/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/transactions/lib/index.js\nvar require_lib15 = __commonJS({\n  \"node_modules/@ethersproject/transactions/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n      }\n      __setModuleDefault(result, mod);\n      return result;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parse = exports2.serialize = exports2.accessListify = exports2.recoverAddress = exports2.computeAddress = exports2.TransactionTypes = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var RLP = __importStar(require_lib6());\n    var signing_key_1 = require_lib14();\n    var logger_1 = require_lib();\n    var _version_1 = require_version13();\n    var logger = new logger_1.Logger(_version_1.version);\n    var TransactionTypes;\n    (function(TransactionTypes2) {\n      TransactionTypes2[TransactionTypes2[\"legacy\"] = 0] = \"legacy\";\n      TransactionTypes2[TransactionTypes2[\"eip2930\"] = 1] = \"eip2930\";\n      TransactionTypes2[TransactionTypes2[\"eip1559\"] = 2] = \"eip1559\";\n    })(TransactionTypes = exports2.TransactionTypes || (exports2.TransactionTypes = {}));\n    function handleAddress(value) {\n      if (value === \"0x\") {\n        return null;\n      }\n      return (0, address_1.getAddress)(value);\n    }\n    function handleNumber(value) {\n      if (value === \"0x\") {\n        return constants_1.Zero;\n      }\n      return bignumber_1.BigNumber.from(value);\n    }\n    var transactionFields = [\n      { name: \"nonce\", maxLength: 32, numeric: true },\n      { name: \"gasPrice\", maxLength: 32, numeric: true },\n      { name: \"gasLimit\", maxLength: 32, numeric: true },\n      { name: \"to\", length: 20 },\n      { name: \"value\", maxLength: 32, numeric: true },\n      { name: \"data\" }\n    ];\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      type: true,\n      value: true\n    };\n    function computeAddress(key) {\n      var publicKey = (0, signing_key_1.computePublicKey)(key);\n      return (0, address_1.getAddress)((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.hexDataSlice)(publicKey, 1)), 12));\n    }\n    exports2.computeAddress = computeAddress;\n    function recoverAddress(digest, signature) {\n      return computeAddress((0, signing_key_1.recoverPublicKey)((0, bytes_1.arrayify)(digest), signature));\n    }\n    exports2.recoverAddress = recoverAddress;\n    function formatNumber(value, name2) {\n      var result = (0, bytes_1.stripZeros)(bignumber_1.BigNumber.from(value).toHexString());\n      if (result.length > 32) {\n        logger.throwArgumentError(\"invalid length for \" + name2, \"transaction:\" + name2, value);\n      }\n      return result;\n    }\n    function accessSetify(addr, storageKeys) {\n      return {\n        address: (0, address_1.getAddress)(addr),\n        storageKeys: (storageKeys || []).map(function(storageKey, index) {\n          if ((0, bytes_1.hexDataLength)(storageKey) !== 32) {\n            logger.throwArgumentError(\"invalid access list storageKey\", \"accessList[\" + addr + \":\" + index + \"]\", storageKey);\n          }\n          return storageKey.toLowerCase();\n        })\n      };\n    }\n    function accessListify(value) {\n      if (Array.isArray(value)) {\n        return value.map(function(set, index) {\n          if (Array.isArray(set)) {\n            if (set.length > 2) {\n              logger.throwArgumentError(\"access list expected to be [ address, storageKeys[] ]\", \"value[\" + index + \"]\", set);\n            }\n            return accessSetify(set[0], set[1]);\n          }\n          return accessSetify(set.address, set.storageKeys);\n        });\n      }\n      var result = Object.keys(value).map(function(addr) {\n        var storageKeys = value[addr].reduce(function(accum, storageKey) {\n          accum[storageKey] = true;\n          return accum;\n        }, {});\n        return accessSetify(addr, Object.keys(storageKeys).sort());\n      });\n      result.sort(function(a, b) {\n        return a.address.localeCompare(b.address);\n      });\n      return result;\n    }\n    exports2.accessListify = accessListify;\n    function formatAccessList(value) {\n      return accessListify(value).map(function(set) {\n        return [set.address, set.storageKeys];\n      });\n    }\n    function _serializeEip1559(transaction, signature) {\n      if (transaction.gasPrice != null) {\n        var gasPrice = bignumber_1.BigNumber.from(transaction.gasPrice);\n        var maxFeePerGas = bignumber_1.BigNumber.from(transaction.maxFeePerGas || 0);\n        if (!gasPrice.eq(maxFeePerGas)) {\n          logger.throwArgumentError(\"mismatch EIP-1559 gasPrice != maxFeePerGas\", \"tx\", {\n            gasPrice,\n            maxFeePerGas\n          });\n        }\n      }\n      var fields = [\n        formatNumber(transaction.chainId || 0, \"chainId\"),\n        formatNumber(transaction.nonce || 0, \"nonce\"),\n        formatNumber(transaction.maxPriorityFeePerGas || 0, \"maxPriorityFeePerGas\"),\n        formatNumber(transaction.maxFeePerGas || 0, \"maxFeePerGas\"),\n        formatNumber(transaction.gasLimit || 0, \"gasLimit\"),\n        transaction.to != null ? (0, address_1.getAddress)(transaction.to) : \"0x\",\n        formatNumber(transaction.value || 0, \"value\"),\n        transaction.data || \"0x\",\n        formatAccessList(transaction.accessList || [])\n      ];\n      if (signature) {\n        var sig = (0, bytes_1.splitSignature)(signature);\n        fields.push(formatNumber(sig.recoveryParam, \"recoveryParam\"));\n        fields.push((0, bytes_1.stripZeros)(sig.r));\n        fields.push((0, bytes_1.stripZeros)(sig.s));\n      }\n      return (0, bytes_1.hexConcat)([\"0x02\", RLP.encode(fields)]);\n    }\n    function _serializeEip2930(transaction, signature) {\n      var fields = [\n        formatNumber(transaction.chainId || 0, \"chainId\"),\n        formatNumber(transaction.nonce || 0, \"nonce\"),\n        formatNumber(transaction.gasPrice || 0, \"gasPrice\"),\n        formatNumber(transaction.gasLimit || 0, \"gasLimit\"),\n        transaction.to != null ? (0, address_1.getAddress)(transaction.to) : \"0x\",\n        formatNumber(transaction.value || 0, \"value\"),\n        transaction.data || \"0x\",\n        formatAccessList(transaction.accessList || [])\n      ];\n      if (signature) {\n        var sig = (0, bytes_1.splitSignature)(signature);\n        fields.push(formatNumber(sig.recoveryParam, \"recoveryParam\"));\n        fields.push((0, bytes_1.stripZeros)(sig.r));\n        fields.push((0, bytes_1.stripZeros)(sig.s));\n      }\n      return (0, bytes_1.hexConcat)([\"0x01\", RLP.encode(fields)]);\n    }\n    function _serialize(transaction, signature) {\n      (0, properties_1.checkProperties)(transaction, allowedTransactionKeys);\n      var raw = [];\n      transactionFields.forEach(function(fieldInfo) {\n        var value = transaction[fieldInfo.name] || [];\n        var options = {};\n        if (fieldInfo.numeric) {\n          options.hexPad = \"left\";\n        }\n        value = (0, bytes_1.arrayify)((0, bytes_1.hexlify)(value, options));\n        if (fieldInfo.length && value.length !== fieldInfo.length && value.length > 0) {\n          logger.throwArgumentError(\"invalid length for \" + fieldInfo.name, \"transaction:\" + fieldInfo.name, value);\n        }\n        if (fieldInfo.maxLength) {\n          value = (0, bytes_1.stripZeros)(value);\n          if (value.length > fieldInfo.maxLength) {\n            logger.throwArgumentError(\"invalid length for \" + fieldInfo.name, \"transaction:\" + fieldInfo.name, value);\n          }\n        }\n        raw.push((0, bytes_1.hexlify)(value));\n      });\n      var chainId = 0;\n      if (transaction.chainId != null) {\n        chainId = transaction.chainId;\n        if (typeof chainId !== \"number\") {\n          logger.throwArgumentError(\"invalid transaction.chainId\", \"transaction\", transaction);\n        }\n      } else if (signature && !(0, bytes_1.isBytesLike)(signature) && signature.v > 28) {\n        chainId = Math.floor((signature.v - 35) / 2);\n      }\n      if (chainId !== 0) {\n        raw.push((0, bytes_1.hexlify)(chainId));\n        raw.push(\"0x\");\n        raw.push(\"0x\");\n      }\n      if (!signature) {\n        return RLP.encode(raw);\n      }\n      var sig = (0, bytes_1.splitSignature)(signature);\n      var v = 27 + sig.recoveryParam;\n      if (chainId !== 0) {\n        raw.pop();\n        raw.pop();\n        raw.pop();\n        v += chainId * 2 + 8;\n        if (sig.v > 28 && sig.v !== v) {\n          logger.throwArgumentError(\"transaction.chainId/signature.v mismatch\", \"signature\", signature);\n        }\n      } else if (sig.v !== v) {\n        logger.throwArgumentError(\"transaction.chainId/signature.v mismatch\", \"signature\", signature);\n      }\n      raw.push((0, bytes_1.hexlify)(v));\n      raw.push((0, bytes_1.stripZeros)((0, bytes_1.arrayify)(sig.r)));\n      raw.push((0, bytes_1.stripZeros)((0, bytes_1.arrayify)(sig.s)));\n      return RLP.encode(raw);\n    }\n    function serialize(transaction, signature) {\n      if (transaction.type == null || transaction.type === 0) {\n        if (transaction.accessList != null) {\n          logger.throwArgumentError(\"untyped transactions do not support accessList; include type: 1\", \"transaction\", transaction);\n        }\n        return _serialize(transaction, signature);\n      }\n      switch (transaction.type) {\n        case 1:\n          return _serializeEip2930(transaction, signature);\n        case 2:\n          return _serializeEip1559(transaction, signature);\n        default:\n          break;\n      }\n      return logger.throwError(\"unsupported transaction type: \" + transaction.type, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n        operation: \"serializeTransaction\",\n        transactionType: transaction.type\n      });\n    }\n    exports2.serialize = serialize;\n    function _parseEipSignature(tx, fields, serialize2) {\n      try {\n        var recid = handleNumber(fields[0]).toNumber();\n        if (recid !== 0 && recid !== 1) {\n          throw new Error(\"bad recid\");\n        }\n        tx.v = recid;\n      } catch (error) {\n        logger.throwArgumentError(\"invalid v for transaction type: 1\", \"v\", fields[0]);\n      }\n      tx.r = (0, bytes_1.hexZeroPad)(fields[1], 32);\n      tx.s = (0, bytes_1.hexZeroPad)(fields[2], 32);\n      try {\n        var digest = (0, keccak256_1.keccak256)(serialize2(tx));\n        tx.from = recoverAddress(digest, { r: tx.r, s: tx.s, recoveryParam: tx.v });\n      } catch (error) {\n        console.log(error);\n      }\n    }\n    function _parseEip1559(payload) {\n      var transaction = RLP.decode(payload.slice(1));\n      if (transaction.length !== 9 && transaction.length !== 12) {\n        logger.throwArgumentError(\"invalid component count for transaction type: 2\", \"payload\", (0, bytes_1.hexlify)(payload));\n      }\n      var maxPriorityFeePerGas = handleNumber(transaction[2]);\n      var maxFeePerGas = handleNumber(transaction[3]);\n      var tx = {\n        type: 2,\n        chainId: handleNumber(transaction[0]).toNumber(),\n        nonce: handleNumber(transaction[1]).toNumber(),\n        maxPriorityFeePerGas,\n        maxFeePerGas,\n        gasPrice: null,\n        gasLimit: handleNumber(transaction[4]),\n        to: handleAddress(transaction[5]),\n        value: handleNumber(transaction[6]),\n        data: transaction[7],\n        accessList: accessListify(transaction[8])\n      };\n      if (transaction.length === 9) {\n        return tx;\n      }\n      tx.hash = (0, keccak256_1.keccak256)(payload);\n      _parseEipSignature(tx, transaction.slice(9), _serializeEip1559);\n      return tx;\n    }\n    function _parseEip2930(payload) {\n      var transaction = RLP.decode(payload.slice(1));\n      if (transaction.length !== 8 && transaction.length !== 11) {\n        logger.throwArgumentError(\"invalid component count for transaction type: 1\", \"payload\", (0, bytes_1.hexlify)(payload));\n      }\n      var tx = {\n        type: 1,\n        chainId: handleNumber(transaction[0]).toNumber(),\n        nonce: handleNumber(transaction[1]).toNumber(),\n        gasPrice: handleNumber(transaction[2]),\n        gasLimit: handleNumber(transaction[3]),\n        to: handleAddress(transaction[4]),\n        value: handleNumber(transaction[5]),\n        data: transaction[6],\n        accessList: accessListify(transaction[7])\n      };\n      if (transaction.length === 8) {\n        return tx;\n      }\n      tx.hash = (0, keccak256_1.keccak256)(payload);\n      _parseEipSignature(tx, transaction.slice(8), _serializeEip2930);\n      return tx;\n    }\n    function _parse(rawTransaction) {\n      var transaction = RLP.decode(rawTransaction);\n      if (transaction.length !== 9 && transaction.length !== 6) {\n        logger.throwArgumentError(\"invalid raw transaction\", \"rawTransaction\", rawTransaction);\n      }\n      var tx = {\n        nonce: handleNumber(transaction[0]).toNumber(),\n        gasPrice: handleNumber(transaction[1]),\n        gasLimit: handleNumber(transaction[2]),\n        to: handleAddress(transaction[3]),\n        value: handleNumber(transaction[4]),\n        data: transaction[5],\n        chainId: 0\n      };\n      if (transaction.length === 6) {\n        return tx;\n      }\n      try {\n        tx.v = bignumber_1.BigNumber.from(transaction[6]).toNumber();\n      } catch (error) {\n        console.log(error);\n        return tx;\n      }\n      tx.r = (0, bytes_1.hexZeroPad)(transaction[7], 32);\n      tx.s = (0, bytes_1.hexZeroPad)(transaction[8], 32);\n      if (bignumber_1.BigNumber.from(tx.r).isZero() && bignumber_1.BigNumber.from(tx.s).isZero()) {\n        tx.chainId = tx.v;\n        tx.v = 0;\n      } else {\n        tx.chainId = Math.floor((tx.v - 35) / 2);\n        if (tx.chainId < 0) {\n          tx.chainId = 0;\n        }\n        var recoveryParam = tx.v - 27;\n        var raw = transaction.slice(0, 6);\n        if (tx.chainId !== 0) {\n          raw.push((0, bytes_1.hexlify)(tx.chainId));\n          raw.push(\"0x\");\n          raw.push(\"0x\");\n          recoveryParam -= tx.chainId * 2 + 8;\n        }\n        var digest = (0, keccak256_1.keccak256)(RLP.encode(raw));\n        try {\n          tx.from = recoverAddress(digest, { r: (0, bytes_1.hexlify)(tx.r), s: (0, bytes_1.hexlify)(tx.s), recoveryParam });\n        } catch (error) {\n          console.log(error);\n        }\n        tx.hash = (0, keccak256_1.keccak256)(rawTransaction);\n      }\n      tx.type = null;\n      return tx;\n    }\n    function parse(rawTransaction) {\n      var payload = (0, bytes_1.arrayify)(rawTransaction);\n      if (payload[0] > 127) {\n        return _parse(payload);\n      }\n      switch (payload[0]) {\n        case 1:\n          return _parseEip2930(payload);\n        case 2:\n          return _parseEip1559(payload);\n        default:\n          break;\n      }\n      return logger.throwError(\"unsupported transaction type: \" + payload[0], logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n        operation: \"parseTransaction\",\n        transactionType: payload[0]\n      });\n    }\n    exports2.parse = parse;\n  }\n});\n\n// node_modules/@ethersproject/contracts/lib/_version.js\nvar require_version14 = __commonJS({\n  \"node_modules/@ethersproject/contracts/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"contracts/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/contracts/lib/index.js\nvar require_lib16 = __commonJS({\n  \"node_modules/@ethersproject/contracts/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __spreadArray = exports2 && exports2.__spreadArray || function(to, from, pack) {\n      if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n        }\n      }\n      return to.concat(ar || Array.prototype.slice.call(from));\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ContractFactory = exports2.Contract = exports2.BaseContract = void 0;\n    var abi_1 = require_lib11();\n    var abstract_provider_1 = require_lib12();\n    var abstract_signer_1 = require_lib13();\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version14();\n    var logger = new logger_1.Logger(_version_1.version);\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      from: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      value: true,\n      type: true,\n      accessList: true,\n      maxFeePerGas: true,\n      maxPriorityFeePerGas: true,\n      customData: true\n    };\n    function resolveName(resolver, nameOrPromise) {\n      return __awaiter(this, void 0, void 0, function() {\n        var name2, address;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              return [4, nameOrPromise];\n            case 1:\n              name2 = _a.sent();\n              if (typeof name2 !== \"string\") {\n                logger.throwArgumentError(\"invalid address or ENS name\", \"name\", name2);\n              }\n              try {\n                return [2, (0, address_1.getAddress)(name2)];\n              } catch (error) {\n              }\n              if (!resolver) {\n                logger.throwError(\"a provider or signer is needed to resolve ENS names\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                  operation: \"resolveName\"\n                });\n              }\n              return [4, resolver.resolveName(name2)];\n            case 2:\n              address = _a.sent();\n              if (address == null) {\n                logger.throwArgumentError(\"resolver or addr is not configured for ENS name\", \"name\", name2);\n              }\n              return [2, address];\n          }\n        });\n      });\n    }\n    function resolveAddresses(resolver, value, paramType) {\n      return __awaiter(this, void 0, void 0, function() {\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              if (!Array.isArray(paramType)) return [3, 2];\n              return [4, Promise.all(paramType.map(function(paramType2, index) {\n                return resolveAddresses(resolver, Array.isArray(value) ? value[index] : value[paramType2.name], paramType2);\n              }))];\n            case 1:\n              return [2, _a.sent()];\n            case 2:\n              if (!(paramType.type === \"address\")) return [3, 4];\n              return [4, resolveName(resolver, value)];\n            case 3:\n              return [2, _a.sent()];\n            case 4:\n              if (!(paramType.type === \"tuple\")) return [3, 6];\n              return [4, resolveAddresses(resolver, value, paramType.components)];\n            case 5:\n              return [2, _a.sent()];\n            case 6:\n              if (!(paramType.baseType === \"array\")) return [3, 8];\n              if (!Array.isArray(value)) {\n                return [2, Promise.reject(logger.makeError(\"invalid value for array\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                  argument: \"value\",\n                  value\n                }))];\n              }\n              return [4, Promise.all(value.map(function(v) {\n                return resolveAddresses(resolver, v, paramType.arrayChildren);\n              }))];\n            case 7:\n              return [2, _a.sent()];\n            case 8:\n              return [2, value];\n          }\n        });\n      });\n    }\n    function populateTransaction(contract, fragment, args) {\n      return __awaiter(this, void 0, void 0, function() {\n        var overrides, resolved, data, tx, ro, intrinsic, bytes, i, roValue, leftovers;\n        var _this = this;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              overrides = {};\n              if (args.length === fragment.inputs.length + 1 && typeof args[args.length - 1] === \"object\") {\n                overrides = (0, properties_1.shallowCopy)(args.pop());\n              }\n              logger.checkArgumentCount(args.length, fragment.inputs.length, \"passed to contract\");\n              if (contract.signer) {\n                if (overrides.from) {\n                  overrides.from = (0, properties_1.resolveProperties)({\n                    override: resolveName(contract.signer, overrides.from),\n                    signer: contract.signer.getAddress()\n                  }).then(function(check) {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      return __generator(this, function(_a2) {\n                        if ((0, address_1.getAddress)(check.signer) !== check.override) {\n                          logger.throwError(\"Contract with a Signer cannot override from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                            operation: \"overrides.from\"\n                          });\n                        }\n                        return [2, check.override];\n                      });\n                    });\n                  });\n                } else {\n                  overrides.from = contract.signer.getAddress();\n                }\n              } else if (overrides.from) {\n                overrides.from = resolveName(contract.provider, overrides.from);\n              }\n              return [4, (0, properties_1.resolveProperties)({\n                args: resolveAddresses(contract.signer || contract.provider, args, fragment.inputs),\n                address: contract.resolvedAddress,\n                overrides: (0, properties_1.resolveProperties)(overrides) || {}\n              })];\n            case 1:\n              resolved = _a.sent();\n              data = contract.interface.encodeFunctionData(fragment, resolved.args);\n              tx = {\n                data,\n                to: resolved.address\n              };\n              ro = resolved.overrides;\n              if (ro.nonce != null) {\n                tx.nonce = bignumber_1.BigNumber.from(ro.nonce).toNumber();\n              }\n              if (ro.gasLimit != null) {\n                tx.gasLimit = bignumber_1.BigNumber.from(ro.gasLimit);\n              }\n              if (ro.gasPrice != null) {\n                tx.gasPrice = bignumber_1.BigNumber.from(ro.gasPrice);\n              }\n              if (ro.maxFeePerGas != null) {\n                tx.maxFeePerGas = bignumber_1.BigNumber.from(ro.maxFeePerGas);\n              }\n              if (ro.maxPriorityFeePerGas != null) {\n                tx.maxPriorityFeePerGas = bignumber_1.BigNumber.from(ro.maxPriorityFeePerGas);\n              }\n              if (ro.from != null) {\n                tx.from = ro.from;\n              }\n              if (ro.type != null) {\n                tx.type = ro.type;\n              }\n              if (ro.accessList != null) {\n                tx.accessList = (0, transactions_1.accessListify)(ro.accessList);\n              }\n              if (tx.gasLimit == null && fragment.gas != null) {\n                intrinsic = 21e3;\n                bytes = (0, bytes_1.arrayify)(data);\n                for (i = 0; i < bytes.length; i++) {\n                  intrinsic += 4;\n                  if (bytes[i]) {\n                    intrinsic += 64;\n                  }\n                }\n                tx.gasLimit = bignumber_1.BigNumber.from(fragment.gas).add(intrinsic);\n              }\n              if (ro.value) {\n                roValue = bignumber_1.BigNumber.from(ro.value);\n                if (!roValue.isZero() && !fragment.payable) {\n                  logger.throwError(\"non-payable method cannot override value\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"overrides.value\",\n                    value: overrides.value\n                  });\n                }\n                tx.value = roValue;\n              }\n              if (ro.customData) {\n                tx.customData = (0, properties_1.shallowCopy)(ro.customData);\n              }\n              delete overrides.nonce;\n              delete overrides.gasLimit;\n              delete overrides.gasPrice;\n              delete overrides.from;\n              delete overrides.value;\n              delete overrides.type;\n              delete overrides.accessList;\n              delete overrides.maxFeePerGas;\n              delete overrides.maxPriorityFeePerGas;\n              delete overrides.customData;\n              leftovers = Object.keys(overrides).filter(function(key) {\n                return overrides[key] != null;\n              });\n              if (leftovers.length) {\n                logger.throwError(\"cannot override \" + leftovers.map(function(l) {\n                  return JSON.stringify(l);\n                }).join(\",\"), logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                  operation: \"overrides\",\n                  overrides: leftovers\n                });\n              }\n              return [2, tx];\n          }\n        });\n      });\n    }\n    function buildPopulate(contract, fragment) {\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return populateTransaction(contract, fragment, args);\n      };\n    }\n    function buildEstimate(contract, fragment) {\n      var signerOrProvider = contract.signer || contract.provider;\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var tx;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                if (!signerOrProvider) {\n                  logger.throwError(\"estimate require a provider or signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"estimateGas\"\n                  });\n                }\n                return [4, populateTransaction(contract, fragment, args)];\n              case 1:\n                tx = _a.sent();\n                return [4, signerOrProvider.estimateGas(tx)];\n              case 2:\n                return [2, _a.sent()];\n            }\n          });\n        });\n      };\n    }\n    function addContractWait(contract, tx) {\n      var wait = tx.wait.bind(tx);\n      tx.wait = function(confirmations) {\n        return wait(confirmations).then(function(receipt) {\n          receipt.events = receipt.logs.map(function(log) {\n            var event = (0, properties_1.deepCopy)(log);\n            var parsed = null;\n            try {\n              parsed = contract.interface.parseLog(log);\n            } catch (e) {\n            }\n            if (parsed) {\n              event.args = parsed.args;\n              event.decode = function(data, topics) {\n                return contract.interface.decodeEventLog(parsed.eventFragment, data, topics);\n              };\n              event.event = parsed.name;\n              event.eventSignature = parsed.signature;\n            }\n            event.removeListener = function() {\n              return contract.provider;\n            };\n            event.getBlock = function() {\n              return contract.provider.getBlock(receipt.blockHash);\n            };\n            event.getTransaction = function() {\n              return contract.provider.getTransaction(receipt.transactionHash);\n            };\n            event.getTransactionReceipt = function() {\n              return Promise.resolve(receipt);\n            };\n            return event;\n          });\n          return receipt;\n        });\n      };\n    }\n    function buildCall(contract, fragment, collapseSimple) {\n      var signerOrProvider = contract.signer || contract.provider;\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var blockTag, overrides, tx, result, value;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                blockTag = void 0;\n                if (!(args.length === fragment.inputs.length + 1 && typeof args[args.length - 1] === \"object\")) return [3, 3];\n                overrides = (0, properties_1.shallowCopy)(args.pop());\n                if (!(overrides.blockTag != null)) return [3, 2];\n                return [4, overrides.blockTag];\n              case 1:\n                blockTag = _a.sent();\n                _a.label = 2;\n              case 2:\n                delete overrides.blockTag;\n                args.push(overrides);\n                _a.label = 3;\n              case 3:\n                if (!(contract.deployTransaction != null)) return [3, 5];\n                return [4, contract._deployed(blockTag)];\n              case 4:\n                _a.sent();\n                _a.label = 5;\n              case 5:\n                return [4, populateTransaction(contract, fragment, args)];\n              case 6:\n                tx = _a.sent();\n                return [4, signerOrProvider.call(tx, blockTag)];\n              case 7:\n                result = _a.sent();\n                try {\n                  value = contract.interface.decodeFunctionResult(fragment, result);\n                  if (collapseSimple && fragment.outputs.length === 1) {\n                    value = value[0];\n                  }\n                  return [2, value];\n                } catch (error) {\n                  if (error.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    error.address = contract.address;\n                    error.args = args;\n                    error.transaction = tx;\n                  }\n                  throw error;\n                }\n                return [\n                  2\n                  /*return*/\n                ];\n            }\n          });\n        });\n      };\n    }\n    function buildSend(contract, fragment) {\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var txRequest, tx;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                if (!contract.signer) {\n                  logger.throwError(\"sending a transaction requires a signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"sendTransaction\"\n                  });\n                }\n                if (!(contract.deployTransaction != null)) return [3, 2];\n                return [4, contract._deployed()];\n              case 1:\n                _a.sent();\n                _a.label = 2;\n              case 2:\n                return [4, populateTransaction(contract, fragment, args)];\n              case 3:\n                txRequest = _a.sent();\n                return [4, contract.signer.sendTransaction(txRequest)];\n              case 4:\n                tx = _a.sent();\n                addContractWait(contract, tx);\n                return [2, tx];\n            }\n          });\n        });\n      };\n    }\n    function buildDefault(contract, fragment, collapseSimple) {\n      if (fragment.constant) {\n        return buildCall(contract, fragment, collapseSimple);\n      }\n      return buildSend(contract, fragment);\n    }\n    function getEventTag(filter) {\n      if (filter.address && (filter.topics == null || filter.topics.length === 0)) {\n        return \"*\";\n      }\n      return (filter.address || \"*\") + \"@\" + (filter.topics ? filter.topics.map(function(topic) {\n        if (Array.isArray(topic)) {\n          return topic.join(\"|\");\n        }\n        return topic;\n      }).join(\":\") : \"\");\n    }\n    var RunningEvent = (\n      /** @class */\n      function() {\n        function RunningEvent2(tag, filter) {\n          (0, properties_1.defineReadOnly)(this, \"tag\", tag);\n          (0, properties_1.defineReadOnly)(this, \"filter\", filter);\n          this._listeners = [];\n        }\n        RunningEvent2.prototype.addListener = function(listener, once) {\n          this._listeners.push({ listener, once });\n        };\n        RunningEvent2.prototype.removeListener = function(listener) {\n          var done = false;\n          this._listeners = this._listeners.filter(function(item) {\n            if (done || item.listener !== listener) {\n              return true;\n            }\n            done = true;\n            return false;\n          });\n        };\n        RunningEvent2.prototype.removeAllListeners = function() {\n          this._listeners = [];\n        };\n        RunningEvent2.prototype.listeners = function() {\n          return this._listeners.map(function(i) {\n            return i.listener;\n          });\n        };\n        RunningEvent2.prototype.listenerCount = function() {\n          return this._listeners.length;\n        };\n        RunningEvent2.prototype.run = function(args) {\n          var _this = this;\n          var listenerCount = this.listenerCount();\n          this._listeners = this._listeners.filter(function(item) {\n            var argsCopy = args.slice();\n            setTimeout(function() {\n              item.listener.apply(_this, argsCopy);\n            }, 0);\n            return !item.once;\n          });\n          return listenerCount;\n        };\n        RunningEvent2.prototype.prepareEvent = function(event) {\n        };\n        RunningEvent2.prototype.getEmit = function(event) {\n          return [event];\n        };\n        return RunningEvent2;\n      }()\n    );\n    var ErrorRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorRunningEvent2, _super);\n        function ErrorRunningEvent2() {\n          return _super.call(this, \"error\", null) || this;\n        }\n        return ErrorRunningEvent2;\n      }(RunningEvent)\n    );\n    var FragmentRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(FragmentRunningEvent2, _super);\n        function FragmentRunningEvent2(address, contractInterface, fragment, topics) {\n          var _this = this;\n          var filter = {\n            address\n          };\n          var topic = contractInterface.getEventTopic(fragment);\n          if (topics) {\n            if (topic !== topics[0]) {\n              logger.throwArgumentError(\"topic mismatch\", \"topics\", topics);\n            }\n            filter.topics = topics.slice();\n          } else {\n            filter.topics = [topic];\n          }\n          _this = _super.call(this, getEventTag(filter), filter) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"interface\", contractInterface);\n          (0, properties_1.defineReadOnly)(_this, \"fragment\", fragment);\n          return _this;\n        }\n        FragmentRunningEvent2.prototype.prepareEvent = function(event) {\n          var _this = this;\n          _super.prototype.prepareEvent.call(this, event);\n          event.event = this.fragment.name;\n          event.eventSignature = this.fragment.format();\n          event.decode = function(data, topics) {\n            return _this.interface.decodeEventLog(_this.fragment, data, topics);\n          };\n          try {\n            event.args = this.interface.decodeEventLog(this.fragment, event.data, event.topics);\n          } catch (error) {\n            event.args = null;\n            event.decodeError = error;\n          }\n        };\n        FragmentRunningEvent2.prototype.getEmit = function(event) {\n          var errors = (0, abi_1.checkResultErrors)(event.args);\n          if (errors.length) {\n            throw errors[0].error;\n          }\n          var args = (event.args || []).slice();\n          args.push(event);\n          return args;\n        };\n        return FragmentRunningEvent2;\n      }(RunningEvent)\n    );\n    var WildcardRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(WildcardRunningEvent2, _super);\n        function WildcardRunningEvent2(address, contractInterface) {\n          var _this = _super.call(this, \"*\", { address }) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"interface\", contractInterface);\n          return _this;\n        }\n        WildcardRunningEvent2.prototype.prepareEvent = function(event) {\n          var _this = this;\n          _super.prototype.prepareEvent.call(this, event);\n          try {\n            var parsed_1 = this.interface.parseLog(event);\n            event.event = parsed_1.name;\n            event.eventSignature = parsed_1.signature;\n            event.decode = function(data, topics) {\n              return _this.interface.decodeEventLog(parsed_1.eventFragment, data, topics);\n            };\n            event.args = parsed_1.args;\n          } catch (error) {\n          }\n        };\n        return WildcardRunningEvent2;\n      }(RunningEvent)\n    );\n    var BaseContract = (\n      /** @class */\n      function() {\n        function BaseContract2(addressOrName, contractInterface, signerOrProvider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Contract);\n          (0, properties_1.defineReadOnly)(this, \"interface\", (0, properties_1.getStatic)(_newTarget, \"getInterface\")(contractInterface));\n          if (signerOrProvider == null) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", null);\n            (0, properties_1.defineReadOnly)(this, \"signer\", null);\n          } else if (abstract_signer_1.Signer.isSigner(signerOrProvider)) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", signerOrProvider.provider || null);\n            (0, properties_1.defineReadOnly)(this, \"signer\", signerOrProvider);\n          } else if (abstract_provider_1.Provider.isProvider(signerOrProvider)) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", signerOrProvider);\n            (0, properties_1.defineReadOnly)(this, \"signer\", null);\n          } else {\n            logger.throwArgumentError(\"invalid signer or provider\", \"signerOrProvider\", signerOrProvider);\n          }\n          (0, properties_1.defineReadOnly)(this, \"callStatic\", {});\n          (0, properties_1.defineReadOnly)(this, \"estimateGas\", {});\n          (0, properties_1.defineReadOnly)(this, \"functions\", {});\n          (0, properties_1.defineReadOnly)(this, \"populateTransaction\", {});\n          (0, properties_1.defineReadOnly)(this, \"filters\", {});\n          {\n            var uniqueFilters_1 = {};\n            Object.keys(this.interface.events).forEach(function(eventSignature) {\n              var event = _this.interface.events[eventSignature];\n              (0, properties_1.defineReadOnly)(_this.filters, eventSignature, function() {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                  args[_i] = arguments[_i];\n                }\n                return {\n                  address: _this.address,\n                  topics: _this.interface.encodeFilterTopics(event, args)\n                };\n              });\n              if (!uniqueFilters_1[event.name]) {\n                uniqueFilters_1[event.name] = [];\n              }\n              uniqueFilters_1[event.name].push(eventSignature);\n            });\n            Object.keys(uniqueFilters_1).forEach(function(name2) {\n              var filters = uniqueFilters_1[name2];\n              if (filters.length === 1) {\n                (0, properties_1.defineReadOnly)(_this.filters, name2, _this.filters[filters[0]]);\n              } else {\n                logger.warn(\"Duplicate definition of \" + name2 + \" (\" + filters.join(\", \") + \")\");\n              }\n            });\n          }\n          (0, properties_1.defineReadOnly)(this, \"_runningEvents\", {});\n          (0, properties_1.defineReadOnly)(this, \"_wrappedEmits\", {});\n          if (addressOrName == null) {\n            logger.throwArgumentError(\"invalid contract address or ENS name\", \"addressOrName\", addressOrName);\n          }\n          (0, properties_1.defineReadOnly)(this, \"address\", addressOrName);\n          if (this.provider) {\n            (0, properties_1.defineReadOnly)(this, \"resolvedAddress\", resolveName(this.provider, addressOrName));\n          } else {\n            try {\n              (0, properties_1.defineReadOnly)(this, \"resolvedAddress\", Promise.resolve((0, address_1.getAddress)(addressOrName)));\n            } catch (error) {\n              logger.throwError(\"provider is required to use ENS name as contract address\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"new Contract\"\n              });\n            }\n          }\n          var uniqueNames = {};\n          var uniqueSignatures = {};\n          Object.keys(this.interface.functions).forEach(function(signature) {\n            var fragment = _this.interface.functions[signature];\n            if (uniqueSignatures[signature]) {\n              logger.warn(\"Duplicate ABI entry for \" + JSON.stringify(signature));\n              return;\n            }\n            uniqueSignatures[signature] = true;\n            {\n              var name_1 = fragment.name;\n              if (!uniqueNames[\"%\" + name_1]) {\n                uniqueNames[\"%\" + name_1] = [];\n              }\n              uniqueNames[\"%\" + name_1].push(signature);\n            }\n            if (_this[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this, signature, buildDefault(_this, fragment, true));\n            }\n            if (_this.functions[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.functions, signature, buildDefault(_this, fragment, false));\n            }\n            if (_this.callStatic[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.callStatic, signature, buildCall(_this, fragment, true));\n            }\n            if (_this.populateTransaction[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.populateTransaction, signature, buildPopulate(_this, fragment));\n            }\n            if (_this.estimateGas[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.estimateGas, signature, buildEstimate(_this, fragment));\n            }\n          });\n          Object.keys(uniqueNames).forEach(function(name2) {\n            var signatures = uniqueNames[name2];\n            if (signatures.length > 1) {\n              return;\n            }\n            name2 = name2.substring(1);\n            var signature = signatures[0];\n            try {\n              if (_this[name2] == null) {\n                (0, properties_1.defineReadOnly)(_this, name2, _this[signature]);\n              }\n            } catch (e) {\n            }\n            if (_this.functions[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.functions, name2, _this.functions[signature]);\n            }\n            if (_this.callStatic[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.callStatic, name2, _this.callStatic[signature]);\n            }\n            if (_this.populateTransaction[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.populateTransaction, name2, _this.populateTransaction[signature]);\n            }\n            if (_this.estimateGas[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.estimateGas, name2, _this.estimateGas[signature]);\n            }\n          });\n        }\n        BaseContract2.getContractAddress = function(transaction) {\n          return (0, address_1.getContractAddress)(transaction);\n        };\n        BaseContract2.getInterface = function(contractInterface) {\n          if (abi_1.Interface.isInterface(contractInterface)) {\n            return contractInterface;\n          }\n          return new abi_1.Interface(contractInterface);\n        };\n        BaseContract2.prototype.deployed = function() {\n          return this._deployed();\n        };\n        BaseContract2.prototype._deployed = function(blockTag) {\n          var _this = this;\n          if (!this._deployedPromise) {\n            if (this.deployTransaction) {\n              this._deployedPromise = this.deployTransaction.wait().then(function() {\n                return _this;\n              });\n            } else {\n              this._deployedPromise = this.provider.getCode(this.address, blockTag).then(function(code) {\n                if (code === \"0x\") {\n                  logger.throwError(\"contract not deployed\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    contractAddress: _this.address,\n                    operation: \"getDeployed\"\n                  });\n                }\n                return _this;\n              });\n            }\n          }\n          return this._deployedPromise;\n        };\n        BaseContract2.prototype.fallback = function(overrides) {\n          var _this = this;\n          if (!this.signer) {\n            logger.throwError(\"sending a transactions require a signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"sendTransaction(fallback)\" });\n          }\n          var tx = (0, properties_1.shallowCopy)(overrides || {});\n          [\"from\", \"to\"].forEach(function(key) {\n            if (tx[key] == null) {\n              return;\n            }\n            logger.throwError(\"cannot override \" + key, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: key });\n          });\n          tx.to = this.resolvedAddress;\n          return this.deployed().then(function() {\n            return _this.signer.sendTransaction(tx);\n          });\n        };\n        BaseContract2.prototype.connect = function(signerOrProvider) {\n          if (typeof signerOrProvider === \"string\") {\n            signerOrProvider = new abstract_signer_1.VoidSigner(signerOrProvider, this.provider);\n          }\n          var contract = new this.constructor(this.address, this.interface, signerOrProvider);\n          if (this.deployTransaction) {\n            (0, properties_1.defineReadOnly)(contract, \"deployTransaction\", this.deployTransaction);\n          }\n          return contract;\n        };\n        BaseContract2.prototype.attach = function(addressOrName) {\n          return new this.constructor(addressOrName, this.interface, this.signer || this.provider);\n        };\n        BaseContract2.isIndexed = function(value) {\n          return abi_1.Indexed.isIndexed(value);\n        };\n        BaseContract2.prototype._normalizeRunningEvent = function(runningEvent) {\n          if (this._runningEvents[runningEvent.tag]) {\n            return this._runningEvents[runningEvent.tag];\n          }\n          return runningEvent;\n        };\n        BaseContract2.prototype._getRunningEvent = function(eventName) {\n          if (typeof eventName === \"string\") {\n            if (eventName === \"error\") {\n              return this._normalizeRunningEvent(new ErrorRunningEvent());\n            }\n            if (eventName === \"event\") {\n              return this._normalizeRunningEvent(new RunningEvent(\"event\", null));\n            }\n            if (eventName === \"*\") {\n              return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface));\n            }\n            var fragment = this.interface.getEvent(eventName);\n            return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment));\n          }\n          if (eventName.topics && eventName.topics.length > 0) {\n            try {\n              var topic = eventName.topics[0];\n              if (typeof topic !== \"string\") {\n                throw new Error(\"invalid topic\");\n              }\n              var fragment = this.interface.getEvent(topic);\n              return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment, eventName.topics));\n            } catch (error) {\n            }\n            var filter = {\n              address: this.address,\n              topics: eventName.topics\n            };\n            return this._normalizeRunningEvent(new RunningEvent(getEventTag(filter), filter));\n          }\n          return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface));\n        };\n        BaseContract2.prototype._checkRunningEvents = function(runningEvent) {\n          if (runningEvent.listenerCount() === 0) {\n            delete this._runningEvents[runningEvent.tag];\n            var emit = this._wrappedEmits[runningEvent.tag];\n            if (emit && runningEvent.filter) {\n              this.provider.off(runningEvent.filter, emit);\n              delete this._wrappedEmits[runningEvent.tag];\n            }\n          }\n        };\n        BaseContract2.prototype._wrapEvent = function(runningEvent, log, listener) {\n          var _this = this;\n          var event = (0, properties_1.deepCopy)(log);\n          event.removeListener = function() {\n            if (!listener) {\n              return;\n            }\n            runningEvent.removeListener(listener);\n            _this._checkRunningEvents(runningEvent);\n          };\n          event.getBlock = function() {\n            return _this.provider.getBlock(log.blockHash);\n          };\n          event.getTransaction = function() {\n            return _this.provider.getTransaction(log.transactionHash);\n          };\n          event.getTransactionReceipt = function() {\n            return _this.provider.getTransactionReceipt(log.transactionHash);\n          };\n          runningEvent.prepareEvent(event);\n          return event;\n        };\n        BaseContract2.prototype._addEventListener = function(runningEvent, listener, once) {\n          var _this = this;\n          if (!this.provider) {\n            logger.throwError(\"events require a provider or a signer with a provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"once\" });\n          }\n          runningEvent.addListener(listener, once);\n          this._runningEvents[runningEvent.tag] = runningEvent;\n          if (!this._wrappedEmits[runningEvent.tag]) {\n            var wrappedEmit = function(log) {\n              var event = _this._wrapEvent(runningEvent, log, listener);\n              if (event.decodeError == null) {\n                try {\n                  var args = runningEvent.getEmit(event);\n                  _this.emit.apply(_this, __spreadArray([runningEvent.filter], args, false));\n                } catch (error) {\n                  event.decodeError = error.error;\n                }\n              }\n              if (runningEvent.filter != null) {\n                _this.emit(\"event\", event);\n              }\n              if (event.decodeError != null) {\n                _this.emit(\"error\", event.decodeError, event);\n              }\n            };\n            this._wrappedEmits[runningEvent.tag] = wrappedEmit;\n            if (runningEvent.filter != null) {\n              this.provider.on(runningEvent.filter, wrappedEmit);\n            }\n          }\n        };\n        BaseContract2.prototype.queryFilter = function(event, fromBlockOrBlockhash, toBlock) {\n          var _this = this;\n          var runningEvent = this._getRunningEvent(event);\n          var filter = (0, properties_1.shallowCopy)(runningEvent.filter);\n          if (typeof fromBlockOrBlockhash === \"string\" && (0, bytes_1.isHexString)(fromBlockOrBlockhash, 32)) {\n            if (toBlock != null) {\n              logger.throwArgumentError(\"cannot specify toBlock with blockhash\", \"toBlock\", toBlock);\n            }\n            filter.blockHash = fromBlockOrBlockhash;\n          } else {\n            filter.fromBlock = fromBlockOrBlockhash != null ? fromBlockOrBlockhash : 0;\n            filter.toBlock = toBlock != null ? toBlock : \"latest\";\n          }\n          return this.provider.getLogs(filter).then(function(logs) {\n            return logs.map(function(log) {\n              return _this._wrapEvent(runningEvent, log, null);\n            });\n          });\n        };\n        BaseContract2.prototype.on = function(event, listener) {\n          this._addEventListener(this._getRunningEvent(event), listener, false);\n          return this;\n        };\n        BaseContract2.prototype.once = function(event, listener) {\n          this._addEventListener(this._getRunningEvent(event), listener, true);\n          return this;\n        };\n        BaseContract2.prototype.emit = function(eventName) {\n          var args = [];\n          for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n          }\n          if (!this.provider) {\n            return false;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          var result = runningEvent.run(args) > 0;\n          this._checkRunningEvents(runningEvent);\n          return result;\n        };\n        BaseContract2.prototype.listenerCount = function(eventName) {\n          var _this = this;\n          if (!this.provider) {\n            return 0;\n          }\n          if (eventName == null) {\n            return Object.keys(this._runningEvents).reduce(function(accum, key) {\n              return accum + _this._runningEvents[key].listenerCount();\n            }, 0);\n          }\n          return this._getRunningEvent(eventName).listenerCount();\n        };\n        BaseContract2.prototype.listeners = function(eventName) {\n          if (!this.provider) {\n            return [];\n          }\n          if (eventName == null) {\n            var result_1 = [];\n            for (var tag in this._runningEvents) {\n              this._runningEvents[tag].listeners().forEach(function(listener) {\n                result_1.push(listener);\n              });\n            }\n            return result_1;\n          }\n          return this._getRunningEvent(eventName).listeners();\n        };\n        BaseContract2.prototype.removeAllListeners = function(eventName) {\n          if (!this.provider) {\n            return this;\n          }\n          if (eventName == null) {\n            for (var tag in this._runningEvents) {\n              var runningEvent_1 = this._runningEvents[tag];\n              runningEvent_1.removeAllListeners();\n              this._checkRunningEvents(runningEvent_1);\n            }\n            return this;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          runningEvent.removeAllListeners();\n          this._checkRunningEvents(runningEvent);\n          return this;\n        };\n        BaseContract2.prototype.off = function(eventName, listener) {\n          if (!this.provider) {\n            return this;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          runningEvent.removeListener(listener);\n          this._checkRunningEvents(runningEvent);\n          return this;\n        };\n        BaseContract2.prototype.removeListener = function(eventName, listener) {\n          return this.off(eventName, listener);\n        };\n        return BaseContract2;\n      }()\n    );\n    exports2.BaseContract = BaseContract;\n    var Contract = (\n      /** @class */\n      function(_super) {\n        __extends(Contract2, _super);\n        function Contract2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return Contract2;\n      }(BaseContract)\n    );\n    exports2.Contract = Contract;\n    var ContractFactory = (\n      /** @class */\n      function() {\n        function ContractFactory2(contractInterface, bytecode, signer) {\n          var _newTarget = this.constructor;\n          var bytecodeHex = null;\n          if (typeof bytecode === \"string\") {\n            bytecodeHex = bytecode;\n          } else if ((0, bytes_1.isBytes)(bytecode)) {\n            bytecodeHex = (0, bytes_1.hexlify)(bytecode);\n          } else if (bytecode && typeof bytecode.object === \"string\") {\n            bytecodeHex = bytecode.object;\n          } else {\n            bytecodeHex = \"!\";\n          }\n          if (bytecodeHex.substring(0, 2) !== \"0x\") {\n            bytecodeHex = \"0x\" + bytecodeHex;\n          }\n          if (!(0, bytes_1.isHexString)(bytecodeHex) || bytecodeHex.length % 2) {\n            logger.throwArgumentError(\"invalid bytecode\", \"bytecode\", bytecode);\n          }\n          if (signer && !abstract_signer_1.Signer.isSigner(signer)) {\n            logger.throwArgumentError(\"invalid signer\", \"signer\", signer);\n          }\n          (0, properties_1.defineReadOnly)(this, \"bytecode\", bytecodeHex);\n          (0, properties_1.defineReadOnly)(this, \"interface\", (0, properties_1.getStatic)(_newTarget, \"getInterface\")(contractInterface));\n          (0, properties_1.defineReadOnly)(this, \"signer\", signer || null);\n        }\n        ContractFactory2.prototype.getDeployTransaction = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          var tx = {};\n          if (args.length === this.interface.deploy.inputs.length + 1 && typeof args[args.length - 1] === \"object\") {\n            tx = (0, properties_1.shallowCopy)(args.pop());\n            for (var key in tx) {\n              if (!allowedTransactionKeys[key]) {\n                throw new Error(\"unknown transaction override \" + key);\n              }\n            }\n          }\n          [\"data\", \"from\", \"to\"].forEach(function(key2) {\n            if (tx[key2] == null) {\n              return;\n            }\n            logger.throwError(\"cannot override \" + key2, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: key2 });\n          });\n          if (tx.value) {\n            var value = bignumber_1.BigNumber.from(tx.value);\n            if (!value.isZero() && !this.interface.deploy.payable) {\n              logger.throwError(\"non-payable constructor cannot override value\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"overrides.value\",\n                value: tx.value\n              });\n            }\n          }\n          logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, \" in Contract constructor\");\n          tx.data = (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.bytecode,\n            this.interface.encodeDeploy(args)\n          ]));\n          return tx;\n        };\n        ContractFactory2.prototype.deploy = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          return __awaiter(this, void 0, void 0, function() {\n            var overrides, params, unsignedTx, tx, address, contract;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  overrides = {};\n                  if (args.length === this.interface.deploy.inputs.length + 1) {\n                    overrides = args.pop();\n                  }\n                  logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, \" in Contract constructor\");\n                  return [4, resolveAddresses(this.signer, args, this.interface.deploy.inputs)];\n                case 1:\n                  params = _a.sent();\n                  params.push(overrides);\n                  unsignedTx = this.getDeployTransaction.apply(this, params);\n                  return [4, this.signer.sendTransaction(unsignedTx)];\n                case 2:\n                  tx = _a.sent();\n                  address = (0, properties_1.getStatic)(this.constructor, \"getContractAddress\")(tx);\n                  contract = (0, properties_1.getStatic)(this.constructor, \"getContract\")(address, this.interface, this.signer);\n                  addContractWait(contract, tx);\n                  (0, properties_1.defineReadOnly)(contract, \"deployTransaction\", tx);\n                  return [2, contract];\n              }\n            });\n          });\n        };\n        ContractFactory2.prototype.attach = function(address) {\n          return this.constructor.getContract(address, this.interface, this.signer);\n        };\n        ContractFactory2.prototype.connect = function(signer) {\n          return new this.constructor(this.interface, this.bytecode, signer);\n        };\n        ContractFactory2.fromSolidity = function(compilerOutput, signer) {\n          if (compilerOutput == null) {\n            logger.throwError(\"missing compiler output\", logger_1.Logger.errors.MISSING_ARGUMENT, { argument: \"compilerOutput\" });\n          }\n          if (typeof compilerOutput === \"string\") {\n            compilerOutput = JSON.parse(compilerOutput);\n          }\n          var abi = compilerOutput.abi;\n          var bytecode = null;\n          if (compilerOutput.bytecode) {\n            bytecode = compilerOutput.bytecode;\n          } else if (compilerOutput.evm && compilerOutput.evm.bytecode) {\n            bytecode = compilerOutput.evm.bytecode;\n          }\n          return new this(abi, bytecode, signer);\n        };\n        ContractFactory2.getInterface = function(contractInterface) {\n          return Contract.getInterface(contractInterface);\n        };\n        ContractFactory2.getContractAddress = function(tx) {\n          return (0, address_1.getContractAddress)(tx);\n        };\n        ContractFactory2.getContract = function(address, contractInterface, signer) {\n          return new Contract(address, contractInterface, signer);\n        };\n        return ContractFactory2;\n      }()\n    );\n    exports2.ContractFactory = ContractFactory;\n  }\n});\n\n// node_modules/@ethersproject/basex/lib/index.js\nvar require_lib17 = __commonJS({\n  \"node_modules/@ethersproject/basex/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Base58 = exports2.Base32 = exports2.BaseX = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var BaseX = (\n      /** @class */\n      function() {\n        function BaseX2(alphabet) {\n          (0, properties_1.defineReadOnly)(this, \"alphabet\", alphabet);\n          (0, properties_1.defineReadOnly)(this, \"base\", alphabet.length);\n          (0, properties_1.defineReadOnly)(this, \"_alphabetMap\", {});\n          (0, properties_1.defineReadOnly)(this, \"_leader\", alphabet.charAt(0));\n          for (var i = 0; i < alphabet.length; i++) {\n            this._alphabetMap[alphabet.charAt(i)] = i;\n          }\n        }\n        BaseX2.prototype.encode = function(value) {\n          var source = (0, bytes_1.arrayify)(value);\n          if (source.length === 0) {\n            return \"\";\n          }\n          var digits = [0];\n          for (var i = 0; i < source.length; ++i) {\n            var carry = source[i];\n            for (var j = 0; j < digits.length; ++j) {\n              carry += digits[j] << 8;\n              digits[j] = carry % this.base;\n              carry = carry / this.base | 0;\n            }\n            while (carry > 0) {\n              digits.push(carry % this.base);\n              carry = carry / this.base | 0;\n            }\n          }\n          var string = \"\";\n          for (var k = 0; source[k] === 0 && k < source.length - 1; ++k) {\n            string += this._leader;\n          }\n          for (var q = digits.length - 1; q >= 0; --q) {\n            string += this.alphabet[digits[q]];\n          }\n          return string;\n        };\n        BaseX2.prototype.decode = function(value) {\n          if (typeof value !== \"string\") {\n            throw new TypeError(\"Expected String\");\n          }\n          var bytes = [];\n          if (value.length === 0) {\n            return new Uint8Array(bytes);\n          }\n          bytes.push(0);\n          for (var i = 0; i < value.length; i++) {\n            var byte = this._alphabetMap[value[i]];\n            if (byte === void 0) {\n              throw new Error(\"Non-base\" + this.base + \" character\");\n            }\n            var carry = byte;\n            for (var j = 0; j < bytes.length; ++j) {\n              carry += bytes[j] * this.base;\n              bytes[j] = carry & 255;\n              carry >>= 8;\n            }\n            while (carry > 0) {\n              bytes.push(carry & 255);\n              carry >>= 8;\n            }\n          }\n          for (var k = 0; value[k] === this._leader && k < value.length - 1; ++k) {\n            bytes.push(0);\n          }\n          return (0, bytes_1.arrayify)(new Uint8Array(bytes.reverse()));\n        };\n        return BaseX2;\n      }()\n    );\n    exports2.BaseX = BaseX;\n    var Base32 = new BaseX(\"abcdefghijklmnopqrstuvwxyz234567\");\n    exports2.Base32 = Base32;\n    var Base58 = new BaseX(\"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\");\n    exports2.Base58 = Base58;\n  }\n});\n\n// node_modules/@ethersproject/pbkdf2/lib/pbkdf2.js\nvar require_pbkdf2 = __commonJS({\n  \"node_modules/@ethersproject/pbkdf2/lib/pbkdf2.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.pbkdf2 = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    function bufferify(value) {\n      return Buffer.from((0, bytes_1.arrayify)(value));\n    }\n    function pbkdf2(password, salt, iterations, keylen, hashAlgorithm) {\n      return (0, bytes_1.hexlify)((0, crypto_1.pbkdf2Sync)(bufferify(password), bufferify(salt), iterations, keylen, hashAlgorithm));\n    }\n    exports2.pbkdf2 = pbkdf2;\n  }\n});\n\n// node_modules/@ethersproject/pbkdf2/lib/index.js\nvar require_lib18 = __commonJS({\n  \"node_modules/@ethersproject/pbkdf2/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.pbkdf2 = void 0;\n    var pbkdf2_1 = require_pbkdf2();\n    Object.defineProperty(exports2, \"pbkdf2\", { enumerable: true, get: function() {\n      return pbkdf2_1.pbkdf2;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/types.js\nvar require_types = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/types.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.SupportedAlgorithm = void 0;\n    var SupportedAlgorithm;\n    (function(SupportedAlgorithm2) {\n      SupportedAlgorithm2[\"sha256\"] = \"sha256\";\n      SupportedAlgorithm2[\"sha512\"] = \"sha512\";\n    })(SupportedAlgorithm = exports2.SupportedAlgorithm || (exports2.SupportedAlgorithm = {}));\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/_version.js\nvar require_version15 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"sha2/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/sha2.js\nvar require_sha2 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/sha2.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.computeHmac = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    var types_1 = require_types();\n    var logger_1 = require_lib();\n    var _version_1 = require_version15();\n    var logger = new logger_1.Logger(_version_1.version);\n    function ripemd160(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"ripemd160\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.ripemd160 = ripemd160;\n    function sha256(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"sha256\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.sha256 = sha256;\n    function sha512(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"sha512\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.sha512 = sha512;\n    function computeHmac(algorithm, key, data) {\n      if (!types_1.SupportedAlgorithm[algorithm]) {\n        logger.throwError(\"unsupported algorithm - \" + algorithm, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          operation: \"computeHmac\",\n          algorithm\n        });\n      }\n      return \"0x\" + (0, crypto_1.createHmac)(algorithm, Buffer.from((0, bytes_1.arrayify)(key))).update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.computeHmac = computeHmac;\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/index.js\nvar require_lib19 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.SupportedAlgorithm = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = exports2.computeHmac = void 0;\n    var sha2_1 = require_sha2();\n    Object.defineProperty(exports2, \"computeHmac\", { enumerable: true, get: function() {\n      return sha2_1.computeHmac;\n    } });\n    Object.defineProperty(exports2, \"ripemd160\", { enumerable: true, get: function() {\n      return sha2_1.ripemd160;\n    } });\n    Object.defineProperty(exports2, \"sha256\", { enumerable: true, get: function() {\n      return sha2_1.sha256;\n    } });\n    Object.defineProperty(exports2, \"sha512\", { enumerable: true, get: function() {\n      return sha2_1.sha512;\n    } });\n    var types_1 = require_types();\n    Object.defineProperty(exports2, \"SupportedAlgorithm\", { enumerable: true, get: function() {\n      return types_1.SupportedAlgorithm;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/_version.js\nvar require_version16 = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"wordlists/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/wordlist.js\nvar require_wordlist = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/wordlist.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.logger = void 0;\n    var exportWordlist = false;\n    var hash_1 = require_lib10();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version16();\n    exports2.logger = new logger_1.Logger(_version_1.version);\n    var Wordlist = (\n      /** @class */\n      function() {\n        function Wordlist2(locale) {\n          var _newTarget = this.constructor;\n          exports2.logger.checkAbstract(_newTarget, Wordlist2);\n          (0, properties_1.defineReadOnly)(this, \"locale\", locale);\n        }\n        Wordlist2.prototype.split = function(mnemonic) {\n          return mnemonic.toLowerCase().split(/ +/g);\n        };\n        Wordlist2.prototype.join = function(words) {\n          return words.join(\" \");\n        };\n        Wordlist2.check = function(wordlist) {\n          var words = [];\n          for (var i = 0; i < 2048; i++) {\n            var word = wordlist.getWord(i);\n            if (i !== wordlist.getWordIndex(word)) {\n              return \"0x\";\n            }\n            words.push(word);\n          }\n          return (0, hash_1.id)(words.join(\"\\n\") + \"\\n\");\n        };\n        Wordlist2.register = function(lang, name2) {\n          if (!name2) {\n            name2 = lang.locale;\n          }\n          if (exportWordlist) {\n            try {\n              var anyGlobal = window;\n              if (anyGlobal._ethers && anyGlobal._ethers.wordlists) {\n                if (!anyGlobal._ethers.wordlists[name2]) {\n                  (0, properties_1.defineReadOnly)(anyGlobal._ethers.wordlists, name2, lang);\n                }\n              }\n            } catch (error) {\n            }\n          }\n        };\n        return Wordlist2;\n      }()\n    );\n    exports2.Wordlist = Wordlist;\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-cz.js\nvar require_lang_cz = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-cz.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langCz = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbdikaceAbecedaAdresaAgreseAkceAktovkaAlejAlkoholAmputaceAnanasAndulkaAnekdotaAnketaAntikaAnulovatArchaAroganceAsfaltAsistentAspiraceAstmaAstronomAtlasAtletikaAtolAutobusAzylBabkaBachorBacilBaculkaBadatelBagetaBagrBahnoBakterieBaladaBaletkaBalkonBalonekBalvanBalzaBambusBankomatBarbarBaretBarmanBarokoBarvaBaterkaBatohBavlnaBazalkaBazilikaBazukaBednaBeranBesedaBestieBetonBezinkaBezmocBeztakBicyklBidloBiftekBikinyBilanceBiografBiologBitvaBizonBlahobytBlatouchBlechaBleduleBleskBlikatBliznaBlokovatBlouditBludBobekBobrBodlinaBodnoutBohatostBojkotBojovatBokorysBolestBorecBoroviceBotaBoubelBouchatBoudaBouleBouratBoxerBradavkaBramboraBrankaBratrBreptaBriketaBrkoBrlohBronzBroskevBrunetkaBrusinkaBrzdaBrzyBublinaBubnovatBuchtaBuditelBudkaBudovaBufetBujarostBukviceBuldokBulvaBundaBunkrBurzaButikBuvolBuzolaBydletBylinaBytovkaBzukotCapartCarevnaCedrCeduleCejchCejnCelaCelerCelkemCelniceCeninaCennostCenovkaCentrumCenzorCestopisCetkaChalupaChapadloCharitaChataChechtatChemieChichotChirurgChladChlebaChlubitChmelChmuraChobotChocholChodbaCholeraChomoutChopitChorobaChovChrapotChrlitChrtChrupChtivostChudinaChutnatChvatChvilkaChvostChybaChystatChytitCibuleCigaretaCihelnaCihlaCinkotCirkusCisternaCitaceCitrusCizinecCizostClonaCokolivCouvatCtitelCtnostCudnostCuketaCukrCupotCvaknoutCvalCvikCvrkotCyklistaDalekoDarebaDatelDatumDceraDebataDechovkaDecibelDeficitDeflaceDeklDekretDemokratDepreseDerbyDeskaDetektivDikobrazDiktovatDiodaDiplomDiskDisplejDivadloDivochDlahaDlouhoDluhopisDnesDobroDobytekDocentDochutitDodnesDohledDohodaDohraDojemDojniceDokladDokolaDoktorDokumentDolarDolevaDolinaDomaDominantDomluvitDomovDonutitDopadDopisDoplnitDoposudDoprovodDopustitDorazitDorostDortDosahDoslovDostatekDosudDosytaDotazDotekDotknoutDoufatDoutnatDovozceDozaduDoznatDozorceDrahotaDrakDramatikDravecDrazeDrdolDrobnostDrogerieDrozdDrsnostDrtitDrzostDubenDuchovnoDudekDuhaDuhovkaDusitDusnoDutostDvojiceDvorecDynamitEkologEkonomieElektronElipsaEmailEmiseEmoceEmpatieEpizodaEpochaEpopejEposEsejEsenceEskortaEskymoEtiketaEuforieEvoluceExekuceExkurzeExpediceExplozeExportExtraktFackaFajfkaFakultaFanatikFantazieFarmacieFavoritFazoleFederaceFejetonFenkaFialkaFigurantFilozofFiltrFinanceFintaFixaceFjordFlanelFlirtFlotilaFondFosforFotbalFotkaFotonFrakceFreskaFrontaFukarFunkceFyzikaGalejeGarantGenetikaGeologGilotinaGlazuraGlejtGolemGolfistaGotikaGrafGramofonGranuleGrepGrilGrogGroteskaGumaHadiceHadrHalaHalenkaHanbaHanopisHarfaHarpunaHavranHebkostHejkalHejnoHejtmanHektarHelmaHematomHerecHernaHesloHezkyHistorikHladovkaHlasivkyHlavaHledatHlenHlodavecHlohHloupostHltatHlubinaHluchotaHmatHmotaHmyzHnisHnojivoHnoutHoblinaHobojHochHodinyHodlatHodnotaHodovatHojnostHokejHolinkaHolkaHolubHomoleHonitbaHonoraceHoralHordaHorizontHorkoHorlivecHormonHorninaHoroskopHorstvoHospodaHostinaHotovostHoubaHoufHoupatHouskaHovorHradbaHraniceHravostHrazdaHrbolekHrdinaHrdloHrdostHrnekHrobkaHromadaHrotHroudaHrozenHrstkaHrubostHryzatHubenostHubnoutHudbaHukotHumrHusitaHustotaHvozdHybnostHydrantHygienaHymnaHysterikIdylkaIhnedIkonaIluzeImunitaInfekceInflaceInkasoInovaceInspekceInternetInvalidaInvestorInzerceIronieJablkoJachtaJahodaJakmileJakostJalovecJantarJarmarkJaroJasanJasnoJatkaJavorJazykJedinecJedleJednatelJehlanJekotJelenJelitoJemnostJenomJepiceJeseterJevitJezdecJezeroJinakJindyJinochJiskraJistotaJitrniceJizvaJmenovatJogurtJurtaKabaretKabelKabinetKachnaKadetKadidloKahanKajakKajutaKakaoKaktusKalamitaKalhotyKalibrKalnostKameraKamkolivKamnaKanibalKanoeKantorKapalinaKapelaKapitolaKapkaKapleKapotaKaprKapustaKapybaraKaramelKarotkaKartonKasaKatalogKatedraKauceKauzaKavalecKazajkaKazetaKazivostKdekolivKdesiKedlubenKempKeramikaKinoKlacekKladivoKlamKlapotKlasikaKlaunKlecKlenbaKlepatKlesnoutKlidKlimaKlisnaKloboukKlokanKlopaKloubKlubovnaKlusatKluzkostKmenKmitatKmotrKnihaKnotKoaliceKoberecKobkaKoblihaKobylaKocourKohoutKojenecKokosKoktejlKolapsKoledaKolizeKoloKomandoKometaKomikKomnataKomoraKompasKomunitaKonatKonceptKondiceKonecKonfeseKongresKoninaKonkursKontaktKonzervaKopanecKopieKopnoutKoprovkaKorbelKorektorKormidloKoroptevKorpusKorunaKorytoKorzetKosatecKostkaKotelKotletaKotoulKoukatKoupelnaKousekKouzloKovbojKozaKozorohKrabiceKrachKrajinaKralovatKrasopisKravataKreditKrejcarKresbaKrevetaKriketKritikKrizeKrkavecKrmelecKrmivoKrocanKrokKronikaKropitKroupaKrovkaKrtekKruhadloKrupiceKrutostKrvinkaKrychleKryptaKrystalKrytKudlankaKufrKujnostKuklaKulajdaKulichKulkaKulometKulturaKunaKupodivuKurtKurzorKutilKvalitaKvasinkaKvestorKynologKyselinaKytaraKyticeKytkaKytovecKyvadloLabradorLachtanLadnostLaikLakomecLamelaLampaLanovkaLasiceLasoLasturaLatinkaLavinaLebkaLeckdyLedenLedniceLedovkaLedvinaLegendaLegieLegraceLehceLehkostLehnoutLektvarLenochodLentilkaLepenkaLepidloLetadloLetecLetmoLetokruhLevhartLevitaceLevobokLibraLichotkaLidojedLidskostLihovinaLijavecLilekLimetkaLinieLinkaLinoleumListopadLitinaLitovatLobistaLodivodLogikaLogopedLokalitaLoketLomcovatLopataLopuchLordLososLotrLoudalLouhLoukaLouskatLovecLstivostLucernaLuciferLumpLuskLustraceLviceLyraLyrikaLysinaMadamMadloMagistrMahagonMajetekMajitelMajoritaMakakMakoviceMakrelaMalbaMalinaMalovatMalviceMaminkaMandleMankoMarnostMasakrMaskotMasopustMaticeMatrikaMaturitaMazanecMazivoMazlitMazurkaMdlobaMechanikMeditaceMedovinaMelasaMelounMentolkaMetlaMetodaMetrMezeraMigraceMihnoutMihuleMikinaMikrofonMilenecMilimetrMilostMimikaMincovnaMinibarMinometMinulostMiskaMistrMixovatMladostMlhaMlhovinaMlokMlsatMluvitMnichMnohemMobilMocnostModelkaModlitbaMohylaMokroMolekulaMomentkaMonarchaMonoklMonstrumMontovatMonzunMosazMoskytMostMotivaceMotorkaMotykaMouchaMoudrostMozaikaMozekMozolMramorMravenecMrkevMrtvolaMrzetMrzutostMstitelMudrcMuflonMulatMumieMuniceMusetMutaceMuzeumMuzikantMyslivecMzdaNabouratNachytatNadaceNadbytekNadhozNadobroNadpisNahlasNahnatNahodileNahraditNaivitaNajednouNajistoNajmoutNaklonitNakonecNakrmitNalevoNamazatNamluvitNanometrNaokoNaopakNaostroNapadatNapevnoNaplnitNapnoutNaposledNaprostoNaroditNarubyNarychloNasaditNasekatNaslepoNastatNatolikNavenekNavrchNavzdoryNazvatNebeNechatNeckyNedalekoNedbatNeduhNegaceNehetNehodaNejenNejprveNeklidNelibostNemilostNemocNeochotaNeonkaNepokojNerostNervNesmyslNesouladNetvorNeuronNevinaNezvykleNicotaNijakNikamNikdyNiklNikterakNitroNoclehNohaviceNominaceNoraNorekNositelNosnostNouzeNovinyNovotaNozdraNudaNudleNugetNutitNutnostNutrieNymfaObalObarvitObavaObdivObecObehnatObejmoutObezitaObhajobaObilniceObjasnitObjektObklopitOblastOblekOblibaOblohaObludaObnosObohatitObojekOboutObrazecObrnaObrubaObrysObsahObsluhaObstaratObuvObvazObvinitObvodObvykleObyvatelObzorOcasOcelOcenitOchladitOchotaOchranaOcitnoutOdbojOdbytOdchodOdcizitOdebratOdeslatOdevzdatOdezvaOdhadceOdhoditOdjetOdjinudOdkazOdkoupitOdlivOdlukaOdmlkaOdolnostOdpadOdpisOdploutOdporOdpustitOdpykatOdrazkaOdsouditOdstupOdsunOdtokOdtudOdvahaOdvetaOdvolatOdvracetOdznakOfinaOfsajdOhlasOhniskoOhradaOhrozitOhryzekOkapOkeniceOklikaOknoOkouzlitOkovyOkrasaOkresOkrsekOkruhOkupantOkurkaOkusitOlejninaOlizovatOmakOmeletaOmezitOmladinaOmlouvatOmluvaOmylOnehdyOpakovatOpasekOperaceOpiceOpilostOpisovatOporaOpoziceOpravduOprotiOrbitalOrchestrOrgieOrliceOrlojOrtelOsadaOschnoutOsikaOsivoOslavaOslepitOslnitOslovitOsnovaOsobaOsolitOspalecOstenOstrahaOstudaOstychOsvojitOteplitOtiskOtopOtrhatOtrlostOtrokOtrubyOtvorOvanoutOvarOvesOvlivnitOvoceOxidOzdobaPachatelPacientPadouchPahorekPaktPalandaPalecPalivoPalubaPamfletPamlsekPanenkaPanikaPannaPanovatPanstvoPantoflePaprikaParketaParodiePartaParukaParybaPasekaPasivitaPastelkaPatentPatronaPavoukPaznehtPazourekPeckaPedagogPejsekPekloPelotonPenaltaPendrekPenzePeriskopPeroPestrostPetardaPeticePetrolejPevninaPexesoPianistaPihaPijavicePiklePiknikPilinaPilnostPilulkaPinzetaPipetaPisatelPistolePitevnaPivnicePivovarPlacentaPlakatPlamenPlanetaPlastikaPlatitPlavidloPlazPlechPlemenoPlentaPlesPletivoPlevelPlivatPlnitPlnoPlochaPlodinaPlombaPloutPlukPlynPobavitPobytPochodPocitPoctivecPodatPodcenitPodepsatPodhledPodivitPodkladPodmanitPodnikPodobaPodporaPodrazPodstataPodvodPodzimPoeziePohankaPohnutkaPohovorPohromaPohybPointaPojistkaPojmoutPokazitPoklesPokojPokrokPokutaPokynPolednePolibekPolknoutPolohaPolynomPomaluPominoutPomlkaPomocPomstaPomysletPonechatPonorkaPonurostPopadatPopelPopisekPoplachPoprositPopsatPopudPoradcePorcePorodPoruchaPoryvPosaditPosedPosilaPoskokPoslanecPosouditPospoluPostavaPosudekPosypPotahPotkanPotleskPotomekPotravaPotupaPotvoraPoukazPoutoPouzdroPovahaPovidlaPovlakPovozPovrchPovstatPovykPovzdechPozdravPozemekPoznatekPozorPozvatPracovatPrahoryPraktikaPralesPraotecPraporekPrasePravdaPrincipPrknoProbuditProcentoProdejProfeseProhraProjektProlomitPromilePronikatPropadProrokProsbaProtonProutekProvazPrskavkaPrstenPrudkostPrutPrvekPrvohoryPsanecPsovodPstruhPtactvoPubertaPuchPudlPukavecPuklinaPukrlePultPumpaPuncPupenPusaPusinkaPustinaPutovatPutykaPyramidaPyskPytelRacekRachotRadiaceRadniceRadonRaftRagbyRaketaRakovinaRamenoRampouchRandeRarachRaritaRasovnaRastrRatolestRazanceRazidloReagovatReakceReceptRedaktorReferentReflexRejnokReklamaRekordRekrutRektorReputaceRevizeRevmaRevolverRezervaRiskovatRizikoRobotikaRodokmenRohovkaRokleRokokoRomanetoRopovodRopuchaRorejsRosolRostlinaRotmistrRotopedRotundaRoubenkaRouchoRoupRouraRovinaRovniceRozborRozchodRozdatRozeznatRozhodceRozinkaRozjezdRozkazRozlohaRozmarRozpadRozruchRozsahRoztokRozumRozvodRubrikaRuchadloRukaviceRukopisRybaRybolovRychlostRydloRypadloRytinaRyzostSadistaSahatSakoSamecSamizdatSamotaSanitkaSardinkaSasankaSatelitSazbaSazeniceSborSchovatSebrankaSeceseSedadloSedimentSedloSehnatSejmoutSekeraSektaSekundaSekvojeSemenoSenoServisSesaditSeshoraSeskokSeslatSestraSesuvSesypatSetbaSetinaSetkatSetnoutSetrvatSeverSeznamShodaShrnoutSifonSilniceSirkaSirotekSirupSituaceSkafandrSkaliskoSkanzenSkautSkeptikSkicaSkladbaSkleniceSkloSkluzSkobaSkokanSkoroSkriptaSkrzSkupinaSkvostSkvrnaSlabikaSladidloSlaninaSlastSlavnostSledovatSlepecSlevaSlezinaSlibSlinaSlizniceSlonSloupekSlovoSluchSluhaSlunceSlupkaSlzaSmaragdSmetanaSmilstvoSmlouvaSmogSmradSmrkSmrtkaSmutekSmyslSnadSnahaSnobSobotaSochaSodovkaSokolSopkaSotvaSoubojSoucitSoudceSouhlasSouladSoumrakSoupravaSousedSoutokSouvisetSpalovnaSpasitelSpisSplavSpodekSpojenecSpoluSponzorSpornostSpoustaSprchaSpustitSrandaSrazSrdceSrnaSrnecSrovnatSrpenSrstSrubStaniceStarostaStatikaStavbaStehnoStezkaStodolaStolekStopaStornoStoupatStrachStresStrhnoutStromStrunaStudnaStupniceStvolStykSubjektSubtropySucharSudostSuknoSundatSunoutSurikataSurovinaSvahSvalstvoSvetrSvatbaSvazekSvisleSvitekSvobodaSvodidloSvorkaSvrabSykavkaSykotSynekSynovecSypatSypkostSyrovostSyselSytostTabletkaTabuleTahounTajemnoTajfunTajgaTajitTajnostTaktikaTamhleTamponTancovatTanecTankerTapetaTaveninaTazatelTechnikaTehdyTekutinaTelefonTemnotaTendenceTenistaTenorTeplotaTepnaTeprveTerapieTermoskaTextilTichoTiskopisTitulekTkadlecTkaninaTlapkaTleskatTlukotTlupaTmelToaletaTopinkaTopolTorzoTouhaToulecTradiceTraktorTrampTrasaTraverzaTrefitTrestTrezorTrhavinaTrhlinaTrochuTrojiceTroskaTroubaTrpceTrpitelTrpkostTrubecTruchlitTruhliceTrusTrvatTudyTuhnoutTuhostTundraTuristaTurnajTuzemskoTvarohTvorbaTvrdostTvrzTygrTykevUbohostUbozeUbratUbrousekUbrusUbytovnaUchoUctivostUdivitUhraditUjednatUjistitUjmoutUkazatelUklidnitUklonitUkotvitUkrojitUliceUlitaUlovitUmyvadloUnavitUniformaUniknoutUpadnoutUplatnitUplynoutUpoutatUpravitUranUrazitUsednoutUsilovatUsmrtitUsnadnitUsnoutUsouditUstlatUstrnoutUtahovatUtkatUtlumitUtonoutUtopenecUtrousitUvalitUvolnitUvozovkaUzdravitUzelUzeninaUzlinaUznatVagonValchaValounVanaVandalVanilkaVaranVarhanyVarovatVcelkuVchodVdovaVedroVegetaceVejceVelbloudVeletrhVelitelVelmocVelrybaVenkovVerandaVerzeVeselkaVeskrzeVesniceVespoduVestaVeterinaVeverkaVibraceVichrVideohraVidinaVidleVilaViniceVisetVitalitaVizeVizitkaVjezdVkladVkusVlajkaVlakVlasecVlevoVlhkostVlivVlnovkaVloupatVnucovatVnukVodaVodivostVodoznakVodstvoVojenskyVojnaVojskoVolantVolbaVolitVolnoVoskovkaVozidloVozovnaVpravoVrabecVracetVrahVrataVrbaVrcholekVrhatVrstvaVrtuleVsaditVstoupitVstupVtipVybavitVybratVychovatVydatVydraVyfotitVyhledatVyhnoutVyhoditVyhraditVyhubitVyjasnitVyjetVyjmoutVyklopitVykonatVylekatVymazatVymezitVymizetVymysletVynechatVynikatVynutitVypadatVyplatitVypravitVypustitVyrazitVyrovnatVyrvatVyslovitVysokoVystavitVysunoutVysypatVytasitVytesatVytratitVyvinoutVyvolatVyvrhelVyzdobitVyznatVzaduVzbuditVzchopitVzdorVzduchVzdychatVzestupVzhledemVzkazVzlykatVznikVzorekVzpouraVztahVztekXylofonZabratZabydletZachovatZadarmoZadusitZafoukatZahltitZahoditZahradaZahynoutZajatecZajetZajistitZaklepatZakoupitZalepitZamezitZamotatZamysletZanechatZanikatZaplatitZapojitZapsatZarazitZastavitZasunoutZatajitZatemnitZatknoutZaujmoutZavalitZaveletZavinitZavolatZavrtatZazvonitZbavitZbrusuZbudovatZbytekZdalekaZdarmaZdatnostZdivoZdobitZdrojZdvihZdymadloZeleninaZemanZeminaZeptatZezaduZezdolaZhatitZhltnoutZhlubokaZhotovitZhrubaZimaZimniceZjemnitZklamatZkoumatZkratkaZkumavkaZlatoZlehkaZlobaZlomZlostZlozvykZmapovatZmarZmatekZmijeZmizetZmocnitZmodratZmrzlinaZmutovatZnakZnalostZnamenatZnovuZobrazitZotavitZoubekZoufaleZploditZpomalitZpravaZprostitZprudkaZprvuZradaZranitZrcadloZrnitostZrnoZrovnaZrychlitZrzavostZtichaZtratitZubovinaZubrZvednoutZvenkuZveselaZvonZvratZvukovodZvyk\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x25f44555f4af25b51a711136e1c7d6e50ce9f8917d39d6b1f076b2bb4d2fac1a\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for en (English) FAILED\");\n      }\n    }\n    var LangCz = (\n      /** @class */\n      function(_super) {\n        __extends(LangCz2, _super);\n        function LangCz2() {\n          return _super.call(this, \"cz\") || this;\n        }\n        LangCz2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangCz2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangCz2;\n      }(wordlist_1.Wordlist)\n    );\n    var langCz = new LangCz();\n    exports2.langCz = langCz;\n    wordlist_1.Wordlist.register(langCz);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-en.js\nvar require_lang_en = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-en.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langEn = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbandonAbilityAbleAboutAboveAbsentAbsorbAbstractAbsurdAbuseAccessAccidentAccountAccuseAchieveAcidAcousticAcquireAcrossActActionActorActressActualAdaptAddAddictAddressAdjustAdmitAdultAdvanceAdviceAerobicAffairAffordAfraidAgainAgeAgentAgreeAheadAimAirAirportAisleAlarmAlbumAlcoholAlertAlienAllAlleyAllowAlmostAloneAlphaAlreadyAlsoAlterAlwaysAmateurAmazingAmongAmountAmusedAnalystAnchorAncientAngerAngleAngryAnimalAnkleAnnounceAnnualAnotherAnswerAntennaAntiqueAnxietyAnyApartApologyAppearAppleApproveAprilArchArcticAreaArenaArgueArmArmedArmorArmyAroundArrangeArrestArriveArrowArtArtefactArtistArtworkAskAspectAssaultAssetAssistAssumeAsthmaAthleteAtomAttackAttendAttitudeAttractAuctionAuditAugustAuntAuthorAutoAutumnAverageAvocadoAvoidAwakeAwareAwayAwesomeAwfulAwkwardAxisBabyBachelorBaconBadgeBagBalanceBalconyBallBambooBananaBannerBarBarelyBargainBarrelBaseBasicBasketBattleBeachBeanBeautyBecauseBecomeBeefBeforeBeginBehaveBehindBelieveBelowBeltBenchBenefitBestBetrayBetterBetweenBeyondBicycleBidBikeBindBiologyBirdBirthBitterBlackBladeBlameBlanketBlastBleakBlessBlindBloodBlossomBlouseBlueBlurBlushBoardBoatBodyBoilBombBoneBonusBookBoostBorderBoringBorrowBossBottomBounceBoxBoyBracketBrainBrandBrassBraveBreadBreezeBrickBridgeBriefBrightBringBriskBroccoliBrokenBronzeBroomBrotherBrownBrushBubbleBuddyBudgetBuffaloBuildBulbBulkBulletBundleBunkerBurdenBurgerBurstBusBusinessBusyButterBuyerBuzzCabbageCabinCableCactusCageCakeCallCalmCameraCampCanCanalCancelCandyCannonCanoeCanvasCanyonCapableCapitalCaptainCarCarbonCardCargoCarpetCarryCartCaseCashCasinoCastleCasualCatCatalogCatchCategoryCattleCaughtCauseCautionCaveCeilingCeleryCementCensusCenturyCerealCertainChairChalkChampionChangeChaosChapterChargeChaseChatCheapCheckCheeseChefCherryChestChickenChiefChildChimneyChoiceChooseChronicChuckleChunkChurnCigarCinnamonCircleCitizenCityCivilClaimClapClarifyClawClayCleanClerkCleverClickClientCliffClimbClinicClipClockClogCloseClothCloudClownClubClumpClusterClutchCoachCoastCoconutCodeCoffeeCoilCoinCollectColorColumnCombineComeComfortComicCommonCompanyConcertConductConfirmCongressConnectConsiderControlConvinceCookCoolCopperCopyCoralCoreCornCorrectCostCottonCouchCountryCoupleCourseCousinCoverCoyoteCrackCradleCraftCramCraneCrashCraterCrawlCrazyCreamCreditCreekCrewCricketCrimeCrispCriticCropCrossCrouchCrowdCrucialCruelCruiseCrumbleCrunchCrushCryCrystalCubeCultureCupCupboardCuriousCurrentCurtainCurveCushionCustomCuteCycleDadDamageDampDanceDangerDaringDashDaughterDawnDayDealDebateDebrisDecadeDecemberDecideDeclineDecorateDecreaseDeerDefenseDefineDefyDegreeDelayDeliverDemandDemiseDenialDentistDenyDepartDependDepositDepthDeputyDeriveDescribeDesertDesignDeskDespairDestroyDetailDetectDevelopDeviceDevoteDiagramDialDiamondDiaryDiceDieselDietDifferDigitalDignityDilemmaDinnerDinosaurDirectDirtDisagreeDiscoverDiseaseDishDismissDisorderDisplayDistanceDivertDivideDivorceDizzyDoctorDocumentDogDollDolphinDomainDonateDonkeyDonorDoorDoseDoubleDoveDraftDragonDramaDrasticDrawDreamDressDriftDrillDrinkDripDriveDropDrumDryDuckDumbDuneDuringDustDutchDutyDwarfDynamicEagerEagleEarlyEarnEarthEasilyEastEasyEchoEcologyEconomyEdgeEditEducateEffortEggEightEitherElbowElderElectricElegantElementElephantElevatorEliteElseEmbarkEmbodyEmbraceEmergeEmotionEmployEmpowerEmptyEnableEnactEndEndlessEndorseEnemyEnergyEnforceEngageEngineEnhanceEnjoyEnlistEnoughEnrichEnrollEnsureEnterEntireEntryEnvelopeEpisodeEqualEquipEraEraseErodeErosionErrorEruptEscapeEssayEssenceEstateEternalEthicsEvidenceEvilEvokeEvolveExactExampleExcessExchangeExciteExcludeExcuseExecuteExerciseExhaustExhibitExileExistExitExoticExpandExpectExpireExplainExposeExpressExtendExtraEyeEyebrowFabricFaceFacultyFadeFaintFaithFallFalseFameFamilyFamousFanFancyFantasyFarmFashionFatFatalFatherFatigueFaultFavoriteFeatureFebruaryFederalFeeFeedFeelFemaleFenceFestivalFetchFeverFewFiberFictionFieldFigureFileFilmFilterFinalFindFineFingerFinishFireFirmFirstFiscalFishFitFitnessFixFlagFlameFlashFlatFlavorFleeFlightFlipFloatFlockFloorFlowerFluidFlushFlyFoamFocusFogFoilFoldFollowFoodFootForceForestForgetForkFortuneForumForwardFossilFosterFoundFoxFragileFrameFrequentFreshFriendFringeFrogFrontFrostFrownFrozenFruitFuelFunFunnyFurnaceFuryFutureGadgetGainGalaxyGalleryGameGapGarageGarbageGardenGarlicGarmentGasGaspGateGatherGaugeGazeGeneralGeniusGenreGentleGenuineGestureGhostGiantGiftGiggleGingerGiraffeGirlGiveGladGlanceGlareGlassGlideGlimpseGlobeGloomGloryGloveGlowGlueGoatGoddessGoldGoodGooseGorillaGospelGossipGovernGownGrabGraceGrainGrantGrapeGrassGravityGreatGreenGridGriefGritGroceryGroupGrowGruntGuardGuessGuideGuiltGuitarGunGymHabitHairHalfHammerHamsterHandHappyHarborHardHarshHarvestHatHaveHawkHazardHeadHealthHeartHeavyHedgehogHeightHelloHelmetHelpHenHeroHiddenHighHillHintHipHireHistoryHobbyHockeyHoldHoleHolidayHollowHomeHoneyHoodHopeHornHorrorHorseHospitalHostHotelHourHoverHubHugeHumanHumbleHumorHundredHungryHuntHurdleHurryHurtHusbandHybridIceIconIdeaIdentifyIdleIgnoreIllIllegalIllnessImageImitateImmenseImmuneImpactImposeImproveImpulseInchIncludeIncomeIncreaseIndexIndicateIndoorIndustryInfantInflictInformInhaleInheritInitialInjectInjuryInmateInnerInnocentInputInquiryInsaneInsectInsideInspireInstallIntactInterestIntoInvestInviteInvolveIronIslandIsolateIssueItemIvoryJacketJaguarJarJazzJealousJeansJellyJewelJobJoinJokeJourneyJoyJudgeJuiceJumpJungleJuniorJunkJustKangarooKeenKeepKetchupKeyKickKidKidneyKindKingdomKissKitKitchenKiteKittenKiwiKneeKnifeKnockKnowLabLabelLaborLadderLadyLakeLampLanguageLaptopLargeLaterLatinLaughLaundryLavaLawLawnLawsuitLayerLazyLeaderLeafLearnLeaveLectureLeftLegLegalLegendLeisureLemonLendLengthLensLeopardLessonLetterLevelLiarLibertyLibraryLicenseLifeLiftLightLikeLimbLimitLinkLionLiquidListLittleLiveLizardLoadLoanLobsterLocalLockLogicLonelyLongLoopLotteryLoudLoungeLoveLoyalLuckyLuggageLumberLunarLunchLuxuryLyricsMachineMadMagicMagnetMaidMailMainMajorMakeMammalManManageMandateMangoMansionManualMapleMarbleMarchMarginMarineMarketMarriageMaskMassMasterMatchMaterialMathMatrixMatterMaximumMazeMeadowMeanMeasureMeatMechanicMedalMediaMelodyMeltMemberMemoryMentionMenuMercyMergeMeritMerryMeshMessageMetalMethodMiddleMidnightMilkMillionMimicMindMinimumMinorMinuteMiracleMirrorMiseryMissMistakeMixMixedMixtureMobileModelModifyMomMomentMonitorMonkeyMonsterMonthMoonMoralMoreMorningMosquitoMotherMotionMotorMountainMouseMoveMovieMuchMuffinMuleMultiplyMuscleMuseumMushroomMusicMustMutualMyselfMysteryMythNaiveNameNapkinNarrowNastyNationNatureNearNeckNeedNegativeNeglectNeitherNephewNerveNestNetNetworkNeutralNeverNewsNextNiceNightNobleNoiseNomineeNoodleNormalNorthNoseNotableNoteNothingNoticeNovelNowNuclearNumberNurseNutOakObeyObjectObligeObscureObserveObtainObviousOccurOceanOctoberOdorOffOfferOfficeOftenOilOkayOldOliveOlympicOmitOnceOneOnionOnlineOnlyOpenOperaOpinionOpposeOptionOrangeOrbitOrchardOrderOrdinaryOrganOrientOriginalOrphanOstrichOtherOutdoorOuterOutputOutsideOvalOvenOverOwnOwnerOxygenOysterOzonePactPaddlePagePairPalacePalmPandaPanelPanicPantherPaperParadeParentParkParrotPartyPassPatchPathPatientPatrolPatternPausePavePaymentPeacePeanutPearPeasantPelicanPenPenaltyPencilPeoplePepperPerfectPermitPersonPetPhonePhotoPhrasePhysicalPianoPicnicPicturePiecePigPigeonPillPilotPinkPioneerPipePistolPitchPizzaPlacePlanetPlasticPlatePlayPleasePledgePluckPlugPlungePoemPoetPointPolarPolePolicePondPonyPoolPopularPortionPositionPossiblePostPotatoPotteryPovertyPowderPowerPracticePraisePredictPreferPreparePresentPrettyPreventPricePridePrimaryPrintPriorityPrisonPrivatePrizeProblemProcessProduceProfitProgramProjectPromoteProofPropertyProsperProtectProudProvidePublicPuddingPullPulpPulsePumpkinPunchPupilPuppyPurchasePurityPurposePursePushPutPuzzlePyramidQualityQuantumQuarterQuestionQuickQuitQuizQuoteRabbitRaccoonRaceRackRadarRadioRailRainRaiseRallyRampRanchRandomRangeRapidRareRateRatherRavenRawRazorReadyRealReasonRebelRebuildRecallReceiveRecipeRecordRecycleReduceReflectReformRefuseRegionRegretRegularRejectRelaxReleaseReliefRelyRemainRememberRemindRemoveRenderRenewRentReopenRepairRepeatReplaceReportRequireRescueResembleResistResourceResponseResultRetireRetreatReturnReunionRevealReviewRewardRhythmRibRibbonRiceRichRideRidgeRifleRightRigidRingRiotRippleRiskRitualRivalRiverRoadRoastRobotRobustRocketRomanceRoofRookieRoomRoseRotateRoughRoundRouteRoyalRubberRudeRugRuleRunRunwayRuralSadSaddleSadnessSafeSailSaladSalmonSalonSaltSaluteSameSampleSandSatisfySatoshiSauceSausageSaveSayScaleScanScareScatterSceneSchemeSchoolScienceScissorsScorpionScoutScrapScreenScriptScrubSeaSearchSeasonSeatSecondSecretSectionSecuritySeedSeekSegmentSelectSellSeminarSeniorSenseSentenceSeriesServiceSessionSettleSetupSevenShadowShaftShallowShareShedShellSheriffShieldShiftShineShipShiverShockShoeShootShopShortShoulderShoveShrimpShrugShuffleShySiblingSickSideSiegeSightSignSilentSilkSillySilverSimilarSimpleSinceSingSirenSisterSituateSixSizeSkateSketchSkiSkillSkinSkirtSkullSlabSlamSleepSlenderSliceSlideSlightSlimSloganSlotSlowSlushSmallSmartSmileSmokeSmoothSnackSnakeSnapSniffSnowSoapSoccerSocialSockSodaSoftSolarSoldierSolidSolutionSolveSomeoneSongSoonSorrySortSoulSoundSoupSourceSouthSpaceSpareSpatialSpawnSpeakSpecialSpeedSpellSpendSphereSpiceSpiderSpikeSpinSpiritSplitSpoilSponsorSpoonSportSpotSpraySpreadSpringSpySquareSqueezeSquirrelStableStadiumStaffStageStairsStampStandStartStateStaySteakSteelStemStepStereoStickStillStingStockStomachStoneStoolStoryStoveStrategyStreetStrikeStrongStruggleStudentStuffStumbleStyleSubjectSubmitSubwaySuccessSuchSuddenSufferSugarSuggestSuitSummerSunSunnySunsetSuperSupplySupremeSureSurfaceSurgeSurpriseSurroundSurveySuspectSustainSwallowSwampSwapSwarmSwearSweetSwiftSwimSwingSwitchSwordSymbolSymptomSyrupSystemTableTackleTagTailTalentTalkTankTapeTargetTaskTasteTattooTaxiTeachTeamTellTenTenantTennisTentTermTestTextThankThatThemeThenTheoryThereTheyThingThisThoughtThreeThriveThrowThumbThunderTicketTideTigerTiltTimberTimeTinyTipTiredTissueTitleToastTobaccoTodayToddlerToeTogetherToiletTokenTomatoTomorrowToneTongueTonightToolToothTopTopicToppleTorchTornadoTortoiseTossTotalTouristTowardTowerTownToyTrackTradeTrafficTragicTrainTransferTrapTrashTravelTrayTreatTreeTrendTrialTribeTrickTriggerTrimTripTrophyTroubleTruckTrueTrulyTrumpetTrustTruthTryTubeTuitionTumbleTunaTunnelTurkeyTurnTurtleTwelveTwentyTwiceTwinTwistTwoTypeTypicalUglyUmbrellaUnableUnawareUncleUncoverUnderUndoUnfairUnfoldUnhappyUniformUniqueUnitUniverseUnknownUnlockUntilUnusualUnveilUpdateUpgradeUpholdUponUpperUpsetUrbanUrgeUsageUseUsedUsefulUselessUsualUtilityVacantVacuumVagueValidValleyValveVanVanishVaporVariousVastVaultVehicleVelvetVendorVentureVenueVerbVerifyVersionVeryVesselVeteranViableVibrantViciousVictoryVideoViewVillageVintageViolinVirtualVirusVisaVisitVisualVitalVividVocalVoiceVoidVolcanoVolumeVoteVoyageWageWagonWaitWalkWallWalnutWantWarfareWarmWarriorWashWaspWasteWaterWaveWayWealthWeaponWearWeaselWeatherWebWeddingWeekendWeirdWelcomeWestWetWhaleWhatWheatWheelWhenWhereWhipWhisperWideWidthWifeWildWillWinWindowWineWingWinkWinnerWinterWireWisdomWiseWishWitnessWolfWomanWonderWoodWoolWordWorkWorldWorryWorthWrapWreckWrestleWristWriteWrongYardYearYellowYouYoungYouthZebraZeroZoneZoo\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x3c8acc1e7b08d8e76f9fda015ef48dc8c710a73cb7e0f77b2c18a9b5a7adde60\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for en (English) FAILED\");\n      }\n    }\n    var LangEn = (\n      /** @class */\n      function(_super) {\n        __extends(LangEn2, _super);\n        function LangEn2() {\n          return _super.call(this, \"en\") || this;\n        }\n        LangEn2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangEn2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangEn2;\n      }(wordlist_1.Wordlist)\n    );\n    var langEn = new LangEn();\n    exports2.langEn = langEn;\n    wordlist_1.Wordlist.register(langEn);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-es.js\nvar require_lang_es = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-es.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langEs = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var words = \"A/bacoAbdomenAbejaAbiertoAbogadoAbonoAbortoAbrazoAbrirAbueloAbusoAcabarAcademiaAccesoAccio/nAceiteAcelgaAcentoAceptarA/cidoAclararAcne/AcogerAcosoActivoActoActrizActuarAcudirAcuerdoAcusarAdictoAdmitirAdoptarAdornoAduanaAdultoAe/reoAfectarAficio/nAfinarAfirmarA/gilAgitarAgoni/aAgostoAgotarAgregarAgrioAguaAgudoA/guilaAgujaAhogoAhorroAireAislarAjedrezAjenoAjusteAlacra/nAlambreAlarmaAlbaA/lbumAlcaldeAldeaAlegreAlejarAlertaAletaAlfilerAlgaAlgodo/nAliadoAlientoAlivioAlmaAlmejaAlmi/barAltarAltezaAltivoAltoAlturaAlumnoAlzarAmableAmanteAmapolaAmargoAmasarA/mbarA/mbitoAmenoAmigoAmistadAmorAmparoAmplioAnchoAncianoAnclaAndarAnde/nAnemiaA/nguloAnilloA/nimoAni/sAnotarAntenaAntiguoAntojoAnualAnularAnuncioA~adirA~ejoA~oApagarAparatoApetitoApioAplicarApodoAporteApoyoAprenderAprobarApuestaApuroAradoAra~aArarA/rbitroA/rbolArbustoArchivoArcoArderArdillaArduoA/reaA/ridoAriesArmoni/aArne/sAromaArpaArpo/nArregloArrozArrugaArteArtistaAsaAsadoAsaltoAscensoAsegurarAseoAsesorAsientoAsiloAsistirAsnoAsombroA/speroAstillaAstroAstutoAsumirAsuntoAtajoAtaqueAtarAtentoAteoA/ticoAtletaA/tomoAtraerAtrozAtu/nAudazAudioAugeAulaAumentoAusenteAutorAvalAvanceAvaroAveAvellanaAvenaAvestruzAvio/nAvisoAyerAyudaAyunoAzafra/nAzarAzoteAzu/carAzufreAzulBabaBaborBacheBahi/aBaileBajarBalanzaBalco/nBaldeBambu/BancoBandaBa~oBarbaBarcoBarnizBarroBa/sculaBasto/nBasuraBatallaBateri/aBatirBatutaBau/lBazarBebe/BebidaBelloBesarBesoBestiaBichoBienBingoBlancoBloqueBlusaBoaBobinaBoboBocaBocinaBodaBodegaBoinaBolaBoleroBolsaBombaBondadBonitoBonoBonsa/iBordeBorrarBosqueBoteBoti/nBo/vedaBozalBravoBrazoBrechaBreveBrilloBrincoBrisaBrocaBromaBronceBroteBrujaBruscoBrutoBuceoBucleBuenoBueyBufandaBufo/nBu/hoBuitreBultoBurbujaBurlaBurroBuscarButacaBuzo/nCaballoCabezaCabinaCabraCacaoCada/verCadenaCaerCafe/Cai/daCaima/nCajaCajo/nCalCalamarCalcioCaldoCalidadCalleCalmaCalorCalvoCamaCambioCamelloCaminoCampoCa/ncerCandilCanelaCanguroCanicaCantoCa~aCa~o/nCaobaCaosCapazCapita/nCapoteCaptarCapuchaCaraCarbo/nCa/rcelCaretaCargaCari~oCarneCarpetaCarroCartaCasaCascoCaseroCaspaCastorCatorceCatreCaudalCausaCazoCebollaCederCedroCeldaCe/lebreCelosoCe/lulaCementoCenizaCentroCercaCerdoCerezaCeroCerrarCertezaCe/spedCetroChacalChalecoChampu/ChanclaChapaCharlaChicoChisteChivoChoqueChozaChuletaChuparCiclo/nCiegoCieloCienCiertoCifraCigarroCimaCincoCineCintaCipre/sCircoCiruelaCisneCitaCiudadClamorClanClaroClaseClaveClienteClimaCli/nicaCobreCoccio/nCochinoCocinaCocoCo/digoCodoCofreCogerCoheteCoji/nCojoColaColchaColegioColgarColinaCollarColmoColumnaCombateComerComidaCo/modoCompraCondeConejoCongaConocerConsejoContarCopaCopiaCorazo/nCorbataCorchoCordo/nCoronaCorrerCoserCosmosCostaCra/neoCra/terCrearCrecerCrei/doCremaCri/aCrimenCriptaCrisisCromoCro/nicaCroquetaCrudoCruzCuadroCuartoCuatroCuboCubrirCucharaCuelloCuentoCuerdaCuestaCuevaCuidarCulebraCulpaCultoCumbreCumplirCunaCunetaCuotaCupo/nCu/pulaCurarCuriosoCursoCurvaCutisDamaDanzaDarDardoDa/tilDeberDe/bilDe/cadaDecirDedoDefensaDefinirDejarDelfi/nDelgadoDelitoDemoraDensoDentalDeporteDerechoDerrotaDesayunoDeseoDesfileDesnudoDestinoDesvi/oDetalleDetenerDeudaDi/aDiabloDiademaDiamanteDianaDiarioDibujoDictarDienteDietaDiezDifi/cilDignoDilemaDiluirDineroDirectoDirigirDiscoDise~oDisfrazDivaDivinoDobleDoceDolorDomingoDonDonarDoradoDormirDorsoDosDosisDrago/nDrogaDuchaDudaDueloDue~oDulceDu/oDuqueDurarDurezaDuroE/banoEbrioEcharEcoEcuadorEdadEdicio/nEdificioEditorEducarEfectoEficazEjeEjemploElefanteElegirElementoElevarElipseE/liteElixirElogioEludirEmbudoEmitirEmocio/nEmpateEmpe~oEmpleoEmpresaEnanoEncargoEnchufeEnci/aEnemigoEneroEnfadoEnfermoEnga~oEnigmaEnlaceEnormeEnredoEnsayoEnse~arEnteroEntrarEnvaseEnvi/oE/pocaEquipoErizoEscalaEscenaEscolarEscribirEscudoEsenciaEsferaEsfuerzoEspadaEspejoEspi/aEsposaEspumaEsqui/EstarEsteEstiloEstufaEtapaEternoE/ticaEtniaEvadirEvaluarEventoEvitarExactoExamenExcesoExcusaExentoExigirExilioExistirE/xitoExpertoExplicarExponerExtremoFa/bricaFa/bulaFachadaFa/cilFactorFaenaFajaFaldaFalloFalsoFaltarFamaFamiliaFamosoFarao/nFarmaciaFarolFarsaFaseFatigaFaunaFavorFaxFebreroFechaFelizFeoFeriaFerozFe/rtilFervorFesti/nFiableFianzaFiarFibraFiccio/nFichaFideoFiebreFielFieraFiestaFiguraFijarFijoFilaFileteFilialFiltroFinFincaFingirFinitoFirmaFlacoFlautaFlechaFlorFlotaFluirFlujoFlu/orFobiaFocaFogataFogo/nFolioFolletoFondoFormaForroFortunaForzarFosaFotoFracasoFra/gilFranjaFraseFraudeFrei/rFrenoFresaFri/oFritoFrutaFuegoFuenteFuerzaFugaFumarFuncio/nFundaFurgo/nFuriaFusilFu/tbolFuturoGacelaGafasGaitaGajoGalaGaleri/aGalloGambaGanarGanchoGangaGansoGarajeGarzaGasolinaGastarGatoGavila/nGemeloGemirGenGe/neroGenioGenteGeranioGerenteGermenGestoGiganteGimnasioGirarGiroGlaciarGloboGloriaGolGolfoGolosoGolpeGomaGordoGorilaGorraGotaGoteoGozarGradaGra/ficoGranoGrasaGratisGraveGrietaGrilloGripeGrisGritoGrosorGru/aGruesoGrumoGrupoGuanteGuapoGuardiaGuerraGui/aGui~oGuionGuisoGuitarraGusanoGustarHaberHa/bilHablarHacerHachaHadaHallarHamacaHarinaHazHaza~aHebillaHebraHechoHeladoHelioHembraHerirHermanoHe/roeHervirHieloHierroHi/gadoHigieneHijoHimnoHistoriaHocicoHogarHogueraHojaHombreHongoHonorHonraHoraHormigaHornoHostilHoyoHuecoHuelgaHuertaHuesoHuevoHuidaHuirHumanoHu/medoHumildeHumoHundirHuraca/nHurtoIconoIdealIdiomaI/doloIglesiaIglu/IgualIlegalIlusio/nImagenIma/nImitarImparImperioImponerImpulsoIncapazI/ndiceInerteInfielInformeIngenioInicioInmensoInmuneInnatoInsectoInstanteIntere/sI/ntimoIntuirInu/tilInviernoIraIrisIroni/aIslaIsloteJabali/Jabo/nJamo/nJarabeJardi/nJarraJaulaJazmi/nJefeJeringaJineteJornadaJorobaJovenJoyaJuergaJuevesJuezJugadorJugoJugueteJuicioJuncoJunglaJunioJuntarJu/piterJurarJustoJuvenilJuzgarKiloKoalaLabioLacioLacraLadoLadro/nLagartoLa/grimaLagunaLaicoLamerLa/minaLa/mparaLanaLanchaLangostaLanzaLa/pizLargoLarvaLa/stimaLataLa/texLatirLaurelLavarLazoLealLeccio/nLecheLectorLeerLegio/nLegumbreLejanoLenguaLentoLe~aLeo/nLeopardoLesio/nLetalLetraLeveLeyendaLibertadLibroLicorLi/derLidiarLienzoLigaLigeroLimaLi/miteLimo/nLimpioLinceLindoLi/neaLingoteLinoLinternaLi/quidoLisoListaLiteraLitioLitroLlagaLlamaLlantoLlaveLlegarLlenarLlevarLlorarLloverLluviaLoboLocio/nLocoLocuraLo/gicaLogroLombrizLomoLonjaLoteLuchaLucirLugarLujoLunaLunesLupaLustroLutoLuzMacetaMachoMaderaMadreMaduroMaestroMafiaMagiaMagoMai/zMaldadMaletaMallaMaloMama/MamboMamutMancoMandoManejarMangaManiqui/ManjarManoMansoMantaMa~anaMapaMa/quinaMarMarcoMareaMarfilMargenMaridoMa/rmolMarro/nMartesMarzoMasaMa/scaraMasivoMatarMateriaMatizMatrizMa/ximoMayorMazorcaMechaMedallaMedioMe/dulaMejillaMejorMelenaMelo/nMemoriaMenorMensajeMenteMenu/MercadoMerengueMe/ritoMesMeso/nMetaMeterMe/todoMetroMezclaMiedoMielMiembroMigaMilMilagroMilitarMillo/nMimoMinaMineroMi/nimoMinutoMiopeMirarMisaMiseriaMisilMismoMitadMitoMochilaMocio/nModaModeloMohoMojarMoldeMolerMolinoMomentoMomiaMonarcaMonedaMonjaMontoMo~oMoradaMorderMorenoMorirMorroMorsaMortalMoscaMostrarMotivoMoverMo/vilMozoMuchoMudarMuebleMuelaMuerteMuestraMugreMujerMulaMuletaMultaMundoMu~ecaMuralMuroMu/sculoMuseoMusgoMu/sicaMusloNa/carNacio/nNadarNaipeNaranjaNarizNarrarNasalNatalNativoNaturalNa/useaNavalNaveNavidadNecioNe/ctarNegarNegocioNegroNeo/nNervioNetoNeutroNevarNeveraNichoNidoNieblaNietoNi~ezNi~oNi/tidoNivelNoblezaNocheNo/minaNoriaNormaNorteNotaNoticiaNovatoNovelaNovioNubeNucaNu/cleoNudilloNudoNueraNueveNuezNuloNu/meroNutriaOasisObesoObispoObjetoObraObreroObservarObtenerObvioOcaOcasoOce/anoOchentaOchoOcioOcreOctavoOctubreOcultoOcuparOcurrirOdiarOdioOdiseaOesteOfensaOfertaOficioOfrecerOgroOi/doOi/rOjoOlaOleadaOlfatoOlivoOllaOlmoOlorOlvidoOmbligoOndaOnzaOpacoOpcio/nO/peraOpinarOponerOptarO/pticaOpuestoOracio/nOradorOralO/rbitaOrcaOrdenOrejaO/rganoOrgi/aOrgulloOrienteOrigenOrillaOroOrquestaOrugaOsadi/aOscuroOseznoOsoOstraOto~oOtroOvejaO/vuloO/xidoOxi/genoOyenteOzonoPactoPadrePaellaPa/ginaPagoPai/sPa/jaroPalabraPalcoPaletaPa/lidoPalmaPalomaPalparPanPanalPa/nicoPanteraPa~ueloPapa/PapelPapillaPaquetePararParcelaParedParirParoPa/rpadoParquePa/rrafoPartePasarPaseoPasio/nPasoPastaPataPatioPatriaPausaPautaPavoPayasoPeato/nPecadoPeceraPechoPedalPedirPegarPeinePelarPelda~oPeleaPeligroPellejoPeloPelucaPenaPensarPe~o/nPeo/nPeorPepinoPeque~oPeraPerchaPerderPerezaPerfilPericoPerlaPermisoPerroPersonaPesaPescaPe/simoPesta~aPe/taloPetro/leoPezPezu~aPicarPicho/nPiePiedraPiernaPiezaPijamaPilarPilotoPimientaPinoPintorPinzaPi~aPiojoPipaPirataPisarPiscinaPisoPistaPito/nPizcaPlacaPlanPlataPlayaPlazaPleitoPlenoPlomoPlumaPluralPobrePocoPoderPodioPoemaPoesi/aPoetaPolenPolici/aPolloPolvoPomadaPomeloPomoPompaPonerPorcio/nPortalPosadaPoseerPosiblePostePotenciaPotroPozoPradoPrecozPreguntaPremioPrensaPresoPrevioPrimoPri/ncipePrisio/nPrivarProaProbarProcesoProductoProezaProfesorProgramaProlePromesaProntoPropioPro/ximoPruebaPu/blicoPucheroPudorPuebloPuertaPuestoPulgaPulirPulmo/nPulpoPulsoPumaPuntoPu~alPu~oPupaPupilaPure/QuedarQuejaQuemarQuererQuesoQuietoQui/micaQuinceQuitarRa/banoRabiaRaboRacio/nRadicalRai/zRamaRampaRanchoRangoRapazRa/pidoRaptoRasgoRaspaRatoRayoRazaRazo/nReaccio/nRealidadReba~oReboteRecaerRecetaRechazoRecogerRecreoRectoRecursoRedRedondoReducirReflejoReformaRefra/nRefugioRegaloRegirReglaRegresoRehe/nReinoRei/rRejaRelatoRelevoRelieveRellenoRelojRemarRemedioRemoRencorRendirRentaRepartoRepetirReposoReptilResRescateResinaRespetoRestoResumenRetiroRetornoRetratoReunirReve/sRevistaReyRezarRicoRiegoRiendaRiesgoRifaRi/gidoRigorRinco/nRi~o/nRi/oRiquezaRisaRitmoRitoRizoRobleRoceRociarRodarRodeoRodillaRoerRojizoRojoRomeroRomperRonRoncoRondaRopaRoperoRosaRoscaRostroRotarRubi/RuborRudoRuedaRugirRuidoRuinaRuletaRuloRumboRumorRupturaRutaRutinaSa/badoSaberSabioSableSacarSagazSagradoSalaSaldoSaleroSalirSalmo/nSalo/nSalsaSaltoSaludSalvarSambaSancio/nSandi/aSanearSangreSanidadSanoSantoSapoSaqueSardinaSarte/nSastreSata/nSaunaSaxofo/nSeccio/nSecoSecretoSectaSedSeguirSeisSelloSelvaSemanaSemillaSendaSensorSe~alSe~orSepararSepiaSequi/aSerSerieSermo/nServirSesentaSesio/nSetaSetentaSeveroSexoSextoSidraSiestaSieteSigloSignoSi/labaSilbarSilencioSillaSi/mboloSimioSirenaSistemaSitioSituarSobreSocioSodioSolSolapaSoldadoSoledadSo/lidoSoltarSolucio/nSombraSondeoSonidoSonoroSonrisaSopaSoplarSoporteSordoSorpresaSorteoSoste/nSo/tanoSuaveSubirSucesoSudorSuegraSueloSue~oSuerteSufrirSujetoSulta/nSumarSuperarSuplirSuponerSupremoSurSurcoSure~oSurgirSustoSutilTabacoTabiqueTablaTabu/TacoTactoTajoTalarTalcoTalentoTallaTalo/nTama~oTamborTangoTanqueTapaTapeteTapiaTapo/nTaquillaTardeTareaTarifaTarjetaTarotTarroTartaTatuajeTauroTazaTazo/nTeatroTechoTeclaTe/cnicaTejadoTejerTejidoTelaTele/fonoTemaTemorTemploTenazTenderTenerTenisTensoTeori/aTerapiaTercoTe/rminoTernuraTerrorTesisTesoroTestigoTeteraTextoTezTibioTiburo/nTiempoTiendaTierraTiesoTigreTijeraTildeTimbreTi/midoTimoTintaTi/oTi/picoTipoTiraTiro/nTita/nTi/tereTi/tuloTizaToallaTobilloTocarTocinoTodoTogaToldoTomarTonoTontoToparTopeToqueTo/raxToreroTormentaTorneoToroTorpedoTorreTorsoTortugaTosToscoToserTo/xicoTrabajoTractorTraerTra/ficoTragoTrajeTramoTranceTratoTraumaTrazarTre/bolTreguaTreintaTrenTreparTresTribuTrigoTripaTristeTriunfoTrofeoTrompaTroncoTropaTroteTrozoTrucoTruenoTrufaTuberi/aTuboTuertoTumbaTumorTu/nelTu/nicaTurbinaTurismoTurnoTutorUbicarU/lceraUmbralUnidadUnirUniversoUnoUntarU~aUrbanoUrbeUrgenteUrnaUsarUsuarioU/tilUtopi/aUvaVacaVaci/oVacunaVagarVagoVainaVajillaValeVa/lidoValleValorVa/lvulaVampiroVaraVariarVaro/nVasoVecinoVectorVehi/culoVeinteVejezVelaVeleroVelozVenaVencerVendaVenenoVengarVenirVentaVenusVerVeranoVerboVerdeVeredaVerjaVersoVerterVi/aViajeVibrarVicioVi/ctimaVidaVi/deoVidrioViejoViernesVigorVilVillaVinagreVinoVi~edoVioli/nViralVirgoVirtudVisorVi/speraVistaVitaminaViudoVivazViveroVivirVivoVolca/nVolumenVolverVorazVotarVotoVozVueloVulgarYacerYateYeguaYemaYernoYesoYodoYogaYogurZafiroZanjaZapatoZarzaZonaZorroZumoZurdo\";\n    var lookup = {};\n    var wordlist = null;\n    function dropDiacritic(word) {\n      wordlist_1.logger.checkNormalize();\n      return (0, strings_1.toUtf8String)(Array.prototype.filter.call((0, strings_1.toUtf8Bytes)(word.normalize(\"NFD\").toLowerCase()), function(c) {\n        return c >= 65 && c <= 90 || c >= 97 && c <= 123;\n      }));\n    }\n    function expand(word) {\n      var output = [];\n      Array.prototype.forEach.call((0, strings_1.toUtf8Bytes)(word), function(c) {\n        if (c === 47) {\n          output.push(204);\n          output.push(129);\n        } else if (c === 126) {\n          output.push(110);\n          output.push(204);\n          output.push(131);\n        } else {\n          output.push(c);\n        }\n      });\n      return (0, strings_1.toUtf8String)(output);\n    }\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \").map(function(w) {\n        return expand(w);\n      });\n      wordlist.forEach(function(word, index) {\n        lookup[dropDiacritic(word)] = index;\n      });\n      if (wordlist_1.Wordlist.check(lang) !== \"0xf74fb7092aeacdfbf8959557de22098da512207fb9f109cb526994938cf40300\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for es (Spanish) FAILED\");\n      }\n    }\n    var LangEs = (\n      /** @class */\n      function(_super) {\n        __extends(LangEs2, _super);\n        function LangEs2() {\n          return _super.call(this, \"es\") || this;\n        }\n        LangEs2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangEs2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return lookup[dropDiacritic(word)];\n        };\n        return LangEs2;\n      }(wordlist_1.Wordlist)\n    );\n    var langEs = new LangEs();\n    exports2.langEs = langEs;\n    wordlist_1.Wordlist.register(langEs);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-fr.js\nvar require_lang_fr = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-fr.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langFr = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var words = \"AbaisserAbandonAbdiquerAbeilleAbolirAborderAboutirAboyerAbrasifAbreuverAbriterAbrogerAbruptAbsenceAbsoluAbsurdeAbusifAbyssalAcade/mieAcajouAcarienAccablerAccepterAcclamerAccoladeAccrocheAccuserAcerbeAchatAcheterAcidulerAcierAcompteAcque/rirAcronymeActeurActifActuelAdepteAde/quatAdhe/sifAdjectifAdjugerAdmettreAdmirerAdopterAdorerAdoucirAdresseAdroitAdulteAdverbeAe/rerAe/ronefAffaireAffecterAfficheAffreuxAffublerAgacerAgencerAgileAgiterAgraferAgre/ableAgrumeAiderAiguilleAilierAimableAisanceAjouterAjusterAlarmerAlchimieAlerteAlge-breAlgueAlie/nerAlimentAlle/gerAlliageAllouerAllumerAlourdirAlpagaAltesseAlve/oleAmateurAmbiguAmbreAme/nagerAmertumeAmidonAmiralAmorcerAmourAmovibleAmphibieAmpleurAmusantAnalyseAnaphoreAnarchieAnatomieAncienAne/antirAngleAngoisseAnguleuxAnimalAnnexerAnnonceAnnuelAnodinAnomalieAnonymeAnormalAntenneAntidoteAnxieuxApaiserApe/ritifAplanirApologieAppareilAppelerApporterAppuyerAquariumAqueducArbitreArbusteArdeurArdoiseArgentArlequinArmatureArmementArmoireArmureArpenterArracherArriverArroserArsenicArte/rielArticleAspectAsphalteAspirerAssautAsservirAssietteAssocierAssurerAsticotAstreAstuceAtelierAtomeAtriumAtroceAttaqueAttentifAttirerAttraperAubaineAubergeAudaceAudibleAugurerAuroreAutomneAutrucheAvalerAvancerAvariceAvenirAverseAveugleAviateurAvideAvionAviserAvoineAvouerAvrilAxialAxiomeBadgeBafouerBagageBaguetteBaignadeBalancerBalconBaleineBalisageBambinBancaireBandageBanlieueBannie-reBanquierBarbierBarilBaronBarqueBarrageBassinBastionBatailleBateauBatterieBaudrierBavarderBeletteBe/lierBeloteBe/ne/ficeBerceauBergerBerlineBermudaBesaceBesogneBe/tailBeurreBiberonBicycleBiduleBijouBilanBilingueBillardBinaireBiologieBiopsieBiotypeBiscuitBisonBistouriBitumeBizarreBlafardBlagueBlanchirBlessantBlinderBlondBloquerBlousonBobardBobineBoireBoiserBolideBonbonBondirBonheurBonifierBonusBordureBorneBotteBoucleBoueuxBougieBoulonBouquinBourseBoussoleBoutiqueBoxeurBrancheBrasierBraveBrebisBre-cheBreuvageBricolerBrigadeBrillantBriocheBriqueBrochureBroderBronzerBrousseBroyeurBrumeBrusqueBrutalBruyantBuffleBuissonBulletinBureauBurinBustierButinerButoirBuvableBuvetteCabanonCabineCachetteCadeauCadreCafe/ineCaillouCaissonCalculerCalepinCalibreCalmerCalomnieCalvaireCamaradeCame/raCamionCampagneCanalCanetonCanonCantineCanularCapableCaporalCapriceCapsuleCapterCapucheCarabineCarboneCaresserCaribouCarnageCarotteCarreauCartonCascadeCasierCasqueCassureCauserCautionCavalierCaverneCaviarCe/dilleCeintureCe/lesteCelluleCendrierCensurerCentralCercleCe/re/bralCeriseCernerCerveauCesserChagrinChaiseChaleurChambreChanceChapitreCharbonChasseurChatonChaussonChavirerChemiseChenilleChe/quierChercherChevalChienChiffreChignonChime-reChiotChlorureChocolatChoisirChoseChouetteChromeChuteCigareCigogneCimenterCine/maCintrerCirculerCirerCirqueCiterneCitoyenCitronCivilClaironClameurClaquerClasseClavierClientClignerClimatClivageClocheClonageCloporteCobaltCobraCocasseCocotierCoderCodifierCoffreCognerCohe/sionCoifferCoincerCole-reColibriCollineColmaterColonelCombatCome/dieCommandeCompactConcertConduireConfierCongelerConnoterConsonneContactConvexeCopainCopieCorailCorbeauCordageCornicheCorpusCorrectCorte-geCosmiqueCostumeCotonCoudeCoupureCourageCouteauCouvrirCoyoteCrabeCrainteCravateCrayonCre/atureCre/diterCre/meuxCreuserCrevetteCriblerCrierCristalCrite-reCroireCroquerCrotaleCrucialCruelCrypterCubiqueCueillirCuille-reCuisineCuivreCulminerCultiverCumulerCupideCuratifCurseurCyanureCycleCylindreCyniqueDaignerDamierDangerDanseurDauphinDe/battreDe/biterDe/borderDe/briderDe/butantDe/calerDe/cembreDe/chirerDe/ciderDe/clarerDe/corerDe/crireDe/cuplerDe/daleDe/ductifDe/esseDe/fensifDe/filerDe/frayerDe/gagerDe/givrerDe/glutirDe/graferDe/jeunerDe/liceDe/logerDemanderDemeurerDe/molirDe/nicherDe/nouerDentelleDe/nuderDe/partDe/penserDe/phaserDe/placerDe/poserDe/rangerDe/roberDe/sastreDescenteDe/sertDe/signerDe/sobe/irDessinerDestrierDe/tacherDe/testerDe/tourerDe/tresseDevancerDevenirDevinerDevoirDiableDialogueDiamantDicterDiffe/rerDige/rerDigitalDigneDiluerDimancheDiminuerDioxydeDirectifDirigerDiscuterDisposerDissiperDistanceDivertirDiviserDocileDocteurDogmeDoigtDomaineDomicileDompterDonateurDonjonDonnerDopamineDortoirDorureDosageDoseurDossierDotationDouanierDoubleDouceurDouterDoyenDragonDraperDresserDribblerDroitureDuperieDuplexeDurableDurcirDynastieE/blouirE/carterE/charpeE/chelleE/clairerE/clipseE/cloreE/cluseE/coleE/conomieE/corceE/couterE/craserE/cre/merE/crivainE/crouE/cumeE/cureuilE/difierE/duquerEffacerEffectifEffigieEffortEffrayerEffusionE/galiserE/garerE/jecterE/laborerE/largirE/lectronE/le/gantE/le/phantE/le-veE/ligibleE/litismeE/logeE/luciderE/luderEmballerEmbellirEmbryonE/meraudeE/missionEmmenerE/motionE/mouvoirEmpereurEmployerEmporterEmpriseE/mulsionEncadrerEnche-reEnclaveEncocheEndiguerEndosserEndroitEnduireE/nergieEnfanceEnfermerEnfouirEngagerEnginEngloberE/nigmeEnjamberEnjeuEnleverEnnemiEnnuyeuxEnrichirEnrobageEnseigneEntasserEntendreEntierEntourerEntraverE/nume/rerEnvahirEnviableEnvoyerEnzymeE/olienE/paissirE/pargneE/patantE/pauleE/picerieE/pide/mieE/pierE/pilogueE/pineE/pisodeE/pitapheE/poqueE/preuveE/prouverE/puisantE/querreE/quipeE/rigerE/rosionErreurE/ruptionEscalierEspadonEspe-ceEspie-gleEspoirEspritEsquiverEssayerEssenceEssieuEssorerEstimeEstomacEstradeE/tage-reE/talerE/tancheE/tatiqueE/teindreE/tendoirE/ternelE/thanolE/thiqueEthnieE/tirerE/tofferE/toileE/tonnantE/tourdirE/trangeE/troitE/tudeEuphorieE/valuerE/vasionE/ventailE/videnceE/viterE/volutifE/voquerExactExage/rerExaucerExcellerExcitantExclusifExcuseExe/cuterExempleExercerExhalerExhorterExigenceExilerExisterExotiqueExpe/dierExplorerExposerExprimerExquisExtensifExtraireExulterFableFabuleuxFacetteFacileFactureFaiblirFalaiseFameuxFamilleFarceurFarfeluFarineFaroucheFascinerFatalFatigueFauconFautifFaveurFavoriFe/brileFe/conderFe/de/rerFe/linFemmeFe/murFendoirFe/odalFermerFe/roceFerveurFestivalFeuilleFeutreFe/vrierFiascoFicelerFictifFide-leFigureFilatureFiletageFilie-reFilleulFilmerFilouFiltrerFinancerFinirFioleFirmeFissureFixerFlairerFlammeFlasqueFlatteurFle/auFle-cheFleurFlexionFloconFloreFluctuerFluideFluvialFolieFonderieFongibleFontaineForcerForgeronFormulerFortuneFossileFoudreFouge-reFouillerFoulureFourmiFragileFraiseFranchirFrapperFrayeurFre/gateFreinerFrelonFre/mirFre/ne/sieFre-reFriableFrictionFrissonFrivoleFroidFromageFrontalFrotterFruitFugitifFuiteFureurFurieuxFurtifFusionFuturGagnerGalaxieGalerieGambaderGarantirGardienGarnirGarrigueGazelleGazonGe/antGe/latineGe/luleGendarmeGe/ne/ralGe/nieGenouGentilGe/ologieGe/ome-treGe/raniumGermeGestuelGeyserGibierGiclerGirafeGivreGlaceGlaiveGlisserGlobeGloireGlorieuxGolfeurGommeGonflerGorgeGorilleGoudronGouffreGoulotGoupilleGourmandGoutteGraduelGraffitiGraineGrandGrappinGratuitGravirGrenatGriffureGrillerGrimperGrognerGronderGrotteGroupeGrugerGrutierGruye-reGue/pardGuerrierGuideGuimauveGuitareGustatifGymnasteGyrostatHabitudeHachoirHalteHameauHangarHannetonHaricotHarmonieHarponHasardHe/liumHe/matomeHerbeHe/rissonHermineHe/ronHe/siterHeureuxHibernerHibouHilarantHistoireHiverHomardHommageHomoge-neHonneurHonorerHonteuxHordeHorizonHorlogeHormoneHorribleHouleuxHousseHublotHuileuxHumainHumbleHumideHumourHurlerHydromelHygie-neHymneHypnoseIdylleIgnorerIguaneIlliciteIllusionImageImbiberImiterImmenseImmobileImmuableImpactImpe/rialImplorerImposerImprimerImputerIncarnerIncendieIncidentInclinerIncoloreIndexerIndiceInductifIne/ditIneptieInexactInfiniInfligerInformerInfusionInge/rerInhalerInhiberInjecterInjureInnocentInoculerInonderInscrireInsecteInsigneInsoliteInspirerInstinctInsulterIntactIntenseIntimeIntrigueIntuitifInutileInvasionInventerInviterInvoquerIroniqueIrradierIrre/elIrriterIsolerIvoireIvresseJaguarJaillirJambeJanvierJardinJaugerJauneJavelotJetableJetonJeudiJeunesseJoindreJoncherJonglerJoueurJouissifJournalJovialJoyauJoyeuxJubilerJugementJuniorJuponJuristeJusticeJuteuxJuve/nileKayakKimonoKiosqueLabelLabialLabourerLace/rerLactoseLaguneLaineLaisserLaitierLambeauLamelleLampeLanceurLangageLanterneLapinLargeurLarmeLaurierLavaboLavoirLectureLe/galLe/gerLe/gumeLessiveLettreLevierLexiqueLe/zardLiasseLibe/rerLibreLicenceLicorneLie-geLie-vreLigatureLigoterLigueLimerLimiteLimonadeLimpideLine/aireLingotLionceauLiquideLisie-reListerLithiumLitigeLittoralLivreurLogiqueLointainLoisirLombricLoterieLouerLourdLoutreLouveLoyalLubieLucideLucratifLueurLugubreLuisantLumie-reLunaireLundiLuronLutterLuxueuxMachineMagasinMagentaMagiqueMaigreMaillonMaintienMairieMaisonMajorerMalaxerMale/ficeMalheurMaliceMalletteMammouthMandaterManiableManquantManteauManuelMarathonMarbreMarchandMardiMaritimeMarqueurMarronMartelerMascotteMassifMate/rielMatie-reMatraqueMaudireMaussadeMauveMaximalMe/chantMe/connuMe/dailleMe/decinMe/diterMe/duseMeilleurMe/langeMe/lodieMembreMe/moireMenacerMenerMenhirMensongeMentorMercrediMe/riteMerleMessagerMesureMe/talMe/te/oreMe/thodeMe/tierMeubleMiaulerMicrobeMietteMignonMigrerMilieuMillionMimiqueMinceMine/ralMinimalMinorerMinuteMiracleMiroiterMissileMixteMobileModerneMoelleuxMondialMoniteurMonnaieMonotoneMonstreMontagneMonumentMoqueurMorceauMorsureMortierMoteurMotifMoucheMoufleMoulinMoussonMoutonMouvantMultipleMunitionMurailleMure-neMurmureMuscleMuse/umMusicienMutationMuterMutuelMyriadeMyrtilleMyste-reMythiqueNageurNappeNarquoisNarrerNatationNationNatureNaufrageNautiqueNavireNe/buleuxNectarNe/fasteNe/gationNe/gligerNe/gocierNeigeNerveuxNettoyerNeuroneNeutronNeveuNicheNickelNitrateNiveauNobleNocifNocturneNoirceurNoisetteNomadeNombreuxNommerNormatifNotableNotifierNotoireNourrirNouveauNovateurNovembreNoviceNuageNuancerNuireNuisibleNume/roNuptialNuqueNutritifObe/irObjectifObligerObscurObserverObstacleObtenirObturerOccasionOccuperOce/anOctobreOctroyerOctuplerOculaireOdeurOdorantOffenserOfficierOffrirOgiveOiseauOisillonOlfactifOlivierOmbrageOmettreOnctueuxOndulerOne/reuxOniriqueOpaleOpaqueOpe/rerOpinionOpportunOpprimerOpterOptiqueOrageuxOrangeOrbiteOrdonnerOreilleOrganeOrgueilOrificeOrnementOrqueOrtieOscillerOsmoseOssatureOtarieOuraganOursonOutilOutragerOuvrageOvationOxydeOxyge-neOzonePaisiblePalacePalmare-sPalourdePalperPanachePandaPangolinPaniquerPanneauPanoramaPantalonPapayePapierPapoterPapyrusParadoxeParcelleParesseParfumerParlerParoleParrainParsemerPartagerParureParvenirPassionPaste-quePaternelPatiencePatronPavillonPavoiserPayerPaysagePeignePeintrePelagePe/licanPellePelousePeluchePendulePe/ne/trerPe/niblePensifPe/nuriePe/pitePe/plumPerdrixPerforerPe/riodePermuterPerplexePersilPertePeserPe/talePetitPe/trirPeuplePharaonPhobiePhoquePhotonPhrasePhysiquePianoPicturalPie-cePierrePieuvrePilotePinceauPipettePiquerPiroguePiscinePistonPivoterPixelPizzaPlacardPlafondPlaisirPlanerPlaquePlastronPlateauPleurerPlexusPliagePlombPlongerPluiePlumagePochettePoe/siePoe-tePointePoirierPoissonPoivrePolairePolicierPollenPolygonePommadePompierPonctuelPonde/rerPoneyPortiquePositionPosse/derPosturePotagerPoteauPotionPoucePoulainPoumonPourprePoussinPouvoirPrairiePratiquePre/cieuxPre/direPre/fixePre/ludePre/nomPre/sencePre/textePre/voirPrimitifPrincePrisonPriverProble-meProce/derProdigeProfondProgre-sProieProjeterProloguePromenerPropreProspe-reProte/gerProuesseProverbePrudencePruneauPsychosePublicPuceronPuiserPulpePulsarPunaisePunitifPupitrePurifierPuzzlePyramideQuasarQuerelleQuestionQuie/tudeQuitterQuotientRacineRaconterRadieuxRagondinRaideurRaisinRalentirRallongeRamasserRapideRasageRatisserRavagerRavinRayonnerRe/actifRe/agirRe/aliserRe/animerRecevoirRe/citerRe/clamerRe/colterRecruterReculerRecyclerRe/digerRedouterRefaireRe/flexeRe/formerRefrainRefugeRe/galienRe/gionRe/glageRe/gulierRe/ite/rerRejeterRejouerRelatifReleverReliefRemarqueReme-deRemiseRemonterRemplirRemuerRenardRenfortReniflerRenoncerRentrerRenvoiReplierReporterRepriseReptileRequinRe/serveRe/sineuxRe/soudreRespectResterRe/sultatRe/tablirRetenirRe/ticuleRetomberRetracerRe/unionRe/ussirRevancheRevivreRe/volteRe/vulsifRichesseRideauRieurRigideRigolerRincerRiposterRisibleRisqueRituelRivalRivie-reRocheuxRomanceRompreRonceRondinRoseauRosierRotatifRotorRotuleRougeRouilleRouleauRoutineRoyaumeRubanRubisRucheRuelleRugueuxRuinerRuisseauRuserRustiqueRythmeSablerSaboterSabreSacocheSafariSagesseSaisirSaladeSaliveSalonSaluerSamediSanctionSanglierSarcasmeSardineSaturerSaugrenuSaumonSauterSauvageSavantSavonnerScalpelScandaleSce/le/ratSce/narioSceptreSche/maScienceScinderScoreScrutinSculpterSe/anceSe/cableSe/cherSecouerSe/cre/terSe/datifSe/duireSeigneurSe/jourSe/lectifSemaineSemblerSemenceSe/minalSe/nateurSensibleSentenceSe/parerSe/quenceSereinSergentSe/rieuxSerrureSe/rumServiceSe/sameSe/virSevrageSextupleSide/ralSie-cleSie/gerSifflerSigleSignalSilenceSiliciumSimpleSince-reSinistreSiphonSiropSismiqueSituerSkierSocialSocleSodiumSoigneuxSoldatSoleilSolitudeSolubleSombreSommeilSomnolerSondeSongeurSonnetteSonoreSorcierSortirSosieSottiseSoucieuxSoudureSouffleSouleverSoupapeSourceSoutirerSouvenirSpacieuxSpatialSpe/cialSphe-reSpiralStableStationSternumStimulusStipulerStrictStudieuxStupeurStylisteSublimeSubstratSubtilSubvenirSucce-sSucreSuffixeSugge/rerSuiveurSulfateSuperbeSupplierSurfaceSuricateSurmenerSurpriseSursautSurvieSuspectSyllabeSymboleSyme/trieSynapseSyntaxeSyste-meTabacTablierTactileTaillerTalentTalismanTalonnerTambourTamiserTangibleTapisTaquinerTarderTarifTartineTasseTatamiTatouageTaupeTaureauTaxerTe/moinTemporelTenailleTendreTeneurTenirTensionTerminerTerneTerribleTe/tineTexteThe-meThe/orieThe/rapieThoraxTibiaTie-deTimideTirelireTiroirTissuTitaneTitreTituberTobogganTole/rantTomateToniqueTonneauToponymeTorcheTordreTornadeTorpilleTorrentTorseTortueTotemToucherTournageTousserToxineTractionTraficTragiqueTrahirTrainTrancherTravailTre-fleTremperTre/sorTreuilTriageTribunalTricoterTrilogieTriompheTriplerTriturerTrivialTromboneTroncTropicalTroupeauTuileTulipeTumulteTunnelTurbineTuteurTutoyerTuyauTympanTyphonTypiqueTyranUbuesqueUltimeUltrasonUnanimeUnifierUnionUniqueUnitaireUniversUraniumUrbainUrticantUsageUsineUsuelUsureUtileUtopieVacarmeVaccinVagabondVagueVaillantVaincreVaisseauValableValiseVallonValveVampireVanilleVapeurVarierVaseuxVassalVasteVecteurVedetteVe/ge/talVe/hiculeVeinardVe/loceVendrediVe/ne/rerVengerVenimeuxVentouseVerdureVe/rinVernirVerrouVerserVertuVestonVe/te/ranVe/tusteVexantVexerViaducViandeVictoireVidangeVide/oVignetteVigueurVilainVillageVinaigreViolonVipe-reVirementVirtuoseVirusVisageViseurVisionVisqueuxVisuelVitalVitesseViticoleVitrineVivaceVivipareVocationVoguerVoileVoisinVoitureVolailleVolcanVoltigerVolumeVoraceVortexVoterVouloirVoyageVoyelleWagonXe/nonYachtZe-breZe/nithZesteZoologie\";\n    var wordlist = null;\n    var lookup = {};\n    function dropDiacritic(word) {\n      wordlist_1.logger.checkNormalize();\n      return (0, strings_1.toUtf8String)(Array.prototype.filter.call((0, strings_1.toUtf8Bytes)(word.normalize(\"NFD\").toLowerCase()), function(c) {\n        return c >= 65 && c <= 90 || c >= 97 && c <= 123;\n      }));\n    }\n    function expand(word) {\n      var output = [];\n      Array.prototype.forEach.call((0, strings_1.toUtf8Bytes)(word), function(c) {\n        if (c === 47) {\n          output.push(204);\n          output.push(129);\n        } else if (c === 45) {\n          output.push(204);\n          output.push(128);\n        } else {\n          output.push(c);\n        }\n      });\n      return (0, strings_1.toUtf8String)(output);\n    }\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \").map(function(w) {\n        return expand(w);\n      });\n      wordlist.forEach(function(word, index) {\n        lookup[dropDiacritic(word)] = index;\n      });\n      if (wordlist_1.Wordlist.check(lang) !== \"0x51deb7ae009149dc61a6bd18a918eb7ac78d2775726c68e598b92d002519b045\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for fr (French) FAILED\");\n      }\n    }\n    var LangFr = (\n      /** @class */\n      function(_super) {\n        __extends(LangFr2, _super);\n        function LangFr2() {\n          return _super.call(this, \"fr\") || this;\n        }\n        LangFr2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangFr2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return lookup[dropDiacritic(word)];\n        };\n        return LangFr2;\n      }(wordlist_1.Wordlist)\n    );\n    var langFr = new LangFr();\n    exports2.langFr = langFr;\n    wordlist_1.Wordlist.register(langFr);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-ja.js\nvar require_lang_ja = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-ja.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langJa = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = [\n      // 4-kana words\n      \"AQRASRAGBAGUAIRAHBAghAURAdBAdcAnoAMEAFBAFCBKFBQRBSFBCXBCDBCHBGFBEQBpBBpQBIkBHNBeOBgFBVCBhBBhNBmOBmRBiHBiFBUFBZDBvFBsXBkFBlcBjYBwDBMBBTBBTRBWBBWXXaQXaRXQWXSRXCFXYBXpHXOQXHRXhRXuRXmXXbRXlXXwDXTRXrCXWQXWGaBWaKcaYgasFadQalmaMBacAKaRKKBKKXKKjKQRKDRKCYKCRKIDKeVKHcKlXKjHKrYNAHNBWNaRNKcNIBNIONmXNsXNdXNnBNMBNRBNrXNWDNWMNFOQABQAHQBrQXBQXFQaRQKXQKDQKOQKFQNBQNDQQgQCXQCDQGBQGDQGdQYXQpBQpQQpHQLXQHuQgBQhBQhCQuFQmXQiDQUFQZDQsFQdRQkHQbRQlOQlmQPDQjDQwXQMBQMDQcFQTBQTHQrDDXQDNFDGBDGQDGRDpFDhFDmXDZXDbRDMYDRdDTRDrXSAhSBCSBrSGQSEQSHBSVRShYShkSyQSuFSiBSdcSoESocSlmSMBSFBSFKSFNSFdSFcCByCaRCKcCSBCSRCCrCGbCEHCYXCpBCpQCIBCIHCeNCgBCgFCVECVcCmkCmwCZXCZFCdRClOClmClFCjDCjdCnXCwBCwXCcRCFQCFjGXhGNhGDEGDMGCDGCHGIFGgBGVXGVEGVRGmXGsXGdYGoSGbRGnXGwXGwDGWRGFNGFLGFOGFdGFkEABEBDEBFEXOEaBEKSENBENDEYXEIgEIkEgBEgQEgHEhFEudEuFEiBEiHEiFEZDEvBEsXEsFEdXEdREkFEbBEbRElFEPCEfkEFNYAEYAhYBNYQdYDXYSRYCEYYoYgQYgRYuRYmCYZTYdBYbEYlXYjQYRbYWRpKXpQopQnpSFpCXpIBpISphNpdBpdRpbRpcZpFBpFNpFDpFopFrLADLBuLXQLXcLaFLCXLEhLpBLpFLHXLeVLhILdHLdRLoDLbRLrXIABIBQIBCIBsIBoIBMIBRIXaIaRIKYIKRINBINuICDIGBIIDIIkIgRIxFIyQIiHIdRIbYIbRIlHIwRIMYIcRIRVITRIFBIFNIFQOABOAFOBQOaFONBONMOQFOSFOCDOGBOEQOpBOLXOIBOIFOgQOgFOyQOycOmXOsXOdIOkHOMEOMkOWWHBNHXNHXWHNXHDuHDRHSuHSRHHoHhkHmRHdRHkQHlcHlRHwBHWcgAEgAggAkgBNgBQgBEgXOgYcgLXgHjgyQgiBgsFgdagMYgWSgFQgFEVBTVXEVKBVKNVKDVKYVKRVNBVNYVDBVDxVSBVSRVCjVGNVLXVIFVhBVhcVsXVdRVbRVlRhBYhKYhDYhGShxWhmNhdahdkhbRhjohMXhTRxAXxXSxKBxNBxEQxeNxeQxhXxsFxdbxlHxjcxFBxFNxFQxFOxFoyNYyYoybcyMYuBQuBRuBruDMuCouHBudQukkuoBulVuMXuFEmCYmCRmpRmeDmiMmjdmTFmFQiADiBOiaRiKRiNBiNRiSFiGkiGFiERipRiLFiIFihYibHijBijEiMXiWBiFBiFCUBQUXFUaRUNDUNcUNRUNFUDBUSHUCDUGBUGFUEqULNULoUIRUeEUeYUgBUhFUuRUiFUsXUdFUkHUbBUjSUjYUwXUMDUcHURdUTBUrBUrXUrQZAFZXZZaRZKFZNBZQFZCXZGBZYdZpBZLDZIFZHXZHNZeQZVRZVFZmXZiBZvFZdFZkFZbHZbFZwXZcCZcRZRBvBQvBGvBLvBWvCovMYsAFsBDsaRsKFsNFsDrsSHsSFsCXsCRsEBsEHsEfspBsLBsLDsIgsIRseGsbRsFBsFQsFSdNBdSRdCVdGHdYDdHcdVbdySduDdsXdlRdwXdWYdWcdWRkBMkXOkaRkNIkNFkSFkCFkYBkpRkeNkgBkhVkmXksFklVkMBkWDkFNoBNoaQoaFoNBoNXoNaoNEoSRoEroYXoYCoYbopRopFomXojkowXorFbBEbEIbdBbjYlaRlDElMXlFDjKjjSRjGBjYBjYkjpRjLXjIBjOFjeVjbRjwBnXQnSHnpFnLXnINnMBnTRwXBwXNwXYwNFwQFwSBwGFwLXwLDweNwgBwuHwjDwnXMBXMpFMIBMeNMTHcaQcNBcDHcSFcCXcpBcLXcLDcgFcuFcnXcwXccDcTQcrFTQErXNrCHrpFrgFrbFrTHrFcWNYWNbWEHWMXWTR\",\n      // 5-kana words\n      \"ABGHABIJAEAVAYJQALZJAIaRAHNXAHdcAHbRAZJMAZJRAZTRAdVJAklmAbcNAjdRAMnRAMWYAWpRAWgRAFgBAFhBAFdcBNJBBNJDBQKBBQhcBQlmBDEJBYJkBYJTBpNBBpJFBIJBBIJDBIcABOKXBOEJBOVJBOiJBOZJBepBBeLXBeIFBegBBgGJBVJXBuocBiJRBUJQBlXVBlITBwNFBMYVBcqXBTlmBWNFBWiJBWnRBFGHBFwXXKGJXNJBXNZJXDTTXSHSXSVRXSlHXCJDXGQJXEhXXYQJXYbRXOfXXeNcXVJFXhQJXhEJXdTRXjdXXMhBXcQTXRGBXTEBXTnQXFCXXFOFXFgFaBaFaBNJaBCJaBpBaBwXaNJKaNJDaQIBaDpRaEPDaHMFamDJalEJaMZJaFaFaFNBaFQJaFLDaFVHKBCYKBEBKBHDKXaFKXGdKXEJKXpHKXIBKXZDKXwXKKwLKNacKNYJKNJoKNWcKDGdKDTRKChXKGaRKGhBKGbRKEBTKEaRKEPTKLMDKLWRKOHDKVJcKdBcKlIBKlOPKFSBKFEPKFpFNBNJNJBQNBGHNBEPNBHXNBgFNBVXNBZDNBsXNBwXNNaRNNJDNNJENNJkNDCJNDVDNGJRNJiDNZJNNsCJNJFNNFSBNFCXNFEPNFLXNFIFQJBFQCaRQJEQQLJDQLJFQIaRQOqXQHaFQHHQQVJXQVJDQhNJQmEIQZJFQsJXQJrFQWbRDJABDBYJDXNFDXCXDXLXDXZDDXsJDQqXDSJFDJCXDEPkDEqXDYmQDpSJDOCkDOGQDHEIDVJDDuDuDWEBDJFgSBNDSBSFSBGHSBIBSBTQSKVYSJQNSJQiSJCXSEqXSJYVSIiJSOMYSHAHSHaQSeCFSepQSegBSHdHSHrFShSJSJuHSJUFSkNRSrSrSWEBSFaHSJFQSFCXSFGDSFYXSFODSFgBSFVXSFhBSFxFSFkFSFbBSFMFCADdCJXBCXaFCXKFCXNFCXCXCXGBCXEJCXYBCXLDCXIBCXOPCXHXCXgBCXhBCXiBCXlDCXcHCJNBCJNFCDCJCDGBCDVXCDhBCDiDCDJdCCmNCpJFCIaRCOqXCHCHCHZJCViJCuCuCmddCJiFCdNBCdHhClEJCnUJCreSCWlgCWTRCFBFCFNBCFYBCFVFCFhFCFdSCFTBCFWDGBNBGBQFGJBCGBEqGBpBGBgQGNBEGNJYGNkOGNJRGDUFGJpQGHaBGJeNGJeEGVBlGVKjGiJDGvJHGsVJGkEBGMIJGWjNGFBFGFCXGFGBGFYXGFpBGFMFEASJEAWpEJNFECJVEIXSEIQJEOqXEOcFEeNcEHEJEHlFEJgFEhlmEmDJEmZJEiMBEUqXEoSREPBFEPXFEPKFEPSFEPEFEPpFEPLXEPIBEJPdEPcFEPTBEJnXEqlHEMpREFCXEFODEFcFYASJYJAFYBaBYBVXYXpFYDhBYCJBYJGFYYbRYeNcYJeVYiIJYZJcYvJgYvJRYJsXYsJFYMYMYreVpBNHpBEJpBwXpQxFpYEJpeNDpJeDpeSFpeCHpHUJpHbBpHcHpmUJpiiJpUJrpsJuplITpFaBpFQqpFGBpFEfpFYBpFpBpFLJpFIDpFgBpFVXpFyQpFuFpFlFpFjDpFnXpFwXpJFMpFTBLXCJLXEFLXhFLXUJLXbFLalmLNJBLSJQLCLCLGJBLLDJLHaFLeNFLeSHLeCXLepFLhaRLZsJLsJDLsJrLocaLlLlLMdbLFNBLFSBLFEHLFkFIBBFIBXFIBaQIBKXIBSFIBpHIBLXIBgBIBhBIBuHIBmXIBiFIBZXIBvFIBbFIBjQIBwXIBWFIKTRIQUJIDGFICjQIYSRIINXIJeCIVaRImEkIZJFIvJRIsJXIdCJIJoRIbBQIjYBIcqXITFVIreVIFKFIFSFIFCJIFGFIFLDIFIBIJFOIFgBIFVXIJFhIFxFIFmXIFdHIFbBIJFrIJFWOBGBOQfXOOKjOUqXOfXBOqXEOcqXORVJOFIBOFlDHBIOHXiFHNTRHCJXHIaRHHJDHHEJHVbRHZJYHbIBHRsJHRkDHWlmgBKFgBSBgBCDgBGHgBpBgBIBgBVJgBuBgBvFgKDTgQVXgDUJgGSJgOqXgmUMgZIJgTUJgWIEgFBFgFNBgFDJgFSFgFGBgFYXgJFOgFgQgFVXgFhBgFbHgJFWVJABVQKcVDgFVOfXVeDFVhaRVmGdViJYVMaRVFNHhBNDhBCXhBEqhBpFhBLXhNJBhSJRheVXhhKEhxlmhZIJhdBQhkIJhbMNhMUJhMZJxNJgxQUJxDEkxDdFxSJRxplmxeSBxeCXxeGFxeYXxepQxegBxWVcxFEQxFLXxFIBxFgBxFxDxFZtxFdcxFbBxFwXyDJXyDlcuASJuDJpuDIBuCpJuGSJuIJFueEFuZIJusJXudWEuoIBuWGJuFBcuFKEuFNFuFQFuFDJuFGJuFVJuFUtuFdHuFTBmBYJmNJYmQhkmLJDmLJomIdXmiJYmvJRmsJRmklmmMBymMuCmclmmcnQiJABiJBNiJBDiBSFiBCJiBEFiBYBiBpFiBLXiBTHiJNciDEfiCZJiECJiJEqiOkHiHKFieNDiHJQieQcieDHieSFieCXieGFieEFieIHiegFihUJixNoioNXiFaBiFKFiFNDiFEPiFYXitFOitFHiFgBiFVEiFmXiFitiFbBiFMFiFrFUCXQUIoQUIJcUHQJUeCEUHwXUUJDUUqXUdWcUcqXUrnQUFNDUFSHUFCFUFEfUFLXUtFOZBXOZXSBZXpFZXVXZEQJZEJkZpDJZOqXZeNHZeCDZUqXZFBQZFEHZFLXvBAFvBKFvBCXvBEPvBpHvBIDvBgFvBuHvQNJvFNFvFGBvFIBvJFcsXCDsXLXsXsXsXlFsXcHsQqXsJQFsEqXseIFsFEHsFjDdBxOdNpRdNJRdEJbdpJRdhZJdnSJdrjNdFNJdFQHdFhNkNJDkYaRkHNRkHSRkVbRkuMRkjSJkcqDoSJFoEiJoYZJoOfXohEBoMGQocqXbBAFbBXFbBaFbBNDbBGBbBLXbBTBbBWDbGJYbIJHbFQqbFpQlDgQlOrFlVJRjGEBjZJRnXvJnXbBnEfHnOPDngJRnxfXnUJWwXEJwNpJwDpBwEfXwrEBMDCJMDGHMDIJMLJDcQGDcQpHcqXccqNFcqCXcFCJRBSBRBGBRBEJRBpQTBNFTBQJTBpBTBVXTFABTFSBTFCFTFGBTFMDrXCJrXLDrDNJrEfHrFQJrFitWNjdWNTR\",\n      // 6-kana words\n      \"AKLJMANOPFASNJIAEJWXAYJNRAIIbRAIcdaAeEfDAgidRAdjNYAMYEJAMIbRAFNJBAFpJFBBIJYBDZJFBSiJhBGdEBBEJfXBEJqXBEJWRBpaUJBLXrXBIYJMBOcfXBeEfFBestXBjNJRBcDJOBFEqXXNvJRXDMBhXCJNYXOAWpXONJWXHDEBXeIaRXhYJDXZJSJXMDJOXcASJXFVJXaBQqXaBZJFasXdQaFSJQaFEfXaFpJHaFOqXKBNSRKXvJBKQJhXKEJQJKEJGFKINJBKIJjNKgJNSKVElmKVhEBKiJGFKlBgJKjnUJKwsJYKMFIJKFNJDKFIJFKFOfXNJBSFNJBCXNBpJFNJBvQNJBMBNJLJXNJOqXNJeCXNJeGFNdsJCNbTKFNwXUJQNFEPQDiJcQDMSJQSFpBQGMQJQJeOcQyCJEQUJEBQJFBrQFEJqDXDJFDJXpBDJXIMDGiJhDIJGRDJeYcDHrDJDVXgFDkAWpDkIgRDjDEqDMvJRDJFNFDJFIBSKclmSJQOFSJQVHSJQjDSJGJBSJGJFSECJoSHEJqSJHTBSJVJDSViJYSZJNBSJsJDSFSJFSFEfXSJFLXCBUJVCJXSBCJXpBCXVJXCJXsXCJXdFCJNJHCLIJgCHiJFCVNJMChCJhCUHEJCsJTRCJdYcCoQJCCFEfXCFIJgCFUJxCFstFGJBaQGJBIDGQJqXGYJNRGJHKFGeQqDGHEJFGJeLXGHIiJGHdBlGUJEBGkIJTGFQPDGJFEqEAGegEJIJBEJVJXEhQJTEiJNcEJZJFEJoEqEjDEqEPDsXEPGJBEPOqXEPeQFEfDiDEJfEFEfepQEfMiJEqXNBEqDIDEqeSFEqVJXEMvJRYXNJDYXEJHYKVJcYYJEBYJeEcYJUqXYFpJFYFstXpAZJMpBSJFpNBNFpeQPDpHLJDpHIJFpHgJFpeitFpHZJFpJFADpFSJFpJFCJpFOqXpFitBpJFZJLXIJFLIJgRLVNJWLVHJMLwNpJLFGJBLFLJDLFOqXLJFUJIBDJXIBGJBIJBYQIJBIBIBOqXIBcqDIEGJFILNJTIIJEBIOiJhIJeNBIJeIBIhiJIIWoTRIJFAHIJFpBIJFuHIFUtFIJFTHOSBYJOEcqXOHEJqOvBpFOkVJrObBVJOncqDOcNJkHhNJRHuHJuHdMhBgBUqXgBsJXgONJBgHNJDgHHJQgJeitgHsJXgJyNagyDJBgZJDrgsVJQgkEJNgkjSJgJFAHgFCJDgFZtMVJXNFVXQfXVJXDJVXoQJVQVJQVDEfXVDvJHVEqNFVeQfXVHpJFVHxfXVVJSRVVmaRVlIJOhCXVJhHjYkhxCJVhWVUJhWiJcxBNJIxeEqDxfXBFxcFEPxFSJFxFYJXyBDQJydaUJyFOPDuYCJYuLvJRuHLJXuZJLDuFOPDuFZJHuFcqXmKHJdmCQJcmOsVJiJAGFitLCFieOfXiestXiZJMEikNJQirXzFiFQqXiFIJFiFZJFiFvtFUHpJFUteIcUteOcUVCJkUhdHcUbEJEUJqXQUMNJhURjYkUFitFZDGJHZJIxDZJVJXZJFDJZJFpQvBNJBvBSJFvJxBrseQqDsVFVJdFLJDkEJNBkmNJYkFLJDoQJOPoGsJRoEAHBoEJfFbBQqDbBZJHbFVJXlFIJBjYIrXjeitcjjCEBjWMNBwXQfXwXOaFwDsJXwCJTRwrCZJMDNJQcDDJFcqDOPRYiJFTBsJXTQIJBTFEfXTFLJDrXEJFrEJXMrFZJFWEJdEWYTlm\",\n      // 7-kana words\n      \"ABCDEFACNJTRAMBDJdAcNJVXBLNJEBXSIdWRXErNJkXYDJMBXZJCJaXMNJaYKKVJKcKDEJqXKDcNJhKVJrNYKbgJVXKFVJSBNBYBwDNJeQfXNJeEqXNhGJWENJFiJRQlIJbEQJfXxDQqXcfXQFNDEJQFwXUJDYcnUJDJIBgQDIUJTRDJFEqDSJQSJFSJQIJFSOPeZtSJFZJHCJXQfXCTDEqFGJBSJFGJBOfXGJBcqXGJHNJDGJRLiJEJfXEqEJFEJPEFpBEJYJBZJFYBwXUJYiJMEBYJZJyTYTONJXpQMFXFpeGIDdpJFstXpJFcPDLBVSJRLHQJqXLJFZJFIJBNJDIJBUqXIBkFDJIJEJPTIYJGWRIJeQPDIJeEfHIJFsJXOqGDSFHXEJqXgJCsJCgGQJqXgdQYJEgFMFNBgJFcqDVJwXUJVJFZJchIgJCCxOEJqXxOwXUJyDJBVRuscisciJBiJBieUtqXiJFDJkiFsJXQUGEZJcUJFsJXZtXIrXZDZJDrZJFNJDZJFstXvJFQqXvJFCJEsJXQJqkhkNGBbDJdTRbYJMEBlDwXUJMEFiJFcfXNJDRcNJWMTBLJXC\",\n      // 8-kana words\n      \"BraFUtHBFSJFdbNBLJXVJQoYJNEBSJBEJfHSJHwXUJCJdAZJMGjaFVJXEJPNJBlEJfFiJFpFbFEJqIJBVJCrIBdHiJhOPFChvJVJZJNJWxGFNIFLueIBQJqUHEJfUFstOZJDrlXEASJRlXVJXSFwVJNJWD\",\n      // 9-kana words\n      \"QJEJNNJDQJEJIBSFQJEJxegBQJEJfHEPSJBmXEJFSJCDEJqXLXNJFQqXIcQsFNJFIFEJqXUJgFsJXIJBUJEJfHNFvJxEqXNJnXUJFQqD\",\n      // 10-kana words\n      \"IJBEJqXZJ\"\n    ];\n    var mapping = \"~~AzB~X~a~KN~Q~D~S~C~G~E~Y~p~L~I~O~eH~g~V~hxyumi~~U~~Z~~v~~s~~dkoblPjfnqwMcRTr~W~~~F~~~~~Jt\";\n    var wordlist = null;\n    function hex(word) {\n      return (0, bytes_1.hexlify)((0, strings_1.toUtf8Bytes)(word));\n    }\n    var KiYoKu = \"0xe3818de38284e3818f\";\n    var KyoKu = \"0xe3818de38283e3818f\";\n    function loadWords(lang) {\n      if (wordlist !== null) {\n        return;\n      }\n      wordlist = [];\n      var transform = {};\n      transform[(0, strings_1.toUtf8String)([227, 130, 154])] = false;\n      transform[(0, strings_1.toUtf8String)([227, 130, 153])] = false;\n      transform[(0, strings_1.toUtf8String)([227, 130, 133])] = (0, strings_1.toUtf8String)([227, 130, 134]);\n      transform[(0, strings_1.toUtf8String)([227, 129, 163])] = (0, strings_1.toUtf8String)([227, 129, 164]);\n      transform[(0, strings_1.toUtf8String)([227, 130, 131])] = (0, strings_1.toUtf8String)([227, 130, 132]);\n      transform[(0, strings_1.toUtf8String)([227, 130, 135])] = (0, strings_1.toUtf8String)([227, 130, 136]);\n      function normalize(word2) {\n        var result = \"\";\n        for (var i2 = 0; i2 < word2.length; i2++) {\n          var kana = word2[i2];\n          var target = transform[kana];\n          if (target === false) {\n            continue;\n          }\n          if (target) {\n            kana = target;\n          }\n          result += kana;\n        }\n        return result;\n      }\n      function sortJapanese(a, b) {\n        a = normalize(a);\n        b = normalize(b);\n        if (a < b) {\n          return -1;\n        }\n        if (a > b) {\n          return 1;\n        }\n        return 0;\n      }\n      for (var length_1 = 3; length_1 <= 9; length_1++) {\n        var d = data[length_1 - 3];\n        for (var offset = 0; offset < d.length; offset += length_1) {\n          var word = [];\n          for (var i = 0; i < length_1; i++) {\n            var k = mapping.indexOf(d[offset + i]);\n            word.push(227);\n            word.push(k & 64 ? 130 : 129);\n            word.push((k & 63) + 128);\n          }\n          wordlist.push((0, strings_1.toUtf8String)(word));\n        }\n      }\n      wordlist.sort(sortJapanese);\n      if (hex(wordlist[442]) === KiYoKu && hex(wordlist[443]) === KyoKu) {\n        var tmp = wordlist[442];\n        wordlist[442] = wordlist[443];\n        wordlist[443] = tmp;\n      }\n      if (wordlist_1.Wordlist.check(lang) !== \"0xcb36b09e6baa935787fd762ce65e80b0c6a8dabdfbc3a7f86ac0e2c4fd111600\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for ja (Japanese) FAILED\");\n      }\n    }\n    var LangJa = (\n      /** @class */\n      function(_super) {\n        __extends(LangJa2, _super);\n        function LangJa2() {\n          return _super.call(this, \"ja\") || this;\n        }\n        LangJa2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangJa2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        LangJa2.prototype.split = function(mnemonic) {\n          wordlist_1.logger.checkNormalize();\n          return mnemonic.split(/(?:\\u3000| )+/g);\n        };\n        LangJa2.prototype.join = function(words) {\n          return words.join(\"\\u3000\");\n        };\n        return LangJa2;\n      }(wordlist_1.Wordlist)\n    );\n    var langJa = new LangJa();\n    exports2.langJa = langJa;\n    wordlist_1.Wordlist.register(langJa);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-ko.js\nvar require_lang_ko = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-ko.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langKo = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = [\n      \"OYAa\",\n      \"ATAZoATBl3ATCTrATCl8ATDloATGg3ATHT8ATJT8ATJl3ATLlvATLn4ATMT8ATMX8ATMboATMgoAToLbAToMTATrHgATvHnAT3AnAT3JbAT3MTAT8DbAT8JTAT8LmAT8MYAT8MbAT#LnAUHT8AUHZvAUJXrAUJX8AULnrAXJnvAXLUoAXLgvAXMn6AXRg3AXrMbAX3JTAX3QbAYLn3AZLgvAZrSUAZvAcAZ8AaAZ8AbAZ8AnAZ8HnAZ8LgAZ8MYAZ8MgAZ8OnAaAboAaDTrAaFTrAaJTrAaJboAaLVoAaMXvAaOl8AaSeoAbAUoAbAg8AbAl4AbGnrAbMT8AbMXrAbMn4AbQb8AbSV8AbvRlAb8AUAb8AnAb8HgAb8JTAb8NTAb8RbAcGboAcLnvAcMT8AcMX8AcSToAcrAaAcrFnAc8AbAc8MgAfGgrAfHboAfJnvAfLV8AfLkoAfMT8AfMnoAfQb8AfScrAfSgrAgAZ8AgFl3AgGX8AgHZvAgHgrAgJXoAgJX8AgJboAgLZoAgLn4AgOX8AgoATAgoAnAgoCUAgoJgAgoLXAgoMYAgoSeAgrDUAgrJTAhrFnAhrLjAhrQgAjAgoAjJnrAkMX8AkOnoAlCTvAlCV8AlClvAlFg4AlFl6AlFn3AloSnAlrAXAlrAfAlrFUAlrFbAlrGgAlrOXAlvKnAlvMTAl3AbAl3MnAnATrAnAcrAnCZ3AnCl8AnDg8AnFboAnFl3AnHX4AnHbrAnHgrAnIl3AnJgvAnLXoAnLX4AnLbrAnLgrAnLhrAnMXoAnMgrAnOn3AnSbrAnSeoAnvLnAn3OnCTGgvCTSlvCTvAUCTvKnCTvNTCT3CZCT3GUCT3MTCT8HnCUCZrCULf8CULnvCU3HnCU3JUCY6NUCbDb8CbFZoCbLnrCboOTCboScCbrFnCbvLnCb8AgCb8HgCb$LnCkLfoClBn3CloDUDTHT8DTLl3DTSU8DTrAaDTrLXDTrLjDTrOYDTrOgDTvFXDTvFnDT3HUDT3LfDUCT9DUDT4DUFVoDUFV8DUFkoDUGgrDUJnrDULl8DUMT8DUMXrDUMX4DUMg8DUOUoDUOgvDUOg8DUSToDUSZ8DbDXoDbDgoDbGT8DbJn3DbLg3DbLn4DbMXrDbMg8DbOToDboJXGTClvGTDT8GTFZrGTLVoGTLlvGTLl3GTMg8GTOTvGTSlrGToCUGTrDgGTrJYGTrScGTtLnGTvAnGTvQgGUCZrGUDTvGUFZoGUHXrGULnvGUMT8GUoMgGXoLnGXrMXGXrMnGXvFnGYLnvGZOnvGZvOnGZ8LaGZ8LmGbAl3GbDYvGbDlrGbHX3GbJl4GbLV8GbLn3GbMn4GboJTGboRfGbvFUGb3GUGb4JnGgDX3GgFl$GgJlrGgLX6GgLZoGgLf8GgOXoGgrAgGgrJXGgrMYGgrScGgvATGgvOYGnAgoGnJgvGnLZoGnLg3GnLnrGnQn8GnSbrGnrMgHTClvHTDToHTFT3HTQT8HToJTHToJgHTrDUHTrMnHTvFYHTvRfHT8MnHT8SUHUAZ8HUBb4HUDTvHUoMYHXFl6HXJX6HXQlrHXrAUHXrMnHXrSbHXvFYHXvKXHX3LjHX3MeHYvQlHZrScHZvDbHbAcrHbFT3HbFl3HbJT8HbLTrHbMT8HbMXrHbMbrHbQb8HbSX3HboDbHboJTHbrFUHbrHgHbrJTHb8JTHb8MnHb8QgHgAlrHgDT3HgGgrHgHgrHgJTrHgJT8HgLX@HgLnrHgMT8HgMX8HgMboHgOnrHgQToHgRg3HgoHgHgrCbHgrFnHgrLVHgvAcHgvAfHnAloHnCTrHnCnvHnGTrHnGZ8HnGnvHnJT8HnLf8HnLkvHnMg8HnRTrITvFUITvFnJTAXrJTCV8JTFT3JTFT8JTFn4JTGgvJTHT8JTJT8JTJXvJTJl3JTJnvJTLX4JTLf8JTLhvJTMT8JTMXrJTMnrJTObrJTQT8JTSlvJT8DUJT8FkJT8MTJT8OXJT8OgJT8QUJT8RfJUHZoJXFT4JXFlrJXGZ8JXGnrJXLV8JXLgvJXMXoJXMX3JXNboJXPlvJXoJTJXoLkJXrAXJXrHUJXrJgJXvJTJXvOnJX4KnJYAl3JYJT8JYLhvJYQToJYrQXJY6NUJbAl3JbCZrJbDloJbGT8JbGgrJbJXvJbJboJbLf8JbLhrJbLl3JbMnvJbRg8JbSZ8JboDbJbrCZJbrSUJb3KnJb8LnJfRn8JgAXrJgCZrJgDTrJgGZrJgGZ8JgHToJgJT8JgJXoJgJgvJgLX4JgLZ3JgLZ8JgLn4JgMgrJgMn4JgOgvJgPX6JgRnvJgSToJgoCZJgoJbJgoMYJgrJXJgrJgJgrLjJg6MTJlCn3JlGgvJlJl8Jl4AnJl8FnJl8HgJnAToJnATrJnAbvJnDUoJnGnrJnJXrJnJXvJnLhvJnLnrJnLnvJnMToJnMT8JnMXvJnMX3JnMg8JnMlrJnMn4JnOX8JnST4JnSX3JnoAgJnoAnJnoJTJnoObJnrAbJnrAkJnrHnJnrJTJnrJYJnrOYJnrScJnvCUJnvFaJnvJgJnvJnJnvOYJnvQUJnvRUJn3FnJn3JTKnFl3KnLT6LTDlvLTMnoLTOn3LTRl3LTSb4LTSlrLToAnLToJgLTrAULTrAcLTrCULTrHgLTrMgLT3JnLULnrLUMX8LUoJgLVATrLVDTrLVLb8LVoJgLV8MgLV8RTLXDg3LXFlrLXrCnLXrLXLX3GTLX4GgLX4OYLZAXrLZAcrLZAgrLZAhrLZDXyLZDlrLZFbrLZFl3LZJX6LZJX8LZLc8LZLnrLZSU8LZoJTLZoJnLZrAgLZrAnLZrJYLZrLULZrMgLZrSkLZvAnLZvGULZvJeLZvOTLZ3FZLZ4JXLZ8STLZ8ScLaAT3LaAl3LaHT8LaJTrLaJT8LaJXrLaJgvLaJl4LaLVoLaMXrLaMXvLaMX8LbClvLbFToLbHlrLbJn4LbLZ3LbLhvLbMXrLbMnoLbvSULcLnrLc8HnLc8MTLdrMnLeAgoLeOgvLeOn3LfAl3LfLnvLfMl3LfOX8Lf8AnLf8JXLf8LXLgJTrLgJXrLgJl8LgMX8LgRZrLhCToLhrAbLhrFULhrJXLhvJYLjHTrLjHX4LjJX8LjLhrLjSX3LjSZ4LkFX4LkGZ8LkGgvLkJTrLkMXoLkSToLkSU8LkSZ8LkoOYLl3FfLl3MgLmAZrLmCbrLmGgrLmHboLmJnoLmJn3LmLfoLmLhrLmSToLnAX6LnAb6LnCZ3LnCb3LnDTvLnDb8LnFl3LnGnrLnHZvLnHgvLnITvLnJT8LnJX8LnJlvLnLf8LnLg6LnLhvLnLnoLnMXrLnMg8LnQlvLnSbrLnrAgLnrAnLnrDbLnrFkLnrJdLnrMULnrOYLnrSTLnvAnLnvDULnvHgLnvOYLnvOnLn3GgLn4DULn4JTLn4JnMTAZoMTAloMTDb8MTFT8MTJnoMTJnrMTLZrMTLhrMTLkvMTMX8MTRTrMToATMTrDnMTrOnMT3JnMT4MnMT8FUMT8FaMT8FlMT8GTMT8GbMT8GnMT8HnMT8JTMT8JbMT8OTMUCl8MUJTrMUJU8MUMX8MURTrMUSToMXAX6MXAb6MXCZoMXFXrMXHXrMXLgvMXOgoMXrAUMXrAnMXrHgMXrJYMXrJnMXrMTMXrMgMXrOYMXrSZMXrSgMXvDUMXvOTMX3JgMX3OTMX4JnMX8DbMX8FnMX8HbMX8HgMX8HnMX8LbMX8MnMX8OnMYAb8MYGboMYHTvMYHX4MYLTrMYLnvMYMToMYOgvMYRg3MYSTrMbAToMbAXrMbAl3MbAn8MbGZ8MbJT8MbJXrMbMXvMbMX8MbMnoMbrMUMb8AfMb8FbMb8FkMcJXoMeLnrMgFl3MgGTvMgGXoMgGgrMgGnrMgHT8MgHZrMgJnoMgLnrMgLnvMgMT8MgQUoMgrHnMgvAnMg8HgMg8JYMg8LfMloJnMl8ATMl8AXMl8JYMnAToMnAT4MnAZ8MnAl3MnAl4MnCl8MnHT8MnHg8MnJnoMnLZoMnLhrMnMXoMnMX3MnMnrMnOgvMnrFbMnrFfMnrFnMnrNTMnvJXNTMl8OTCT3OTFV8OTFn3OTHZvOTJXrOTOl3OT3ATOT3JUOT3LZOT3LeOT3MbOT8ATOT8AbOT8AgOT8MbOUCXvOUMX3OXHXvOXLl3OXrMUOXvDbOX6NUOX8JbOYFZoOYLbrOYLkoOYMg8OYSX3ObHTrObHT4ObJgrObLhrObMX3ObOX8Ob8FnOeAlrOeJT8OeJXrOeJnrOeLToOeMb8OgJXoOgLXoOgMnrOgOXrOgOloOgoAgOgoJbOgoMYOgoSTOg8AbOjLX4OjMnoOjSV8OnLVoOnrAgOn3DUPXQlrPXvFXPbvFTPdAT3PlFn3PnvFbQTLn4QToAgQToMTQULV8QURg8QUoJnQXCXvQbFbrQb8AaQb8AcQb8FbQb8MYQb8ScQeAlrQeLhrQjAn3QlFXoQloJgQloSnRTLnvRTrGURTrJTRUJZrRUoJlRUrQnRZrLmRZrMnRZrSnRZ8ATRZ8JbRZ8ScRbMT8RbST3RfGZrRfMX8RfMgrRfSZrRnAbrRnGT8RnvJgRnvLfRnvMTRn8AaSTClvSTJgrSTOXrSTRg3STRnvSToAcSToAfSToAnSToHnSToLjSToMTSTrAaSTrEUST3BYST8AgST8LmSUAZvSUAgrSUDT4SUDT8SUGgvSUJXoSUJXvSULTrSU8JTSU8LjSV8AnSV8JgSXFToSXLf8SYvAnSZrDUSZrMUSZrMnSZ8HgSZ8JTSZ8JgSZ8MYSZ8QUSaQUoSbCT3SbHToSbQYvSbSl4SboJnSbvFbSb8HbSb8JgSb8OTScGZrScHgrScJTvScMT8ScSToScoHbScrMTScvAnSeAZrSeAcrSeHboSeJUoSeLhrSeMT8SeMXrSe6JgSgHTrSkJnoSkLnvSk8CUSlFl3SlrSnSl8GnSmAboSmGT8SmJU8\",\n      \"ATLnDlATrAZoATrJX4ATrMT8ATrMX4ATrRTrATvDl8ATvJUoATvMl8AT3AToAT3MX8AT8CT3AT8DT8AT8HZrAT8HgoAUAgFnAUCTFnAXoMX8AXrAT8AXrGgvAXrJXvAXrOgoAXvLl3AZvAgoAZvFbrAZvJXoAZvJl8AZvJn3AZvMX8AZvSbrAZ8FZoAZ8LZ8AZ8MU8AZ8OTvAZ8SV8AZ8SX3AbAgFZAboJnoAbvGboAb8ATrAb8AZoAb8AgrAb8Al4Ab8Db8Ab8JnoAb8LX4Ab8LZrAb8LhrAb8MT8Ab8OUoAb8Qb8Ab8ST8AcrAUoAcrAc8AcrCZ3AcrFT3AcrFZrAcrJl4AcrJn3AcrMX3AcrOTvAc8AZ8Ac8MT8AfAcJXAgoFn4AgoGgvAgoGnrAgoLc8AgoMXoAgrLnrAkrSZ8AlFXCTAloHboAlrHbrAlrLhrAlrLkoAl3CZrAl3LUoAl3LZrAnrAl4AnrMT8An3HT4BT3IToBX4MnvBb!Ln$CTGXMnCToLZ4CTrHT8CT3JTrCT3RZrCT#GTvCU6GgvCU8Db8CU8GZrCU8HT8CboLl3CbrGgrCbrMU8Cb8DT3Cb8GnrCb8LX4Cb8MT8Cb8ObrCgrGgvCgrKX4Cl8FZoDTrAbvDTrDboDTrGT6DTrJgrDTrMX3DTrRZrDTrRg8DTvAVvDTvFZoDT3DT8DT3Ln3DT4HZrDT4MT8DT8AlrDT8MT8DUAkGbDUDbJnDYLnQlDbDUOYDbMTAnDbMXSnDboAT3DboFn4DboLnvDj6JTrGTCgFTGTGgFnGTJTMnGTLnPlGToJT8GTrCT3GTrLVoGTrLnvGTrMX3GTrMboGTvKl3GZClFnGZrDT3GZ8DTrGZ8FZ8GZ8MXvGZ8On8GZ8ST3GbCnQXGbMbFnGboFboGboJg3GboMXoGb3JTvGb3JboGb3Mn6Gb3Qb8GgDXLjGgMnAUGgrDloGgrHX4GgrSToGgvAXrGgvAZvGgvFbrGgvLl3GgvMnvGnDnLXGnrATrGnrMboGnuLl3HTATMnHTAgCnHTCTCTHTrGTvHTrHTvHTrJX8HTrLl8HTrMT8HTrMgoHTrOTrHTuOn3HTvAZrHTvDTvHTvGboHTvJU8HTvLl3HTvMXrHTvQb4HT4GT6HT4JT8HT4Jb#HT8Al3HT8GZrHT8GgrHT8HX4HT8Jb8HT8JnoHT8LTrHT8LgvHT8SToHT8SV8HUoJUoHUoJX8HUoLnrHXrLZoHXvAl3HX3LnrHX4FkvHX4LhrHX4MXoHX4OnoHZrAZ8HZrDb8HZrGZ8HZrJnrHZvGZ8HZvLnvHZ8JnvHZ8LhrHbCXJlHbMTAnHboJl4HbpLl3HbrJX8HbrLnrHbrMnvHbvRYrHgoSTrHgrFV8HgrGZ8HgrJXoHgrRnvHgvBb!HgvGTrHgvHX4HgvHn!HgvLTrHgvSU8HnDnLbHnFbJbHnvDn8Hn6GgvHn!BTvJTCTLnJTQgFnJTrAnvJTrLX4JTrOUoJTvFn3JTvLnrJTvNToJT3AgoJT3Jn4JT3LhvJT3ObrJT8AcrJT8Al3JT8JT8JT8JnoJT8LX4JT8LnrJT8MX3JT8Rg3JT8Sc8JUoBTvJU8AToJU8GZ8JU8GgvJU8JTrJU8JXrJU8JnrJU8LnvJU8ScvJXHnJlJXrGgvJXrJU8JXrLhrJXrMT8JXrMXrJXrQUoJXvCTvJXvGZ8JXvGgrJXvQT8JX8Ab8JX8DT8JX8GZ8JX8HZvJX8LnrJX8MT8JX8MXoJX8MnvJX8ST3JYGnCTJbAkGbJbCTAnJbLTAcJboDT3JboLb6JbrAnvJbrCn3JbrDl8JbrGboJbrIZoJbrJnvJbrMnvJbrQb4Jb8RZrJeAbAnJgJnFbJgScAnJgrATrJgvHZ8JgvMn4JlJlFbJlLiQXJlLjOnJlRbOlJlvNXoJlvRl3Jl4AcrJl8AUoJl8MnrJnFnMlJnHgGbJnoDT8JnoFV8JnoGgvJnoIT8JnoQToJnoRg3JnrCZ3JnrGgrJnrHTvJnrLf8JnrOX8JnvAT3JnvFZoJnvGT8JnvJl4JnvMT8JnvMX8JnvOXrJnvPX6JnvSX3JnvSZrJn3MT8Jn3MX8Jn3RTrLTATKnLTJnLTLTMXKnLTRTQlLToGb8LTrAZ8LTrCZ8LTrDb8LTrHT8LT3PX6LT4FZoLT$CTvLT$GgrLUvHX3LVoATrLVoAgoLVoJboLVoMX3LVoRg3LV8CZ3LV8FZoLV8GTvLXrDXoLXrFbrLXvAgvLXvFlrLXvLl3LXvRn6LX4Mb8LX8GT8LYCXMnLYrMnrLZoSTvLZrAZvLZrAloLZrFToLZrJXvLZrJboLZrJl4LZrLnrLZrMT8LZrOgvLZrRnvLZrST4LZvMX8LZvSlvLZ8AgoLZ8CT3LZ8JT8LZ8LV8LZ8LZoLZ8Lg8LZ8SV8LZ8SbrLZ$HT8LZ$Mn4La6CTvLbFbMnLbRYFTLbSnFZLboJT8LbrAT9LbrGb3LbrQb8LcrJX8LcrMXrLerHTvLerJbrLerNboLgrDb8LgrGZ8LgrHTrLgrMXrLgrSU8LgvJTrLgvLl3Lg6Ll3LhrLnrLhrMT8LhvAl4LiLnQXLkoAgrLkoJT8LkoJn4LlrSU8Ll3FZoLl3HTrLl3JX8Ll3JnoLl3LToLmLeFbLnDUFbLnLVAnLnrATrLnrAZoLnrAb8LnrAlrLnrGgvLnrJU8LnrLZrLnrLhrLnrMb8LnrOXrLnrSZ8LnvAb4LnvDTrLnvDl8LnvHTrLnvHbrLnvJT8LnvJU8LnvJbrLnvLhvLnvMX8LnvMb8LnvNnoLnvSU8Ln3Al3Ln4FZoLn4GT6Ln4JgvLn4LhrLn4MT8Ln4SToMToCZrMToJX8MToLX4MToLf8MToRg3MTrEloMTvGb6MT3BTrMT3Lb6MT8AcrMT8AgrMT8GZrMT8JnoMT8LnrMT8MX3MUOUAnMXAbFnMXoAloMXoJX8MXoLf8MXoLl8MXrAb8MXrDTvMXrGT8MXrGgrMXrHTrMXrLf8MXrMU8MXrOXvMXrQb8MXvGT8MXvHTrMXvLVoMX3AX3MX3Jn3MX3LhrMX3MX3MX4AlrMX4OboMX8GTvMX8GZrMX8GgrMX8JT8MX8JX8MX8LhrMX8MT8MYDUFbMYMgDbMbGnFfMbvLX4MbvLl3Mb8Mb8Mb8ST4MgGXCnMg8ATrMg8AgoMg8CZrMg8DTrMg8DboMg8HTrMg8JgrMg8LT8MloJXoMl8AhrMl8JT8MnLgAUMnoJXrMnoLX4MnoLhrMnoMT8MnrAl4MnrDb8MnrOTvMnrOgvMnrQb8MnrSU8MnvGgrMnvHZ8Mn3MToMn4DTrMn4LTrMn4Mg8NnBXAnOTFTFnOToAToOTrGgvOTrJX8OT3JXoOT6MTrOT8GgrOT8HTpOT8MToOUoHT8OUoJT8OUoLn3OXrAgoOXrDg8OXrMT8OXvSToOX6CTvOX8CZrOX8OgrOb6HgvOb8AToOb8MT8OcvLZ8OgvAlrOgvHTvOgvJTrOgvJnrOgvLZrOgvLn4OgvMT8OgvRTrOg8AZoOg8DbvOnrOXoOnvJn4OnvLhvOnvRTrOn3GgoOn3JnvOn6JbvOn8OTrPTGYFTPbBnFnPbGnDnPgDYQTPlrAnvPlrETvPlrLnvPlrMXvPlvFX4QTMTAnQTrJU8QYCnJlQYJlQlQbGTQbQb8JnrQb8LZoQb8LnvQb8MT8Qb8Ml8Qb8ST4QloAl4QloHZvQloJX8QloMn8QnJZOlRTrAZvRTrDTrRTvJn4RTvLhvRT4Jb8RZrAZrRZ8AkrRZ8JU8RZ8LV8RZ8LnvRbJlQXRg3GboRg3MnvRg8AZ8Rg8JboRg8Jl4RnLTCbRnvFl3RnvQb8SToAl4SToCZrSToFZoSToHXrSToJU8SToJgvSToJl4SToLhrSToMX3STrAlvSTrCT9STrCgrSTrGgrSTrHXrSTrHboSTrJnoSTrNboSTvLnrST4AZoST8Ab8ST8JT8SUoJn3SU6HZ#SU6JTvSU8Db8SU8HboSU8LgrSV8JT8SZrAcrSZrAl3SZrJT8SZrJnvSZrMT8SZvLUoSZ4FZoSZ8JnoSZ8RZrScoLnrScoMT8ScoMX8ScrAT4ScrAZ8ScrLZ8ScrLkvScvDb8ScvLf8ScvNToSgrFZrShvKnrSloHUoSloLnrSlrMXoSl8HgrSmrJUoSn3BX6\",\n      \"ATFlOn3ATLgrDYAT4MTAnAT8LTMnAYJnRTrAbGgJnrAbLV8LnAbvNTAnAeFbLg3AgOYMXoAlQbFboAnDboAfAnJgoJTBToDgAnBUJbAl3BboDUAnCTDlvLnCTFTrSnCYoQTLnDTwAbAnDUDTrSnDUHgHgrDX8LXFnDbJXAcrETvLTLnGTFTQbrGTMnGToGT3DUFbGUJlPX3GbQg8LnGboJbFnGb3GgAYGgAg8ScGgMbAXrGgvAbAnGnJTLnvGnvATFgHTDT6ATHTrDlJnHYLnMn8HZrSbJTHZ8LTFnHbFTJUoHgSeMT8HgrLjAnHgvAbAnHlFUrDlHnDgvAnHnHTFT3HnQTGnrJTAaMXvJTGbCn3JTOgrAnJXvAXMnJbMg8SnJbMnRg3Jb8LTMnJnAl3OnJnGYrQlJnJlQY3LTDlCn3LTJjLg3LTLgvFXLTMg3GTLV8HUOgLXFZLg3LXNXrMnLX8QXFnLX9AlMYLYLXPXrLZAbJU8LZDUJU8LZMXrSnLZ$AgFnLaPXrDULbFYrMnLbMn8LXLboJgJgLeFbLg3LgLZrSnLgOYAgoLhrRnJlLkCTrSnLkOnLhrLnFX%AYLnFZoJXLnHTvJbLnLloAbMTATLf8MTHgJn3MTMXrAXMT3MTFnMUITvFnMXFX%AYMXMXvFbMXrFTDbMYAcMX3MbLf8SnMb8JbFnMgMXrMTMgvAXFnMgvGgCmMnAloSnMnFnJTrOXvMXSnOX8HTMnObJT8ScObLZFl3ObMXCZoPTLgrQXPUFnoQXPU3RXJlPX3RkQXPbrJXQlPlrJbFnQUAhrDbQXGnCXvQYLnHlvQbLfLnvRTOgvJbRXJYrQlRYLnrQlRbLnrQlRlFT8JlRlFnrQXSTClCn3STHTrAnSTLZQlrSTMnGTrSToHgGbSTrGTDnSTvGXCnST3HgFbSU3HXAXSbAnJn3SbFT8LnScLfLnv\",\n      \"AT3JgJX8AT8FZoSnAT8JgFV8AT8LhrDbAZ8JT8DbAb8GgLhrAb8SkLnvAe8MT8SnAlMYJXLVAl3GYDTvAl3LfLnvBUDTvLl3CTOn3HTrCT3DUGgrCU8MT8AbCbFTrJUoCgrDb8MTDTLV8JX8DTLnLXQlDT8LZrSnDUQb8FZ8DUST4JnvDb8ScOUoDj6GbJl4GTLfCYMlGToAXvFnGboAXvLnGgAcrJn3GgvFnSToGnLf8JnvGn#HTDToHTLnFXJlHTvATFToHTvHTDToHTvMTAgoHT3STClvHT4AlFl6HT8HTDToHUoDgJTrHUoScMX3HbRZrMXoHboJg8LTHgDb8JTrHgMToLf8HgvLnLnoHnHn3HT4Hn6MgvAnJTJU8ScvJT3AaQT8JT8HTrAnJXrRg8AnJbAloMXoJbrATFToJbvMnoSnJgDb6GgvJgDb8MXoJgSX3JU8JguATFToJlPYLnQlJlQkDnLbJlQlFYJlJl8Lf8OTJnCTFnLbJnLTHXMnJnLXGXCnJnoFfRg3JnrMYRg3Jn3HgFl3KT8Dg8LnLTRlFnPTLTvPbLbvLVoSbrCZLXMY6HT3LXNU7DlrLXNXDTATLX8DX8LnLZDb8JU8LZMnoLhrLZSToJU8LZrLaLnrLZvJn3SnLZ8LhrSnLaJnoMT8LbFlrHTvLbrFTLnrLbvATLlvLb6OTFn3LcLnJZOlLeAT6Mn4LeJT3ObrLg6LXFlrLhrJg8LnLhvDlPX4LhvLfLnvLj6JTFT3LnFbrMXoLnQluCTvLnrQXCY6LnvLfLnvLnvMgLnvLnvSeLf8MTMbrJn3MT3JgST3MT8AnATrMT8LULnrMUMToCZrMUScvLf8MXoDT8SnMX6ATFToMX8AXMT8MX8FkMT8MX8HTrDUMX8ScoSnMYJT6CTvMgAcrMXoMg8SToAfMlvAXLg3MnFl3AnvOT3AnFl3OUoATHT8OU3RnLXrOXrOXrSnObPbvFn6Og8HgrSnOg8OX8DbPTvAgoJgPU3RYLnrPXrDnJZrPb8CTGgvPlrLTDlvPlvFUJnoQUvFXrQlQeMnoAl3QlrQlrSnRTFTrJUoSTDlLiLXSTFg6HT3STJgoMn4STrFTJTrSTrLZFl3ST4FnMXoSUrDlHUoScvHTvSnSfLkvMXo\",\n      \"AUoAcrMXoAZ8HboAg8AbOg6ATFgAg8AloMXoAl3AT8JTrAl8MX8MXoCT3SToJU8Cl8Db8MXoDT8HgrATrDboOT8MXoGTOTrATMnGT8LhrAZ8GnvFnGnQXHToGgvAcrHTvAXvLl3HbrAZoMXoHgBlFXLg3HgMnFXrSnHgrSb8JUoHn6HT8LgvITvATrJUoJUoLZrRnvJU8HT8Jb8JXvFX8QT8JXvLToJTrJYrQnGnQXJgrJnoATrJnoJU8ScvJnvMnvMXoLTCTLgrJXLTJlRTvQlLbRnJlQYvLbrMb8LnvLbvFn3RnoLdCVSTGZrLeSTvGXCnLg3MnoLn3MToLlrETvMT8SToAl3MbrDU6GTvMb8LX4LhrPlrLXGXCnSToLf8Rg3STrDb8LTrSTvLTHXMnSb3RYLnMnSgOg6ATFg\",\n      \"HUDlGnrQXrJTrHgLnrAcJYMb8DULc8LTvFgGnCk3Mg8JbAnLX4QYvFYHnMXrRUoJnGnvFnRlvFTJlQnoSTrBXHXrLYSUJgLfoMT8Se8DTrHbDb\",\n      \"AbDl8SToJU8An3RbAb8ST8DUSTrGnrAgoLbFU6Db8LTrMg8AaHT8Jb8ObDl8SToJU8Pb3RlvFYoJl\"\n    ];\n    var codes = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*\";\n    function getHangul(code) {\n      if (code >= 40) {\n        code = code + 168 - 40;\n      } else if (code >= 19) {\n        code = code + 97 - 19;\n      }\n      return (0, strings_1.toUtf8String)([225, (code >> 6) + 132, (code & 63) + 128]);\n    }\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = [];\n      data.forEach(function(data2, length) {\n        length += 4;\n        for (var i = 0; i < data2.length; i += length) {\n          var word = \"\";\n          for (var j = 0; j < length; j++) {\n            word += getHangul(codes.indexOf(data2[i + j]));\n          }\n          wordlist.push(word);\n        }\n      });\n      wordlist.sort();\n      if (wordlist_1.Wordlist.check(lang) !== \"0xf9eddeace9c5d3da9c93cf7d3cd38f6a13ed3affb933259ae865714e8a3ae71a\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for ko (Korean) FAILED\");\n      }\n    }\n    var LangKo = (\n      /** @class */\n      function(_super) {\n        __extends(LangKo2, _super);\n        function LangKo2() {\n          return _super.call(this, \"ko\") || this;\n        }\n        LangKo2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangKo2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangKo2;\n      }(wordlist_1.Wordlist)\n    );\n    var langKo = new LangKo();\n    exports2.langKo = langKo;\n    wordlist_1.Wordlist.register(langKo);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-it.js\nvar require_lang_it = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-it.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langIt = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbacoAbbaglioAbbinatoAbeteAbissoAbolireAbrasivoAbrogatoAccadereAccennoAccusatoAcetoneAchilleAcidoAcquaAcreAcrilicoAcrobataAcutoAdagioAddebitoAddomeAdeguatoAderireAdipeAdottareAdulareAffabileAffettoAffissoAffrantoAforismaAfosoAfricanoAgaveAgenteAgevoleAggancioAgireAgitareAgonismoAgricoloAgrumetoAguzzoAlabardaAlatoAlbatroAlberatoAlboAlbumeAlceAlcolicoAlettoneAlfaAlgebraAlianteAlibiAlimentoAllagatoAllegroAllievoAllodolaAllusivoAlmenoAlogenoAlpacaAlpestreAltalenaAlternoAlticcioAltroveAlunnoAlveoloAlzareAmalgamaAmanitaAmarenaAmbitoAmbratoAmebaAmericaAmetistaAmicoAmmassoAmmendaAmmirareAmmonitoAmoreAmpioAmpliareAmuletoAnacardoAnagrafeAnalistaAnarchiaAnatraAncaAncellaAncoraAndareAndreaAnelloAngeloAngolareAngustoAnimaAnnegareAnnidatoAnnoAnnuncioAnonimoAnticipoAnziApaticoAperturaApodeApparireAppetitoAppoggioApprodoAppuntoAprileArabicaArachideAragostaAraldicaArancioAraturaArazzoArbitroArchivioArditoArenileArgentoArgineArgutoAriaArmoniaArneseArredatoArringaArrostoArsenicoArsoArteficeArzilloAsciuttoAscoltoAsepsiAsetticoAsfaltoAsinoAsolaAspiratoAsproAssaggioAsseAssolutoAssurdoAstaAstenutoAsticeAstrattoAtavicoAteismoAtomicoAtonoAttesaAttivareAttornoAttritoAttualeAusilioAustriaAutistaAutonomoAutunnoAvanzatoAvereAvvenireAvvisoAvvolgereAzioneAzotoAzzimoAzzurroBabeleBaccanoBacinoBacoBadessaBadilataBagnatoBaitaBalconeBaldoBalenaBallataBalzanoBambinoBandireBaraondaBarbaroBarcaBaritonoBarlumeBaroccoBasilicoBassoBatostaBattutoBauleBavaBavosaBeccoBeffaBelgioBelvaBendaBenevoleBenignoBenzinaBereBerlinaBetaBibitaBiciBidoneBifidoBigaBilanciaBimboBinocoloBiologoBipedeBipolareBirbanteBirraBiscottoBisestoBisnonnoBisonteBisturiBizzarroBlandoBlattaBollitoBonificoBordoBoscoBotanicoBottinoBozzoloBraccioBradipoBramaBrancaBravuraBretellaBrevettoBrezzaBrigliaBrillanteBrindareBroccoloBrodoBronzinaBrulloBrunoBubboneBucaBudinoBuffoneBuioBulboBuonoBurloneBurrascaBussolaBustaCadettoCaducoCalamaroCalcoloCalesseCalibroCalmoCaloriaCambusaCamerataCamiciaCamminoCamolaCampaleCanapaCandelaCaneCaninoCanottoCantinaCapaceCapelloCapitoloCapogiroCapperoCapraCapsulaCarapaceCarcassaCardoCarismaCarovanaCarrettoCartolinaCasaccioCascataCasermaCasoCassoneCastelloCasualeCatastaCatenaCatrameCautoCavilloCedibileCedrataCefaloCelebreCellulareCenaCenoneCentesimoCeramicaCercareCertoCerumeCervelloCesoiaCespoCetoChelaChiaroChiccaChiedereChimeraChinaChirurgoChitarraCiaoCiclismoCifrareCignoCilindroCiottoloCircaCirrosiCitricoCittadinoCiuffoCivettaCivileClassicoClinicaCloroCoccoCodardoCodiceCoerenteCognomeCollareColmatoColoreColposoColtivatoColzaComaCometaCommandoComodoComputerComuneConcisoCondurreConfermaCongelareConiugeConnessoConoscereConsumoContinuoConvegnoCopertoCopioneCoppiaCopricapoCorazzaCordataCoricatoCorniceCorollaCorpoCorredoCorsiaCorteseCosmicoCostanteCotturaCovatoCratereCravattaCreatoCredereCremosoCrescitaCretaCricetoCrinaleCrisiCriticoCroceCronacaCrostataCrucialeCruscaCucireCuculoCuginoCullatoCupolaCuratoreCursoreCurvoCuscinoCustodeDadoDainoDalmataDamerinoDanielaDannosoDanzareDatatoDavantiDavveroDebuttoDecennioDecisoDeclinoDecolloDecretoDedicatoDefinitoDeformeDegnoDelegareDelfinoDelirioDeltaDemenzaDenotatoDentroDepositoDerapataDerivareDerogaDescrittoDesertoDesiderioDesumereDetersivoDevotoDiametroDicembreDiedroDifesoDiffusoDigerireDigitaleDiluvioDinamicoDinnanziDipintoDiplomaDipoloDiradareDireDirottoDirupoDisagioDiscretoDisfareDisgeloDispostoDistanzaDisumanoDitoDivanoDiveltoDividereDivoratoDobloneDocenteDoganaleDogmaDolceDomatoDomenicaDominareDondoloDonoDormireDoteDottoreDovutoDozzinaDragoDruidoDubbioDubitareDucaleDunaDuomoDupliceDuraturoEbanoEccessoEccoEclissiEconomiaEderaEdicolaEdileEditoriaEducareEgemoniaEgliEgoismoEgregioElaboratoElargireEleganteElencatoElettoElevareElficoElicaElmoElsaElusoEmanatoEmblemaEmessoEmiroEmotivoEmozioneEmpiricoEmuloEndemicoEnduroEnergiaEnfasiEnotecaEntrareEnzimaEpatiteEpilogoEpisodioEpocaleEppureEquatoreErarioErbaErbosoEredeEremitaErigereErmeticoEroeErosivoErranteEsagonoEsameEsanimeEsaudireEscaEsempioEsercitoEsibitoEsigenteEsistereEsitoEsofagoEsortatoEsosoEspansoEspressoEssenzaEssoEstesoEstimareEstoniaEstrosoEsultareEtilicoEtnicoEtruscoEttoEuclideoEuropaEvasoEvidenzaEvitatoEvolutoEvvivaFabbricaFaccendaFachiroFalcoFamigliaFanaleFanfaraFangoFantasmaFareFarfallaFarinosoFarmacoFasciaFastosoFasulloFaticareFatoFavolosoFebbreFecolaFedeFegatoFelpaFeltroFemminaFendereFenomenoFermentoFerroFertileFessuraFestivoFettaFeudoFiabaFiduciaFifaFiguratoFiloFinanzaFinestraFinireFioreFiscaleFisicoFiumeFlaconeFlamencoFleboFlemmaFloridoFluenteFluoroFobicoFocacciaFocosoFoderatoFoglioFolataFolcloreFolgoreFondenteFoneticoFoniaFontanaForbitoForchettaForestaFormicaFornaioForoFortezzaForzareFosfatoFossoFracassoFranaFrassinoFratelloFreccettaFrenataFrescoFrigoFrollinoFrondeFrugaleFruttaFucilataFucsiaFuggenteFulmineFulvoFumanteFumettoFumosoFuneFunzioneFuocoFurboFurgoneFuroreFusoFutileGabbianoGaffeGalateoGallinaGaloppoGamberoGammaGaranziaGarboGarofanoGarzoneGasdottoGasolioGastricoGattoGaudioGazeboGazzellaGecoGelatinaGelsoGemelloGemmatoGeneGenitoreGennaioGenotipoGergoGhepardoGhiaccioGhisaGialloGildaGineproGiocareGioielloGiornoGioveGiratoGironeGittataGiudizioGiuratoGiustoGlobuloGlutineGnomoGobbaGolfGomitoGommoneGonfioGonnaGovernoGracileGradoGraficoGrammoGrandeGrattareGravosoGraziaGrecaGreggeGrifoneGrigioGrinzaGrottaGruppoGuadagnoGuaioGuantoGuardareGufoGuidareIbernatoIconaIdenticoIdillioIdoloIdraIdricoIdrogenoIgieneIgnaroIgnoratoIlareIllesoIllogicoIlludereImballoImbevutoImboccoImbutoImmaneImmersoImmolatoImpaccoImpetoImpiegoImportoImprontaInalareInarcareInattivoIncantoIncendioInchinoIncisivoInclusoIncontroIncrocioIncuboIndagineIndiaIndoleIneditoInfattiInfilareInflittoIngaggioIngegnoIngleseIngordoIngrossoInnescoInodoreInoltrareInondatoInsanoInsettoInsiemeInsonniaInsulinaIntasatoInteroIntonacoIntuitoInumidireInvalidoInveceInvitoIperboleIpnoticoIpotesiIppicaIrideIrlandaIronicoIrrigatoIrrorareIsolatoIsotopoIstericoIstitutoIstriceItaliaIterareLabbroLabirintoLaccaLaceratoLacrimaLacunaLaddoveLagoLampoLancettaLanternaLardosoLargaLaringeLastraLatenzaLatinoLattugaLavagnaLavoroLegaleLeggeroLemboLentezzaLenzaLeoneLepreLesivoLessatoLestoLetteraleLevaLevigatoLiberoLidoLievitoLillaLimaturaLimitareLimpidoLineareLinguaLiquidoLiraLiricaLiscaLiteLitigioLivreaLocandaLodeLogicaLombareLondraLongevoLoquaceLorenzoLotoLotteriaLuceLucidatoLumacaLuminosoLungoLupoLuppoloLusingaLussoLuttoMacabroMacchinaMaceroMacinatoMadamaMagicoMagliaMagneteMagroMaiolicaMalafedeMalgradoMalintesoMalsanoMaltoMalumoreManaManciaMandorlaMangiareManifestoMannaroManovraMansardaMantideManubrioMappaMaratonaMarcireMarettaMarmoMarsupioMascheraMassaiaMastinoMaterassoMatricolaMattoneMaturoMazurcaMeandroMeccanicoMecenateMedesimoMeditareMegaMelassaMelisMelodiaMeningeMenoMensolaMercurioMerendaMerloMeschinoMeseMessereMestoloMetalloMetodoMettereMiagolareMicaMicelioMicheleMicroboMidolloMieleMiglioreMilanoMiliteMimosaMineraleMiniMinoreMirinoMirtilloMiscelaMissivaMistoMisurareMitezzaMitigareMitraMittenteMnemonicoModelloModificaModuloMoganoMogioMoleMolossoMonasteroMoncoMondinaMonetarioMonileMonotonoMonsoneMontatoMonvisoMoraMordereMorsicatoMostroMotivatoMotosegaMottoMovenzaMovimentoMozzoMuccaMucosaMuffaMughettoMugnaioMulattoMulinelloMultiploMummiaMuntoMuovereMuraleMusaMuscoloMusicaMutevoleMutoNababboNaftaNanometroNarcisoNariceNarratoNascereNastrareNaturaleNauticaNaviglioNebulosaNecrosiNegativoNegozioNemmenoNeofitaNerettoNervoNessunoNettunoNeutraleNeveNevroticoNicchiaNinfaNitidoNobileNocivoNodoNomeNominaNordicoNormaleNorvegeseNostranoNotareNotiziaNotturnoNovellaNucleoNullaNumeroNuovoNutrireNuvolaNuzialeOasiObbedireObbligoObeliscoOblioOboloObsoletoOccasioneOcchioOccidenteOccorrereOccultareOcraOculatoOdiernoOdorareOffertaOffrireOffuscatoOggettoOggiOgnunoOlandeseOlfattoOliatoOlivaOlogrammaOltreOmaggioOmbelicoOmbraOmegaOmissioneOndosoOnereOniceOnnivoroOnorevoleOntaOperatoOpinioneOppostoOracoloOrafoOrdineOrecchinoOreficeOrfanoOrganicoOrigineOrizzonteOrmaOrmeggioOrnativoOrologioOrrendoOrribileOrtensiaOrticaOrzataOrzoOsareOscurareOsmosiOspedaleOspiteOssaOssidareOstacoloOsteOtiteOtreOttagonoOttimoOttobreOvaleOvestOvinoOviparoOvocitoOvunqueOvviareOzioPacchettoPacePacificoPadellaPadronePaesePagaPaginaPalazzinaPalesarePallidoPaloPaludePandoroPannelloPaoloPaonazzoPapricaParabolaParcellaParerePargoloPariParlatoParolaPartireParvenzaParzialePassivoPasticcaPataccaPatologiaPattumePavonePeccatoPedalarePedonalePeggioPelosoPenarePendicePenisolaPennutoPenombraPensarePentolaPepePepitaPerbenePercorsoPerdonatoPerforarePergamenaPeriodoPermessoPernoPerplessoPersuasoPertugioPervasoPesatorePesistaPesoPestiferoPetaloPettinePetulantePezzoPiacerePiantaPiattinoPiccinoPicozzaPiegaPietraPifferoPigiamaPigolioPigroPilaPiliferoPillolaPilotaPimpantePinetaPinnaPinoloPioggiaPiomboPiramidePireticoPiritePirolisiPitonePizzicoPlaceboPlanarePlasmaPlatanoPlenarioPochezzaPoderosoPodismoPoesiaPoggiarePolentaPoligonoPollicePolmonitePolpettaPolsoPoltronaPolverePomicePomodoroPontePopolosoPorfidoPorosoPorporaPorrePortataPosaPositivoPossessoPostulatoPotassioPoterePranzoPrassiPraticaPreclusoPredicaPrefissoPregiatoPrelievoPremerePrenotarePreparatoPresenzaPretestoPrevalsoPrimaPrincipePrivatoProblemaProcuraProdurreProfumoProgettoProlungaPromessaPronomePropostaProrogaProtesoProvaPrudentePrugnaPruritoPsichePubblicoPudicaPugilatoPugnoPulcePulitoPulsantePuntarePupazzoPupillaPuroQuadroQualcosaQuasiQuerelaQuotaRaccoltoRaddoppioRadicaleRadunatoRafficaRagazzoRagioneRagnoRamarroRamingoRamoRandagioRantolareRapatoRapinaRappresoRasaturaRaschiatoRasenteRassegnaRastrelloRataRavvedutoRealeRecepireRecintoReclutaReconditoRecuperoRedditoRedimereRegalatoRegistroRegolaRegressoRelazioneRemareRemotoRennaReplicaReprimereReputareResaResidenteResponsoRestauroReteRetinaRetoricaRettificaRevocatoRiassuntoRibadireRibelleRibrezzoRicaricaRiccoRicevereRiciclatoRicordoRicredutoRidicoloRidurreRifasareRiflessoRiformaRifugioRigareRigettatoRighelloRilassatoRilevatoRimanereRimbalzoRimedioRimorchioRinascitaRincaroRinforzoRinnovoRinomatoRinsavitoRintoccoRinunciaRinvenireRiparatoRipetutoRipienoRiportareRipresaRipulireRisataRischioRiservaRisibileRisoRispettoRistoroRisultatoRisvoltoRitardoRitegnoRitmicoRitrovoRiunioneRivaRiversoRivincitaRivoltoRizomaRobaRoboticoRobustoRocciaRocoRodaggioRodereRoditoreRogitoRollioRomanticoRompereRonzioRosolareRospoRotanteRotondoRotulaRovescioRubizzoRubricaRugaRullinoRumineRumorosoRuoloRupeRussareRusticoSabatoSabbiareSabotatoSagomaSalassoSaldaturaSalgemmaSalivareSalmoneSaloneSaltareSalutoSalvoSapereSapidoSaporitoSaracenoSarcasmoSartoSassosoSatelliteSatiraSatolloSaturnoSavanaSavioSaziatoSbadiglioSbalzoSbancatoSbarraSbattereSbavareSbendareSbirciareSbloccatoSbocciatoSbrinareSbruffoneSbuffareScabrosoScadenzaScalaScambiareScandaloScapolaScarsoScatenareScavatoSceltoScenicoScettroSchedaSchienaSciarpaScienzaScindereScippoSciroppoScivoloSclerareScodellaScolpitoScompartoSconfortoScoprireScortaScossoneScozzeseScribaScrollareScrutinioScuderiaScultoreScuolaScuroScusareSdebitareSdoganareSeccaturaSecondoSedanoSeggiolaSegnalatoSegregatoSeguitoSelciatoSelettivoSellaSelvaggioSemaforoSembrareSemeSeminatoSempreSensoSentireSepoltoSequenzaSerataSerbatoSerenoSerioSerpenteSerraglioServireSestinaSetolaSettimanaSfaceloSfaldareSfamatoSfarzosoSfaticatoSferaSfidaSfilatoSfingeSfocatoSfoderareSfogoSfoltireSforzatoSfrattoSfruttatoSfuggitoSfumareSfusoSgabelloSgarbatoSgonfiareSgorbioSgrassatoSguardoSibiloSiccomeSierraSiglaSignoreSilenzioSillabaSimboloSimpaticoSimulatoSinfoniaSingoloSinistroSinoSintesiSinusoideSiparioSismaSistoleSituatoSlittaSlogaturaSlovenoSmarritoSmemoratoSmentitoSmeraldoSmilzoSmontareSmottatoSmussatoSnellireSnervatoSnodoSobbalzoSobrioSoccorsoSocialeSodaleSoffittoSognoSoldatoSolenneSolidoSollazzoSoloSolubileSolventeSomaticoSommaSondaSonettoSonniferoSopireSoppesoSopraSorgereSorpassoSorrisoSorsoSorteggioSorvolatoSospiroSostaSottileSpadaSpallaSpargereSpatolaSpaventoSpazzolaSpecieSpedireSpegnereSpelaturaSperanzaSpessoreSpettraleSpezzatoSpiaSpigolosoSpillatoSpinosoSpiraleSplendidoSportivoSposoSprangaSprecareSpronatoSpruzzoSpuntinoSquilloSradicareSrotolatoStabileStaccoStaffaStagnareStampatoStantioStarnutoStaseraStatutoSteloSteppaSterzoStilettoStimaStirpeStivaleStizzosoStonatoStoricoStrappoStregatoStriduloStrozzareStruttoStuccareStufoStupendoSubentroSuccosoSudoreSuggeritoSugoSultanoSuonareSuperboSupportoSurgelatoSurrogatoSussurroSuturaSvagareSvedeseSveglioSvelareSvenutoSveziaSviluppoSvistaSvizzeraSvoltaSvuotareTabaccoTabulatoTacciareTaciturnoTaleTalismanoTamponeTanninoTaraTardivoTargatoTariffaTarpareTartarugaTastoTatticoTavernaTavolataTazzaTecaTecnicoTelefonoTemerarioTempoTemutoTendoneTeneroTensioneTentacoloTeoremaTermeTerrazzoTerzettoTesiTesseratoTestatoTetroTettoiaTifareTigellaTimbroTintoTipicoTipografoTiraggioTiroTitanioTitoloTitubanteTizioTizzoneToccareTollerareToltoTombolaTomoTonfoTonsillaTopazioTopologiaToppaTorbaTornareTorroneTortoraToscanoTossireTostaturaTotanoTraboccoTracheaTrafilaTragediaTralcioTramontoTransitoTrapanoTrarreTraslocoTrattatoTraveTrecciaTremolioTrespoloTributoTrichecoTrifoglioTrilloTrinceaTrioTristezzaTrituratoTrivellaTrombaTronoTroppoTrottolaTrovareTruccatoTubaturaTuffatoTulipanoTumultoTunisiaTurbareTurchinoTutaTutelaUbicatoUccelloUccisoreUdireUditivoUffaUfficioUgualeUlisseUltimatoUmanoUmileUmorismoUncinettoUngereUnghereseUnicornoUnificatoUnisonoUnitarioUnteUovoUpupaUraganoUrgenzaUrloUsanzaUsatoUscitoUsignoloUsuraioUtensileUtilizzoUtopiaVacanteVaccinatoVagabondoVagliatoValangaValgoValicoVallettaValorosoValutareValvolaVampataVangareVanitosoVanoVantaggioVanveraVaporeVaranoVarcatoVarianteVascaVedettaVedovaVedutoVegetaleVeicoloVelcroVelinaVellutoVeloceVenatoVendemmiaVentoVeraceVerbaleVergognaVerificaVeroVerrucaVerticaleVescicaVessilloVestaleVeteranoVetrinaVetustoViandanteVibranteVicendaVichingoVicinanzaVidimareVigiliaVignetoVigoreVileVillanoViminiVincitoreViolaViperaVirgolaVirologoVirulentoViscosoVisioneVispoVissutoVisuraVitaVitelloVittimaVivandaVividoViziareVoceVogaVolatileVolereVolpeVoragineVulcanoZampognaZannaZappatoZatteraZavorraZefiroZelanteZeloZenzeroZerbinoZibettoZincoZirconeZittoZollaZoticoZuccheroZufoloZuluZuppa\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x5c1362d88fd4cf614a96f3234941d29f7d37c08c5292fde03bf62c2db6ff7620\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for it (Italian) FAILED\");\n      }\n    }\n    var LangIt = (\n      /** @class */\n      function(_super) {\n        __extends(LangIt2, _super);\n        function LangIt2() {\n          return _super.call(this, \"it\") || this;\n        }\n        LangIt2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangIt2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangIt2;\n      }(wordlist_1.Wordlist)\n    );\n    var langIt = new LangIt();\n    exports2.langIt = langIt;\n    wordlist_1.Wordlist.register(langIt);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-zh.js\nvar require_lang_zh = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-zh.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langZhTw = exports2.langZhCn = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = \"}aE#4A=Yv&co#4N#6G=cJ&SM#66|/Z#4t&kn~46#4K~4q%b9=IR#7l,mB#7W_X2*dl}Uo~7s}Uf&Iw#9c&cw~6O&H6&wx&IG%v5=IQ~8a&Pv#47$PR&50%Ko&QM&3l#5f,D9#4L|/H&tQ;v0~6n]nN<di,AM=W5%QO&ka&ua,hM^tm=zV=JA=wR&+X]7P&NB#4J#5L|/b[dA}tJ<Do&6m&u2[U1&Kb.HM&mC=w0&MW<rY,Hq#6M}QG,13&wP}Jp]Ow%ue&Kg<HP<D9~4k~9T&I2_c6$9T#9/[C5~7O~4a=cs&O7=KK=An&l9$6U$8A&uD&QI|/Y&bg}Ux&F2#6b}E2&JN&kW&kp=U/&bb=Xl<Cj}k+~5J#6L&5z&9i}b4&Fo,ho(X0_g3~4O$Fz&QE<HN=Ww]6/%GF-Vw=tj&/D&PN#9g=YO}cL&Of&PI~5I&Ip=vU=IW#9G;0o-wU}ss&QR<BT&R9=tk$PY_dh&Pq-yh]7T,nj.Xu=EP&76=cI&Fs*Xg}z7$Gb&+I=DF,AF=cA}rL#7j=Dz&3y<Aa$52=PQ}b0(iY$Fa}oL&xV#6U=ec=WZ,xh%RY<dp#9N&Fl&44=WH*A7=sh&TB&8P=07;u+&PK}uh}J5#72)V/=xC,AB$k0&f6;1E|+5=1B,3v]6n&wR%b+&xx]7f=Ol}fl;+D^wG]7E;nB;uh^Ir&l5=JL,nS=cf=g5;u6|/Q$Gc=MH%Hg#5d%M6^86=U+$Gz,l/,ir^5y&Ba&/F-IY&FI&be%IZ#77&PW_Nu$kE(Yf&NX]7Z,Jy&FJ(Xo&Nz#/d=y7&MX<Ag}Z+;nE]Dt(iG#4D=13&Pj~4c%v8&Zo%OL&/X#4W<HR&ie~6J_1O(Y2=y5=Ad*cv_eB#6k&PX:BU#7A;uk&Ft&Fx_dD=U2;vB=U5=4F}+O&GN.HH:9s=b0%NV(jO&IH=JT}Z9=VZ<Af,Kx^4m&uJ%c6,6r;9m#+L}cf%Kh&F3~4H=vP}bu,Hz|++,1w]nv}k6;uu$jw*Kl*WX&uM[x7&Fr[m7$NO&QN]hu=JN}nR^8g#/h(ps|KC;vd}xz=V0}p6&FD$G1#7K<bG_4p~8g&cf;u4=tl}+k%5/}fz;uw<cA=u1}gU}VM=LJ=eX&+L&Pr#4U}p2:nC,2K]7H:jF&9x}uX#9O=MB<fz~8X~5m&4D&kN&u5%E/(h7(ZF&VG<de(qM|/e-Wt=3x(a+,/R]f/&ND$Ro&nU}0g=KA%kH&NK$Ke<dS}cB&IX~5g$TN]6m=Uv,Is&Py=Ef%Kz#+/%bi&+A<F4$OG&4C&FL#9V<Zk=2I_eE&6c]nw&kq$HG}y+&A8$P3}OH=XP]70%IS(AJ_gH%GZ&tY&AZ=vb~6y&/r=VI=Wv<Zi=fl=xf&eL}c8}OL=MJ=g8$F7=YT}9u=0+^xC}JH&nL^N0~4T]K2,Cy%OC#6s;vG(AC^xe^cG&MF}Br#9P;wD-7h$O/&xA}Fn^PC]6i]7G&8V$Qs;vl(TB~73~4l<mW&6V=2y&uY&+3)aP}XF;LP&kx$wU=t7;uy<FN&lz)7E=Oo*Y+;wI}9q}le;J6&Ri&4t&Qr#8B=cb&vG=J5|Ql(h5<Yy~4+}QD,Lx=wn%K/&RK=dO&Pw,Q9=co%4u;9u}g0@6a^4I%b0=zo|/c&tX=dQ=OS#+b=yz_AB&wB&Pm=W9$HP_gR=62=AO=ti=hI,oA&jr&dH=tm&b6$P2(x8=zi;nG~7F;05]0n[Ix&3m}rg=Xp=cd&uz]7t;97=cN;vV<jf&FF&F1=6Q&Ik*Kk&P4,2z=fQ]7D&3u,H0=d/}Uw<ZN<7R}Kv;0f$H7,MD]7n$F0#88~9Z%da=by;+T#/u=VF&fO&kr^kf<AB]sU,I5$Ng&Pz;0i&QD&vM=Yl:BM;nJ_xJ]U7&Kf&30,3f|Z9*dC)je_jA&Q4&Kp$NH(Yz#6S&Id%Ib=KX,AD=KV%dP}tW&Pk^+E_Ni=cq,3R}VZ(Si=b+}rv;0j}rZ]uA,/w(Sx&Jv$w9&4d&wE,NJ$Gy=J/]Ls#7k<ZQ<Y/&uj]Ov$PM;v3,2F&+u:up=On&3e,Jv;90=J+&Qm]6q}bK#+d~8Y(h2]hA;99&AS=I/}qB&dQ}yJ-VM}Vl&ui,iB&G3|Dc]7d=eQ%dX%JC_1L~4d^NP;vJ&/1)ZI#7N]9X[bQ&PL=0L(UZ,Lm&kc&IR}n7(iR<AQ<dg=33=vN}ft}au]7I,Ba=x9=dR~6R&Tq=Xi,3d$Nr&Bc}DI&ku&vf]Dn,/F&iD,Ll&Nw=0y&I7=Ls=/A&tU=Qe}Ua&uk&+F=g4=gh=Vj#+1&Qn}Uy*44#5F,Pc&Rz*Xn=oh=5W;0n_Nf(iE<Y7=vr=Zu]oz#5Z%mI=kN=Bv_Jp(T2;vt_Ml<FS&uI=L/&6P]64$M7}86<bo%QX(SI%IY&VK=Al&Ux;vv;ut*E/%uh<ZE|O3,M2(yc]yu=Wk&tp:Ex}hr,Cl&WE)+Z=8U}I2_4Q,hA_si=iw=OM=tM=yZ%Ia=U7;wT}b+;uo=Za}yS!5x}HD}fb#5O_dA;Nv%uB(yB;01(Sf}Fk;v7}Pt#8v<mZ#7L,/r&Pl~4w&f5=Ph$Fw_LF&8m,bL=yJ&BH}p/*Jn}tU~5Q;wB(h6]Df]8p^+B;E4&Wc=d+;Ea&bw$8C&FN,DM=Yf}mP~5w=fT#6V=mC=Fi=AV}jB&AN}lW}aH#/D)dZ;hl;vE}/7,CJ;31&w8,hj%u9_Js=jJ&4M~8k=TN&eC}nL&uc-wi&lX}dj=Mv=e2#6u=cr$uq$6G]8W}Jb:nm=Yg<b3(UA;vX&6n&xF=KT,jC,De&R8&oY=Zv&oB]7/=Z2&Oa}bf,hh(4h^tZ&72&Nx;D2&xL~5h~40)ZG)h+=OJ&RA]Bv$yB=Oq=df,AQ%Jn}OJ;11,3z&Tl&tj;v+^Hv,Dh(id=s+]7N&N3)9Q~8f,S4=uW=w4&uX,LX&3d]CJ&yp&8x<b2_do&lP=y/<cy_dG=Oi=7R(VH(lt_1T,Iq_AA;12^6T%k6#8K[B1{oO<AU[Bt;1b$9S&Ps<8T=St{bY,jB(Zp&63&Uv$9V,PM]6v&Af}zW[bW_oq}sm}nB&Kq&gC&ff_eq_2m&5F&TI}rf}Gf;Zr_z9;ER&jk}iz_sn<BN~+n&vo=Vi%97|ZR=Wc,WE&6t]6z%85(ly#84=KY)6m_5/=aX,N3}Tm&he&6K]tR_B2-I3;u/&hU&lH<AP=iB&IA=XL;/5&Nh=wv<BH#79=vS=zl<AA=0X_RG}Bw&9p$NW,AX&kP_Lp&/Z(Tc]Mu}hs#6I}5B&cI<bq&H9#6m=K9}vH(Y1(Y0#4B&w6,/9&gG<bE,/O=zb}I4_l8<B/;wL%Qo<HO[Mq=XX}0v&BP&F4(mG}0i}nm,EC=9u{I3,xG&/9=JY*DK&hR)BX=EI=cx=b/{6k}yX%A+&wa}Xb=la;wi^lL;0t}jo&Qb=xg=XB}iO<qo{bR=NV&8f=a0&Jy;0v=uK)HK;vN#6h&jB(h/%ud&NI%wY.X7=Pt}Cu-uL&Gs_hl%mH,tm]78=Lb^Q0#7Y=1u<Bt&+Q=Co_RH,w3;1e}ux<aU;ui}U3&Q5%bt]63&UQ|0l&uL}O7&3o,AV&dm|Nj(Xt*5+(Uu&Hh(p7(UF=VR=Bp^Jl&Hd[ix)9/=Iq]C8<67]66}mB%6f}bb}JI]8T$HA}db=YM&pa=2J}tS&Y0=PS&y4=cX$6E,hX,XP&nR;04,FQ&l0&Vm_Dv#5Y~8Z=Bi%MA]6x=JO:+p,Az&9q,Hj~6/}SD=K1:EJ}nA;Qo#/E]9R,Ie&6X%W3]61&v4=xX_MC=0q;06(Xq=fs}IG}Dv=0l}o7$iZ;9v&LH&DP-7a&OY,SZ,Kz,Cv&dh=fx|Nh,F/~7q=XF&w+;9n&Gw;0h}Z7<7O&JK(S7&LS<AD<ac=wo<Dt&zw%4B=4v#8P;9o~6p*vV=Tm,Or&I6=1q}nY=P0=gq&Bl&Uu,Ch%yb}UY=zh}dh}rl(T4_xk(YA#8R*xH,IN}Jn]7V}C4&Ty}j3]7p=cL=3h&wW%Qv<Z3=f0&RI&+S(ic_zq}oN&/Y=z1;Td=LW=0e=OI(Vc,+b^ju(UL;0r:Za%8v=Rp=zw&58&73&wK}qX]6y&8E)a2}WR=wP^ur&nQ<cH}Re=Aq&wk}Q0&+q=PP,Gc|/d^k5,Fw]8Y}Pg]p3=ju=ed}r5_yf&Cs]7z$/G<Cm&Jp&54_1G_gP_Ll}JZ;0u]k8_7k(Sg]65{9i=LN&Sx&WK,iW&fD&Lk{9a}Em-9c#8N&io=sy]8d&nT&IK(lx#7/$lW(Td<s8~49,3o<7Y=MW(T+_Jr&Wd,iL}Ct=xh&5V;v4&8n%Kx=iF&l2_0B{B+,If(J0,Lv;u8=Kx-vB=HC&vS=Z6&fU&vE^xK;3D=4h=MR#45:Jw;0d}iw=LU}I5=I0]gB*im,K9}GU,1k_4U&Tt=Vs(iX&lU(TF#7y,ZO}oA&m5#5P}PN}Uz=hM<B1&FB<aG,e6~7T<tP(UQ_ZT=wu&F8)aQ]iN,1r_Lo&/g:CD}84{J1_Ki&Na&3n$jz&FE=dc;uv;va}in}ll=fv(h1&3h}fp=Cy}BM(+E~8m}lo%v7=hC(T6$cj=BQ=Bw(DR,2j=Ks,NS|F+;00=fU=70}Mb(YU;+G&m7&hr=Sk%Co]t+(X5_Jw}0r}gC(AS-IP&QK<Z2#8Q$WC]WX}T2&pG_Ka,HC=R4&/N;Z+;ch(C7,D4$3p_Mk&B2$8D=n9%Ky#5z(CT&QJ#7B]DC]gW}nf~5M;Iw#80}Tc_1F#4Z-aC}Hl=ph=fz,/3=aW}JM}nn;DG;vm}wn,4P}T3;wx&RG$u+}zK=0b;+J_Ek{re<aZ=AS}yY#5D]7q,Cp}xN=VP*2C}GZ}aG~+m_Cs=OY#6r]6g<GS}LC(UB=3A=Bo}Jy<c4}Is;1P<AG}Op<Z1}ld}nS=1Z,yM&95&98=CJ(4t:2L$Hk=Zo}Vc;+I}np&N1}9y=iv}CO*7p=jL)px]tb^zh&GS&Vl%v/;vR=14=zJ&49|/f]hF}WG;03=8P}o/&Gg&rp;DB,Kv}Ji&Pb;aA^ll(4j%yt}+K$Ht#4y&hY]7Y<F1,eN}bG(Uh%6Z]t5%G7;+F_RE;it}tL=LS&Da=Xx(S+(4f=8G=yI}cJ}WP=37=jS}pX}hd)fp<A8=Jt~+o$HJ=M6}iX=g9}CS=dv=Cj(mP%Kd,xq|+9&LD(4/=Xm&QP=Lc}LX&fL;+K=Op(lu=Qs.qC:+e&L+=Jj#8w;SL]7S(b+#4I=c1&nG_Lf&uH;+R)ZV<bV%B/,TE&0H&Jq&Ah%OF&Ss(p2,Wv&I3=Wl}Vq;1L&lJ#9b_1H=8r=b8=JH(SZ=hD=J2#7U,/U#/X~6P,FU<eL=jx,mG=hG=CE&PU=Se(qX&LY=X6=y4&tk&QQ&tf=4g&xI}W+&mZ=Dc#7w}Lg;DA;wQ_Kb(cJ=hR%yX&Yb,hw{bX_4X;EP;1W_2M}Uc=b5(YF,CM&Tp^OJ{DD]6s=vF=Yo~8q}XH}Fu%P5(SJ=Qt;MO]s8<F3&B3&8T(Ul-BS*dw&dR<87}/8]62$PZ]Lx<Au}9Q]7c=ja=KR,Go,Us&v6(qk}pG&G2=ev^GM%w4&H4]7F&dv]J6}Ew:9w=sj-ZL}Ym$+h(Ut(Um~4n=Xs(U7%eE=Qc_JR<CA#6t<Fv|/I,IS,EG<F2(Xy$/n<Fa(h9}+9_2o&N4#7X<Zq|+f_Dp=dt&na,Ca=NJ)jY=8C=YG=s6&Q+<DO}D3=xB&R1(lw;Qn<bF(Cu|/B}HV=SS&n7,10&u0]Dm%A6^4Q=WR(TD=Xo<GH,Rj(l8)bP&n/=LM&CF,F5&ml=PJ;0k=LG=tq,Rh,D6@4i=1p&+9=YC%er_Mh;nI;0q=Fw]80=xq=FM$Gv;v6&nc;wK%H2&Kj;vs,AA=YP,66}bI(qR~5U=6q~4b$Ni=K5.X3$So&Iu(p+]8G=Cf=RY(TS_O3(iH&57=fE=Dg_Do#9z#7H;FK{qd_2k%JR}en&gh_z8;Rx}9p<cN_Ne,DO;LN_7o~/p=NF=5Y}gN<ce<C1,QE]Wv=3u<BC}GK]yq}DY&u/_hj=II(pz&rC,jV&+Z}ut=NQ;Cg-SR_ZS,+o=u/;Oy_RK_QF(Fx&xP}Wr&TA,Uh&g1=yr{ax[VF$Pg(YB;Ox=Vy;+W(Sp}XV%dd&33(l/]l4#4Y}OE=6c=bw(A7&9t%wd&N/&mo,JH&Qe)fm=Ao}fu=tH\";\n    var deltaData = \"FAZDC6BALcLZCA+GBARCW8wNCcDDZ8LVFBOqqDUiou+M42TFAyERXFb7EjhP+vmBFpFrUpfDV2F7eB+eCltCHJFWLFCED+pWTojEIHFXc3aFn4F68zqjEuKidS1QBVPDEhE7NA4mhMF7oThD49ot3FgtzHFCK0acW1x8DH1EmLoIlrWFBLE+y5+NA3Cx65wJHTaEZVaK1mWAmPGxgYCdxwOjTDIt/faOEhTl1vqNsKtJCOhJWuio2g07KLZEQsFBUpNtwEByBgxFslFheFbiEPvi61msDvApxCzB6rBCzox7joYA5UdDc+Cb4FSgIabpXFAj3bjkmFAxCZE+mD/SFf/0ELecYCt3nLoxC6WEZf2tKDB4oZvrEmqFkKk7BwILA7gtYBpsTq//D4jD0F0wEB9pyQ1BD5Ba0oYHDI+sbDFhvrHXdDHfgFEIJLi5r8qercNFBgFLC4bo5ERJtamWBDFy73KCEb6M8VpmEt330ygCTK58EIIFkYgF84gtGA9Uyh3m68iVrFbWFbcbqiCYHZ9J1jeRPbL8yswhMiDbhEhdNoSwFbZrLT740ABEqgCkO8J1BLd1VhKKR4sD1yUo0z+FF59Mvg71CFbyEhbHSFBKEIKyoQNgQppq9T0KAqePu0ZFGrXOHdKJqkoTFhYvpDNyuuznrN84thJbsCoO6Cu6Xlvntvy0QYuAExQEYtTUBf3CoCqwgGFZ4u1HJFzDVwEy3cjcpV4QvsPaBC3rCGyCF23o4K3pp2gberGgFEJEHo4nHICtyKH2ZqyxhN05KBBJIQlKh/Oujv/DH32VrlqFdIFC7Fz9Ct4kaqFME0UETLprnN9kfy+kFmtQBB0+5CFu0N9Ij8l/VvJDh2oq3hT6EzjTHKFN7ZjZwoTsAZ4Exsko6Fpa6WC+sduz8jyrLpegTv2h1EBeYpLpm2czQW0KoCcS0bCVXCmuWJDBjN1nQNLdF58SFJ0h7i3pC3oEOKy/FjBklL70XvBEEIWp2yZ04xObzAWDDJG7f+DbqBEA7LyiR95j7MDVdDViz2RE5vWlBMv5e4+VfhP3aXNPhvLSynb9O2x4uFBV+3jqu6d5pCG28/sETByvmu/+IJ0L3wb4rj9DNOLBF6XPIODr4L19U9RRofAG6Nxydi8Bki8BhGJbBAJKzbJxkZSlF9Q2Cu8oKqggB9hBArwLLqEBWEtFowy8XK8bEyw9snT+BeyFk1ZCSrdmgfEwFePTgCjELBEnIbjaDDPJm36rG9pztcEzT8dGk23SBhXBB1H4z+OWze0ooFzz8pDBYFvp9j9tvFByf9y4EFdVnz026CGR5qMr7fxMHN8UUdlyJAzlTBDRC28k+L4FB8078ljyD91tUj1ocnTs8vdEf7znbzm+GIjEZnoZE5rnLL700Xc7yHfz05nWxy03vBB9YGHYOWxgMQGBCR24CVYNE1hpfKxN0zKnfJDmmMgMmBWqNbjfSyFCBWSCGCgR8yFXiHyEj+VtD1FB3FpC1zI0kFbzifiKTLm9yq5zFmur+q8FHqjoOBWsBPiDbnCC2ErunV6cJ6TygXFYHYp7MKN9RUlSIS8/xBAGYLzeqUnBF4QbsTuUkUqGs6CaiDWKWjQK9EJkjpkTmNCPYXL\";\n    var wordlist = {\n      zh_cn: null,\n      zh_tw: null\n    };\n    var Checks = {\n      zh_cn: \"0x17bcc4d8547e5a7135e365d1ab443aaae95e76d8230c2782c67305d4f21497a1\",\n      zh_tw: \"0x51e720e90c7b87bec1d70eb6e74a21a449bd3ec9c020b01d3a40ed991b60ce5d\"\n    };\n    var codes = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var style = \"~!@#$%^&*_-=[]{}|;:,.()<>?\";\n    function loadWords(lang) {\n      if (wordlist[lang.locale] !== null) {\n        return;\n      }\n      wordlist[lang.locale] = [];\n      var deltaOffset = 0;\n      for (var i = 0; i < 2048; i++) {\n        var s = style.indexOf(data[i * 3]);\n        var bytes = [\n          228 + (s >> 2),\n          128 + codes.indexOf(data[i * 3 + 1]),\n          128 + codes.indexOf(data[i * 3 + 2])\n        ];\n        if (lang.locale === \"zh_tw\") {\n          var common = s % 4;\n          for (var i_1 = common; i_1 < 3; i_1++) {\n            bytes[i_1] = codes.indexOf(deltaData[deltaOffset++]) + (i_1 == 0 ? 228 : 128);\n          }\n        }\n        wordlist[lang.locale].push((0, strings_1.toUtf8String)(bytes));\n      }\n      if (wordlist_1.Wordlist.check(lang) !== Checks[lang.locale]) {\n        wordlist[lang.locale] = null;\n        throw new Error(\"BIP39 Wordlist for \" + lang.locale + \" (Chinese) FAILED\");\n      }\n    }\n    var LangZh = (\n      /** @class */\n      function(_super) {\n        __extends(LangZh2, _super);\n        function LangZh2(country) {\n          return _super.call(this, \"zh_\" + country) || this;\n        }\n        LangZh2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[this.locale][index];\n        };\n        LangZh2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist[this.locale].indexOf(word);\n        };\n        LangZh2.prototype.split = function(mnemonic) {\n          mnemonic = mnemonic.replace(/(?:\\u3000| )+/g, \"\");\n          return mnemonic.split(\"\");\n        };\n        return LangZh2;\n      }(wordlist_1.Wordlist)\n    );\n    var langZhCn = new LangZh(\"cn\");\n    exports2.langZhCn = langZhCn;\n    wordlist_1.Wordlist.register(langZhCn);\n    wordlist_1.Wordlist.register(langZhCn, \"zh\");\n    var langZhTw = new LangZh(\"tw\");\n    exports2.langZhTw = langZhTw;\n    wordlist_1.Wordlist.register(langZhTw);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/wordlists.js\nvar require_wordlists = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/wordlists.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.wordlists = void 0;\n    var lang_cz_1 = require_lang_cz();\n    var lang_en_1 = require_lang_en();\n    var lang_es_1 = require_lang_es();\n    var lang_fr_1 = require_lang_fr();\n    var lang_ja_1 = require_lang_ja();\n    var lang_ko_1 = require_lang_ko();\n    var lang_it_1 = require_lang_it();\n    var lang_zh_1 = require_lang_zh();\n    exports2.wordlists = {\n      cz: lang_cz_1.langCz,\n      en: lang_en_1.langEn,\n      es: lang_es_1.langEs,\n      fr: lang_fr_1.langFr,\n      it: lang_it_1.langIt,\n      ja: lang_ja_1.langJa,\n      ko: lang_ko_1.langKo,\n      zh: lang_zh_1.langZhCn,\n      zh_cn: lang_zh_1.langZhCn,\n      zh_tw: lang_zh_1.langZhTw\n    };\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/index.js\nvar require_lib20 = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.wordlists = exports2.Wordlist = exports2.logger = void 0;\n    var wordlist_1 = require_wordlist();\n    Object.defineProperty(exports2, \"logger\", { enumerable: true, get: function() {\n      return wordlist_1.logger;\n    } });\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return wordlist_1.Wordlist;\n    } });\n    var wordlists_1 = require_wordlists();\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return wordlists_1.wordlists;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/hdnode/lib/_version.js\nvar require_version17 = __commonJS({\n  \"node_modules/@ethersproject/hdnode/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"hdnode/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/hdnode/lib/index.js\nvar require_lib21 = __commonJS({\n  \"node_modules/@ethersproject/hdnode/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getAccountPath = exports2.isValidMnemonic = exports2.entropyToMnemonic = exports2.mnemonicToEntropy = exports2.mnemonicToSeed = exports2.HDNode = exports2.defaultPath = void 0;\n    var basex_1 = require_lib17();\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var strings_1 = require_lib9();\n    var pbkdf2_1 = require_lib18();\n    var properties_1 = require_lib4();\n    var signing_key_1 = require_lib14();\n    var sha2_1 = require_lib19();\n    var transactions_1 = require_lib15();\n    var wordlists_1 = require_lib20();\n    var logger_1 = require_lib();\n    var _version_1 = require_version17();\n    var logger = new logger_1.Logger(_version_1.version);\n    var N = bignumber_1.BigNumber.from(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\");\n    var MasterSecret = (0, strings_1.toUtf8Bytes)(\"Bitcoin seed\");\n    var HardenedBit = 2147483648;\n    function getUpperMask(bits) {\n      return (1 << bits) - 1 << 8 - bits;\n    }\n    function getLowerMask(bits) {\n      return (1 << bits) - 1;\n    }\n    function bytes32(value) {\n      return (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(value), 32);\n    }\n    function base58check(data) {\n      return basex_1.Base58.encode((0, bytes_1.concat)([data, (0, bytes_1.hexDataSlice)((0, sha2_1.sha256)((0, sha2_1.sha256)(data)), 0, 4)]));\n    }\n    function getWordlist(wordlist) {\n      if (wordlist == null) {\n        return wordlists_1.wordlists[\"en\"];\n      }\n      if (typeof wordlist === \"string\") {\n        var words = wordlists_1.wordlists[wordlist];\n        if (words == null) {\n          logger.throwArgumentError(\"unknown locale\", \"wordlist\", wordlist);\n        }\n        return words;\n      }\n      return wordlist;\n    }\n    var _constructorGuard = {};\n    exports2.defaultPath = \"m/44'/60'/0'/0/0\";\n    var HDNode = (\n      /** @class */\n      function() {\n        function HDNode2(constructorGuard, privateKey, publicKey, parentFingerprint, chainCode, index, depth, mnemonicOrPath) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, HDNode2);\n          if (constructorGuard !== _constructorGuard) {\n            throw new Error(\"HDNode constructor cannot be called directly\");\n          }\n          if (privateKey) {\n            var signingKey = new signing_key_1.SigningKey(privateKey);\n            (0, properties_1.defineReadOnly)(this, \"privateKey\", signingKey.privateKey);\n            (0, properties_1.defineReadOnly)(this, \"publicKey\", signingKey.compressedPublicKey);\n          } else {\n            (0, properties_1.defineReadOnly)(this, \"privateKey\", null);\n            (0, properties_1.defineReadOnly)(this, \"publicKey\", (0, bytes_1.hexlify)(publicKey));\n          }\n          (0, properties_1.defineReadOnly)(this, \"parentFingerprint\", parentFingerprint);\n          (0, properties_1.defineReadOnly)(this, \"fingerprint\", (0, bytes_1.hexDataSlice)((0, sha2_1.ripemd160)((0, sha2_1.sha256)(this.publicKey)), 0, 4));\n          (0, properties_1.defineReadOnly)(this, \"address\", (0, transactions_1.computeAddress)(this.publicKey));\n          (0, properties_1.defineReadOnly)(this, \"chainCode\", chainCode);\n          (0, properties_1.defineReadOnly)(this, \"index\", index);\n          (0, properties_1.defineReadOnly)(this, \"depth\", depth);\n          if (mnemonicOrPath == null) {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", null);\n            (0, properties_1.defineReadOnly)(this, \"path\", null);\n          } else if (typeof mnemonicOrPath === \"string\") {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", null);\n            (0, properties_1.defineReadOnly)(this, \"path\", mnemonicOrPath);\n          } else {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", mnemonicOrPath);\n            (0, properties_1.defineReadOnly)(this, \"path\", mnemonicOrPath.path);\n          }\n        }\n        Object.defineProperty(HDNode2.prototype, \"extendedKey\", {\n          get: function() {\n            if (this.depth >= 256) {\n              throw new Error(\"Depth too large!\");\n            }\n            return base58check((0, bytes_1.concat)([\n              this.privateKey != null ? \"0x0488ADE4\" : \"0x0488B21E\",\n              (0, bytes_1.hexlify)(this.depth),\n              this.parentFingerprint,\n              (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(this.index), 4),\n              this.chainCode,\n              this.privateKey != null ? (0, bytes_1.concat)([\"0x00\", this.privateKey]) : this.publicKey\n            ]));\n          },\n          enumerable: false,\n          configurable: true\n        });\n        HDNode2.prototype.neuter = function() {\n          return new HDNode2(_constructorGuard, null, this.publicKey, this.parentFingerprint, this.chainCode, this.index, this.depth, this.path);\n        };\n        HDNode2.prototype._derive = function(index) {\n          if (index > 4294967295) {\n            throw new Error(\"invalid index - \" + String(index));\n          }\n          var path = this.path;\n          if (path) {\n            path += \"/\" + (index & ~HardenedBit);\n          }\n          var data = new Uint8Array(37);\n          if (index & HardenedBit) {\n            if (!this.privateKey) {\n              throw new Error(\"cannot derive child of neutered node\");\n            }\n            data.set((0, bytes_1.arrayify)(this.privateKey), 1);\n            if (path) {\n              path += \"'\";\n            }\n          } else {\n            data.set((0, bytes_1.arrayify)(this.publicKey));\n          }\n          for (var i = 24; i >= 0; i -= 8) {\n            data[33 + (i >> 3)] = index >> 24 - i & 255;\n          }\n          var I = (0, bytes_1.arrayify)((0, sha2_1.computeHmac)(sha2_1.SupportedAlgorithm.sha512, this.chainCode, data));\n          var IL = I.slice(0, 32);\n          var IR = I.slice(32);\n          var ki = null;\n          var Ki = null;\n          if (this.privateKey) {\n            ki = bytes32(bignumber_1.BigNumber.from(IL).add(this.privateKey).mod(N));\n          } else {\n            var ek = new signing_key_1.SigningKey((0, bytes_1.hexlify)(IL));\n            Ki = ek._addPoint(this.publicKey);\n          }\n          var mnemonicOrPath = path;\n          var srcMnemonic = this.mnemonic;\n          if (srcMnemonic) {\n            mnemonicOrPath = Object.freeze({\n              phrase: srcMnemonic.phrase,\n              path,\n              locale: srcMnemonic.locale || \"en\"\n            });\n          }\n          return new HDNode2(_constructorGuard, ki, Ki, this.fingerprint, bytes32(IR), index, this.depth + 1, mnemonicOrPath);\n        };\n        HDNode2.prototype.derivePath = function(path) {\n          var components = path.split(\"/\");\n          if (components.length === 0 || components[0] === \"m\" && this.depth !== 0) {\n            throw new Error(\"invalid path - \" + path);\n          }\n          if (components[0] === \"m\") {\n            components.shift();\n          }\n          var result = this;\n          for (var i = 0; i < components.length; i++) {\n            var component = components[i];\n            if (component.match(/^[0-9]+'$/)) {\n              var index = parseInt(component.substring(0, component.length - 1));\n              if (index >= HardenedBit) {\n                throw new Error(\"invalid path index - \" + component);\n              }\n              result = result._derive(HardenedBit + index);\n            } else if (component.match(/^[0-9]+$/)) {\n              var index = parseInt(component);\n              if (index >= HardenedBit) {\n                throw new Error(\"invalid path index - \" + component);\n              }\n              result = result._derive(index);\n            } else {\n              throw new Error(\"invalid path component - \" + component);\n            }\n          }\n          return result;\n        };\n        HDNode2._fromSeed = function(seed, mnemonic) {\n          var seedArray = (0, bytes_1.arrayify)(seed);\n          if (seedArray.length < 16 || seedArray.length > 64) {\n            throw new Error(\"invalid seed\");\n          }\n          var I = (0, bytes_1.arrayify)((0, sha2_1.computeHmac)(sha2_1.SupportedAlgorithm.sha512, MasterSecret, seedArray));\n          return new HDNode2(_constructorGuard, bytes32(I.slice(0, 32)), null, \"0x00000000\", bytes32(I.slice(32)), 0, 0, mnemonic);\n        };\n        HDNode2.fromMnemonic = function(mnemonic, password, wordlist) {\n          wordlist = getWordlist(wordlist);\n          mnemonic = entropyToMnemonic(mnemonicToEntropy(mnemonic, wordlist), wordlist);\n          return HDNode2._fromSeed(mnemonicToSeed(mnemonic, password), {\n            phrase: mnemonic,\n            path: \"m\",\n            locale: wordlist.locale\n          });\n        };\n        HDNode2.fromSeed = function(seed) {\n          return HDNode2._fromSeed(seed, null);\n        };\n        HDNode2.fromExtendedKey = function(extendedKey) {\n          var bytes = basex_1.Base58.decode(extendedKey);\n          if (bytes.length !== 82 || base58check(bytes.slice(0, 78)) !== extendedKey) {\n            logger.throwArgumentError(\"invalid extended key\", \"extendedKey\", \"[REDACTED]\");\n          }\n          var depth = bytes[4];\n          var parentFingerprint = (0, bytes_1.hexlify)(bytes.slice(5, 9));\n          var index = parseInt((0, bytes_1.hexlify)(bytes.slice(9, 13)).substring(2), 16);\n          var chainCode = (0, bytes_1.hexlify)(bytes.slice(13, 45));\n          var key = bytes.slice(45, 78);\n          switch ((0, bytes_1.hexlify)(bytes.slice(0, 4))) {\n            case \"0x0488b21e\":\n            case \"0x043587cf\":\n              return new HDNode2(_constructorGuard, null, (0, bytes_1.hexlify)(key), parentFingerprint, chainCode, index, depth, null);\n            case \"0x0488ade4\":\n            case \"0x04358394 \":\n              if (key[0] !== 0) {\n                break;\n              }\n              return new HDNode2(_constructorGuard, (0, bytes_1.hexlify)(key.slice(1)), null, parentFingerprint, chainCode, index, depth, null);\n          }\n          return logger.throwArgumentError(\"invalid extended key\", \"extendedKey\", \"[REDACTED]\");\n        };\n        return HDNode2;\n      }()\n    );\n    exports2.HDNode = HDNode;\n    function mnemonicToSeed(mnemonic, password) {\n      if (!password) {\n        password = \"\";\n      }\n      var salt = (0, strings_1.toUtf8Bytes)(\"mnemonic\" + password, strings_1.UnicodeNormalizationForm.NFKD);\n      return (0, pbkdf2_1.pbkdf2)((0, strings_1.toUtf8Bytes)(mnemonic, strings_1.UnicodeNormalizationForm.NFKD), salt, 2048, 64, \"sha512\");\n    }\n    exports2.mnemonicToSeed = mnemonicToSeed;\n    function mnemonicToEntropy(mnemonic, wordlist) {\n      wordlist = getWordlist(wordlist);\n      logger.checkNormalize();\n      var words = wordlist.split(mnemonic);\n      if (words.length % 3 !== 0) {\n        throw new Error(\"invalid mnemonic\");\n      }\n      var entropy = (0, bytes_1.arrayify)(new Uint8Array(Math.ceil(11 * words.length / 8)));\n      var offset = 0;\n      for (var i = 0; i < words.length; i++) {\n        var index = wordlist.getWordIndex(words[i].normalize(\"NFKD\"));\n        if (index === -1) {\n          throw new Error(\"invalid mnemonic\");\n        }\n        for (var bit = 0; bit < 11; bit++) {\n          if (index & 1 << 10 - bit) {\n            entropy[offset >> 3] |= 1 << 7 - offset % 8;\n          }\n          offset++;\n        }\n      }\n      var entropyBits = 32 * words.length / 3;\n      var checksumBits = words.length / 3;\n      var checksumMask = getUpperMask(checksumBits);\n      var checksum = (0, bytes_1.arrayify)((0, sha2_1.sha256)(entropy.slice(0, entropyBits / 8)))[0] & checksumMask;\n      if (checksum !== (entropy[entropy.length - 1] & checksumMask)) {\n        throw new Error(\"invalid checksum\");\n      }\n      return (0, bytes_1.hexlify)(entropy.slice(0, entropyBits / 8));\n    }\n    exports2.mnemonicToEntropy = mnemonicToEntropy;\n    function entropyToMnemonic(entropy, wordlist) {\n      wordlist = getWordlist(wordlist);\n      entropy = (0, bytes_1.arrayify)(entropy);\n      if (entropy.length % 4 !== 0 || entropy.length < 16 || entropy.length > 32) {\n        throw new Error(\"invalid entropy\");\n      }\n      var indices = [0];\n      var remainingBits = 11;\n      for (var i = 0; i < entropy.length; i++) {\n        if (remainingBits > 8) {\n          indices[indices.length - 1] <<= 8;\n          indices[indices.length - 1] |= entropy[i];\n          remainingBits -= 8;\n        } else {\n          indices[indices.length - 1] <<= remainingBits;\n          indices[indices.length - 1] |= entropy[i] >> 8 - remainingBits;\n          indices.push(entropy[i] & getLowerMask(8 - remainingBits));\n          remainingBits += 3;\n        }\n      }\n      var checksumBits = entropy.length / 4;\n      var checksum = (0, bytes_1.arrayify)((0, sha2_1.sha256)(entropy))[0] & getUpperMask(checksumBits);\n      indices[indices.length - 1] <<= checksumBits;\n      indices[indices.length - 1] |= checksum >> 8 - checksumBits;\n      return wordlist.join(indices.map(function(index) {\n        return wordlist.getWord(index);\n      }));\n    }\n    exports2.entropyToMnemonic = entropyToMnemonic;\n    function isValidMnemonic(mnemonic, wordlist) {\n      try {\n        mnemonicToEntropy(mnemonic, wordlist);\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isValidMnemonic = isValidMnemonic;\n    function getAccountPath(index) {\n      if (typeof index !== \"number\" || index < 0 || index >= HardenedBit || index % 1) {\n        logger.throwArgumentError(\"invalid account index\", \"index\", index);\n      }\n      return \"m/44'/60'/\" + index + \"'/0/0\";\n    }\n    exports2.getAccountPath = getAccountPath;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/random.js\nvar require_random = __commonJS({\n  \"node_modules/@ethersproject/random/lib/random.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.randomBytes = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    function randomBytes(length) {\n      return (0, bytes_1.arrayify)((0, crypto_1.randomBytes)(length));\n    }\n    exports2.randomBytes = randomBytes;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/shuffle.js\nvar require_shuffle = __commonJS({\n  \"node_modules/@ethersproject/random/lib/shuffle.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.shuffled = void 0;\n    function shuffled(array) {\n      array = array.slice();\n      for (var i = array.length - 1; i > 0; i--) {\n        var j = Math.floor(Math.random() * (i + 1));\n        var tmp = array[i];\n        array[i] = array[j];\n        array[j] = tmp;\n      }\n      return array;\n    }\n    exports2.shuffled = shuffled;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/index.js\nvar require_lib22 = __commonJS({\n  \"node_modules/@ethersproject/random/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.shuffled = exports2.randomBytes = void 0;\n    var random_1 = require_random();\n    Object.defineProperty(exports2, \"randomBytes\", { enumerable: true, get: function() {\n      return random_1.randomBytes;\n    } });\n    var shuffle_1 = require_shuffle();\n    Object.defineProperty(exports2, \"shuffled\", { enumerable: true, get: function() {\n      return shuffle_1.shuffled;\n    } });\n  }\n});\n\n// node_modules/aes-js/index.js\nvar require_aes_js = __commonJS({\n  \"node_modules/aes-js/index.js\"(exports2, module2) {\n    \"use strict\";\n    (function(root) {\n      function checkInt(value) {\n        return parseInt(value) === value;\n      }\n      function checkInts(arrayish) {\n        if (!checkInt(arrayish.length)) {\n          return false;\n        }\n        for (var i = 0; i < arrayish.length; i++) {\n          if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {\n            return false;\n          }\n        }\n        return true;\n      }\n      function coerceArray(arg, copy) {\n        if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === \"Uint8Array\") {\n          if (copy) {\n            if (arg.slice) {\n              arg = arg.slice();\n            } else {\n              arg = Array.prototype.slice.call(arg);\n            }\n          }\n          return arg;\n        }\n        if (Array.isArray(arg)) {\n          if (!checkInts(arg)) {\n            throw new Error(\"Array contains invalid value: \" + arg);\n          }\n          return new Uint8Array(arg);\n        }\n        if (checkInt(arg.length) && checkInts(arg)) {\n          return new Uint8Array(arg);\n        }\n        throw new Error(\"unsupported array-like object\");\n      }\n      function createArray(length) {\n        return new Uint8Array(length);\n      }\n      function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {\n        if (sourceStart != null || sourceEnd != null) {\n          if (sourceArray.slice) {\n            sourceArray = sourceArray.slice(sourceStart, sourceEnd);\n          } else {\n            sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);\n          }\n        }\n        targetArray.set(sourceArray, targetStart);\n      }\n      var convertUtf8 = /* @__PURE__ */ function() {\n        function toBytes(text) {\n          var result = [], i = 0;\n          text = encodeURI(text);\n          while (i < text.length) {\n            var c = text.charCodeAt(i++);\n            if (c === 37) {\n              result.push(parseInt(text.substr(i, 2), 16));\n              i += 2;\n            } else {\n              result.push(c);\n            }\n          }\n          return coerceArray(result);\n        }\n        function fromBytes(bytes) {\n          var result = [], i = 0;\n          while (i < bytes.length) {\n            var c = bytes[i];\n            if (c < 128) {\n              result.push(String.fromCharCode(c));\n              i++;\n            } else if (c > 191 && c < 224) {\n              result.push(String.fromCharCode((c & 31) << 6 | bytes[i + 1] & 63));\n              i += 2;\n            } else {\n              result.push(String.fromCharCode((c & 15) << 12 | (bytes[i + 1] & 63) << 6 | bytes[i + 2] & 63));\n              i += 3;\n            }\n          }\n          return result.join(\"\");\n        }\n        return {\n          toBytes,\n          fromBytes\n        };\n      }();\n      var convertHex = /* @__PURE__ */ function() {\n        function toBytes(text) {\n          var result = [];\n          for (var i = 0; i < text.length; i += 2) {\n            result.push(parseInt(text.substr(i, 2), 16));\n          }\n          return result;\n        }\n        var Hex = \"0123456789abcdef\";\n        function fromBytes(bytes) {\n          var result = [];\n          for (var i = 0; i < bytes.length; i++) {\n            var v = bytes[i];\n            result.push(Hex[(v & 240) >> 4] + Hex[v & 15]);\n          }\n          return result.join(\"\");\n        }\n        return {\n          toBytes,\n          fromBytes\n        };\n      }();\n      var numberOfRounds = { 16: 10, 24: 12, 32: 14 };\n      var rcon = [1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145];\n      var S = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22];\n      var Si = [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125];\n      var T1 = [3328402341, 4168907908, 4000806809, 4135287693, 4294111757, 3597364157, 3731845041, 2445657428, 1613770832, 33620227, 3462883241, 1445669757, 3892248089, 3050821474, 1303096294, 3967186586, 2412431941, 528646813, 2311702848, 4202528135, 4026202645, 2992200171, 2387036105, 4226871307, 1101901292, 3017069671, 1604494077, 1169141738, 597466303, 1403299063, 3832705686, 2613100635, 1974974402, 3791519004, 1033081774, 1277568618, 1815492186, 2118074177, 4126668546, 2211236943, 1748251740, 1369810420, 3521504564, 4193382664, 3799085459, 2883115123, 1647391059, 706024767, 134480908, 2512897874, 1176707941, 2646852446, 806885416, 932615841, 168101135, 798661301, 235341577, 605164086, 461406363, 3756188221, 3454790438, 1311188841, 2142417613, 3933566367, 302582043, 495158174, 1479289972, 874125870, 907746093, 3698224818, 3025820398, 1537253627, 2756858614, 1983593293, 3084310113, 2108928974, 1378429307, 3722699582, 1580150641, 327451799, 2790478837, 3117535592, 0, 3253595436, 1075847264, 3825007647, 2041688520, 3059440621, 3563743934, 2378943302, 1740553945, 1916352843, 2487896798, 2555137236, 2958579944, 2244988746, 3151024235, 3320835882, 1336584933, 3992714006, 2252555205, 2588757463, 1714631509, 293963156, 2319795663, 3925473552, 67240454, 4269768577, 2689618160, 2017213508, 631218106, 1269344483, 2723238387, 1571005438, 2151694528, 93294474, 1066570413, 563977660, 1882732616, 4059428100, 1673313503, 2008463041, 2950355573, 1109467491, 537923632, 3858759450, 4260623118, 3218264685, 2177748300, 403442708, 638784309, 3287084079, 3193921505, 899127202, 2286175436, 773265209, 2479146071, 1437050866, 4236148354, 2050833735, 3362022572, 3126681063, 840505643, 3866325909, 3227541664, 427917720, 2655997905, 2749160575, 1143087718, 1412049534, 999329963, 193497219, 2353415882, 3354324521, 1807268051, 672404540, 2816401017, 3160301282, 369822493, 2916866934, 3688947771, 1681011286, 1949973070, 336202270, 2454276571, 201721354, 1210328172, 3093060836, 2680341085, 3184776046, 1135389935, 3294782118, 965841320, 831886756, 3554993207, 4068047243, 3588745010, 2345191491, 1849112409, 3664604599, 26054028, 2983581028, 2622377682, 1235855840, 3630984372, 2891339514, 4092916743, 3488279077, 3395642799, 4101667470, 1202630377, 268961816, 1874508501, 4034427016, 1243948399, 1546530418, 941366308, 1470539505, 1941222599, 2546386513, 3421038627, 2715671932, 3899946140, 1042226977, 2521517021, 1639824860, 227249030, 260737669, 3765465232, 2084453954, 1907733956, 3429263018, 2420656344, 100860677, 4160157185, 470683154, 3261161891, 1781871967, 2924959737, 1773779408, 394692241, 2579611992, 974986535, 664706745, 3655459128, 3958962195, 731420851, 571543859, 3530123707, 2849626480, 126783113, 865375399, 765172662, 1008606754, 361203602, 3387549984, 2278477385, 2857719295, 1344809080, 2782912378, 59542671, 1503764984, 160008576, 437062935, 1707065306, 3622233649, 2218934982, 3496503480, 2185314755, 697932208, 1512910199, 504303377, 2075177163, 2824099068, 1841019862, 739644986];\n      var T2 = [2781242211, 2230877308, 2582542199, 2381740923, 234877682, 3184946027, 2984144751, 1418839493, 1348481072, 50462977, 2848876391, 2102799147, 434634494, 1656084439, 3863849899, 2599188086, 1167051466, 2636087938, 1082771913, 2281340285, 368048890, 3954334041, 3381544775, 201060592, 3963727277, 1739838676, 4250903202, 3930435503, 3206782108, 4149453988, 2531553906, 1536934080, 3262494647, 484572669, 2923271059, 1783375398, 1517041206, 1098792767, 49674231, 1334037708, 1550332980, 4098991525, 886171109, 150598129, 2481090929, 1940642008, 1398944049, 1059722517, 201851908, 1385547719, 1699095331, 1587397571, 674240536, 2704774806, 252314885, 3039795866, 151914247, 908333586, 2602270848, 1038082786, 651029483, 1766729511, 3447698098, 2682942837, 454166793, 2652734339, 1951935532, 775166490, 758520603, 3000790638, 4004797018, 4217086112, 4137964114, 1299594043, 1639438038, 3464344499, 2068982057, 1054729187, 1901997871, 2534638724, 4121318227, 1757008337, 0, 750906861, 1614815264, 535035132, 3363418545, 3988151131, 3201591914, 1183697867, 3647454910, 1265776953, 3734260298, 3566750796, 3903871064, 1250283471, 1807470800, 717615087, 3847203498, 384695291, 3313910595, 3617213773, 1432761139, 2484176261, 3481945413, 283769337, 100925954, 2180939647, 4037038160, 1148730428, 3123027871, 3813386408, 4087501137, 4267549603, 3229630528, 2315620239, 2906624658, 3156319645, 1215313976, 82966005, 3747855548, 3245848246, 1974459098, 1665278241, 807407632, 451280895, 251524083, 1841287890, 1283575245, 337120268, 891687699, 801369324, 3787349855, 2721421207, 3431482436, 959321879, 1469301956, 4065699751, 2197585534, 1199193405, 2898814052, 3887750493, 724703513, 2514908019, 2696962144, 2551808385, 3516813135, 2141445340, 1715741218, 2119445034, 2872807568, 2198571144, 3398190662, 700968686, 3547052216, 1009259540, 2041044702, 3803995742, 487983883, 1991105499, 1004265696, 1449407026, 1316239930, 504629770, 3683797321, 168560134, 1816667172, 3837287516, 1570751170, 1857934291, 4014189740, 2797888098, 2822345105, 2754712981, 936633572, 2347923833, 852879335, 1133234376, 1500395319, 3084545389, 2348912013, 1689376213, 3533459022, 3762923945, 3034082412, 4205598294, 133428468, 634383082, 2949277029, 2398386810, 3913789102, 403703816, 3580869306, 2297460856, 1867130149, 1918643758, 607656988, 4049053350, 3346248884, 1368901318, 600565992, 2090982877, 2632479860, 557719327, 3717614411, 3697393085, 2249034635, 2232388234, 2430627952, 1115438654, 3295786421, 2865522278, 3633334344, 84280067, 33027830, 303828494, 2747425121, 1600795957, 4188952407, 3496589753, 2434238086, 1486471617, 658119965, 3106381470, 953803233, 334231800, 3005978776, 857870609, 3151128937, 1890179545, 2298973838, 2805175444, 3056442267, 574365214, 2450884487, 550103529, 1233637070, 4289353045, 2018519080, 2057691103, 2399374476, 4166623649, 2148108681, 387583245, 3664101311, 836232934, 3330556482, 3100665960, 3280093505, 2955516313, 2002398509, 287182607, 3413881008, 4238890068, 3597515707, 975967766];\n      var T3 = [1671808611, 2089089148, 2006576759, 2072901243, 4061003762, 1807603307, 1873927791, 3310653893, 810573872, 16974337, 1739181671, 729634347, 4263110654, 3613570519, 2883997099, 1989864566, 3393556426, 2191335298, 3376449993, 2106063485, 4195741690, 1508618841, 1204391495, 4027317232, 2917941677, 3563566036, 2734514082, 2951366063, 2629772188, 2767672228, 1922491506, 3227229120, 3082974647, 4246528509, 2477669779, 644500518, 911895606, 1061256767, 4144166391, 3427763148, 878471220, 2784252325, 3845444069, 4043897329, 1905517169, 3631459288, 827548209, 356461077, 67897348, 3344078279, 593839651, 3277757891, 405286936, 2527147926, 84871685, 2595565466, 118033927, 305538066, 2157648768, 3795705826, 3945188843, 661212711, 2999812018, 1973414517, 152769033, 2208177539, 745822252, 439235610, 455947803, 1857215598, 1525593178, 2700827552, 1391895634, 994932283, 3596728278, 3016654259, 695947817, 3812548067, 795958831, 2224493444, 1408607827, 3513301457, 0, 3979133421, 543178784, 4229948412, 2982705585, 1542305371, 1790891114, 3410398667, 3201918910, 961245753, 1256100938, 1289001036, 1491644504, 3477767631, 3496721360, 4012557807, 2867154858, 4212583931, 1137018435, 1305975373, 861234739, 2241073541, 1171229253, 4178635257, 33948674, 2139225727, 1357946960, 1011120188, 2679776671, 2833468328, 1374921297, 2751356323, 1086357568, 2408187279, 2460827538, 2646352285, 944271416, 4110742005, 3168756668, 3066132406, 3665145818, 560153121, 271589392, 4279952895, 4077846003, 3530407890, 3444343245, 202643468, 322250259, 3962553324, 1608629855, 2543990167, 1154254916, 389623319, 3294073796, 2817676711, 2122513534, 1028094525, 1689045092, 1575467613, 422261273, 1939203699, 1621147744, 2174228865, 1339137615, 3699352540, 577127458, 712922154, 2427141008, 2290289544, 1187679302, 3995715566, 3100863416, 339486740, 3732514782, 1591917662, 186455563, 3681988059, 3762019296, 844522546, 978220090, 169743370, 1239126601, 101321734, 611076132, 1558493276, 3260915650, 3547250131, 2901361580, 1655096418, 2443721105, 2510565781, 3828863972, 2039214713, 3878868455, 3359869896, 928607799, 1840765549, 2374762893, 3580146133, 1322425422, 2850048425, 1823791212, 1459268694, 4094161908, 3928346602, 1706019429, 2056189050, 2934523822, 135794696, 3134549946, 2022240376, 628050469, 779246638, 472135708, 2800834470, 3032970164, 3327236038, 3894660072, 3715932637, 1956440180, 522272287, 1272813131, 3185336765, 2340818315, 2323976074, 1888542832, 1044544574, 3049550261, 1722469478, 1222152264, 50660867, 4127324150, 236067854, 1638122081, 895445557, 1475980887, 3117443513, 2257655686, 3243809217, 489110045, 2662934430, 3778599393, 4162055160, 2561878936, 288563729, 1773916777, 3648039385, 2391345038, 2493985684, 2612407707, 505560094, 2274497927, 3911240169, 3460925390, 1442818645, 678973480, 3749357023, 2358182796, 2717407649, 2306869641, 219617805, 3218761151, 3862026214, 1120306242, 1756942440, 1103331905, 2578459033, 762796589, 252780047, 2966125488, 1425844308, 3151392187, 372911126];\n      var T4 = [1667474886, 2088535288, 2004326894, 2071694838, 4075949567, 1802223062, 1869591006, 3318043793, 808472672, 16843522, 1734846926, 724270422, 4278065639, 3621216949, 2880169549, 1987484396, 3402253711, 2189597983, 3385409673, 2105378810, 4210693615, 1499065266, 1195886990, 4042263547, 2913856577, 3570689971, 2728590687, 2947541573, 2627518243, 2762274643, 1920112356, 3233831835, 3082273397, 4261223649, 2475929149, 640051788, 909531756, 1061110142, 4160160501, 3435941763, 875846760, 2779116625, 3857003729, 4059105529, 1903268834, 3638064043, 825316194, 353713962, 67374088, 3351728789, 589522246, 3284360861, 404236336, 2526454071, 84217610, 2593830191, 117901582, 303183396, 2155911963, 3806477791, 3958056653, 656894286, 2998062463, 1970642922, 151591698, 2206440989, 741110872, 437923380, 454765878, 1852748508, 1515908788, 2694904667, 1381168804, 993742198, 3604373943, 3014905469, 690584402, 3823320797, 791638366, 2223281939, 1398011302, 3520161977, 0, 3991743681, 538992704, 4244381667, 2981218425, 1532751286, 1785380564, 3419096717, 3200178535, 960056178, 1246420628, 1280103576, 1482221744, 3486468741, 3503319995, 4025428677, 2863326543, 4227536621, 1128514950, 1296947098, 859002214, 2240123921, 1162203018, 4193849577, 33687044, 2139062782, 1347481760, 1010582648, 2678045221, 2829640523, 1364325282, 2745433693, 1077985408, 2408548869, 2459086143, 2644360225, 943212656, 4126475505, 3166494563, 3065430391, 3671750063, 555836226, 269496352, 4294908645, 4092792573, 3537006015, 3452783745, 202118168, 320025894, 3974901699, 1600119230, 2543297077, 1145359496, 387397934, 3301201811, 2812801621, 2122220284, 1027426170, 1684319432, 1566435258, 421079858, 1936954854, 1616945344, 2172753945, 1330631070, 3705438115, 572679748, 707427924, 2425400123, 2290647819, 1179044492, 4008585671, 3099120491, 336870440, 3739122087, 1583276732, 185277718, 3688593069, 3772791771, 842159716, 976899700, 168435220, 1229577106, 101059084, 606366792, 1549591736, 3267517855, 3553849021, 2897014595, 1650632388, 2442242105, 2509612081, 3840161747, 2038008818, 3890688725, 3368567691, 926374254, 1835907034, 2374863873, 3587531953, 1313788572, 2846482505, 1819063512, 1448540844, 4109633523, 3941213647, 1701162954, 2054852340, 2930698567, 134748176, 3132806511, 2021165296, 623210314, 774795868, 471606328, 2795958615, 3031746419, 3334885783, 3907527627, 3722280097, 1953799400, 522133822, 1263263126, 3183336545, 2341176845, 2324333839, 1886425312, 1044267644, 3048588401, 1718004428, 1212733584, 50529542, 4143317495, 235803164, 1633788866, 892690282, 1465383342, 3115962473, 2256965911, 3250673817, 488449850, 2661202215, 3789633753, 4177007595, 2560144171, 286339874, 1768537042, 3654906025, 2391705863, 2492770099, 2610673197, 505291324, 2273808917, 3924369609, 3469625735, 1431699370, 673740880, 3755965093, 2358021891, 2711746649, 2307489801, 218961690, 3217021541, 3873845719, 1111672452, 1751693520, 1094828930, 2576986153, 757954394, 252645662, 2964376443, 1414855848, 3149649517, 370555436];\n      var T5 = [1374988112, 2118214995, 437757123, 975658646, 1001089995, 530400753, 2902087851, 1273168787, 540080725, 2910219766, 2295101073, 4110568485, 1340463100, 3307916247, 641025152, 3043140495, 3736164937, 632953703, 1172967064, 1576976609, 3274667266, 2169303058, 2370213795, 1809054150, 59727847, 361929877, 3211623147, 2505202138, 3569255213, 1484005843, 1239443753, 2395588676, 1975683434, 4102977912, 2572697195, 666464733, 3202437046, 4035489047, 3374361702, 2110667444, 1675577880, 3843699074, 2538681184, 1649639237, 2976151520, 3144396420, 4269907996, 4178062228, 1883793496, 2403728665, 2497604743, 1383856311, 2876494627, 1917518562, 3810496343, 1716890410, 3001755655, 800440835, 2261089178, 3543599269, 807962610, 599762354, 33778362, 3977675356, 2328828971, 2809771154, 4077384432, 1315562145, 1708848333, 101039829, 3509871135, 3299278474, 875451293, 2733856160, 92987698, 2767645557, 193195065, 1080094634, 1584504582, 3178106961, 1042385657, 2531067453, 3711829422, 1306967366, 2438237621, 1908694277, 67556463, 1615861247, 429456164, 3602770327, 2302690252, 1742315127, 2968011453, 126454664, 3877198648, 2043211483, 2709260871, 2084704233, 4169408201, 0, 159417987, 841739592, 504459436, 1817866830, 4245618683, 260388950, 1034867998, 908933415, 168810852, 1750902305, 2606453969, 607530554, 202008497, 2472011535, 3035535058, 463180190, 2160117071, 1641816226, 1517767529, 470948374, 3801332234, 3231722213, 1008918595, 303765277, 235474187, 4069246893, 766945465, 337553864, 1475418501, 2943682380, 4003061179, 2743034109, 4144047775, 1551037884, 1147550661, 1543208500, 2336434550, 3408119516, 3069049960, 3102011747, 3610369226, 1113818384, 328671808, 2227573024, 2236228733, 3535486456, 2935566865, 3341394285, 496906059, 3702665459, 226906860, 2009195472, 733156972, 2842737049, 294930682, 1206477858, 2835123396, 2700099354, 1451044056, 573804783, 2269728455, 3644379585, 2362090238, 2564033334, 2801107407, 2776292904, 3669462566, 1068351396, 742039012, 1350078989, 1784663195, 1417561698, 4136440770, 2430122216, 775550814, 2193862645, 2673705150, 1775276924, 1876241833, 3475313331, 3366754619, 270040487, 3902563182, 3678124923, 3441850377, 1851332852, 3969562369, 2203032232, 3868552805, 2868897406, 566021896, 4011190502, 3135740889, 1248802510, 3936291284, 699432150, 832877231, 708780849, 3332740144, 899835584, 1951317047, 4236429990, 3767586992, 866637845, 4043610186, 1106041591, 2144161806, 395441711, 1984812685, 1139781709, 3433712980, 3835036895, 2664543715, 1282050075, 3240894392, 1181045119, 2640243204, 25965917, 4203181171, 4211818798, 3009879386, 2463879762, 3910161971, 1842759443, 2597806476, 933301370, 1509430414, 3943906441, 3467192302, 3076639029, 3776767469, 2051518780, 2631065433, 1441952575, 404016761, 1942435775, 1408749034, 1610459739, 3745345300, 2017778566, 3400528769, 3110650942, 941896748, 3265478751, 371049330, 3168937228, 675039627, 4279080257, 967311729, 135050206, 3635733660, 1683407248, 2076935265, 3576870512, 1215061108, 3501741890];\n      var T6 = [1347548327, 1400783205, 3273267108, 2520393566, 3409685355, 4045380933, 2880240216, 2471224067, 1428173050, 4138563181, 2441661558, 636813900, 4233094615, 3620022987, 2149987652, 2411029155, 1239331162, 1730525723, 2554718734, 3781033664, 46346101, 310463728, 2743944855, 3328955385, 3875770207, 2501218972, 3955191162, 3667219033, 768917123, 3545789473, 692707433, 1150208456, 1786102409, 2029293177, 1805211710, 3710368113, 3065962831, 401639597, 1724457132, 3028143674, 409198410, 2196052529, 1620529459, 1164071807, 3769721975, 2226875310, 486441376, 2499348523, 1483753576, 428819965, 2274680428, 3075636216, 598438867, 3799141122, 1474502543, 711349675, 129166120, 53458370, 2592523643, 2782082824, 4063242375, 2988687269, 3120694122, 1559041666, 730517276, 2460449204, 4042459122, 2706270690, 3446004468, 3573941694, 533804130, 2328143614, 2637442643, 2695033685, 839224033, 1973745387, 957055980, 2856345839, 106852767, 1371368976, 4181598602, 1033297158, 2933734917, 1179510461, 3046200461, 91341917, 1862534868, 4284502037, 605657339, 2547432937, 3431546947, 2003294622, 3182487618, 2282195339, 954669403, 3682191598, 1201765386, 3917234703, 3388507166, 0, 2198438022, 1211247597, 2887651696, 1315723890, 4227665663, 1443857720, 507358933, 657861945, 1678381017, 560487590, 3516619604, 975451694, 2970356327, 261314535, 3535072918, 2652609425, 1333838021, 2724322336, 1767536459, 370938394, 182621114, 3854606378, 1128014560, 487725847, 185469197, 2918353863, 3106780840, 3356761769, 2237133081, 1286567175, 3152976349, 4255350624, 2683765030, 3160175349, 3309594171, 878443390, 1988838185, 3704300486, 1756818940, 1673061617, 3403100636, 272786309, 1075025698, 545572369, 2105887268, 4174560061, 296679730, 1841768865, 1260232239, 4091327024, 3960309330, 3497509347, 1814803222, 2578018489, 4195456072, 575138148, 3299409036, 446754879, 3629546796, 4011996048, 3347532110, 3252238545, 4270639778, 915985419, 3483825537, 681933534, 651868046, 2755636671, 3828103837, 223377554, 2607439820, 1649704518, 3270937875, 3901806776, 1580087799, 4118987695, 3198115200, 2087309459, 2842678573, 3016697106, 1003007129, 2802849917, 1860738147, 2077965243, 164439672, 4100872472, 32283319, 2827177882, 1709610350, 2125135846, 136428751, 3874428392, 3652904859, 3460984630, 3572145929, 3593056380, 2939266226, 824852259, 818324884, 3224740454, 930369212, 2801566410, 2967507152, 355706840, 1257309336, 4148292826, 243256656, 790073846, 2373340630, 1296297904, 1422699085, 3756299780, 3818836405, 457992840, 3099667487, 2135319889, 77422314, 1560382517, 1945798516, 788204353, 1521706781, 1385356242, 870912086, 325965383, 2358957921, 2050466060, 2388260884, 2313884476, 4006521127, 901210569, 3990953189, 1014646705, 1503449823, 1062597235, 2031621326, 3212035895, 3931371469, 1533017514, 350174575, 2256028891, 2177544179, 1052338372, 741876788, 1606591296, 1914052035, 213705253, 2334669897, 1107234197, 1899603969, 3725069491, 2631447780, 2422494913, 1635502980, 1893020342, 1950903388, 1120974935];\n      var T7 = [2807058932, 1699970625, 2764249623, 1586903591, 1808481195, 1173430173, 1487645946, 59984867, 4199882800, 1844882806, 1989249228, 1277555970, 3623636965, 3419915562, 1149249077, 2744104290, 1514790577, 459744698, 244860394, 3235995134, 1963115311, 4027744588, 2544078150, 4190530515, 1608975247, 2627016082, 2062270317, 1507497298, 2200818878, 567498868, 1764313568, 3359936201, 2305455554, 2037970062, 1047239e3, 1910319033, 1337376481, 2904027272, 2892417312, 984907214, 1243112415, 830661914, 861968209, 2135253587, 2011214180, 2927934315, 2686254721, 731183368, 1750626376, 4246310725, 1820824798, 4172763771, 3542330227, 48394827, 2404901663, 2871682645, 671593195, 3254988725, 2073724613, 145085239, 2280796200, 2779915199, 1790575107, 2187128086, 472615631, 3029510009, 4075877127, 3802222185, 4107101658, 3201631749, 1646252340, 4270507174, 1402811438, 1436590835, 3778151818, 3950355702, 3963161475, 4020912224, 2667994737, 273792366, 2331590177, 104699613, 95345982, 3175501286, 2377486676, 1560637892, 3564045318, 369057872, 4213447064, 3919042237, 1137477952, 2658625497, 1119727848, 2340947849, 1530455833, 4007360968, 172466556, 266959938, 516552836, 0, 2256734592, 3980931627, 1890328081, 1917742170, 4294704398, 945164165, 3575528878, 958871085, 3647212047, 2787207260, 1423022939, 775562294, 1739656202, 3876557655, 2530391278, 2443058075, 3310321856, 547512796, 1265195639, 437656594, 3121275539, 719700128, 3762502690, 387781147, 218828297, 3350065803, 2830708150, 2848461854, 428169201, 122466165, 3720081049, 1627235199, 648017665, 4122762354, 1002783846, 2117360635, 695634755, 3336358691, 4234721005, 4049844452, 3704280881, 2232435299, 574624663, 287343814, 612205898, 1039717051, 840019705, 2708326185, 793451934, 821288114, 1391201670, 3822090177, 376187827, 3113855344, 1224348052, 1679968233, 2361698556, 1058709744, 752375421, 2431590963, 1321699145, 3519142200, 2734591178, 188127444, 2177869557, 3727205754, 2384911031, 3215212461, 2648976442, 2450346104, 3432737375, 1180849278, 331544205, 3102249176, 4150144569, 2952102595, 2159976285, 2474404304, 766078933, 313773861, 2570832044, 2108100632, 1668212892, 3145456443, 2013908262, 418672217, 3070356634, 2594734927, 1852171925, 3867060991, 3473416636, 3907448597, 2614737639, 919489135, 164948639, 2094410160, 2997825956, 590424639, 2486224549, 1723872674, 3157750862, 3399941250, 3501252752, 3625268135, 2555048196, 3673637356, 1343127501, 4130281361, 3599595085, 2957853679, 1297403050, 81781910, 3051593425, 2283490410, 532201772, 1367295589, 3926170974, 895287692, 1953757831, 1093597963, 492483431, 3528626907, 1446242576, 1192455638, 1636604631, 209336225, 344873464, 1015671571, 669961897, 3375740769, 3857572124, 2973530695, 3747192018, 1933530610, 3464042516, 935293895, 3454686199, 2858115069, 1863638845, 3683022916, 4085369519, 3292445032, 875313188, 1080017571, 3279033885, 621591778, 1233856572, 2504130317, 24197544, 3017672716, 3835484340, 3247465558, 2220981195, 3060847922, 1551124588, 1463996600];\n      var T8 = [4104605777, 1097159550, 396673818, 660510266, 2875968315, 2638606623, 4200115116, 3808662347, 821712160, 1986918061, 3430322568, 38544885, 3856137295, 718002117, 893681702, 1654886325, 2975484382, 3122358053, 3926825029, 4274053469, 796197571, 1290801793, 1184342925, 3556361835, 2405426947, 2459735317, 1836772287, 1381620373, 3196267988, 1948373848, 3764988233, 3385345166, 3263785589, 2390325492, 1480485785, 3111247143, 3780097726, 2293045232, 548169417, 3459953789, 3746175075, 439452389, 1362321559, 1400849762, 1685577905, 1806599355, 2174754046, 137073913, 1214797936, 1174215055, 3731654548, 2079897426, 1943217067, 1258480242, 529487843, 1437280870, 3945269170, 3049390895, 3313212038, 923313619, 679998e3, 3215307299, 57326082, 377642221, 3474729866, 2041877159, 133361907, 1776460110, 3673476453, 96392454, 878845905, 2801699524, 777231668, 4082475170, 2330014213, 4142626212, 2213296395, 1626319424, 1906247262, 1846563261, 562755902, 3708173718, 1040559837, 3871163981, 1418573201, 3294430577, 114585348, 1343618912, 2566595609, 3186202582, 1078185097, 3651041127, 3896688048, 2307622919, 425408743, 3371096953, 2081048481, 1108339068, 2216610296, 0, 2156299017, 736970802, 292596766, 1517440620, 251657213, 2235061775, 2933202493, 758720310, 265905162, 1554391400, 1532285339, 908999204, 174567692, 1474760595, 4002861748, 2610011675, 3234156416, 3693126241, 2001430874, 303699484, 2478443234, 2687165888, 585122620, 454499602, 151849742, 2345119218, 3064510765, 514443284, 4044981591, 1963412655, 2581445614, 2137062819, 19308535, 1928707164, 1715193156, 4219352155, 1126790795, 600235211, 3992742070, 3841024952, 836553431, 1669664834, 2535604243, 3323011204, 1243905413, 3141400786, 4180808110, 698445255, 2653899549, 2989552604, 2253581325, 3252932727, 3004591147, 1891211689, 2487810577, 3915653703, 4237083816, 4030667424, 2100090966, 865136418, 1229899655, 953270745, 3399679628, 3557504664, 4118925222, 2061379749, 3079546586, 2915017791, 983426092, 2022837584, 1607244650, 2118541908, 2366882550, 3635996816, 972512814, 3283088770, 1568718495, 3499326569, 3576539503, 621982671, 2895723464, 410887952, 2623762152, 1002142683, 645401037, 1494807662, 2595684844, 1335535747, 2507040230, 4293295786, 3167684641, 367585007, 3885750714, 1865862730, 2668221674, 2960971305, 2763173681, 1059270954, 2777952454, 2724642869, 1320957812, 2194319100, 2429595872, 2815956275, 77089521, 3973773121, 3444575871, 2448830231, 1305906550, 4021308739, 2857194700, 2516901860, 3518358430, 1787304780, 740276417, 1699839814, 1592394909, 2352307457, 2272556026, 188821243, 1729977011, 3687994002, 274084841, 3594982253, 3613494426, 2701949495, 4162096729, 322734571, 2837966542, 1640576439, 484830689, 1202797690, 3537852828, 4067639125, 349075736, 3342319475, 4157467219, 4255800159, 1030690015, 1155237496, 2951971274, 1757691577, 607398968, 2738905026, 499347990, 3794078908, 1011452712, 227885567, 2818666809, 213114376, 3034881240, 1455525988, 3414450555, 850817237, 1817998408, 3092726480];\n      var U1 = [0, 235474187, 470948374, 303765277, 941896748, 908933415, 607530554, 708780849, 1883793496, 2118214995, 1817866830, 1649639237, 1215061108, 1181045119, 1417561698, 1517767529, 3767586992, 4003061179, 4236429990, 4069246893, 3635733660, 3602770327, 3299278474, 3400528769, 2430122216, 2664543715, 2362090238, 2193862645, 2835123396, 2801107407, 3035535058, 3135740889, 3678124923, 3576870512, 3341394285, 3374361702, 3810496343, 3977675356, 4279080257, 4043610186, 2876494627, 2776292904, 3076639029, 3110650942, 2472011535, 2640243204, 2403728665, 2169303058, 1001089995, 899835584, 666464733, 699432150, 59727847, 226906860, 530400753, 294930682, 1273168787, 1172967064, 1475418501, 1509430414, 1942435775, 2110667444, 1876241833, 1641816226, 2910219766, 2743034109, 2976151520, 3211623147, 2505202138, 2606453969, 2302690252, 2269728455, 3711829422, 3543599269, 3240894392, 3475313331, 3843699074, 3943906441, 4178062228, 4144047775, 1306967366, 1139781709, 1374988112, 1610459739, 1975683434, 2076935265, 1775276924, 1742315127, 1034867998, 866637845, 566021896, 800440835, 92987698, 193195065, 429456164, 395441711, 1984812685, 2017778566, 1784663195, 1683407248, 1315562145, 1080094634, 1383856311, 1551037884, 101039829, 135050206, 437757123, 337553864, 1042385657, 807962610, 573804783, 742039012, 2531067453, 2564033334, 2328828971, 2227573024, 2935566865, 2700099354, 3001755655, 3168937228, 3868552805, 3902563182, 4203181171, 4102977912, 3736164937, 3501741890, 3265478751, 3433712980, 1106041591, 1340463100, 1576976609, 1408749034, 2043211483, 2009195472, 1708848333, 1809054150, 832877231, 1068351396, 766945465, 599762354, 159417987, 126454664, 361929877, 463180190, 2709260871, 2943682380, 3178106961, 3009879386, 2572697195, 2538681184, 2236228733, 2336434550, 3509871135, 3745345300, 3441850377, 3274667266, 3910161971, 3877198648, 4110568485, 4211818798, 2597806476, 2497604743, 2261089178, 2295101073, 2733856160, 2902087851, 3202437046, 2968011453, 3936291284, 3835036895, 4136440770, 4169408201, 3535486456, 3702665459, 3467192302, 3231722213, 2051518780, 1951317047, 1716890410, 1750902305, 1113818384, 1282050075, 1584504582, 1350078989, 168810852, 67556463, 371049330, 404016761, 841739592, 1008918595, 775550814, 540080725, 3969562369, 3801332234, 4035489047, 4269907996, 3569255213, 3669462566, 3366754619, 3332740144, 2631065433, 2463879762, 2160117071, 2395588676, 2767645557, 2868897406, 3102011747, 3069049960, 202008497, 33778362, 270040487, 504459436, 875451293, 975658646, 675039627, 641025152, 2084704233, 1917518562, 1615861247, 1851332852, 1147550661, 1248802510, 1484005843, 1451044056, 933301370, 967311729, 733156972, 632953703, 260388950, 25965917, 328671808, 496906059, 1206477858, 1239443753, 1543208500, 1441952575, 2144161806, 1908694277, 1675577880, 1842759443, 3610369226, 3644379585, 3408119516, 3307916247, 4011190502, 3776767469, 4077384432, 4245618683, 2809771154, 2842737049, 3144396420, 3043140495, 2673705150, 2438237621, 2203032232, 2370213795];\n      var U2 = [0, 185469197, 370938394, 487725847, 741876788, 657861945, 975451694, 824852259, 1483753576, 1400783205, 1315723890, 1164071807, 1950903388, 2135319889, 1649704518, 1767536459, 2967507152, 3152976349, 2801566410, 2918353863, 2631447780, 2547432937, 2328143614, 2177544179, 3901806776, 3818836405, 4270639778, 4118987695, 3299409036, 3483825537, 3535072918, 3652904859, 2077965243, 1893020342, 1841768865, 1724457132, 1474502543, 1559041666, 1107234197, 1257309336, 598438867, 681933534, 901210569, 1052338372, 261314535, 77422314, 428819965, 310463728, 3409685355, 3224740454, 3710368113, 3593056380, 3875770207, 3960309330, 4045380933, 4195456072, 2471224067, 2554718734, 2237133081, 2388260884, 3212035895, 3028143674, 2842678573, 2724322336, 4138563181, 4255350624, 3769721975, 3955191162, 3667219033, 3516619604, 3431546947, 3347532110, 2933734917, 2782082824, 3099667487, 3016697106, 2196052529, 2313884476, 2499348523, 2683765030, 1179510461, 1296297904, 1347548327, 1533017514, 1786102409, 1635502980, 2087309459, 2003294622, 507358933, 355706840, 136428751, 53458370, 839224033, 957055980, 605657339, 790073846, 2373340630, 2256028891, 2607439820, 2422494913, 2706270690, 2856345839, 3075636216, 3160175349, 3573941694, 3725069491, 3273267108, 3356761769, 4181598602, 4063242375, 4011996048, 3828103837, 1033297158, 915985419, 730517276, 545572369, 296679730, 446754879, 129166120, 213705253, 1709610350, 1860738147, 1945798516, 2029293177, 1239331162, 1120974935, 1606591296, 1422699085, 4148292826, 4233094615, 3781033664, 3931371469, 3682191598, 3497509347, 3446004468, 3328955385, 2939266226, 2755636671, 3106780840, 2988687269, 2198438022, 2282195339, 2501218972, 2652609425, 1201765386, 1286567175, 1371368976, 1521706781, 1805211710, 1620529459, 2105887268, 1988838185, 533804130, 350174575, 164439672, 46346101, 870912086, 954669403, 636813900, 788204353, 2358957921, 2274680428, 2592523643, 2441661558, 2695033685, 2880240216, 3065962831, 3182487618, 3572145929, 3756299780, 3270937875, 3388507166, 4174560061, 4091327024, 4006521127, 3854606378, 1014646705, 930369212, 711349675, 560487590, 272786309, 457992840, 106852767, 223377554, 1678381017, 1862534868, 1914052035, 2031621326, 1211247597, 1128014560, 1580087799, 1428173050, 32283319, 182621114, 401639597, 486441376, 768917123, 651868046, 1003007129, 818324884, 1503449823, 1385356242, 1333838021, 1150208456, 1973745387, 2125135846, 1673061617, 1756818940, 2970356327, 3120694122, 2802849917, 2887651696, 2637442643, 2520393566, 2334669897, 2149987652, 3917234703, 3799141122, 4284502037, 4100872472, 3309594171, 3460984630, 3545789473, 3629546796, 2050466060, 1899603969, 1814803222, 1730525723, 1443857720, 1560382517, 1075025698, 1260232239, 575138148, 692707433, 878443390, 1062597235, 243256656, 91341917, 409198410, 325965383, 3403100636, 3252238545, 3704300486, 3620022987, 3874428392, 3990953189, 4042459122, 4227665663, 2460449204, 2578018489, 2226875310, 2411029155, 3198115200, 3046200461, 2827177882, 2743944855];\n      var U3 = [0, 218828297, 437656594, 387781147, 875313188, 958871085, 775562294, 590424639, 1750626376, 1699970625, 1917742170, 2135253587, 1551124588, 1367295589, 1180849278, 1265195639, 3501252752, 3720081049, 3399941250, 3350065803, 3835484340, 3919042237, 4270507174, 4085369519, 3102249176, 3051593425, 2734591178, 2952102595, 2361698556, 2177869557, 2530391278, 2614737639, 3145456443, 3060847922, 2708326185, 2892417312, 2404901663, 2187128086, 2504130317, 2555048196, 3542330227, 3727205754, 3375740769, 3292445032, 3876557655, 3926170974, 4246310725, 4027744588, 1808481195, 1723872674, 1910319033, 2094410160, 1608975247, 1391201670, 1173430173, 1224348052, 59984867, 244860394, 428169201, 344873464, 935293895, 984907214, 766078933, 547512796, 1844882806, 1627235199, 2011214180, 2062270317, 1507497298, 1423022939, 1137477952, 1321699145, 95345982, 145085239, 532201772, 313773861, 830661914, 1015671571, 731183368, 648017665, 3175501286, 2957853679, 2807058932, 2858115069, 2305455554, 2220981195, 2474404304, 2658625497, 3575528878, 3625268135, 3473416636, 3254988725, 3778151818, 3963161475, 4213447064, 4130281361, 3599595085, 3683022916, 3432737375, 3247465558, 3802222185, 4020912224, 4172763771, 4122762354, 3201631749, 3017672716, 2764249623, 2848461854, 2331590177, 2280796200, 2431590963, 2648976442, 104699613, 188127444, 472615631, 287343814, 840019705, 1058709744, 671593195, 621591778, 1852171925, 1668212892, 1953757831, 2037970062, 1514790577, 1463996600, 1080017571, 1297403050, 3673637356, 3623636965, 3235995134, 3454686199, 4007360968, 3822090177, 4107101658, 4190530515, 2997825956, 3215212461, 2830708150, 2779915199, 2256734592, 2340947849, 2627016082, 2443058075, 172466556, 122466165, 273792366, 492483431, 1047239e3, 861968209, 612205898, 695634755, 1646252340, 1863638845, 2013908262, 1963115311, 1446242576, 1530455833, 1277555970, 1093597963, 1636604631, 1820824798, 2073724613, 1989249228, 1436590835, 1487645946, 1337376481, 1119727848, 164948639, 81781910, 331544205, 516552836, 1039717051, 821288114, 669961897, 719700128, 2973530695, 3157750862, 2871682645, 2787207260, 2232435299, 2283490410, 2667994737, 2450346104, 3647212047, 3564045318, 3279033885, 3464042516, 3980931627, 3762502690, 4150144569, 4199882800, 3070356634, 3121275539, 2904027272, 2686254721, 2200818878, 2384911031, 2570832044, 2486224549, 3747192018, 3528626907, 3310321856, 3359936201, 3950355702, 3867060991, 4049844452, 4234721005, 1739656202, 1790575107, 2108100632, 1890328081, 1402811438, 1586903591, 1233856572, 1149249077, 266959938, 48394827, 369057872, 418672217, 1002783846, 919489135, 567498868, 752375421, 209336225, 24197544, 376187827, 459744698, 945164165, 895287692, 574624663, 793451934, 1679968233, 1764313568, 2117360635, 1933530610, 1343127501, 1560637892, 1243112415, 1192455638, 3704280881, 3519142200, 3336358691, 3419915562, 3907448597, 3857572124, 4075877127, 4294704398, 3029510009, 3113855344, 2927934315, 2744104290, 2159976285, 2377486676, 2594734927, 2544078150];\n      var U4 = [0, 151849742, 303699484, 454499602, 607398968, 758720310, 908999204, 1059270954, 1214797936, 1097159550, 1517440620, 1400849762, 1817998408, 1699839814, 2118541908, 2001430874, 2429595872, 2581445614, 2194319100, 2345119218, 3034881240, 3186202582, 2801699524, 2951971274, 3635996816, 3518358430, 3399679628, 3283088770, 4237083816, 4118925222, 4002861748, 3885750714, 1002142683, 850817237, 698445255, 548169417, 529487843, 377642221, 227885567, 77089521, 1943217067, 2061379749, 1640576439, 1757691577, 1474760595, 1592394909, 1174215055, 1290801793, 2875968315, 2724642869, 3111247143, 2960971305, 2405426947, 2253581325, 2638606623, 2487810577, 3808662347, 3926825029, 4044981591, 4162096729, 3342319475, 3459953789, 3576539503, 3693126241, 1986918061, 2137062819, 1685577905, 1836772287, 1381620373, 1532285339, 1078185097, 1229899655, 1040559837, 923313619, 740276417, 621982671, 439452389, 322734571, 137073913, 19308535, 3871163981, 4021308739, 4104605777, 4255800159, 3263785589, 3414450555, 3499326569, 3651041127, 2933202493, 2815956275, 3167684641, 3049390895, 2330014213, 2213296395, 2566595609, 2448830231, 1305906550, 1155237496, 1607244650, 1455525988, 1776460110, 1626319424, 2079897426, 1928707164, 96392454, 213114376, 396673818, 514443284, 562755902, 679998e3, 865136418, 983426092, 3708173718, 3557504664, 3474729866, 3323011204, 4180808110, 4030667424, 3945269170, 3794078908, 2507040230, 2623762152, 2272556026, 2390325492, 2975484382, 3092726480, 2738905026, 2857194700, 3973773121, 3856137295, 4274053469, 4157467219, 3371096953, 3252932727, 3673476453, 3556361835, 2763173681, 2915017791, 3064510765, 3215307299, 2156299017, 2307622919, 2459735317, 2610011675, 2081048481, 1963412655, 1846563261, 1729977011, 1480485785, 1362321559, 1243905413, 1126790795, 878845905, 1030690015, 645401037, 796197571, 274084841, 425408743, 38544885, 188821243, 3613494426, 3731654548, 3313212038, 3430322568, 4082475170, 4200115116, 3780097726, 3896688048, 2668221674, 2516901860, 2366882550, 2216610296, 3141400786, 2989552604, 2837966542, 2687165888, 1202797690, 1320957812, 1437280870, 1554391400, 1669664834, 1787304780, 1906247262, 2022837584, 265905162, 114585348, 499347990, 349075736, 736970802, 585122620, 972512814, 821712160, 2595684844, 2478443234, 2293045232, 2174754046, 3196267988, 3079546586, 2895723464, 2777952454, 3537852828, 3687994002, 3234156416, 3385345166, 4142626212, 4293295786, 3841024952, 3992742070, 174567692, 57326082, 410887952, 292596766, 777231668, 660510266, 1011452712, 893681702, 1108339068, 1258480242, 1343618912, 1494807662, 1715193156, 1865862730, 1948373848, 2100090966, 2701949495, 2818666809, 3004591147, 3122358053, 2235061775, 2352307457, 2535604243, 2653899549, 3915653703, 3764988233, 4219352155, 4067639125, 3444575871, 3294430577, 3746175075, 3594982253, 836553431, 953270745, 600235211, 718002117, 367585007, 484830689, 133361907, 251657213, 2041877159, 1891211689, 1806599355, 1654886325, 1568718495, 1418573201, 1335535747, 1184342925];\n      function convertToInt32(bytes) {\n        var result = [];\n        for (var i = 0; i < bytes.length; i += 4) {\n          result.push(\n            bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]\n          );\n        }\n        return result;\n      }\n      var AES = function(key) {\n        if (!(this instanceof AES)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        Object.defineProperty(this, \"key\", {\n          value: coerceArray(key, true)\n        });\n        this._prepare();\n      };\n      AES.prototype._prepare = function() {\n        var rounds = numberOfRounds[this.key.length];\n        if (rounds == null) {\n          throw new Error(\"invalid key size (must be 16, 24 or 32 bytes)\");\n        }\n        this._Ke = [];\n        this._Kd = [];\n        for (var i = 0; i <= rounds; i++) {\n          this._Ke.push([0, 0, 0, 0]);\n          this._Kd.push([0, 0, 0, 0]);\n        }\n        var roundKeyCount = (rounds + 1) * 4;\n        var KC = this.key.length / 4;\n        var tk = convertToInt32(this.key);\n        var index;\n        for (var i = 0; i < KC; i++) {\n          index = i >> 2;\n          this._Ke[index][i % 4] = tk[i];\n          this._Kd[rounds - index][i % 4] = tk[i];\n        }\n        var rconpointer = 0;\n        var t = KC, tt;\n        while (t < roundKeyCount) {\n          tt = tk[KC - 1];\n          tk[0] ^= S[tt >> 16 & 255] << 24 ^ S[tt >> 8 & 255] << 16 ^ S[tt & 255] << 8 ^ S[tt >> 24 & 255] ^ rcon[rconpointer] << 24;\n          rconpointer += 1;\n          if (KC != 8) {\n            for (var i = 1; i < KC; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n          } else {\n            for (var i = 1; i < KC / 2; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n            tt = tk[KC / 2 - 1];\n            tk[KC / 2] ^= S[tt & 255] ^ S[tt >> 8 & 255] << 8 ^ S[tt >> 16 & 255] << 16 ^ S[tt >> 24 & 255] << 24;\n            for (var i = KC / 2 + 1; i < KC; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n          }\n          var i = 0, r, c;\n          while (i < KC && t < roundKeyCount) {\n            r = t >> 2;\n            c = t % 4;\n            this._Ke[r][c] = tk[i];\n            this._Kd[rounds - r][c] = tk[i++];\n            t++;\n          }\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var c = 0; c < 4; c++) {\n            tt = this._Kd[r][c];\n            this._Kd[r][c] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255];\n          }\n        }\n      };\n      AES.prototype.encrypt = function(plaintext) {\n        if (plaintext.length != 16) {\n          throw new Error(\"invalid plaintext size (must be 16 bytes)\");\n        }\n        var rounds = this._Ke.length - 1;\n        var a = [0, 0, 0, 0];\n        var t = convertToInt32(plaintext);\n        for (var i = 0; i < 4; i++) {\n          t[i] ^= this._Ke[0][i];\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var i = 0; i < 4; i++) {\n            a[i] = T1[t[i] >> 24 & 255] ^ T2[t[(i + 1) % 4] >> 16 & 255] ^ T3[t[(i + 2) % 4] >> 8 & 255] ^ T4[t[(i + 3) % 4] & 255] ^ this._Ke[r][i];\n          }\n          t = a.slice();\n        }\n        var result = createArray(16), tt;\n        for (var i = 0; i < 4; i++) {\n          tt = this._Ke[rounds][i];\n          result[4 * i] = (S[t[i] >> 24 & 255] ^ tt >> 24) & 255;\n          result[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 255] ^ tt >> 16) & 255;\n          result[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;\n          result[4 * i + 3] = (S[t[(i + 3) % 4] & 255] ^ tt) & 255;\n        }\n        return result;\n      };\n      AES.prototype.decrypt = function(ciphertext) {\n        if (ciphertext.length != 16) {\n          throw new Error(\"invalid ciphertext size (must be 16 bytes)\");\n        }\n        var rounds = this._Kd.length - 1;\n        var a = [0, 0, 0, 0];\n        var t = convertToInt32(ciphertext);\n        for (var i = 0; i < 4; i++) {\n          t[i] ^= this._Kd[0][i];\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var i = 0; i < 4; i++) {\n            a[i] = T5[t[i] >> 24 & 255] ^ T6[t[(i + 3) % 4] >> 16 & 255] ^ T7[t[(i + 2) % 4] >> 8 & 255] ^ T8[t[(i + 1) % 4] & 255] ^ this._Kd[r][i];\n          }\n          t = a.slice();\n        }\n        var result = createArray(16), tt;\n        for (var i = 0; i < 4; i++) {\n          tt = this._Kd[rounds][i];\n          result[4 * i] = (Si[t[i] >> 24 & 255] ^ tt >> 24) & 255;\n          result[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 255] ^ tt >> 16) & 255;\n          result[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;\n          result[4 * i + 3] = (Si[t[(i + 1) % 4] & 255] ^ tt) & 255;\n        }\n        return result;\n      };\n      var ModeOfOperationECB = function(key) {\n        if (!(this instanceof ModeOfOperationECB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Electronic Code Block\";\n        this.name = \"ecb\";\n        this._aes = new AES(key);\n      };\n      ModeOfOperationECB.prototype.encrypt = function(plaintext) {\n        plaintext = coerceArray(plaintext);\n        if (plaintext.length % 16 !== 0) {\n          throw new Error(\"invalid plaintext size (must be multiple of 16 bytes)\");\n        }\n        var ciphertext = createArray(plaintext.length);\n        var block = createArray(16);\n        for (var i = 0; i < plaintext.length; i += 16) {\n          copyArray(plaintext, block, 0, i, i + 16);\n          block = this._aes.encrypt(block);\n          copyArray(block, ciphertext, i);\n        }\n        return ciphertext;\n      };\n      ModeOfOperationECB.prototype.decrypt = function(ciphertext) {\n        ciphertext = coerceArray(ciphertext);\n        if (ciphertext.length % 16 !== 0) {\n          throw new Error(\"invalid ciphertext size (must be multiple of 16 bytes)\");\n        }\n        var plaintext = createArray(ciphertext.length);\n        var block = createArray(16);\n        for (var i = 0; i < ciphertext.length; i += 16) {\n          copyArray(ciphertext, block, 0, i, i + 16);\n          block = this._aes.decrypt(block);\n          copyArray(block, plaintext, i);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationCBC = function(key, iv) {\n        if (!(this instanceof ModeOfOperationCBC)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Cipher Block Chaining\";\n        this.name = \"cbc\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 bytes)\");\n        }\n        this._lastCipherblock = coerceArray(iv, true);\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCBC.prototype.encrypt = function(plaintext) {\n        plaintext = coerceArray(plaintext);\n        if (plaintext.length % 16 !== 0) {\n          throw new Error(\"invalid plaintext size (must be multiple of 16 bytes)\");\n        }\n        var ciphertext = createArray(plaintext.length);\n        var block = createArray(16);\n        for (var i = 0; i < plaintext.length; i += 16) {\n          copyArray(plaintext, block, 0, i, i + 16);\n          for (var j = 0; j < 16; j++) {\n            block[j] ^= this._lastCipherblock[j];\n          }\n          this._lastCipherblock = this._aes.encrypt(block);\n          copyArray(this._lastCipherblock, ciphertext, i);\n        }\n        return ciphertext;\n      };\n      ModeOfOperationCBC.prototype.decrypt = function(ciphertext) {\n        ciphertext = coerceArray(ciphertext);\n        if (ciphertext.length % 16 !== 0) {\n          throw new Error(\"invalid ciphertext size (must be multiple of 16 bytes)\");\n        }\n        var plaintext = createArray(ciphertext.length);\n        var block = createArray(16);\n        for (var i = 0; i < ciphertext.length; i += 16) {\n          copyArray(ciphertext, block, 0, i, i + 16);\n          block = this._aes.decrypt(block);\n          for (var j = 0; j < 16; j++) {\n            plaintext[i + j] = block[j] ^ this._lastCipherblock[j];\n          }\n          copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationCFB = function(key, iv, segmentSize) {\n        if (!(this instanceof ModeOfOperationCFB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Cipher Feedback\";\n        this.name = \"cfb\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 size)\");\n        }\n        if (!segmentSize) {\n          segmentSize = 1;\n        }\n        this.segmentSize = segmentSize;\n        this._shiftRegister = coerceArray(iv, true);\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCFB.prototype.encrypt = function(plaintext) {\n        if (plaintext.length % this.segmentSize != 0) {\n          throw new Error(\"invalid plaintext size (must be segmentSize bytes)\");\n        }\n        var encrypted = coerceArray(plaintext, true);\n        var xorSegment;\n        for (var i = 0; i < encrypted.length; i += this.segmentSize) {\n          xorSegment = this._aes.encrypt(this._shiftRegister);\n          for (var j = 0; j < this.segmentSize; j++) {\n            encrypted[i + j] ^= xorSegment[j];\n          }\n          copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n          copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n        }\n        return encrypted;\n      };\n      ModeOfOperationCFB.prototype.decrypt = function(ciphertext) {\n        if (ciphertext.length % this.segmentSize != 0) {\n          throw new Error(\"invalid ciphertext size (must be segmentSize bytes)\");\n        }\n        var plaintext = coerceArray(ciphertext, true);\n        var xorSegment;\n        for (var i = 0; i < plaintext.length; i += this.segmentSize) {\n          xorSegment = this._aes.encrypt(this._shiftRegister);\n          for (var j = 0; j < this.segmentSize; j++) {\n            plaintext[i + j] ^= xorSegment[j];\n          }\n          copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n          copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationOFB = function(key, iv) {\n        if (!(this instanceof ModeOfOperationOFB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Output Feedback\";\n        this.name = \"ofb\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 bytes)\");\n        }\n        this._lastPrecipher = coerceArray(iv, true);\n        this._lastPrecipherIndex = 16;\n        this._aes = new AES(key);\n      };\n      ModeOfOperationOFB.prototype.encrypt = function(plaintext) {\n        var encrypted = coerceArray(plaintext, true);\n        for (var i = 0; i < encrypted.length; i++) {\n          if (this._lastPrecipherIndex === 16) {\n            this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);\n            this._lastPrecipherIndex = 0;\n          }\n          encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];\n        }\n        return encrypted;\n      };\n      ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;\n      var Counter = function(initialValue) {\n        if (!(this instanceof Counter)) {\n          throw Error(\"Counter must be instanitated with `new`\");\n        }\n        if (initialValue !== 0 && !initialValue) {\n          initialValue = 1;\n        }\n        if (typeof initialValue === \"number\") {\n          this._counter = createArray(16);\n          this.setValue(initialValue);\n        } else {\n          this.setBytes(initialValue);\n        }\n      };\n      Counter.prototype.setValue = function(value) {\n        if (typeof value !== \"number\" || parseInt(value) != value) {\n          throw new Error(\"invalid counter value (must be an integer)\");\n        }\n        for (var index = 15; index >= 0; --index) {\n          this._counter[index] = value % 256;\n          value = value >> 8;\n        }\n      };\n      Counter.prototype.setBytes = function(bytes) {\n        bytes = coerceArray(bytes, true);\n        if (bytes.length != 16) {\n          throw new Error(\"invalid counter bytes size (must be 16 bytes)\");\n        }\n        this._counter = bytes;\n      };\n      Counter.prototype.increment = function() {\n        for (var i = 15; i >= 0; i--) {\n          if (this._counter[i] === 255) {\n            this._counter[i] = 0;\n          } else {\n            this._counter[i]++;\n            break;\n          }\n        }\n      };\n      var ModeOfOperationCTR = function(key, counter) {\n        if (!(this instanceof ModeOfOperationCTR)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Counter\";\n        this.name = \"ctr\";\n        if (!(counter instanceof Counter)) {\n          counter = new Counter(counter);\n        }\n        this._counter = counter;\n        this._remainingCounter = null;\n        this._remainingCounterIndex = 16;\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCTR.prototype.encrypt = function(plaintext) {\n        var encrypted = coerceArray(plaintext, true);\n        for (var i = 0; i < encrypted.length; i++) {\n          if (this._remainingCounterIndex === 16) {\n            this._remainingCounter = this._aes.encrypt(this._counter._counter);\n            this._remainingCounterIndex = 0;\n            this._counter.increment();\n          }\n          encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\n        }\n        return encrypted;\n      };\n      ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;\n      function pkcs7pad(data) {\n        data = coerceArray(data, true);\n        var padder = 16 - data.length % 16;\n        var result = createArray(data.length + padder);\n        copyArray(data, result);\n        for (var i = data.length; i < result.length; i++) {\n          result[i] = padder;\n        }\n        return result;\n      }\n      function pkcs7strip(data) {\n        data = coerceArray(data, true);\n        if (data.length < 16) {\n          throw new Error(\"PKCS#7 invalid length\");\n        }\n        var padder = data[data.length - 1];\n        if (padder > 16) {\n          throw new Error(\"PKCS#7 padding byte out of range\");\n        }\n        var length = data.length - padder;\n        for (var i = 0; i < padder; i++) {\n          if (data[length + i] !== padder) {\n            throw new Error(\"PKCS#7 invalid padding byte\");\n          }\n        }\n        var result = createArray(length);\n        copyArray(data, result, 0, 0, length);\n        return result;\n      }\n      var aesjs = {\n        AES,\n        Counter,\n        ModeOfOperation: {\n          ecb: ModeOfOperationECB,\n          cbc: ModeOfOperationCBC,\n          cfb: ModeOfOperationCFB,\n          ofb: ModeOfOperationOFB,\n          ctr: ModeOfOperationCTR\n        },\n        utils: {\n          hex: convertHex,\n          utf8: convertUtf8\n        },\n        padding: {\n          pkcs7: {\n            pad: pkcs7pad,\n            strip: pkcs7strip\n          }\n        },\n        _arrayTest: {\n          coerceArray,\n          createArray,\n          copyArray\n        }\n      };\n      if (typeof exports2 !== \"undefined\") {\n        module2.exports = aesjs;\n      } else if (typeof define === \"function\" && define.amd) {\n        define(aesjs);\n      } else {\n        if (root.aesjs) {\n          aesjs._aesjs = root.aesjs;\n        }\n        root.aesjs = aesjs;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/_version.js\nvar require_version18 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"json-wallets/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/utils.js\nvar require_utils4 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/utils.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.uuidV4 = exports2.searchPath = exports2.getPassword = exports2.zpad = exports2.looseArrayify = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    function looseArrayify(hexString) {\n      if (typeof hexString === \"string\" && hexString.substring(0, 2) !== \"0x\") {\n        hexString = \"0x\" + hexString;\n      }\n      return (0, bytes_1.arrayify)(hexString);\n    }\n    exports2.looseArrayify = looseArrayify;\n    function zpad(value, length) {\n      value = String(value);\n      while (value.length < length) {\n        value = \"0\" + value;\n      }\n      return value;\n    }\n    exports2.zpad = zpad;\n    function getPassword(password) {\n      if (typeof password === \"string\") {\n        return (0, strings_1.toUtf8Bytes)(password, strings_1.UnicodeNormalizationForm.NFKC);\n      }\n      return (0, bytes_1.arrayify)(password);\n    }\n    exports2.getPassword = getPassword;\n    function searchPath(object, path) {\n      var currentChild = object;\n      var comps = path.toLowerCase().split(\"/\");\n      for (var i = 0; i < comps.length; i++) {\n        var matchingChild = null;\n        for (var key in currentChild) {\n          if (key.toLowerCase() === comps[i]) {\n            matchingChild = currentChild[key];\n            break;\n          }\n        }\n        if (matchingChild === null) {\n          return null;\n        }\n        currentChild = matchingChild;\n      }\n      return currentChild;\n    }\n    exports2.searchPath = searchPath;\n    function uuidV4(randomBytes) {\n      var bytes = (0, bytes_1.arrayify)(randomBytes);\n      bytes[6] = bytes[6] & 15 | 64;\n      bytes[8] = bytes[8] & 63 | 128;\n      var value = (0, bytes_1.hexlify)(bytes);\n      return [\n        value.substring(2, 10),\n        value.substring(10, 14),\n        value.substring(14, 18),\n        value.substring(18, 22),\n        value.substring(22, 34)\n      ].join(\"-\");\n    }\n    exports2.uuidV4 = uuidV4;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/crowdsale.js\nvar require_crowdsale = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/crowdsale.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decrypt = exports2.CrowdsaleAccount = void 0;\n    var aes_js_1 = __importDefault(require_aes_js());\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var pbkdf2_1 = require_lib18();\n    var strings_1 = require_lib9();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version18();\n    var logger = new logger_1.Logger(_version_1.version);\n    var utils_1 = require_utils4();\n    var CrowdsaleAccount = (\n      /** @class */\n      function(_super) {\n        __extends(CrowdsaleAccount2, _super);\n        function CrowdsaleAccount2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        CrowdsaleAccount2.prototype.isCrowdsaleAccount = function(value) {\n          return !!(value && value._isCrowdsaleAccount);\n        };\n        return CrowdsaleAccount2;\n      }(properties_1.Description)\n    );\n    exports2.CrowdsaleAccount = CrowdsaleAccount;\n    function decrypt(json, password) {\n      var data = JSON.parse(json);\n      password = (0, utils_1.getPassword)(password);\n      var ethaddr = (0, address_1.getAddress)((0, utils_1.searchPath)(data, \"ethaddr\"));\n      var encseed = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"encseed\"));\n      if (!encseed || encseed.length % 16 !== 0) {\n        logger.throwArgumentError(\"invalid encseed\", \"json\", json);\n      }\n      var key = (0, bytes_1.arrayify)((0, pbkdf2_1.pbkdf2)(password, password, 2e3, 32, \"sha256\")).slice(0, 16);\n      var iv = encseed.slice(0, 16);\n      var encryptedSeed = encseed.slice(16);\n      var aesCbc = new aes_js_1.default.ModeOfOperation.cbc(key, iv);\n      var seed = aes_js_1.default.padding.pkcs7.strip((0, bytes_1.arrayify)(aesCbc.decrypt(encryptedSeed)));\n      var seedHex = \"\";\n      for (var i = 0; i < seed.length; i++) {\n        seedHex += String.fromCharCode(seed[i]);\n      }\n      var seedHexBytes = (0, strings_1.toUtf8Bytes)(seedHex);\n      var privateKey = (0, keccak256_1.keccak256)(seedHexBytes);\n      return new CrowdsaleAccount({\n        _isCrowdsaleAccount: true,\n        address: ethaddr,\n        privateKey\n      });\n    }\n    exports2.decrypt = decrypt;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/inspect.js\nvar require_inspect = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/inspect.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getJsonWalletAddress = exports2.isKeystoreWallet = exports2.isCrowdsaleWallet = void 0;\n    var address_1 = require_lib7();\n    function isCrowdsaleWallet(json) {\n      var data = null;\n      try {\n        data = JSON.parse(json);\n      } catch (error) {\n        return false;\n      }\n      return data.encseed && data.ethaddr;\n    }\n    exports2.isCrowdsaleWallet = isCrowdsaleWallet;\n    function isKeystoreWallet(json) {\n      var data = null;\n      try {\n        data = JSON.parse(json);\n      } catch (error) {\n        return false;\n      }\n      if (!data.version || parseInt(data.version) !== data.version || parseInt(data.version) !== 3) {\n        return false;\n      }\n      return true;\n    }\n    exports2.isKeystoreWallet = isKeystoreWallet;\n    function getJsonWalletAddress(json) {\n      if (isCrowdsaleWallet(json)) {\n        try {\n          return (0, address_1.getAddress)(JSON.parse(json).ethaddr);\n        } catch (error) {\n          return null;\n        }\n      }\n      if (isKeystoreWallet(json)) {\n        try {\n          return (0, address_1.getAddress)(JSON.parse(json).address);\n        } catch (error) {\n          return null;\n        }\n      }\n      return null;\n    }\n    exports2.getJsonWalletAddress = getJsonWalletAddress;\n  }\n});\n\n// node_modules/scrypt-js/scrypt.js\nvar require_scrypt = __commonJS({\n  \"node_modules/scrypt-js/scrypt.js\"(exports2, module2) {\n    \"use strict\";\n    (function(root) {\n      const MAX_VALUE = 2147483647;\n      function SHA256(m) {\n        const K = new Uint32Array([\n          1116352408,\n          1899447441,\n          3049323471,\n          3921009573,\n          961987163,\n          1508970993,\n          2453635748,\n          2870763221,\n          3624381080,\n          310598401,\n          607225278,\n          1426881987,\n          1925078388,\n          2162078206,\n          2614888103,\n          3248222580,\n          3835390401,\n          4022224774,\n          264347078,\n          604807628,\n          770255983,\n          1249150122,\n          1555081692,\n          1996064986,\n          2554220882,\n          2821834349,\n          2952996808,\n          3210313671,\n          3336571891,\n          3584528711,\n          113926993,\n          338241895,\n          666307205,\n          773529912,\n          1294757372,\n          1396182291,\n          1695183700,\n          1986661051,\n          2177026350,\n          2456956037,\n          2730485921,\n          2820302411,\n          3259730800,\n          3345764771,\n          3516065817,\n          3600352804,\n          4094571909,\n          275423344,\n          430227734,\n          506948616,\n          659060556,\n          883997877,\n          958139571,\n          1322822218,\n          1537002063,\n          1747873779,\n          1955562222,\n          2024104815,\n          2227730452,\n          2361852424,\n          2428436474,\n          2756734187,\n          3204031479,\n          3329325298\n        ]);\n        let h0 = 1779033703, h1 = 3144134277, h2 = 1013904242, h3 = 2773480762;\n        let h4 = 1359893119, h5 = 2600822924, h6 = 528734635, h7 = 1541459225;\n        const w = new Uint32Array(64);\n        function blocks(p2) {\n          let off = 0, len = p2.length;\n          while (len >= 64) {\n            let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, u, i2, j, t1, t2;\n            for (i2 = 0; i2 < 16; i2++) {\n              j = off + i2 * 4;\n              w[i2] = (p2[j] & 255) << 24 | (p2[j + 1] & 255) << 16 | (p2[j + 2] & 255) << 8 | p2[j + 3] & 255;\n            }\n            for (i2 = 16; i2 < 64; i2++) {\n              u = w[i2 - 2];\n              t1 = (u >>> 17 | u << 32 - 17) ^ (u >>> 19 | u << 32 - 19) ^ u >>> 10;\n              u = w[i2 - 15];\n              t2 = (u >>> 7 | u << 32 - 7) ^ (u >>> 18 | u << 32 - 18) ^ u >>> 3;\n              w[i2] = (t1 + w[i2 - 7] | 0) + (t2 + w[i2 - 16] | 0) | 0;\n            }\n            for (i2 = 0; i2 < 64; i2++) {\n              t1 = (((e >>> 6 | e << 32 - 6) ^ (e >>> 11 | e << 32 - 11) ^ (e >>> 25 | e << 32 - 25)) + (e & f ^ ~e & g) | 0) + (h + (K[i2] + w[i2] | 0) | 0) | 0;\n              t2 = ((a >>> 2 | a << 32 - 2) ^ (a >>> 13 | a << 32 - 13) ^ (a >>> 22 | a << 32 - 22)) + (a & b ^ a & c ^ b & c) | 0;\n              h = g;\n              g = f;\n              f = e;\n              e = d + t1 | 0;\n              d = c;\n              c = b;\n              b = a;\n              a = t1 + t2 | 0;\n            }\n            h0 = h0 + a | 0;\n            h1 = h1 + b | 0;\n            h2 = h2 + c | 0;\n            h3 = h3 + d | 0;\n            h4 = h4 + e | 0;\n            h5 = h5 + f | 0;\n            h6 = h6 + g | 0;\n            h7 = h7 + h | 0;\n            off += 64;\n            len -= 64;\n          }\n        }\n        blocks(m);\n        let i, bytesLeft = m.length % 64, bitLenHi = m.length / 536870912 | 0, bitLenLo = m.length << 3, numZeros = bytesLeft < 56 ? 56 : 120, p = m.slice(m.length - bytesLeft, m.length);\n        p.push(128);\n        for (i = bytesLeft + 1; i < numZeros; i++) {\n          p.push(0);\n        }\n        p.push(bitLenHi >>> 24 & 255);\n        p.push(bitLenHi >>> 16 & 255);\n        p.push(bitLenHi >>> 8 & 255);\n        p.push(bitLenHi >>> 0 & 255);\n        p.push(bitLenLo >>> 24 & 255);\n        p.push(bitLenLo >>> 16 & 255);\n        p.push(bitLenLo >>> 8 & 255);\n        p.push(bitLenLo >>> 0 & 255);\n        blocks(p);\n        return [\n          h0 >>> 24 & 255,\n          h0 >>> 16 & 255,\n          h0 >>> 8 & 255,\n          h0 >>> 0 & 255,\n          h1 >>> 24 & 255,\n          h1 >>> 16 & 255,\n          h1 >>> 8 & 255,\n          h1 >>> 0 & 255,\n          h2 >>> 24 & 255,\n          h2 >>> 16 & 255,\n          h2 >>> 8 & 255,\n          h2 >>> 0 & 255,\n          h3 >>> 24 & 255,\n          h3 >>> 16 & 255,\n          h3 >>> 8 & 255,\n          h3 >>> 0 & 255,\n          h4 >>> 24 & 255,\n          h4 >>> 16 & 255,\n          h4 >>> 8 & 255,\n          h4 >>> 0 & 255,\n          h5 >>> 24 & 255,\n          h5 >>> 16 & 255,\n          h5 >>> 8 & 255,\n          h5 >>> 0 & 255,\n          h6 >>> 24 & 255,\n          h6 >>> 16 & 255,\n          h6 >>> 8 & 255,\n          h6 >>> 0 & 255,\n          h7 >>> 24 & 255,\n          h7 >>> 16 & 255,\n          h7 >>> 8 & 255,\n          h7 >>> 0 & 255\n        ];\n      }\n      function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) {\n        password = password.length <= 64 ? password : SHA256(password);\n        const innerLen = 64 + salt.length + 4;\n        const inner = new Array(innerLen);\n        const outerKey = new Array(64);\n        let i;\n        let dk = [];\n        for (i = 0; i < 64; i++) {\n          inner[i] = 54;\n        }\n        for (i = 0; i < password.length; i++) {\n          inner[i] ^= password[i];\n        }\n        for (i = 0; i < salt.length; i++) {\n          inner[64 + i] = salt[i];\n        }\n        for (i = innerLen - 4; i < innerLen; i++) {\n          inner[i] = 0;\n        }\n        for (i = 0; i < 64; i++) outerKey[i] = 92;\n        for (i = 0; i < password.length; i++) outerKey[i] ^= password[i];\n        function incrementCounter() {\n          for (let i2 = innerLen - 1; i2 >= innerLen - 4; i2--) {\n            inner[i2]++;\n            if (inner[i2] <= 255) return;\n            inner[i2] = 0;\n          }\n        }\n        while (dkLen >= 32) {\n          incrementCounter();\n          dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))));\n          dkLen -= 32;\n        }\n        if (dkLen > 0) {\n          incrementCounter();\n          dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen));\n        }\n        return dk;\n      }\n      function blockmix_salsa8(BY, Yi, r, x, _X) {\n        let i;\n        arraycopy(BY, (2 * r - 1) * 16, _X, 0, 16);\n        for (i = 0; i < 2 * r; i++) {\n          blockxor(BY, i * 16, _X, 16);\n          salsa20_8(_X, x);\n          arraycopy(_X, 0, BY, Yi + i * 16, 16);\n        }\n        for (i = 0; i < r; i++) {\n          arraycopy(BY, Yi + i * 2 * 16, BY, i * 16, 16);\n        }\n        for (i = 0; i < r; i++) {\n          arraycopy(BY, Yi + (i * 2 + 1) * 16, BY, (i + r) * 16, 16);\n        }\n      }\n      function R(a, b) {\n        return a << b | a >>> 32 - b;\n      }\n      function salsa20_8(B, x) {\n        arraycopy(B, 0, x, 0, 16);\n        for (let i = 8; i > 0; i -= 2) {\n          x[4] ^= R(x[0] + x[12], 7);\n          x[8] ^= R(x[4] + x[0], 9);\n          x[12] ^= R(x[8] + x[4], 13);\n          x[0] ^= R(x[12] + x[8], 18);\n          x[9] ^= R(x[5] + x[1], 7);\n          x[13] ^= R(x[9] + x[5], 9);\n          x[1] ^= R(x[13] + x[9], 13);\n          x[5] ^= R(x[1] + x[13], 18);\n          x[14] ^= R(x[10] + x[6], 7);\n          x[2] ^= R(x[14] + x[10], 9);\n          x[6] ^= R(x[2] + x[14], 13);\n          x[10] ^= R(x[6] + x[2], 18);\n          x[3] ^= R(x[15] + x[11], 7);\n          x[7] ^= R(x[3] + x[15], 9);\n          x[11] ^= R(x[7] + x[3], 13);\n          x[15] ^= R(x[11] + x[7], 18);\n          x[1] ^= R(x[0] + x[3], 7);\n          x[2] ^= R(x[1] + x[0], 9);\n          x[3] ^= R(x[2] + x[1], 13);\n          x[0] ^= R(x[3] + x[2], 18);\n          x[6] ^= R(x[5] + x[4], 7);\n          x[7] ^= R(x[6] + x[5], 9);\n          x[4] ^= R(x[7] + x[6], 13);\n          x[5] ^= R(x[4] + x[7], 18);\n          x[11] ^= R(x[10] + x[9], 7);\n          x[8] ^= R(x[11] + x[10], 9);\n          x[9] ^= R(x[8] + x[11], 13);\n          x[10] ^= R(x[9] + x[8], 18);\n          x[12] ^= R(x[15] + x[14], 7);\n          x[13] ^= R(x[12] + x[15], 9);\n          x[14] ^= R(x[13] + x[12], 13);\n          x[15] ^= R(x[14] + x[13], 18);\n        }\n        for (let i = 0; i < 16; ++i) {\n          B[i] += x[i];\n        }\n      }\n      function blockxor(S, Si, D, len) {\n        for (let i = 0; i < len; i++) {\n          D[i] ^= S[Si + i];\n        }\n      }\n      function arraycopy(src, srcPos, dest, destPos, length) {\n        while (length--) {\n          dest[destPos++] = src[srcPos++];\n        }\n      }\n      function checkBufferish(o) {\n        if (!o || typeof o.length !== \"number\") {\n          return false;\n        }\n        for (let i = 0; i < o.length; i++) {\n          const v = o[i];\n          if (typeof v !== \"number\" || v % 1 || v < 0 || v >= 256) {\n            return false;\n          }\n        }\n        return true;\n      }\n      function ensureInteger(value, name2) {\n        if (typeof value !== \"number\" || value % 1) {\n          throw new Error(\"invalid \" + name2);\n        }\n        return value;\n      }\n      function _scrypt(password, salt, N, r, p, dkLen, callback) {\n        N = ensureInteger(N, \"N\");\n        r = ensureInteger(r, \"r\");\n        p = ensureInteger(p, \"p\");\n        dkLen = ensureInteger(dkLen, \"dkLen\");\n        if (N === 0 || (N & N - 1) !== 0) {\n          throw new Error(\"N must be power of 2\");\n        }\n        if (N > MAX_VALUE / 128 / r) {\n          throw new Error(\"N too large\");\n        }\n        if (r > MAX_VALUE / 128 / p) {\n          throw new Error(\"r too large\");\n        }\n        if (!checkBufferish(password)) {\n          throw new Error(\"password must be an array or buffer\");\n        }\n        password = Array.prototype.slice.call(password);\n        if (!checkBufferish(salt)) {\n          throw new Error(\"salt must be an array or buffer\");\n        }\n        salt = Array.prototype.slice.call(salt);\n        let b = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r);\n        const B = new Uint32Array(p * 32 * r);\n        for (let i = 0; i < B.length; i++) {\n          const j = i * 4;\n          B[i] = (b[j + 3] & 255) << 24 | (b[j + 2] & 255) << 16 | (b[j + 1] & 255) << 8 | (b[j + 0] & 255) << 0;\n        }\n        const XY = new Uint32Array(64 * r);\n        const V = new Uint32Array(32 * r * N);\n        const Yi = 32 * r;\n        const x = new Uint32Array(16);\n        const _X = new Uint32Array(16);\n        const totalOps = p * N * 2;\n        let currentOp = 0;\n        let lastPercent10 = null;\n        let stop = false;\n        let state = 0;\n        let i0 = 0, i1;\n        let Bi;\n        const limit = callback ? parseInt(1e3 / r) : 4294967295;\n        const nextTick = typeof setImmediate !== \"undefined\" ? setImmediate : setTimeout;\n        const incrementalSMix = function() {\n          if (stop) {\n            return callback(new Error(\"cancelled\"), currentOp / totalOps);\n          }\n          let steps;\n          switch (state) {\n            case 0:\n              Bi = i0 * 32 * r;\n              arraycopy(B, Bi, XY, 0, Yi);\n              state = 1;\n              i1 = 0;\n            case 1:\n              steps = N - i1;\n              if (steps > limit) {\n                steps = limit;\n              }\n              for (let i = 0; i < steps; i++) {\n                arraycopy(XY, 0, V, (i1 + i) * Yi, Yi);\n                blockmix_salsa8(XY, Yi, r, x, _X);\n              }\n              i1 += steps;\n              currentOp += steps;\n              if (callback) {\n                const percent10 = parseInt(1e3 * currentOp / totalOps);\n                if (percent10 !== lastPercent10) {\n                  stop = callback(null, currentOp / totalOps);\n                  if (stop) {\n                    break;\n                  }\n                  lastPercent10 = percent10;\n                }\n              }\n              if (i1 < N) {\n                break;\n              }\n              i1 = 0;\n              state = 2;\n            case 2:\n              steps = N - i1;\n              if (steps > limit) {\n                steps = limit;\n              }\n              for (let i = 0; i < steps; i++) {\n                const offset = (2 * r - 1) * 16;\n                const j = XY[offset] & N - 1;\n                blockxor(V, j * Yi, XY, Yi);\n                blockmix_salsa8(XY, Yi, r, x, _X);\n              }\n              i1 += steps;\n              currentOp += steps;\n              if (callback) {\n                const percent10 = parseInt(1e3 * currentOp / totalOps);\n                if (percent10 !== lastPercent10) {\n                  stop = callback(null, currentOp / totalOps);\n                  if (stop) {\n                    break;\n                  }\n                  lastPercent10 = percent10;\n                }\n              }\n              if (i1 < N) {\n                break;\n              }\n              arraycopy(XY, 0, B, Bi, Yi);\n              i0++;\n              if (i0 < p) {\n                state = 0;\n                break;\n              }\n              b = [];\n              for (let i = 0; i < B.length; i++) {\n                b.push(B[i] >> 0 & 255);\n                b.push(B[i] >> 8 & 255);\n                b.push(B[i] >> 16 & 255);\n                b.push(B[i] >> 24 & 255);\n              }\n              const derivedKey = PBKDF2_HMAC_SHA256_OneIter(password, b, dkLen);\n              if (callback) {\n                callback(null, 1, derivedKey);\n              }\n              return derivedKey;\n          }\n          if (callback) {\n            nextTick(incrementalSMix);\n          }\n        };\n        if (!callback) {\n          while (true) {\n            const derivedKey = incrementalSMix();\n            if (derivedKey != void 0) {\n              return derivedKey;\n            }\n          }\n        }\n        incrementalSMix();\n      }\n      const lib = {\n        scrypt: function(password, salt, N, r, p, dkLen, progressCallback) {\n          return new Promise(function(resolve, reject) {\n            let lastProgress = 0;\n            if (progressCallback) {\n              progressCallback(0);\n            }\n            _scrypt(password, salt, N, r, p, dkLen, function(error, progress, key) {\n              if (error) {\n                reject(error);\n              } else if (key) {\n                if (progressCallback && lastProgress !== 1) {\n                  progressCallback(1);\n                }\n                resolve(new Uint8Array(key));\n              } else if (progressCallback && progress !== lastProgress) {\n                lastProgress = progress;\n                return progressCallback(progress);\n              }\n            });\n          });\n        },\n        syncScrypt: function(password, salt, N, r, p, dkLen) {\n          return new Uint8Array(_scrypt(password, salt, N, r, p, dkLen));\n        }\n      };\n      if (typeof exports2 !== \"undefined\") {\n        module2.exports = lib;\n      } else if (typeof define === \"function\" && define.amd) {\n        define(lib);\n      } else if (root) {\n        if (root.scrypt) {\n          root._scrypt = root.scrypt;\n        }\n        root.scrypt = lib;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/keystore.js\nvar require_keystore = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/keystore.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encrypt = exports2.decrypt = exports2.decryptSync = exports2.KeystoreAccount = void 0;\n    var aes_js_1 = __importDefault(require_aes_js());\n    var scrypt_js_1 = __importDefault(require_scrypt());\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var hdnode_1 = require_lib21();\n    var keccak256_1 = require_lib5();\n    var pbkdf2_1 = require_lib18();\n    var random_1 = require_lib22();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var utils_1 = require_utils4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version18();\n    var logger = new logger_1.Logger(_version_1.version);\n    function hasMnemonic(value) {\n      return value != null && value.mnemonic && value.mnemonic.phrase;\n    }\n    var KeystoreAccount = (\n      /** @class */\n      function(_super) {\n        __extends(KeystoreAccount2, _super);\n        function KeystoreAccount2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        KeystoreAccount2.prototype.isKeystoreAccount = function(value) {\n          return !!(value && value._isKeystoreAccount);\n        };\n        return KeystoreAccount2;\n      }(properties_1.Description)\n    );\n    exports2.KeystoreAccount = KeystoreAccount;\n    function _decrypt(data, key, ciphertext) {\n      var cipher = (0, utils_1.searchPath)(data, \"crypto/cipher\");\n      if (cipher === \"aes-128-ctr\") {\n        var iv = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/cipherparams/iv\"));\n        var counter = new aes_js_1.default.Counter(iv);\n        var aesCtr = new aes_js_1.default.ModeOfOperation.ctr(key, counter);\n        return (0, bytes_1.arrayify)(aesCtr.decrypt(ciphertext));\n      }\n      return null;\n    }\n    function _getAccount(data, key) {\n      var ciphertext = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/ciphertext\"));\n      var computedMAC = (0, bytes_1.hexlify)((0, keccak256_1.keccak256)((0, bytes_1.concat)([key.slice(16, 32), ciphertext]))).substring(2);\n      if (computedMAC !== (0, utils_1.searchPath)(data, \"crypto/mac\").toLowerCase()) {\n        throw new Error(\"invalid password\");\n      }\n      var privateKey = _decrypt(data, key.slice(0, 16), ciphertext);\n      if (!privateKey) {\n        logger.throwError(\"unsupported cipher\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          operation: \"decrypt\"\n        });\n      }\n      var mnemonicKey = key.slice(32, 64);\n      var address = (0, transactions_1.computeAddress)(privateKey);\n      if (data.address) {\n        var check = data.address.toLowerCase();\n        if (check.substring(0, 2) !== \"0x\") {\n          check = \"0x\" + check;\n        }\n        if ((0, address_1.getAddress)(check) !== address) {\n          throw new Error(\"address mismatch\");\n        }\n      }\n      var account = {\n        _isKeystoreAccount: true,\n        address,\n        privateKey: (0, bytes_1.hexlify)(privateKey)\n      };\n      if ((0, utils_1.searchPath)(data, \"x-ethers/version\") === \"0.1\") {\n        var mnemonicCiphertext = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"x-ethers/mnemonicCiphertext\"));\n        var mnemonicIv = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"x-ethers/mnemonicCounter\"));\n        var mnemonicCounter = new aes_js_1.default.Counter(mnemonicIv);\n        var mnemonicAesCtr = new aes_js_1.default.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter);\n        var path = (0, utils_1.searchPath)(data, \"x-ethers/path\") || hdnode_1.defaultPath;\n        var locale = (0, utils_1.searchPath)(data, \"x-ethers/locale\") || \"en\";\n        var entropy = (0, bytes_1.arrayify)(mnemonicAesCtr.decrypt(mnemonicCiphertext));\n        try {\n          var mnemonic = (0, hdnode_1.entropyToMnemonic)(entropy, locale);\n          var node = hdnode_1.HDNode.fromMnemonic(mnemonic, null, locale).derivePath(path);\n          if (node.privateKey != account.privateKey) {\n            throw new Error(\"mnemonic mismatch\");\n          }\n          account.mnemonic = node.mnemonic;\n        } catch (error) {\n          if (error.code !== logger_1.Logger.errors.INVALID_ARGUMENT || error.argument !== \"wordlist\") {\n            throw error;\n          }\n        }\n      }\n      return new KeystoreAccount(account);\n    }\n    function pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc) {\n      return (0, bytes_1.arrayify)((0, pbkdf2_1.pbkdf2)(passwordBytes, salt, count, dkLen, prfFunc));\n    }\n    function pbkdf2(passwordBytes, salt, count, dkLen, prfFunc) {\n      return Promise.resolve(pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc));\n    }\n    function _computeKdfKey(data, password, pbkdf2Func, scryptFunc, progressCallback) {\n      var passwordBytes = (0, utils_1.getPassword)(password);\n      var kdf = (0, utils_1.searchPath)(data, \"crypto/kdf\");\n      if (kdf && typeof kdf === \"string\") {\n        var throwError = function(name2, value) {\n          return logger.throwArgumentError(\"invalid key-derivation function parameters\", name2, value);\n        };\n        if (kdf.toLowerCase() === \"scrypt\") {\n          var salt = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/kdfparams/salt\"));\n          var N = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/n\"));\n          var r = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/r\"));\n          var p = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/p\"));\n          if (!N || !r || !p) {\n            throwError(\"kdf\", kdf);\n          }\n          if ((N & N - 1) !== 0) {\n            throwError(\"N\", N);\n          }\n          var dkLen = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/dklen\"));\n          if (dkLen !== 32) {\n            throwError(\"dklen\", dkLen);\n          }\n          return scryptFunc(passwordBytes, salt, N, r, p, 64, progressCallback);\n        } else if (kdf.toLowerCase() === \"pbkdf2\") {\n          var salt = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/kdfparams/salt\"));\n          var prfFunc = null;\n          var prf = (0, utils_1.searchPath)(data, \"crypto/kdfparams/prf\");\n          if (prf === \"hmac-sha256\") {\n            prfFunc = \"sha256\";\n          } else if (prf === \"hmac-sha512\") {\n            prfFunc = \"sha512\";\n          } else {\n            throwError(\"prf\", prf);\n          }\n          var count = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/c\"));\n          var dkLen = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/dklen\"));\n          if (dkLen !== 32) {\n            throwError(\"dklen\", dkLen);\n          }\n          return pbkdf2Func(passwordBytes, salt, count, dkLen, prfFunc);\n        }\n      }\n      return logger.throwArgumentError(\"unsupported key-derivation function\", \"kdf\", kdf);\n    }\n    function decryptSync(json, password) {\n      var data = JSON.parse(json);\n      var key = _computeKdfKey(data, password, pbkdf2Sync, scrypt_js_1.default.syncScrypt);\n      return _getAccount(data, key);\n    }\n    exports2.decryptSync = decryptSync;\n    function decrypt(json, password, progressCallback) {\n      return __awaiter(this, void 0, void 0, function() {\n        var data, key;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              data = JSON.parse(json);\n              return [4, _computeKdfKey(data, password, pbkdf2, scrypt_js_1.default.scrypt, progressCallback)];\n            case 1:\n              key = _a.sent();\n              return [2, _getAccount(data, key)];\n          }\n        });\n      });\n    }\n    exports2.decrypt = decrypt;\n    function encrypt(account, password, options, progressCallback) {\n      try {\n        if ((0, address_1.getAddress)(account.address) !== (0, transactions_1.computeAddress)(account.privateKey)) {\n          throw new Error(\"address/privateKey mismatch\");\n        }\n        if (hasMnemonic(account)) {\n          var mnemonic = account.mnemonic;\n          var node = hdnode_1.HDNode.fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path || hdnode_1.defaultPath);\n          if (node.privateKey != account.privateKey) {\n            throw new Error(\"mnemonic mismatch\");\n          }\n        }\n      } catch (e) {\n        return Promise.reject(e);\n      }\n      if (typeof options === \"function\" && !progressCallback) {\n        progressCallback = options;\n        options = {};\n      }\n      if (!options) {\n        options = {};\n      }\n      var privateKey = (0, bytes_1.arrayify)(account.privateKey);\n      var passwordBytes = (0, utils_1.getPassword)(password);\n      var entropy = null;\n      var path = null;\n      var locale = null;\n      if (hasMnemonic(account)) {\n        var srcMnemonic = account.mnemonic;\n        entropy = (0, bytes_1.arrayify)((0, hdnode_1.mnemonicToEntropy)(srcMnemonic.phrase, srcMnemonic.locale || \"en\"));\n        path = srcMnemonic.path || hdnode_1.defaultPath;\n        locale = srcMnemonic.locale || \"en\";\n      }\n      var client = options.client;\n      if (!client) {\n        client = \"ethers.js\";\n      }\n      var salt = null;\n      if (options.salt) {\n        salt = (0, bytes_1.arrayify)(options.salt);\n      } else {\n        salt = (0, random_1.randomBytes)(32);\n        ;\n      }\n      var iv = null;\n      if (options.iv) {\n        iv = (0, bytes_1.arrayify)(options.iv);\n        if (iv.length !== 16) {\n          throw new Error(\"invalid iv\");\n        }\n      } else {\n        iv = (0, random_1.randomBytes)(16);\n      }\n      var uuidRandom = null;\n      if (options.uuid) {\n        uuidRandom = (0, bytes_1.arrayify)(options.uuid);\n        if (uuidRandom.length !== 16) {\n          throw new Error(\"invalid uuid\");\n        }\n      } else {\n        uuidRandom = (0, random_1.randomBytes)(16);\n      }\n      var N = 1 << 17, r = 8, p = 1;\n      if (options.scrypt) {\n        if (options.scrypt.N) {\n          N = options.scrypt.N;\n        }\n        if (options.scrypt.r) {\n          r = options.scrypt.r;\n        }\n        if (options.scrypt.p) {\n          p = options.scrypt.p;\n        }\n      }\n      return scrypt_js_1.default.scrypt(passwordBytes, salt, N, r, p, 64, progressCallback).then(function(key) {\n        key = (0, bytes_1.arrayify)(key);\n        var derivedKey = key.slice(0, 16);\n        var macPrefix = key.slice(16, 32);\n        var mnemonicKey = key.slice(32, 64);\n        var counter = new aes_js_1.default.Counter(iv);\n        var aesCtr = new aes_js_1.default.ModeOfOperation.ctr(derivedKey, counter);\n        var ciphertext = (0, bytes_1.arrayify)(aesCtr.encrypt(privateKey));\n        var mac = (0, keccak256_1.keccak256)((0, bytes_1.concat)([macPrefix, ciphertext]));\n        var data = {\n          address: account.address.substring(2).toLowerCase(),\n          id: (0, utils_1.uuidV4)(uuidRandom),\n          version: 3,\n          Crypto: {\n            cipher: \"aes-128-ctr\",\n            cipherparams: {\n              iv: (0, bytes_1.hexlify)(iv).substring(2)\n            },\n            ciphertext: (0, bytes_1.hexlify)(ciphertext).substring(2),\n            kdf: \"scrypt\",\n            kdfparams: {\n              salt: (0, bytes_1.hexlify)(salt).substring(2),\n              n: N,\n              dklen: 32,\n              p,\n              r\n            },\n            mac: mac.substring(2)\n          }\n        };\n        if (entropy) {\n          var mnemonicIv = (0, random_1.randomBytes)(16);\n          var mnemonicCounter = new aes_js_1.default.Counter(mnemonicIv);\n          var mnemonicAesCtr = new aes_js_1.default.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter);\n          var mnemonicCiphertext = (0, bytes_1.arrayify)(mnemonicAesCtr.encrypt(entropy));\n          var now = /* @__PURE__ */ new Date();\n          var timestamp = now.getUTCFullYear() + \"-\" + (0, utils_1.zpad)(now.getUTCMonth() + 1, 2) + \"-\" + (0, utils_1.zpad)(now.getUTCDate(), 2) + \"T\" + (0, utils_1.zpad)(now.getUTCHours(), 2) + \"-\" + (0, utils_1.zpad)(now.getUTCMinutes(), 2) + \"-\" + (0, utils_1.zpad)(now.getUTCSeconds(), 2) + \".0Z\";\n          data[\"x-ethers\"] = {\n            client,\n            gethFilename: \"UTC--\" + timestamp + \"--\" + data.address,\n            mnemonicCounter: (0, bytes_1.hexlify)(mnemonicIv).substring(2),\n            mnemonicCiphertext: (0, bytes_1.hexlify)(mnemonicCiphertext).substring(2),\n            path,\n            locale,\n            version: \"0.1\"\n          };\n        }\n        return JSON.stringify(data);\n      });\n    }\n    exports2.encrypt = encrypt;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/index.js\nvar require_lib23 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decryptJsonWalletSync = exports2.decryptJsonWallet = exports2.getJsonWalletAddress = exports2.isKeystoreWallet = exports2.isCrowdsaleWallet = exports2.encryptKeystore = exports2.decryptKeystoreSync = exports2.decryptKeystore = exports2.decryptCrowdsale = void 0;\n    var crowdsale_1 = require_crowdsale();\n    Object.defineProperty(exports2, \"decryptCrowdsale\", { enumerable: true, get: function() {\n      return crowdsale_1.decrypt;\n    } });\n    var inspect_1 = require_inspect();\n    Object.defineProperty(exports2, \"getJsonWalletAddress\", { enumerable: true, get: function() {\n      return inspect_1.getJsonWalletAddress;\n    } });\n    Object.defineProperty(exports2, \"isCrowdsaleWallet\", { enumerable: true, get: function() {\n      return inspect_1.isCrowdsaleWallet;\n    } });\n    Object.defineProperty(exports2, \"isKeystoreWallet\", { enumerable: true, get: function() {\n      return inspect_1.isKeystoreWallet;\n    } });\n    var keystore_1 = require_keystore();\n    Object.defineProperty(exports2, \"decryptKeystore\", { enumerable: true, get: function() {\n      return keystore_1.decrypt;\n    } });\n    Object.defineProperty(exports2, \"decryptKeystoreSync\", { enumerable: true, get: function() {\n      return keystore_1.decryptSync;\n    } });\n    Object.defineProperty(exports2, \"encryptKeystore\", { enumerable: true, get: function() {\n      return keystore_1.encrypt;\n    } });\n    function decryptJsonWallet(json, password, progressCallback) {\n      if ((0, inspect_1.isCrowdsaleWallet)(json)) {\n        if (progressCallback) {\n          progressCallback(0);\n        }\n        var account = (0, crowdsale_1.decrypt)(json, password);\n        if (progressCallback) {\n          progressCallback(1);\n        }\n        return Promise.resolve(account);\n      }\n      if ((0, inspect_1.isKeystoreWallet)(json)) {\n        return (0, keystore_1.decrypt)(json, password, progressCallback);\n      }\n      return Promise.reject(new Error(\"invalid JSON wallet\"));\n    }\n    exports2.decryptJsonWallet = decryptJsonWallet;\n    function decryptJsonWalletSync(json, password) {\n      if ((0, inspect_1.isCrowdsaleWallet)(json)) {\n        return (0, crowdsale_1.decrypt)(json, password);\n      }\n      if ((0, inspect_1.isKeystoreWallet)(json)) {\n        return (0, keystore_1.decryptSync)(json, password);\n      }\n      throw new Error(\"invalid JSON wallet\");\n    }\n    exports2.decryptJsonWalletSync = decryptJsonWalletSync;\n  }\n});\n\n// node_modules/@ethersproject/wallet/lib/_version.js\nvar require_version19 = __commonJS({\n  \"node_modules/@ethersproject/wallet/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"wallet/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/wallet/lib/index.js\nvar require_lib24 = __commonJS({\n  \"node_modules/@ethersproject/wallet/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.verifyTypedData = exports2.verifyMessage = exports2.Wallet = void 0;\n    var address_1 = require_lib7();\n    var abstract_provider_1 = require_lib12();\n    var abstract_signer_1 = require_lib13();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var hdnode_1 = require_lib21();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var random_1 = require_lib22();\n    var signing_key_1 = require_lib14();\n    var json_wallets_1 = require_lib23();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version19();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isAccount(value) {\n      return value != null && (0, bytes_1.isHexString)(value.privateKey, 32) && value.address != null;\n    }\n    function hasMnemonic(value) {\n      var mnemonic = value.mnemonic;\n      return mnemonic && mnemonic.phrase;\n    }\n    var Wallet = (\n      /** @class */\n      function(_super) {\n        __extends(Wallet2, _super);\n        function Wallet2(privateKey, provider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Wallet2);\n          _this = _super.call(this) || this;\n          if (isAccount(privateKey)) {\n            var signingKey_1 = new signing_key_1.SigningKey(privateKey.privateKey);\n            (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n              return signingKey_1;\n            });\n            (0, properties_1.defineReadOnly)(_this, \"address\", (0, transactions_1.computeAddress)(_this.publicKey));\n            if (_this.address !== (0, address_1.getAddress)(privateKey.address)) {\n              logger.throwArgumentError(\"privateKey/address mismatch\", \"privateKey\", \"[REDACTED]\");\n            }\n            if (hasMnemonic(privateKey)) {\n              var srcMnemonic_1 = privateKey.mnemonic;\n              (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n                return {\n                  phrase: srcMnemonic_1.phrase,\n                  path: srcMnemonic_1.path || hdnode_1.defaultPath,\n                  locale: srcMnemonic_1.locale || \"en\"\n                };\n              });\n              var mnemonic = _this.mnemonic;\n              var node = hdnode_1.HDNode.fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path);\n              if ((0, transactions_1.computeAddress)(node.privateKey) !== _this.address) {\n                logger.throwArgumentError(\"mnemonic/address mismatch\", \"privateKey\", \"[REDACTED]\");\n              }\n            } else {\n              (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n                return null;\n              });\n            }\n          } else {\n            if (signing_key_1.SigningKey.isSigningKey(privateKey)) {\n              if (privateKey.curve !== \"secp256k1\") {\n                logger.throwArgumentError(\"unsupported curve; must be secp256k1\", \"privateKey\", \"[REDACTED]\");\n              }\n              (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n                return privateKey;\n              });\n            } else {\n              if (typeof privateKey === \"string\") {\n                if (privateKey.match(/^[0-9a-f]*$/i) && privateKey.length === 64) {\n                  privateKey = \"0x\" + privateKey;\n                }\n              }\n              var signingKey_2 = new signing_key_1.SigningKey(privateKey);\n              (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n                return signingKey_2;\n              });\n            }\n            (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n              return null;\n            });\n            (0, properties_1.defineReadOnly)(_this, \"address\", (0, transactions_1.computeAddress)(_this.publicKey));\n          }\n          if (provider && !abstract_provider_1.Provider.isProvider(provider)) {\n            logger.throwArgumentError(\"invalid provider\", \"provider\", provider);\n          }\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider || null);\n          return _this;\n        }\n        Object.defineProperty(Wallet2.prototype, \"mnemonic\", {\n          get: function() {\n            return this._mnemonic();\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Wallet2.prototype, \"privateKey\", {\n          get: function() {\n            return this._signingKey().privateKey;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Wallet2.prototype, \"publicKey\", {\n          get: function() {\n            return this._signingKey().publicKey;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Wallet2.prototype.getAddress = function() {\n          return Promise.resolve(this.address);\n        };\n        Wallet2.prototype.connect = function(provider) {\n          return new Wallet2(this, provider);\n        };\n        Wallet2.prototype.signTransaction = function(transaction) {\n          var _this = this;\n          return (0, properties_1.resolveProperties)(transaction).then(function(tx) {\n            if (tx.from != null) {\n              if ((0, address_1.getAddress)(tx.from) !== _this.address) {\n                logger.throwArgumentError(\"transaction from address mismatch\", \"transaction.from\", transaction.from);\n              }\n              delete tx.from;\n            }\n            var signature = _this._signingKey().signDigest((0, keccak256_1.keccak256)((0, transactions_1.serialize)(tx)));\n            return (0, transactions_1.serialize)(tx, signature);\n          });\n        };\n        Wallet2.prototype.signMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, (0, bytes_1.joinSignature)(this._signingKey().signDigest((0, hash_1.hashMessage)(message)))];\n            });\n          });\n        };\n        Wallet2.prototype._signTypedData = function(domain, types, value) {\n          return __awaiter(this, void 0, void 0, function() {\n            var populated;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, hash_1._TypedDataEncoder.resolveNames(domain, types, value, function(name2) {\n                    if (_this.provider == null) {\n                      logger.throwError(\"cannot resolve ENS names without a provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                        operation: \"resolveName\",\n                        value: name2\n                      });\n                    }\n                    return _this.provider.resolveName(name2);\n                  })];\n                case 1:\n                  populated = _a.sent();\n                  return [2, (0, bytes_1.joinSignature)(this._signingKey().signDigest(hash_1._TypedDataEncoder.hash(populated.domain, types, populated.value)))];\n              }\n            });\n          });\n        };\n        Wallet2.prototype.encrypt = function(password, options, progressCallback) {\n          if (typeof options === \"function\" && !progressCallback) {\n            progressCallback = options;\n            options = {};\n          }\n          if (progressCallback && typeof progressCallback !== \"function\") {\n            throw new Error(\"invalid callback\");\n          }\n          if (!options) {\n            options = {};\n          }\n          return (0, json_wallets_1.encryptKeystore)(this, password, options, progressCallback);\n        };\n        Wallet2.createRandom = function(options) {\n          var entropy = (0, random_1.randomBytes)(16);\n          if (!options) {\n            options = {};\n          }\n          if (options.extraEntropy) {\n            entropy = (0, bytes_1.arrayify)((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.concat)([entropy, options.extraEntropy])), 0, 16));\n          }\n          var mnemonic = (0, hdnode_1.entropyToMnemonic)(entropy, options.locale);\n          return Wallet2.fromMnemonic(mnemonic, options.path, options.locale);\n        };\n        Wallet2.fromEncryptedJson = function(json, password, progressCallback) {\n          return (0, json_wallets_1.decryptJsonWallet)(json, password, progressCallback).then(function(account) {\n            return new Wallet2(account);\n          });\n        };\n        Wallet2.fromEncryptedJsonSync = function(json, password) {\n          return new Wallet2((0, json_wallets_1.decryptJsonWalletSync)(json, password));\n        };\n        Wallet2.fromMnemonic = function(mnemonic, path, wordlist) {\n          if (!path) {\n            path = hdnode_1.defaultPath;\n          }\n          return new Wallet2(hdnode_1.HDNode.fromMnemonic(mnemonic, null, wordlist).derivePath(path));\n        };\n        return Wallet2;\n      }(abstract_signer_1.Signer)\n    );\n    exports2.Wallet = Wallet;\n    function verifyMessage(message, signature) {\n      return (0, transactions_1.recoverAddress)((0, hash_1.hashMessage)(message), signature);\n    }\n    exports2.verifyMessage = verifyMessage;\n    function verifyTypedData(domain, types, value, signature) {\n      return (0, transactions_1.recoverAddress)(hash_1._TypedDataEncoder.hash(domain, types, value), signature);\n    }\n    exports2.verifyTypedData = verifyTypedData;\n  }\n});\n\n// node_modules/@ethersproject/networks/lib/_version.js\nvar require_version20 = __commonJS({\n  \"node_modules/@ethersproject/networks/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"networks/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/networks/lib/index.js\nvar require_lib25 = __commonJS({\n  \"node_modules/@ethersproject/networks/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getNetwork = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version20();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isRenetworkable(value) {\n      return value && typeof value.renetwork === \"function\";\n    }\n    function ethDefaultProvider(network) {\n      var func = function(providers, options) {\n        if (options == null) {\n          options = {};\n        }\n        var providerList = [];\n        if (providers.InfuraProvider) {\n          try {\n            providerList.push(new providers.InfuraProvider(network, options.infura));\n          } catch (error) {\n          }\n        }\n        if (providers.EtherscanProvider) {\n          try {\n            providerList.push(new providers.EtherscanProvider(network, options.etherscan));\n          } catch (error) {\n          }\n        }\n        if (providers.AlchemyProvider) {\n          try {\n            providerList.push(new providers.AlchemyProvider(network, options.alchemy));\n          } catch (error) {\n          }\n        }\n        if (providers.PocketProvider) {\n          var skip = [\"goerli\", \"ropsten\", \"rinkeby\"];\n          try {\n            var provider = new providers.PocketProvider(network);\n            if (provider.network && skip.indexOf(provider.network.name) === -1) {\n              providerList.push(provider);\n            }\n          } catch (error) {\n          }\n        }\n        if (providers.CloudflareProvider) {\n          try {\n            providerList.push(new providers.CloudflareProvider(network));\n          } catch (error) {\n          }\n        }\n        if (providerList.length === 0) {\n          return null;\n        }\n        if (providers.FallbackProvider) {\n          var quorum = 1;\n          if (options.quorum != null) {\n            quorum = options.quorum;\n          } else if (network === \"homestead\") {\n            quorum = 2;\n          }\n          return new providers.FallbackProvider(providerList, quorum);\n        }\n        return providerList[0];\n      };\n      func.renetwork = function(network2) {\n        return ethDefaultProvider(network2);\n      };\n      return func;\n    }\n    function etcDefaultProvider(url, network) {\n      var func = function(providers, options) {\n        if (providers.JsonRpcProvider) {\n          return new providers.JsonRpcProvider(url, network);\n        }\n        return null;\n      };\n      func.renetwork = function(network2) {\n        return etcDefaultProvider(url, network2);\n      };\n      return func;\n    }\n    var homestead = {\n      chainId: 1,\n      ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n      name: \"homestead\",\n      _defaultProvider: ethDefaultProvider(\"homestead\")\n    };\n    var ropsten = {\n      chainId: 3,\n      ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n      name: \"ropsten\",\n      _defaultProvider: ethDefaultProvider(\"ropsten\")\n    };\n    var classicMordor = {\n      chainId: 63,\n      name: \"classicMordor\",\n      _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/mordor\", \"classicMordor\")\n    };\n    var networks = {\n      unspecified: { chainId: 0, name: \"unspecified\" },\n      homestead,\n      mainnet: homestead,\n      morden: { chainId: 2, name: \"morden\" },\n      ropsten,\n      testnet: ropsten,\n      rinkeby: {\n        chainId: 4,\n        ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n        name: \"rinkeby\",\n        _defaultProvider: ethDefaultProvider(\"rinkeby\")\n      },\n      kovan: {\n        chainId: 42,\n        name: \"kovan\",\n        _defaultProvider: ethDefaultProvider(\"kovan\")\n      },\n      goerli: {\n        chainId: 5,\n        ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n        name: \"goerli\",\n        _defaultProvider: ethDefaultProvider(\"goerli\")\n      },\n      // ETC (See: #351)\n      classic: {\n        chainId: 61,\n        name: \"classic\",\n        _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/etc\", \"classic\")\n      },\n      classicMorden: { chainId: 62, name: \"classicMorden\" },\n      classicMordor,\n      classicTestnet: classicMordor,\n      classicKotti: {\n        chainId: 6,\n        name: \"classicKotti\",\n        _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/kotti\", \"classicKotti\")\n      },\n      xdai: { chainId: 100, name: \"xdai\" },\n      matic: { chainId: 137, name: \"matic\" },\n      maticmum: { chainId: 80001, name: \"maticmum\" },\n      optimism: { chainId: 10, name: \"optimism\" },\n      \"optimism-kovan\": { chainId: 69, name: \"optimism-kovan\" },\n      \"optimism-goerli\": { chainId: 420, name: \"optimism-goerli\" },\n      arbitrum: { chainId: 42161, name: \"arbitrum\" },\n      \"arbitrum-rinkeby\": { chainId: 421611, name: \"arbitrum-rinkeby\" },\n      bnb: { chainId: 56, name: \"bnb\" },\n      bnbt: { chainId: 97, name: \"bnbt\" }\n    };\n    function getNetwork(network) {\n      if (network == null) {\n        return null;\n      }\n      if (typeof network === \"number\") {\n        for (var name_1 in networks) {\n          var standard_1 = networks[name_1];\n          if (standard_1.chainId === network) {\n            return {\n              name: standard_1.name,\n              chainId: standard_1.chainId,\n              ensAddress: standard_1.ensAddress || null,\n              _defaultProvider: standard_1._defaultProvider || null\n            };\n          }\n        }\n        return {\n          chainId: network,\n          name: \"unknown\"\n        };\n      }\n      if (typeof network === \"string\") {\n        var standard_2 = networks[network];\n        if (standard_2 == null) {\n          return null;\n        }\n        return {\n          name: standard_2.name,\n          chainId: standard_2.chainId,\n          ensAddress: standard_2.ensAddress,\n          _defaultProvider: standard_2._defaultProvider || null\n        };\n      }\n      var standard = networks[network.name];\n      if (!standard) {\n        if (typeof network.chainId !== \"number\") {\n          logger.throwArgumentError(\"invalid network chainId\", \"network\", network);\n        }\n        return network;\n      }\n      if (network.chainId !== 0 && network.chainId !== standard.chainId) {\n        logger.throwArgumentError(\"network chainId mismatch\", \"network\", network);\n      }\n      var defaultProvider = network._defaultProvider || null;\n      if (defaultProvider == null && standard._defaultProvider) {\n        if (isRenetworkable(standard._defaultProvider)) {\n          defaultProvider = standard._defaultProvider.renetwork(network);\n        } else {\n          defaultProvider = standard._defaultProvider;\n        }\n      }\n      return {\n        name: network.name,\n        chainId: standard.chainId,\n        ensAddress: network.ensAddress || standard.ensAddress || null,\n        _defaultProvider: defaultProvider\n      };\n    }\n    exports2.getNetwork = getNetwork;\n  }\n});\n\n// node_modules/@ethersproject/base64/lib/base64.js\nvar require_base64 = __commonJS({\n  \"node_modules/@ethersproject/base64/lib/base64.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encode = exports2.decode = void 0;\n    var bytes_1 = require_lib2();\n    function decode(textData) {\n      return (0, bytes_1.arrayify)(new Uint8Array(Buffer.from(textData, \"base64\")));\n    }\n    exports2.decode = decode;\n    function encode(data) {\n      return Buffer.from((0, bytes_1.arrayify)(data)).toString(\"base64\");\n    }\n    exports2.encode = encode;\n  }\n});\n\n// node_modules/@ethersproject/base64/lib/index.js\nvar require_lib26 = __commonJS({\n  \"node_modules/@ethersproject/base64/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encode = exports2.decode = void 0;\n    var base64_1 = require_base64();\n    Object.defineProperty(exports2, \"decode\", { enumerable: true, get: function() {\n      return base64_1.decode;\n    } });\n    Object.defineProperty(exports2, \"encode\", { enumerable: true, get: function() {\n      return base64_1.encode;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/web/lib/_version.js\nvar require_version21 = __commonJS({\n  \"node_modules/@ethersproject/web/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"web/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/web/lib/geturl.js\nvar require_geturl = __commonJS({\n  \"node_modules/@ethersproject/web/lib/geturl.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getUrl = void 0;\n    var http_1 = __importDefault(require(\"http\"));\n    var https_1 = __importDefault(require(\"https\"));\n    var zlib_1 = require(\"zlib\");\n    var url_1 = require(\"url\");\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version21();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getResponse(request) {\n      return new Promise(function(resolve, reject) {\n        request.once(\"response\", function(resp) {\n          var response = {\n            statusCode: resp.statusCode,\n            statusMessage: resp.statusMessage,\n            headers: Object.keys(resp.headers).reduce(function(accum, name2) {\n              var value = resp.headers[name2];\n              if (Array.isArray(value)) {\n                value = value.join(\", \");\n              }\n              accum[name2] = value;\n              return accum;\n            }, {}),\n            body: null\n          };\n          resp.on(\"data\", function(chunk) {\n            if (response.body == null) {\n              response.body = new Uint8Array(0);\n            }\n            response.body = (0, bytes_1.concat)([response.body, chunk]);\n          });\n          resp.on(\"end\", function() {\n            if (response.headers[\"content-encoding\"] === \"gzip\") {\n              response.body = (0, bytes_1.arrayify)((0, zlib_1.gunzipSync)(response.body));\n            }\n            resolve(response);\n          });\n          resp.on(\"error\", function(error) {\n            error.response = response;\n            reject(error);\n          });\n        });\n        request.on(\"error\", function(error) {\n          reject(error);\n        });\n      });\n    }\n    function nonnull(value) {\n      if (value == null) {\n        return \"\";\n      }\n      return value;\n    }\n    function getUrl(href, options) {\n      return __awaiter(this, void 0, void 0, function() {\n        var url, request, req, response;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              if (options == null) {\n                options = {};\n              }\n              url = (0, url_1.parse)(href);\n              request = {\n                protocol: nonnull(url.protocol),\n                hostname: nonnull(url.hostname),\n                port: nonnull(url.port),\n                path: nonnull(url.pathname) + nonnull(url.search),\n                method: options.method || \"GET\",\n                headers: (0, properties_1.shallowCopy)(options.headers || {})\n              };\n              if (options.allowGzip) {\n                request.headers[\"accept-encoding\"] = \"gzip\";\n              }\n              req = null;\n              switch (nonnull(url.protocol)) {\n                case \"http:\":\n                  req = http_1.default.request(request);\n                  break;\n                case \"https:\":\n                  req = https_1.default.request(request);\n                  break;\n                default:\n                  logger.throwError(\"unsupported protocol \" + url.protocol, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    protocol: url.protocol,\n                    operation: \"request\"\n                  });\n              }\n              if (options.body) {\n                req.write(Buffer.from(options.body));\n              }\n              req.end();\n              return [4, getResponse(req)];\n            case 1:\n              response = _a.sent();\n              return [2, response];\n          }\n        });\n      });\n    }\n    exports2.getUrl = getUrl;\n  }\n});\n\n// node_modules/@ethersproject/web/lib/index.js\nvar require_lib27 = __commonJS({\n  \"node_modules/@ethersproject/web/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.poll = exports2.fetchJson = exports2._fetchData = void 0;\n    var base64_1 = require_lib26();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var strings_1 = require_lib9();\n    var logger_1 = require_lib();\n    var _version_1 = require_version21();\n    var logger = new logger_1.Logger(_version_1.version);\n    var geturl_1 = require_geturl();\n    function staller(duration) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, duration);\n      });\n    }\n    function bodyify(value, type) {\n      if (value == null) {\n        return null;\n      }\n      if (typeof value === \"string\") {\n        return value;\n      }\n      if ((0, bytes_1.isBytesLike)(value)) {\n        if (type && (type.split(\"/\")[0] === \"text\" || type.split(\";\")[0].trim() === \"application/json\")) {\n          try {\n            return (0, strings_1.toUtf8String)(value);\n          } catch (error) {\n          }\n          ;\n        }\n        return (0, bytes_1.hexlify)(value);\n      }\n      return value;\n    }\n    function _fetchData(connection, body, processFunc) {\n      var attemptLimit = typeof connection === \"object\" && connection.throttleLimit != null ? connection.throttleLimit : 12;\n      logger.assertArgument(attemptLimit > 0 && attemptLimit % 1 === 0, \"invalid connection throttle limit\", \"connection.throttleLimit\", attemptLimit);\n      var throttleCallback = typeof connection === \"object\" ? connection.throttleCallback : null;\n      var throttleSlotInterval = typeof connection === \"object\" && typeof connection.throttleSlotInterval === \"number\" ? connection.throttleSlotInterval : 100;\n      logger.assertArgument(throttleSlotInterval > 0 && throttleSlotInterval % 1 === 0, \"invalid connection throttle slot interval\", \"connection.throttleSlotInterval\", throttleSlotInterval);\n      var headers = {};\n      var url = null;\n      var options = {\n        method: \"GET\"\n      };\n      var allow304 = false;\n      var timeout = 2 * 60 * 1e3;\n      if (typeof connection === \"string\") {\n        url = connection;\n      } else if (typeof connection === \"object\") {\n        if (connection == null || connection.url == null) {\n          logger.throwArgumentError(\"missing URL\", \"connection.url\", connection);\n        }\n        url = connection.url;\n        if (typeof connection.timeout === \"number\" && connection.timeout > 0) {\n          timeout = connection.timeout;\n        }\n        if (connection.headers) {\n          for (var key in connection.headers) {\n            headers[key.toLowerCase()] = { key, value: String(connection.headers[key]) };\n            if ([\"if-none-match\", \"if-modified-since\"].indexOf(key.toLowerCase()) >= 0) {\n              allow304 = true;\n            }\n          }\n        }\n        options.allowGzip = !!connection.allowGzip;\n        if (connection.user != null && connection.password != null) {\n          if (url.substring(0, 6) !== \"https:\" && connection.allowInsecureAuthentication !== true) {\n            logger.throwError(\"basic authentication requires a secure https url\", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: \"url\", url, user: connection.user, password: \"[REDACTED]\" });\n          }\n          var authorization = connection.user + \":\" + connection.password;\n          headers[\"authorization\"] = {\n            key: \"Authorization\",\n            value: \"Basic \" + (0, base64_1.encode)((0, strings_1.toUtf8Bytes)(authorization))\n          };\n        }\n      }\n      var reData = new RegExp(\"^data:([a-z0-9-]+/[a-z0-9-]+);base64,(.*)$\", \"i\");\n      var dataMatch = url ? url.match(reData) : null;\n      if (dataMatch) {\n        try {\n          var response = {\n            statusCode: 200,\n            statusMessage: \"OK\",\n            headers: { \"content-type\": dataMatch[1] },\n            body: (0, base64_1.decode)(dataMatch[2])\n          };\n          var result = response.body;\n          if (processFunc) {\n            result = processFunc(response.body, response);\n          }\n          return Promise.resolve(result);\n        } catch (error) {\n          logger.throwError(\"processing response error\", logger_1.Logger.errors.SERVER_ERROR, {\n            body: bodyify(dataMatch[1], dataMatch[2]),\n            error,\n            requestBody: null,\n            requestMethod: \"GET\",\n            url\n          });\n        }\n      }\n      if (body) {\n        options.method = \"POST\";\n        options.body = body;\n        if (headers[\"content-type\"] == null) {\n          headers[\"content-type\"] = { key: \"Content-Type\", value: \"application/octet-stream\" };\n        }\n        if (headers[\"content-length\"] == null) {\n          headers[\"content-length\"] = { key: \"Content-Length\", value: String(body.length) };\n        }\n      }\n      var flatHeaders = {};\n      Object.keys(headers).forEach(function(key2) {\n        var header = headers[key2];\n        flatHeaders[header.key] = header.value;\n      });\n      options.headers = flatHeaders;\n      var runningTimeout = function() {\n        var timer = null;\n        var promise = new Promise(function(resolve, reject) {\n          if (timeout) {\n            timer = setTimeout(function() {\n              if (timer == null) {\n                return;\n              }\n              timer = null;\n              reject(logger.makeError(\"timeout\", logger_1.Logger.errors.TIMEOUT, {\n                requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                requestMethod: options.method,\n                timeout,\n                url\n              }));\n            }, timeout);\n          }\n        });\n        var cancel = function() {\n          if (timer == null) {\n            return;\n          }\n          clearTimeout(timer);\n          timer = null;\n        };\n        return { promise, cancel };\n      }();\n      var runningFetch = function() {\n        return __awaiter(this, void 0, void 0, function() {\n          var attempt, response2, location_1, tryAgain, stall, retryAfter, error_1, body_1, result2, error_2, tryAgain, timeout_1;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                attempt = 0;\n                _a.label = 1;\n              case 1:\n                if (!(attempt < attemptLimit)) return [3, 20];\n                response2 = null;\n                _a.label = 2;\n              case 2:\n                _a.trys.push([2, 9, , 10]);\n                return [4, (0, geturl_1.getUrl)(url, options)];\n              case 3:\n                response2 = _a.sent();\n                if (!(attempt < attemptLimit)) return [3, 8];\n                if (!(response2.statusCode === 301 || response2.statusCode === 302)) return [3, 4];\n                location_1 = response2.headers.location || \"\";\n                if (options.method === \"GET\" && location_1.match(/^https:/)) {\n                  url = response2.headers.location;\n                  return [3, 19];\n                }\n                return [3, 8];\n              case 4:\n                if (!(response2.statusCode === 429)) return [3, 8];\n                tryAgain = true;\n                if (!throttleCallback) return [3, 6];\n                return [4, throttleCallback(attempt, url)];\n              case 5:\n                tryAgain = _a.sent();\n                _a.label = 6;\n              case 6:\n                if (!tryAgain) return [3, 8];\n                stall = 0;\n                retryAfter = response2.headers[\"retry-after\"];\n                if (typeof retryAfter === \"string\" && retryAfter.match(/^[1-9][0-9]*$/)) {\n                  stall = parseInt(retryAfter) * 1e3;\n                } else {\n                  stall = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n                }\n                return [4, staller(stall)];\n              case 7:\n                _a.sent();\n                return [3, 19];\n              case 8:\n                return [3, 10];\n              case 9:\n                error_1 = _a.sent();\n                response2 = error_1.response;\n                if (response2 == null) {\n                  runningTimeout.cancel();\n                  logger.throwError(\"missing response\", logger_1.Logger.errors.SERVER_ERROR, {\n                    requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                    requestMethod: options.method,\n                    serverError: error_1,\n                    url\n                  });\n                }\n                return [3, 10];\n              case 10:\n                body_1 = response2.body;\n                if (allow304 && response2.statusCode === 304) {\n                  body_1 = null;\n                } else if (response2.statusCode < 200 || response2.statusCode >= 300) {\n                  runningTimeout.cancel();\n                  logger.throwError(\"bad response\", logger_1.Logger.errors.SERVER_ERROR, {\n                    status: response2.statusCode,\n                    headers: response2.headers,\n                    body: bodyify(body_1, response2.headers ? response2.headers[\"content-type\"] : null),\n                    requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                    requestMethod: options.method,\n                    url\n                  });\n                }\n                if (!processFunc) return [3, 18];\n                _a.label = 11;\n              case 11:\n                _a.trys.push([11, 13, , 18]);\n                return [4, processFunc(body_1, response2)];\n              case 12:\n                result2 = _a.sent();\n                runningTimeout.cancel();\n                return [2, result2];\n              case 13:\n                error_2 = _a.sent();\n                if (!(error_2.throttleRetry && attempt < attemptLimit)) return [3, 17];\n                tryAgain = true;\n                if (!throttleCallback) return [3, 15];\n                return [4, throttleCallback(attempt, url)];\n              case 14:\n                tryAgain = _a.sent();\n                _a.label = 15;\n              case 15:\n                if (!tryAgain) return [3, 17];\n                timeout_1 = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n                return [4, staller(timeout_1)];\n              case 16:\n                _a.sent();\n                return [3, 19];\n              case 17:\n                runningTimeout.cancel();\n                logger.throwError(\"processing response error\", logger_1.Logger.errors.SERVER_ERROR, {\n                  body: bodyify(body_1, response2.headers ? response2.headers[\"content-type\"] : null),\n                  error: error_2,\n                  requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                  requestMethod: options.method,\n                  url\n                });\n                return [3, 18];\n              case 18:\n                runningTimeout.cancel();\n                return [2, body_1];\n              case 19:\n                attempt++;\n                return [3, 1];\n              case 20:\n                return [2, logger.throwError(\"failed response\", logger_1.Logger.errors.SERVER_ERROR, {\n                  requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                  requestMethod: options.method,\n                  url\n                })];\n            }\n          });\n        });\n      }();\n      return Promise.race([runningTimeout.promise, runningFetch]);\n    }\n    exports2._fetchData = _fetchData;\n    function fetchJson(connection, json, processFunc) {\n      var processJsonFunc = function(value, response) {\n        var result = null;\n        if (value != null) {\n          try {\n            result = JSON.parse((0, strings_1.toUtf8String)(value));\n          } catch (error) {\n            logger.throwError(\"invalid JSON\", logger_1.Logger.errors.SERVER_ERROR, {\n              body: value,\n              error\n            });\n          }\n        }\n        if (processFunc) {\n          result = processFunc(result, response);\n        }\n        return result;\n      };\n      var body = null;\n      if (json != null) {\n        body = (0, strings_1.toUtf8Bytes)(json);\n        var updated = typeof connection === \"string\" ? { url: connection } : (0, properties_1.shallowCopy)(connection);\n        if (updated.headers) {\n          var hasContentType = Object.keys(updated.headers).filter(function(k) {\n            return k.toLowerCase() === \"content-type\";\n          }).length !== 0;\n          if (!hasContentType) {\n            updated.headers = (0, properties_1.shallowCopy)(updated.headers);\n            updated.headers[\"content-type\"] = \"application/json\";\n          }\n        } else {\n          updated.headers = { \"content-type\": \"application/json\" };\n        }\n        connection = updated;\n      }\n      return _fetchData(connection, body, processJsonFunc);\n    }\n    exports2.fetchJson = fetchJson;\n    function poll(func, options) {\n      if (!options) {\n        options = {};\n      }\n      options = (0, properties_1.shallowCopy)(options);\n      if (options.floor == null) {\n        options.floor = 0;\n      }\n      if (options.ceiling == null) {\n        options.ceiling = 1e4;\n      }\n      if (options.interval == null) {\n        options.interval = 250;\n      }\n      return new Promise(function(resolve, reject) {\n        var timer = null;\n        var done = false;\n        var cancel = function() {\n          if (done) {\n            return false;\n          }\n          done = true;\n          if (timer) {\n            clearTimeout(timer);\n          }\n          return true;\n        };\n        if (options.timeout) {\n          timer = setTimeout(function() {\n            if (cancel()) {\n              reject(new Error(\"timeout\"));\n            }\n          }, options.timeout);\n        }\n        var retryLimit = options.retryLimit;\n        var attempt = 0;\n        function check() {\n          return func().then(function(result) {\n            if (result !== void 0) {\n              if (cancel()) {\n                resolve(result);\n              }\n            } else if (options.oncePoll) {\n              options.oncePoll.once(\"poll\", check);\n            } else if (options.onceBlock) {\n              options.onceBlock.once(\"block\", check);\n            } else if (!done) {\n              attempt++;\n              if (attempt > retryLimit) {\n                if (cancel()) {\n                  reject(new Error(\"retry limit reached\"));\n                }\n                return;\n              }\n              var timeout = options.interval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n              if (timeout < options.floor) {\n                timeout = options.floor;\n              }\n              if (timeout > options.ceiling) {\n                timeout = options.ceiling;\n              }\n              setTimeout(check, timeout);\n            }\n            return null;\n          }, function(error) {\n            if (cancel()) {\n              reject(error);\n            }\n          });\n        }\n        check();\n      });\n    }\n    exports2.poll = poll;\n  }\n});\n\n// node_modules/bech32/index.js\nvar require_bech32 = __commonJS({\n  \"node_modules/bech32/index.js\"(exports2, module2) {\n    \"use strict\";\n    var ALPHABET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\n    var ALPHABET_MAP = {};\n    for (z = 0; z < ALPHABET.length; z++) {\n      x = ALPHABET.charAt(z);\n      if (ALPHABET_MAP[x] !== void 0) throw new TypeError(x + \" is ambiguous\");\n      ALPHABET_MAP[x] = z;\n    }\n    var x;\n    var z;\n    function polymodStep(pre) {\n      var b = pre >> 25;\n      return (pre & 33554431) << 5 ^ -(b >> 0 & 1) & 996825010 ^ -(b >> 1 & 1) & 642813549 ^ -(b >> 2 & 1) & 513874426 ^ -(b >> 3 & 1) & 1027748829 ^ -(b >> 4 & 1) & 705979059;\n    }\n    function prefixChk(prefix) {\n      var chk = 1;\n      for (var i = 0; i < prefix.length; ++i) {\n        var c = prefix.charCodeAt(i);\n        if (c < 33 || c > 126) return \"Invalid prefix (\" + prefix + \")\";\n        chk = polymodStep(chk) ^ c >> 5;\n      }\n      chk = polymodStep(chk);\n      for (i = 0; i < prefix.length; ++i) {\n        var v = prefix.charCodeAt(i);\n        chk = polymodStep(chk) ^ v & 31;\n      }\n      return chk;\n    }\n    function encode(prefix, words, LIMIT) {\n      LIMIT = LIMIT || 90;\n      if (prefix.length + 7 + words.length > LIMIT) throw new TypeError(\"Exceeds length limit\");\n      prefix = prefix.toLowerCase();\n      var chk = prefixChk(prefix);\n      if (typeof chk === \"string\") throw new Error(chk);\n      var result = prefix + \"1\";\n      for (var i = 0; i < words.length; ++i) {\n        var x2 = words[i];\n        if (x2 >> 5 !== 0) throw new Error(\"Non 5-bit word\");\n        chk = polymodStep(chk) ^ x2;\n        result += ALPHABET.charAt(x2);\n      }\n      for (i = 0; i < 6; ++i) {\n        chk = polymodStep(chk);\n      }\n      chk ^= 1;\n      for (i = 0; i < 6; ++i) {\n        var v = chk >> (5 - i) * 5 & 31;\n        result += ALPHABET.charAt(v);\n      }\n      return result;\n    }\n    function __decode(str, LIMIT) {\n      LIMIT = LIMIT || 90;\n      if (str.length < 8) return str + \" too short\";\n      if (str.length > LIMIT) return \"Exceeds length limit\";\n      var lowered = str.toLowerCase();\n      var uppered = str.toUpperCase();\n      if (str !== lowered && str !== uppered) return \"Mixed-case string \" + str;\n      str = lowered;\n      var split = str.lastIndexOf(\"1\");\n      if (split === -1) return \"No separator character for \" + str;\n      if (split === 0) return \"Missing prefix for \" + str;\n      var prefix = str.slice(0, split);\n      var wordChars = str.slice(split + 1);\n      if (wordChars.length < 6) return \"Data too short\";\n      var chk = prefixChk(prefix);\n      if (typeof chk === \"string\") return chk;\n      var words = [];\n      for (var i = 0; i < wordChars.length; ++i) {\n        var c = wordChars.charAt(i);\n        var v = ALPHABET_MAP[c];\n        if (v === void 0) return \"Unknown character \" + c;\n        chk = polymodStep(chk) ^ v;\n        if (i + 6 >= wordChars.length) continue;\n        words.push(v);\n      }\n      if (chk !== 1) return \"Invalid checksum for \" + str;\n      return { prefix, words };\n    }\n    function decodeUnsafe() {\n      var res = __decode.apply(null, arguments);\n      if (typeof res === \"object\") return res;\n    }\n    function decode(str) {\n      var res = __decode.apply(null, arguments);\n      if (typeof res === \"object\") return res;\n      throw new Error(res);\n    }\n    function convert(data, inBits, outBits, pad) {\n      var value = 0;\n      var bits = 0;\n      var maxV = (1 << outBits) - 1;\n      var result = [];\n      for (var i = 0; i < data.length; ++i) {\n        value = value << inBits | data[i];\n        bits += inBits;\n        while (bits >= outBits) {\n          bits -= outBits;\n          result.push(value >> bits & maxV);\n        }\n      }\n      if (pad) {\n        if (bits > 0) {\n          result.push(value << outBits - bits & maxV);\n        }\n      } else {\n        if (bits >= inBits) return \"Excess padding\";\n        if (value << outBits - bits & maxV) return \"Non-zero padding\";\n      }\n      return result;\n    }\n    function toWordsUnsafe(bytes) {\n      var res = convert(bytes, 8, 5, true);\n      if (Array.isArray(res)) return res;\n    }\n    function toWords(bytes) {\n      var res = convert(bytes, 8, 5, true);\n      if (Array.isArray(res)) return res;\n      throw new Error(res);\n    }\n    function fromWordsUnsafe(words) {\n      var res = convert(words, 5, 8, false);\n      if (Array.isArray(res)) return res;\n    }\n    function fromWords(words) {\n      var res = convert(words, 5, 8, false);\n      if (Array.isArray(res)) return res;\n      throw new Error(res);\n    }\n    module2.exports = {\n      decodeUnsafe,\n      decode,\n      encode,\n      toWordsUnsafe,\n      toWords,\n      fromWordsUnsafe,\n      fromWords\n    };\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/_version.js\nvar require_version22 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"providers/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/formatter.js\nvar require_formatter = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/formatter.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.showThrottleMessage = exports2.isCommunityResource = exports2.isCommunityResourcable = exports2.Formatter = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var Formatter = (\n      /** @class */\n      function() {\n        function Formatter2() {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, Formatter2);\n          this.formats = this.getDefaultFormats();\n        }\n        Formatter2.prototype.getDefaultFormats = function() {\n          var _this = this;\n          var formats = {};\n          var address = this.address.bind(this);\n          var bigNumber = this.bigNumber.bind(this);\n          var blockTag = this.blockTag.bind(this);\n          var data = this.data.bind(this);\n          var hash = this.hash.bind(this);\n          var hex = this.hex.bind(this);\n          var number = this.number.bind(this);\n          var type = this.type.bind(this);\n          var strictData = function(v) {\n            return _this.data(v, true);\n          };\n          formats.transaction = {\n            hash,\n            type,\n            accessList: Formatter2.allowNull(this.accessList.bind(this), null),\n            blockHash: Formatter2.allowNull(hash, null),\n            blockNumber: Formatter2.allowNull(number, null),\n            transactionIndex: Formatter2.allowNull(number, null),\n            confirmations: Formatter2.allowNull(number, null),\n            from: address,\n            // either (gasPrice) or (maxPriorityFeePerGas + maxFeePerGas)\n            // must be set\n            gasPrice: Formatter2.allowNull(bigNumber),\n            maxPriorityFeePerGas: Formatter2.allowNull(bigNumber),\n            maxFeePerGas: Formatter2.allowNull(bigNumber),\n            gasLimit: bigNumber,\n            to: Formatter2.allowNull(address, null),\n            value: bigNumber,\n            nonce: number,\n            data,\n            r: Formatter2.allowNull(this.uint256),\n            s: Formatter2.allowNull(this.uint256),\n            v: Formatter2.allowNull(number),\n            creates: Formatter2.allowNull(address, null),\n            raw: Formatter2.allowNull(data)\n          };\n          formats.transactionRequest = {\n            from: Formatter2.allowNull(address),\n            nonce: Formatter2.allowNull(number),\n            gasLimit: Formatter2.allowNull(bigNumber),\n            gasPrice: Formatter2.allowNull(bigNumber),\n            maxPriorityFeePerGas: Formatter2.allowNull(bigNumber),\n            maxFeePerGas: Formatter2.allowNull(bigNumber),\n            to: Formatter2.allowNull(address),\n            value: Formatter2.allowNull(bigNumber),\n            data: Formatter2.allowNull(strictData),\n            type: Formatter2.allowNull(number),\n            accessList: Formatter2.allowNull(this.accessList.bind(this), null)\n          };\n          formats.receiptLog = {\n            transactionIndex: number,\n            blockNumber: number,\n            transactionHash: hash,\n            address,\n            topics: Formatter2.arrayOf(hash),\n            data,\n            logIndex: number,\n            blockHash: hash\n          };\n          formats.receipt = {\n            to: Formatter2.allowNull(this.address, null),\n            from: Formatter2.allowNull(this.address, null),\n            contractAddress: Formatter2.allowNull(address, null),\n            transactionIndex: number,\n            // should be allowNull(hash), but broken-EIP-658 support is handled in receipt\n            root: Formatter2.allowNull(hex),\n            gasUsed: bigNumber,\n            logsBloom: Formatter2.allowNull(data),\n            blockHash: hash,\n            transactionHash: hash,\n            logs: Formatter2.arrayOf(this.receiptLog.bind(this)),\n            blockNumber: number,\n            confirmations: Formatter2.allowNull(number, null),\n            cumulativeGasUsed: bigNumber,\n            effectiveGasPrice: Formatter2.allowNull(bigNumber),\n            status: Formatter2.allowNull(number),\n            type\n          };\n          formats.block = {\n            hash,\n            parentHash: hash,\n            number,\n            timestamp: number,\n            nonce: Formatter2.allowNull(hex),\n            difficulty: this.difficulty.bind(this),\n            gasLimit: bigNumber,\n            gasUsed: bigNumber,\n            miner: address,\n            extraData: data,\n            transactions: Formatter2.allowNull(Formatter2.arrayOf(hash)),\n            baseFeePerGas: Formatter2.allowNull(bigNumber)\n          };\n          formats.blockWithTransactions = (0, properties_1.shallowCopy)(formats.block);\n          formats.blockWithTransactions.transactions = Formatter2.allowNull(Formatter2.arrayOf(this.transactionResponse.bind(this)));\n          formats.filter = {\n            fromBlock: Formatter2.allowNull(blockTag, void 0),\n            toBlock: Formatter2.allowNull(blockTag, void 0),\n            blockHash: Formatter2.allowNull(hash, void 0),\n            address: Formatter2.allowNull(address, void 0),\n            topics: Formatter2.allowNull(this.topics.bind(this), void 0)\n          };\n          formats.filterLog = {\n            blockNumber: Formatter2.allowNull(number),\n            blockHash: Formatter2.allowNull(hash),\n            transactionIndex: number,\n            removed: Formatter2.allowNull(this.boolean.bind(this)),\n            address,\n            data: Formatter2.allowFalsish(data, \"0x\"),\n            topics: Formatter2.arrayOf(hash),\n            transactionHash: hash,\n            logIndex: number\n          };\n          return formats;\n        };\n        Formatter2.prototype.accessList = function(accessList) {\n          return (0, transactions_1.accessListify)(accessList || []);\n        };\n        Formatter2.prototype.number = function(number) {\n          if (number === \"0x\") {\n            return 0;\n          }\n          return bignumber_1.BigNumber.from(number).toNumber();\n        };\n        Formatter2.prototype.type = function(number) {\n          if (number === \"0x\" || number == null) {\n            return 0;\n          }\n          return bignumber_1.BigNumber.from(number).toNumber();\n        };\n        Formatter2.prototype.bigNumber = function(value) {\n          return bignumber_1.BigNumber.from(value);\n        };\n        Formatter2.prototype.boolean = function(value) {\n          if (typeof value === \"boolean\") {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            value = value.toLowerCase();\n            if (value === \"true\") {\n              return true;\n            }\n            if (value === \"false\") {\n              return false;\n            }\n          }\n          throw new Error(\"invalid boolean - \" + value);\n        };\n        Formatter2.prototype.hex = function(value, strict) {\n          if (typeof value === \"string\") {\n            if (!strict && value.substring(0, 2) !== \"0x\") {\n              value = \"0x\" + value;\n            }\n            if ((0, bytes_1.isHexString)(value)) {\n              return value.toLowerCase();\n            }\n          }\n          return logger.throwArgumentError(\"invalid hash\", \"value\", value);\n        };\n        Formatter2.prototype.data = function(value, strict) {\n          var result = this.hex(value, strict);\n          if (result.length % 2 !== 0) {\n            throw new Error(\"invalid data; odd-length - \" + value);\n          }\n          return result;\n        };\n        Formatter2.prototype.address = function(value) {\n          return (0, address_1.getAddress)(value);\n        };\n        Formatter2.prototype.callAddress = function(value) {\n          if (!(0, bytes_1.isHexString)(value, 32)) {\n            return null;\n          }\n          var address = (0, address_1.getAddress)((0, bytes_1.hexDataSlice)(value, 12));\n          return address === constants_1.AddressZero ? null : address;\n        };\n        Formatter2.prototype.contractAddress = function(value) {\n          return (0, address_1.getContractAddress)(value);\n        };\n        Formatter2.prototype.blockTag = function(blockTag) {\n          if (blockTag == null) {\n            return \"latest\";\n          }\n          if (blockTag === \"earliest\") {\n            return \"0x0\";\n          }\n          if (blockTag === \"latest\" || blockTag === \"pending\") {\n            return blockTag;\n          }\n          if (typeof blockTag === \"number\" || (0, bytes_1.isHexString)(blockTag)) {\n            return (0, bytes_1.hexValue)(blockTag);\n          }\n          throw new Error(\"invalid blockTag\");\n        };\n        Formatter2.prototype.hash = function(value, strict) {\n          var result = this.hex(value, strict);\n          if ((0, bytes_1.hexDataLength)(result) !== 32) {\n            return logger.throwArgumentError(\"invalid hash\", \"value\", value);\n          }\n          return result;\n        };\n        Formatter2.prototype.difficulty = function(value) {\n          if (value == null) {\n            return null;\n          }\n          var v = bignumber_1.BigNumber.from(value);\n          try {\n            return v.toNumber();\n          } catch (error) {\n          }\n          return null;\n        };\n        Formatter2.prototype.uint256 = function(value) {\n          if (!(0, bytes_1.isHexString)(value)) {\n            throw new Error(\"invalid uint256\");\n          }\n          return (0, bytes_1.hexZeroPad)(value, 32);\n        };\n        Formatter2.prototype._block = function(value, format) {\n          if (value.author != null && value.miner == null) {\n            value.miner = value.author;\n          }\n          var difficulty = value._difficulty != null ? value._difficulty : value.difficulty;\n          var result = Formatter2.check(format, value);\n          result._difficulty = difficulty == null ? null : bignumber_1.BigNumber.from(difficulty);\n          return result;\n        };\n        Formatter2.prototype.block = function(value) {\n          return this._block(value, this.formats.block);\n        };\n        Formatter2.prototype.blockWithTransactions = function(value) {\n          return this._block(value, this.formats.blockWithTransactions);\n        };\n        Formatter2.prototype.transactionRequest = function(value) {\n          return Formatter2.check(this.formats.transactionRequest, value);\n        };\n        Formatter2.prototype.transactionResponse = function(transaction) {\n          if (transaction.gas != null && transaction.gasLimit == null) {\n            transaction.gasLimit = transaction.gas;\n          }\n          if (transaction.to && bignumber_1.BigNumber.from(transaction.to).isZero()) {\n            transaction.to = \"0x0000000000000000000000000000000000000000\";\n          }\n          if (transaction.input != null && transaction.data == null) {\n            transaction.data = transaction.input;\n          }\n          if (transaction.to == null && transaction.creates == null) {\n            transaction.creates = this.contractAddress(transaction);\n          }\n          if ((transaction.type === 1 || transaction.type === 2) && transaction.accessList == null) {\n            transaction.accessList = [];\n          }\n          var result = Formatter2.check(this.formats.transaction, transaction);\n          if (transaction.chainId != null) {\n            var chainId = transaction.chainId;\n            if ((0, bytes_1.isHexString)(chainId)) {\n              chainId = bignumber_1.BigNumber.from(chainId).toNumber();\n            }\n            result.chainId = chainId;\n          } else {\n            var chainId = transaction.networkId;\n            if (chainId == null && result.v == null) {\n              chainId = transaction.chainId;\n            }\n            if ((0, bytes_1.isHexString)(chainId)) {\n              chainId = bignumber_1.BigNumber.from(chainId).toNumber();\n            }\n            if (typeof chainId !== \"number\" && result.v != null) {\n              chainId = (result.v - 35) / 2;\n              if (chainId < 0) {\n                chainId = 0;\n              }\n              chainId = parseInt(chainId);\n            }\n            if (typeof chainId !== \"number\") {\n              chainId = 0;\n            }\n            result.chainId = chainId;\n          }\n          if (result.blockHash && result.blockHash.replace(/0/g, \"\") === \"x\") {\n            result.blockHash = null;\n          }\n          return result;\n        };\n        Formatter2.prototype.transaction = function(value) {\n          return (0, transactions_1.parse)(value);\n        };\n        Formatter2.prototype.receiptLog = function(value) {\n          return Formatter2.check(this.formats.receiptLog, value);\n        };\n        Formatter2.prototype.receipt = function(value) {\n          var result = Formatter2.check(this.formats.receipt, value);\n          if (result.root != null) {\n            if (result.root.length <= 4) {\n              var value_1 = bignumber_1.BigNumber.from(result.root).toNumber();\n              if (value_1 === 0 || value_1 === 1) {\n                if (result.status != null && result.status !== value_1) {\n                  logger.throwArgumentError(\"alt-root-status/status mismatch\", \"value\", { root: result.root, status: result.status });\n                }\n                result.status = value_1;\n                delete result.root;\n              } else {\n                logger.throwArgumentError(\"invalid alt-root-status\", \"value.root\", result.root);\n              }\n            } else if (result.root.length !== 66) {\n              logger.throwArgumentError(\"invalid root hash\", \"value.root\", result.root);\n            }\n          }\n          if (result.status != null) {\n            result.byzantium = true;\n          }\n          return result;\n        };\n        Formatter2.prototype.topics = function(value) {\n          var _this = this;\n          if (Array.isArray(value)) {\n            return value.map(function(v) {\n              return _this.topics(v);\n            });\n          } else if (value != null) {\n            return this.hash(value, true);\n          }\n          return null;\n        };\n        Formatter2.prototype.filter = function(value) {\n          return Formatter2.check(this.formats.filter, value);\n        };\n        Formatter2.prototype.filterLog = function(value) {\n          return Formatter2.check(this.formats.filterLog, value);\n        };\n        Formatter2.check = function(format, object) {\n          var result = {};\n          for (var key in format) {\n            try {\n              var value = format[key](object[key]);\n              if (value !== void 0) {\n                result[key] = value;\n              }\n            } catch (error) {\n              error.checkKey = key;\n              error.checkValue = object[key];\n              throw error;\n            }\n          }\n          return result;\n        };\n        Formatter2.allowNull = function(format, nullValue) {\n          return function(value) {\n            if (value == null) {\n              return nullValue;\n            }\n            return format(value);\n          };\n        };\n        Formatter2.allowFalsish = function(format, replaceValue) {\n          return function(value) {\n            if (!value) {\n              return replaceValue;\n            }\n            return format(value);\n          };\n        };\n        Formatter2.arrayOf = function(format) {\n          return function(array) {\n            if (!Array.isArray(array)) {\n              throw new Error(\"not an array\");\n            }\n            var result = [];\n            array.forEach(function(value) {\n              result.push(format(value));\n            });\n            return result;\n          };\n        };\n        return Formatter2;\n      }()\n    );\n    exports2.Formatter = Formatter;\n    function isCommunityResourcable(value) {\n      return value && typeof value.isCommunityResource === \"function\";\n    }\n    exports2.isCommunityResourcable = isCommunityResourcable;\n    function isCommunityResource(value) {\n      return isCommunityResourcable(value) && value.isCommunityResource();\n    }\n    exports2.isCommunityResource = isCommunityResource;\n    var throttleMessage = false;\n    function showThrottleMessage() {\n      if (throttleMessage) {\n        return;\n      }\n      throttleMessage = true;\n      console.log(\"========= NOTICE =========\");\n      console.log(\"Request-Rate Exceeded  (this message will not be repeated)\");\n      console.log(\"\");\n      console.log(\"The default API keys for each service are provided as a highly-throttled,\");\n      console.log(\"community resource for low-traffic projects and early prototyping.\");\n      console.log(\"\");\n      console.log(\"While your application will continue to function, we highly recommended\");\n      console.log(\"signing up for your own API keys to improve performance, increase your\");\n      console.log(\"request rate/limit and enable other perks, such as metrics and advanced APIs.\");\n      console.log(\"\");\n      console.log(\"For more details: https://docs.ethers.io/api-keys/\");\n      console.log(\"==========================\");\n    }\n    exports2.showThrottleMessage = showThrottleMessage;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/base-provider.js\nvar require_base_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/base-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BaseProvider = exports2.Resolver = exports2.Event = void 0;\n    var abstract_provider_1 = require_lib12();\n    var basex_1 = require_lib17();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var hash_1 = require_lib10();\n    var networks_1 = require_lib25();\n    var properties_1 = require_lib4();\n    var sha2_1 = require_lib19();\n    var strings_1 = require_lib9();\n    var web_1 = require_lib27();\n    var bech32_1 = __importDefault(require_bech32());\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var formatter_1 = require_formatter();\n    function checkTopic(topic) {\n      if (topic == null) {\n        return \"null\";\n      }\n      if ((0, bytes_1.hexDataLength)(topic) !== 32) {\n        logger.throwArgumentError(\"invalid topic\", \"topic\", topic);\n      }\n      return topic.toLowerCase();\n    }\n    function serializeTopics(topics) {\n      topics = topics.slice();\n      while (topics.length > 0 && topics[topics.length - 1] == null) {\n        topics.pop();\n      }\n      return topics.map(function(topic) {\n        if (Array.isArray(topic)) {\n          var unique_1 = {};\n          topic.forEach(function(topic2) {\n            unique_1[checkTopic(topic2)] = true;\n          });\n          var sorted = Object.keys(unique_1);\n          sorted.sort();\n          return sorted.join(\"|\");\n        } else {\n          return checkTopic(topic);\n        }\n      }).join(\"&\");\n    }\n    function deserializeTopics(data) {\n      if (data === \"\") {\n        return [];\n      }\n      return data.split(/&/g).map(function(topic) {\n        if (topic === \"\") {\n          return [];\n        }\n        var comps = topic.split(\"|\").map(function(topic2) {\n          return topic2 === \"null\" ? null : topic2;\n        });\n        return comps.length === 1 ? comps[0] : comps;\n      });\n    }\n    function getEventTag(eventName) {\n      if (typeof eventName === \"string\") {\n        eventName = eventName.toLowerCase();\n        if ((0, bytes_1.hexDataLength)(eventName) === 32) {\n          return \"tx:\" + eventName;\n        }\n        if (eventName.indexOf(\":\") === -1) {\n          return eventName;\n        }\n      } else if (Array.isArray(eventName)) {\n        return \"filter:*:\" + serializeTopics(eventName);\n      } else if (abstract_provider_1.ForkEvent.isForkEvent(eventName)) {\n        logger.warn(\"not implemented\");\n        throw new Error(\"not implemented\");\n      } else if (eventName && typeof eventName === \"object\") {\n        return \"filter:\" + (eventName.address || \"*\") + \":\" + serializeTopics(eventName.topics || []);\n      }\n      throw new Error(\"invalid event - \" + eventName);\n    }\n    function getTime() {\n      return (/* @__PURE__ */ new Date()).getTime();\n    }\n    function stall(duration) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, duration);\n      });\n    }\n    var PollableEvents = [\"block\", \"network\", \"pending\", \"poll\"];\n    var Event = (\n      /** @class */\n      function() {\n        function Event2(tag, listener, once) {\n          (0, properties_1.defineReadOnly)(this, \"tag\", tag);\n          (0, properties_1.defineReadOnly)(this, \"listener\", listener);\n          (0, properties_1.defineReadOnly)(this, \"once\", once);\n        }\n        Object.defineProperty(Event2.prototype, \"event\", {\n          get: function() {\n            switch (this.type) {\n              case \"tx\":\n                return this.hash;\n              case \"filter\":\n                return this.filter;\n            }\n            return this.tag;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"type\", {\n          get: function() {\n            return this.tag.split(\":\")[0];\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"hash\", {\n          get: function() {\n            var comps = this.tag.split(\":\");\n            if (comps[0] !== \"tx\") {\n              return null;\n            }\n            return comps[1];\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"filter\", {\n          get: function() {\n            var comps = this.tag.split(\":\");\n            if (comps[0] !== \"filter\") {\n              return null;\n            }\n            var address = comps[1];\n            var topics = deserializeTopics(comps[2]);\n            var filter = {};\n            if (topics.length > 0) {\n              filter.topics = topics;\n            }\n            if (address && address !== \"*\") {\n              filter.address = address;\n            }\n            return filter;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Event2.prototype.pollable = function() {\n          return this.tag.indexOf(\":\") >= 0 || PollableEvents.indexOf(this.tag) >= 0;\n        };\n        return Event2;\n      }()\n    );\n    exports2.Event = Event;\n    var coinInfos = {\n      \"0\": { symbol: \"btc\", p2pkh: 0, p2sh: 5, prefix: \"bc\" },\n      \"2\": { symbol: \"ltc\", p2pkh: 48, p2sh: 50, prefix: \"ltc\" },\n      \"3\": { symbol: \"doge\", p2pkh: 30, p2sh: 22 },\n      \"60\": { symbol: \"eth\", ilk: \"eth\" },\n      \"61\": { symbol: \"etc\", ilk: \"eth\" },\n      \"700\": { symbol: \"xdai\", ilk: \"eth\" }\n    };\n    function bytes32ify(value) {\n      return (0, bytes_1.hexZeroPad)(bignumber_1.BigNumber.from(value).toHexString(), 32);\n    }\n    function base58Encode(data) {\n      return basex_1.Base58.encode((0, bytes_1.concat)([data, (0, bytes_1.hexDataSlice)((0, sha2_1.sha256)((0, sha2_1.sha256)(data)), 0, 4)]));\n    }\n    var matchers = [\n      new RegExp(\"^(https)://(.*)$\", \"i\"),\n      new RegExp(\"^(data):(.*)$\", \"i\"),\n      new RegExp(\"^(ipfs)://(.*)$\", \"i\"),\n      new RegExp(\"^eip155:[0-9]+/(erc[0-9]+):(.*)$\", \"i\")\n    ];\n    function _parseString(result) {\n      try {\n        return (0, strings_1.toUtf8String)(_parseBytes(result));\n      } catch (error) {\n      }\n      return null;\n    }\n    function _parseBytes(result) {\n      if (result === \"0x\") {\n        return null;\n      }\n      var offset = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(result, 0, 32)).toNumber();\n      var length = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(result, offset, offset + 32)).toNumber();\n      return (0, bytes_1.hexDataSlice)(result, offset + 32, offset + 32 + length);\n    }\n    var Resolver = (\n      /** @class */\n      function() {\n        function Resolver2(provider, address, name2, resolvedAddress) {\n          (0, properties_1.defineReadOnly)(this, \"provider\", provider);\n          (0, properties_1.defineReadOnly)(this, \"name\", name2);\n          (0, properties_1.defineReadOnly)(this, \"address\", provider.formatter.address(address));\n          (0, properties_1.defineReadOnly)(this, \"_resolvedAddress\", resolvedAddress);\n        }\n        Resolver2.prototype._fetchBytes = function(selector, parameters) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, _a, error_1;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  tx = {\n                    to: this.address,\n                    data: (0, bytes_1.hexConcat)([selector, (0, hash_1.namehash)(this.name), parameters || \"0x\"])\n                  };\n                  _b.label = 1;\n                case 1:\n                  _b.trys.push([1, 3, , 4]);\n                  _a = _parseBytes;\n                  return [4, this.provider.call(tx)];\n                case 2:\n                  return [2, _a.apply(void 0, [_b.sent()])];\n                case 3:\n                  error_1 = _b.sent();\n                  if (error_1.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  return [2, null];\n                case 4:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        Resolver2.prototype._getAddress = function(coinType, hexBytes) {\n          var coinInfo = coinInfos[String(coinType)];\n          if (coinInfo == null) {\n            logger.throwError(\"unsupported coin type: \" + coinType, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"getAddress(\" + coinType + \")\"\n            });\n          }\n          if (coinInfo.ilk === \"eth\") {\n            return this.provider.formatter.address(hexBytes);\n          }\n          var bytes = (0, bytes_1.arrayify)(hexBytes);\n          if (coinInfo.p2pkh != null) {\n            var p2pkh = hexBytes.match(/^0x76a9([0-9a-f][0-9a-f])([0-9a-f]*)88ac$/);\n            if (p2pkh) {\n              var length_1 = parseInt(p2pkh[1], 16);\n              if (p2pkh[2].length === length_1 * 2 && length_1 >= 1 && length_1 <= 75) {\n                return base58Encode((0, bytes_1.concat)([[coinInfo.p2pkh], \"0x\" + p2pkh[2]]));\n              }\n            }\n          }\n          if (coinInfo.p2sh != null) {\n            var p2sh = hexBytes.match(/^0xa9([0-9a-f][0-9a-f])([0-9a-f]*)87$/);\n            if (p2sh) {\n              var length_2 = parseInt(p2sh[1], 16);\n              if (p2sh[2].length === length_2 * 2 && length_2 >= 1 && length_2 <= 75) {\n                return base58Encode((0, bytes_1.concat)([[coinInfo.p2sh], \"0x\" + p2sh[2]]));\n              }\n            }\n          }\n          if (coinInfo.prefix != null) {\n            var length_3 = bytes[1];\n            var version_1 = bytes[0];\n            if (version_1 === 0) {\n              if (length_3 !== 20 && length_3 !== 32) {\n                version_1 = -1;\n              }\n            } else {\n              version_1 = -1;\n            }\n            if (version_1 >= 0 && bytes.length === 2 + length_3 && length_3 >= 1 && length_3 <= 75) {\n              var words = bech32_1.default.toWords(bytes.slice(2));\n              words.unshift(version_1);\n              return bech32_1.default.encode(coinInfo.prefix, words);\n            }\n          }\n          return null;\n        };\n        Resolver2.prototype.getAddress = function(coinType) {\n          return __awaiter(this, void 0, void 0, function() {\n            var transaction, hexBytes_1, error_2, hexBytes, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (coinType == null) {\n                    coinType = 60;\n                  }\n                  if (!(coinType === 60)) return [3, 4];\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  transaction = {\n                    to: this.address,\n                    data: \"0x3b3b57de\" + (0, hash_1.namehash)(this.name).substring(2)\n                  };\n                  return [4, this.provider.call(transaction)];\n                case 2:\n                  hexBytes_1 = _a.sent();\n                  if (hexBytes_1 === \"0x\" || hexBytes_1 === constants_1.HashZero) {\n                    return [2, null];\n                  }\n                  return [2, this.provider.formatter.callAddress(hexBytes_1)];\n                case 3:\n                  error_2 = _a.sent();\n                  if (error_2.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  throw error_2;\n                case 4:\n                  return [4, this._fetchBytes(\"0xf1cb7e06\", bytes32ify(coinType))];\n                case 5:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  address = this._getAddress(coinType, hexBytes);\n                  if (address == null) {\n                    logger.throwError(\"invalid or unsupported coin data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                      operation: \"getAddress(\" + coinType + \")\",\n                      coinType,\n                      data: hexBytes\n                    });\n                  }\n                  return [2, address];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getAvatar = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var linkage, avatar, i, match, _a, selector, owner, _b, comps, addr, tokenId, tokenOwner, _c, _d, balance, _e, _f, tx, metadataUrl, _g, metadata, error_3;\n            return __generator(this, function(_h) {\n              switch (_h.label) {\n                case 0:\n                  linkage = [];\n                  _h.label = 1;\n                case 1:\n                  _h.trys.push([1, 19, , 20]);\n                  return [4, this.getText(\"avatar\")];\n                case 2:\n                  avatar = _h.sent();\n                  if (avatar == null) {\n                    return [2, null];\n                  }\n                  i = 0;\n                  _h.label = 3;\n                case 3:\n                  if (!(i < matchers.length)) return [3, 18];\n                  match = avatar.match(matchers[i]);\n                  if (match == null) {\n                    return [3, 17];\n                  }\n                  _a = match[1];\n                  switch (_a) {\n                    case \"https\":\n                      return [3, 4];\n                    case \"data\":\n                      return [3, 5];\n                    case \"ipfs\":\n                      return [3, 6];\n                    case \"erc721\":\n                      return [3, 7];\n                    case \"erc1155\":\n                      return [3, 7];\n                  }\n                  return [3, 17];\n                case 4:\n                  linkage.push({ type: \"url\", content: avatar });\n                  return [2, { linkage, url: avatar }];\n                case 5:\n                  linkage.push({ type: \"data\", content: avatar });\n                  return [2, { linkage, url: avatar }];\n                case 6:\n                  linkage.push({ type: \"ipfs\", content: avatar });\n                  return [2, { linkage, url: \"https://gateway.ipfs.io/ipfs/\" + avatar.substring(7) }];\n                case 7:\n                  selector = match[1] === \"erc721\" ? \"0xc87b56dd\" : \"0x0e89341c\";\n                  linkage.push({ type: match[1], content: avatar });\n                  _b = this._resolvedAddress;\n                  if (_b) return [3, 9];\n                  return [4, this.getAddress()];\n                case 8:\n                  _b = _h.sent();\n                  _h.label = 9;\n                case 9:\n                  owner = _b;\n                  comps = (match[2] || \"\").split(\"/\");\n                  if (comps.length !== 2) {\n                    return [2, null];\n                  }\n                  return [4, this.provider.formatter.address(comps[0])];\n                case 10:\n                  addr = _h.sent();\n                  tokenId = (0, bytes_1.hexZeroPad)(bignumber_1.BigNumber.from(comps[1]).toHexString(), 32);\n                  if (!(match[1] === \"erc721\")) return [3, 12];\n                  _d = (_c = this.provider.formatter).callAddress;\n                  return [4, this.provider.call({\n                    to: addr,\n                    data: (0, bytes_1.hexConcat)([\"0x6352211e\", tokenId])\n                  })];\n                case 11:\n                  tokenOwner = _d.apply(_c, [_h.sent()]);\n                  if (owner !== tokenOwner) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"owner\", content: tokenOwner });\n                  return [3, 14];\n                case 12:\n                  if (!(match[1] === \"erc1155\")) return [3, 14];\n                  _f = (_e = bignumber_1.BigNumber).from;\n                  return [4, this.provider.call({\n                    to: addr,\n                    data: (0, bytes_1.hexConcat)([\"0x00fdd58e\", (0, bytes_1.hexZeroPad)(owner, 32), tokenId])\n                  })];\n                case 13:\n                  balance = _f.apply(_e, [_h.sent()]);\n                  if (balance.isZero()) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"balance\", content: balance.toString() });\n                  _h.label = 14;\n                case 14:\n                  tx = {\n                    to: this.provider.formatter.address(comps[0]),\n                    data: (0, bytes_1.hexConcat)([selector, tokenId])\n                  };\n                  _g = _parseString;\n                  return [4, this.provider.call(tx)];\n                case 15:\n                  metadataUrl = _g.apply(void 0, [_h.sent()]);\n                  if (metadataUrl == null) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"metadata-url\", content: metadataUrl });\n                  if (match[1] === \"erc1155\") {\n                    metadataUrl = metadataUrl.replace(\"{id}\", tokenId.substring(2));\n                  }\n                  return [4, (0, web_1.fetchJson)(metadataUrl)];\n                case 16:\n                  metadata = _h.sent();\n                  if (!metadata || typeof metadata.image !== \"string\" || !metadata.image.match(/^(https:\\/\\/|data:)/i)) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"metadata\", content: JSON.stringify(metadata) });\n                  linkage.push({ type: \"url\", content: metadata.image });\n                  return [2, { linkage, url: metadata.image }];\n                case 17:\n                  i++;\n                  return [3, 3];\n                case 18:\n                  return [3, 20];\n                case 19:\n                  error_3 = _h.sent();\n                  return [3, 20];\n                case 20:\n                  return [2, null];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getContentHash = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var hexBytes, ipfs, length_4, swarm;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._fetchBytes(\"0xbc1c58d1\")];\n                case 1:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  ipfs = hexBytes.match(/^0xe3010170(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/);\n                  if (ipfs) {\n                    length_4 = parseInt(ipfs[3], 16);\n                    if (ipfs[4].length === length_4 * 2) {\n                      return [2, \"ipfs://\" + basex_1.Base58.encode(\"0x\" + ipfs[1])];\n                    }\n                  }\n                  swarm = hexBytes.match(/^0xe40101fa011b20([0-9a-f]*)$/);\n                  if (swarm) {\n                    if (swarm[1].length === 32 * 2) {\n                      return [2, \"bzz://\" + swarm[1]];\n                    }\n                  }\n                  return [2, logger.throwError(\"invalid or unsupported content hash data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"getContentHash()\",\n                    data: hexBytes\n                  })];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getText = function(key) {\n          return __awaiter(this, void 0, void 0, function() {\n            var keyBytes, hexBytes;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  keyBytes = (0, strings_1.toUtf8Bytes)(key);\n                  keyBytes = (0, bytes_1.concat)([bytes32ify(64), bytes32ify(keyBytes.length), keyBytes]);\n                  if (keyBytes.length % 32 !== 0) {\n                    keyBytes = (0, bytes_1.concat)([keyBytes, (0, bytes_1.hexZeroPad)(\"0x\", 32 - key.length % 32)]);\n                  }\n                  return [4, this._fetchBytes(\"0x59d1d43c\", (0, bytes_1.hexlify)(keyBytes))];\n                case 1:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  return [2, (0, strings_1.toUtf8String)(hexBytes)];\n              }\n            });\n          });\n        };\n        return Resolver2;\n      }()\n    );\n    exports2.Resolver = Resolver;\n    var defaultFormatter = null;\n    var nextPollId = 1;\n    var BaseProvider = (\n      /** @class */\n      function(_super) {\n        __extends(BaseProvider2, _super);\n        function BaseProvider2(network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, abstract_provider_1.Provider);\n          _this = _super.call(this) || this;\n          _this._events = [];\n          _this._emitted = { block: -2 };\n          _this.formatter = _newTarget.getFormatter();\n          (0, properties_1.defineReadOnly)(_this, \"anyNetwork\", network === \"any\");\n          if (_this.anyNetwork) {\n            network = _this.detectNetwork();\n          }\n          if (network instanceof Promise) {\n            _this._networkPromise = network;\n            network.catch(function(error) {\n            });\n            _this._ready().catch(function(error) {\n            });\n          } else {\n            var knownNetwork = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n            if (knownNetwork) {\n              (0, properties_1.defineReadOnly)(_this, \"_network\", knownNetwork);\n              _this.emit(\"network\", knownNetwork, null);\n            } else {\n              logger.throwArgumentError(\"invalid network\", \"network\", network);\n            }\n          }\n          _this._maxInternalBlockNumber = -1024;\n          _this._lastBlockNumber = -2;\n          _this._pollingInterval = 4e3;\n          _this._fastQueryDate = 0;\n          return _this;\n        }\n        BaseProvider2.prototype._ready = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, error_4;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(this._network == null)) return [3, 7];\n                  network = null;\n                  if (!this._networkPromise) return [3, 4];\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  return [4, this._networkPromise];\n                case 2:\n                  network = _a.sent();\n                  return [3, 4];\n                case 3:\n                  error_4 = _a.sent();\n                  return [3, 4];\n                case 4:\n                  if (!(network == null)) return [3, 6];\n                  return [4, this.detectNetwork()];\n                case 5:\n                  network = _a.sent();\n                  _a.label = 6;\n                case 6:\n                  if (!network) {\n                    logger.throwError(\"no network detected\", logger_1.Logger.errors.UNKNOWN_ERROR, {});\n                  }\n                  if (this._network == null) {\n                    if (this.anyNetwork) {\n                      this._network = network;\n                    } else {\n                      (0, properties_1.defineReadOnly)(this, \"_network\", network);\n                    }\n                    this.emit(\"network\", network, null);\n                  }\n                  _a.label = 7;\n                case 7:\n                  return [2, this._network];\n              }\n            });\n          });\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"ready\", {\n          // This will always return the most recently established network.\n          // For \"any\", this can change (a \"network\" event is emitted before\n          // any change is reflected); otherwise this cannot change\n          get: function() {\n            var _this = this;\n            return (0, web_1.poll)(function() {\n              return _this._ready().then(function(network) {\n                return network;\n              }, function(error) {\n                if (error.code === logger_1.Logger.errors.NETWORK_ERROR && error.event === \"noNetwork\") {\n                  return void 0;\n                }\n                throw error;\n              });\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.getFormatter = function() {\n          if (defaultFormatter == null) {\n            defaultFormatter = new formatter_1.Formatter();\n          }\n          return defaultFormatter;\n        };\n        BaseProvider2.getNetwork = function(network) {\n          return (0, networks_1.getNetwork)(network == null ? \"homestead\" : network);\n        };\n        BaseProvider2.prototype._getInternalBlockNumber = function(maxAge) {\n          return __awaiter(this, void 0, void 0, function() {\n            var internalBlockNumber, result, error_5, reqTime, checkInternalBlockNumber;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._ready()];\n                case 1:\n                  _a.sent();\n                  if (!(maxAge > 0)) return [3, 7];\n                  _a.label = 2;\n                case 2:\n                  if (!this._internalBlockNumber) return [3, 7];\n                  internalBlockNumber = this._internalBlockNumber;\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, internalBlockNumber];\n                case 4:\n                  result = _a.sent();\n                  if (getTime() - result.respTime <= maxAge) {\n                    return [2, result.blockNumber];\n                  }\n                  return [3, 7];\n                case 5:\n                  error_5 = _a.sent();\n                  if (this._internalBlockNumber === internalBlockNumber) {\n                    return [3, 7];\n                  }\n                  return [3, 6];\n                case 6:\n                  return [3, 2];\n                case 7:\n                  reqTime = getTime();\n                  checkInternalBlockNumber = (0, properties_1.resolveProperties)({\n                    blockNumber: this.perform(\"getBlockNumber\", {}),\n                    networkError: this.getNetwork().then(function(network) {\n                      return null;\n                    }, function(error) {\n                      return error;\n                    })\n                  }).then(function(_a2) {\n                    var blockNumber = _a2.blockNumber, networkError = _a2.networkError;\n                    if (networkError) {\n                      if (_this._internalBlockNumber === checkInternalBlockNumber) {\n                        _this._internalBlockNumber = null;\n                      }\n                      throw networkError;\n                    }\n                    var respTime = getTime();\n                    blockNumber = bignumber_1.BigNumber.from(blockNumber).toNumber();\n                    if (blockNumber < _this._maxInternalBlockNumber) {\n                      blockNumber = _this._maxInternalBlockNumber;\n                    }\n                    _this._maxInternalBlockNumber = blockNumber;\n                    _this._setFastBlockNumber(blockNumber);\n                    return { blockNumber, reqTime, respTime };\n                  });\n                  this._internalBlockNumber = checkInternalBlockNumber;\n                  checkInternalBlockNumber.catch(function(error) {\n                    if (_this._internalBlockNumber === checkInternalBlockNumber) {\n                      _this._internalBlockNumber = null;\n                    }\n                  });\n                  return [4, checkInternalBlockNumber];\n                case 8:\n                  return [2, _a.sent().blockNumber];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.poll = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var pollId, runners, blockNumber, error_6, i;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  pollId = nextPollId++;\n                  runners = [];\n                  blockNumber = null;\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  return [4, this._getInternalBlockNumber(100 + this.pollingInterval / 2)];\n                case 2:\n                  blockNumber = _a.sent();\n                  return [3, 4];\n                case 3:\n                  error_6 = _a.sent();\n                  this.emit(\"error\", error_6);\n                  return [\n                    2\n                    /*return*/\n                  ];\n                case 4:\n                  this._setFastBlockNumber(blockNumber);\n                  this.emit(\"poll\", pollId, blockNumber);\n                  if (blockNumber === this._lastBlockNumber) {\n                    this.emit(\"didPoll\", pollId);\n                    return [\n                      2\n                      /*return*/\n                    ];\n                  }\n                  if (this._emitted.block === -2) {\n                    this._emitted.block = blockNumber - 1;\n                  }\n                  if (Math.abs(this._emitted.block - blockNumber) > 1e3) {\n                    logger.warn(\"network block skew detected; skipping block events (emitted=\" + this._emitted.block + \" blockNumber\" + blockNumber + \")\");\n                    this.emit(\"error\", logger.makeError(\"network block skew detected\", logger_1.Logger.errors.NETWORK_ERROR, {\n                      blockNumber,\n                      event: \"blockSkew\",\n                      previousBlockNumber: this._emitted.block\n                    }));\n                    this.emit(\"block\", blockNumber);\n                  } else {\n                    for (i = this._emitted.block + 1; i <= blockNumber; i++) {\n                      this.emit(\"block\", i);\n                    }\n                  }\n                  if (this._emitted.block !== blockNumber) {\n                    this._emitted.block = blockNumber;\n                    Object.keys(this._emitted).forEach(function(key) {\n                      if (key === \"block\") {\n                        return;\n                      }\n                      var eventBlockNumber = _this._emitted[key];\n                      if (eventBlockNumber === \"pending\") {\n                        return;\n                      }\n                      if (blockNumber - eventBlockNumber > 12) {\n                        delete _this._emitted[key];\n                      }\n                    });\n                  }\n                  if (this._lastBlockNumber === -2) {\n                    this._lastBlockNumber = blockNumber - 1;\n                  }\n                  this._events.forEach(function(event) {\n                    switch (event.type) {\n                      case \"tx\": {\n                        var hash_2 = event.hash;\n                        var runner = _this.getTransactionReceipt(hash_2).then(function(receipt) {\n                          if (!receipt || receipt.blockNumber == null) {\n                            return null;\n                          }\n                          _this._emitted[\"t:\" + hash_2] = receipt.blockNumber;\n                          _this.emit(hash_2, receipt);\n                          return null;\n                        }).catch(function(error) {\n                          _this.emit(\"error\", error);\n                        });\n                        runners.push(runner);\n                        break;\n                      }\n                      case \"filter\": {\n                        var filter_1 = event.filter;\n                        filter_1.fromBlock = _this._lastBlockNumber + 1;\n                        filter_1.toBlock = blockNumber;\n                        var runner = _this.getLogs(filter_1).then(function(logs) {\n                          if (logs.length === 0) {\n                            return;\n                          }\n                          logs.forEach(function(log) {\n                            _this._emitted[\"b:\" + log.blockHash] = log.blockNumber;\n                            _this._emitted[\"t:\" + log.transactionHash] = log.blockNumber;\n                            _this.emit(filter_1, log);\n                          });\n                        }).catch(function(error) {\n                          _this.emit(\"error\", error);\n                        });\n                        runners.push(runner);\n                        break;\n                      }\n                    }\n                  });\n                  this._lastBlockNumber = blockNumber;\n                  Promise.all(runners).then(function() {\n                    _this.emit(\"didPoll\", pollId);\n                  }).catch(function(error) {\n                    _this.emit(\"error\", error);\n                  });\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.resetEventsBlock = function(blockNumber) {\n          this._lastBlockNumber = blockNumber - 1;\n          if (this.polling) {\n            this.poll();\n          }\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"network\", {\n          get: function() {\n            return this._network;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, logger.throwError(\"provider does not support network detection\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"provider.detectNetwork\"\n              })];\n            });\n          });\n        };\n        BaseProvider2.prototype.getNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, currentNetwork, error;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._ready()];\n                case 1:\n                  network = _a.sent();\n                  return [4, this.detectNetwork()];\n                case 2:\n                  currentNetwork = _a.sent();\n                  if (!(network.chainId !== currentNetwork.chainId)) return [3, 5];\n                  if (!this.anyNetwork) return [3, 4];\n                  this._network = currentNetwork;\n                  this._lastBlockNumber = -2;\n                  this._fastBlockNumber = null;\n                  this._fastBlockNumberPromise = null;\n                  this._fastQueryDate = 0;\n                  this._emitted.block = -2;\n                  this._maxInternalBlockNumber = -1024;\n                  this._internalBlockNumber = null;\n                  this.emit(\"network\", currentNetwork, network);\n                  return [4, stall(0)];\n                case 3:\n                  _a.sent();\n                  return [2, this._network];\n                case 4:\n                  error = logger.makeError(\"underlying network changed\", logger_1.Logger.errors.NETWORK_ERROR, {\n                    event: \"changed\",\n                    network,\n                    detectedNetwork: currentNetwork\n                  });\n                  this.emit(\"error\", error);\n                  throw error;\n                case 5:\n                  return [2, network];\n              }\n            });\n          });\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"blockNumber\", {\n          get: function() {\n            var _this = this;\n            this._getInternalBlockNumber(100 + this.pollingInterval / 2).then(function(blockNumber) {\n              _this._setFastBlockNumber(blockNumber);\n            }, function(error) {\n            });\n            return this._fastBlockNumber != null ? this._fastBlockNumber : -1;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(BaseProvider2.prototype, \"polling\", {\n          get: function() {\n            return this._poller != null;\n          },\n          set: function(value) {\n            var _this = this;\n            if (value && !this._poller) {\n              this._poller = setInterval(function() {\n                _this.poll();\n              }, this.pollingInterval);\n              if (!this._bootstrapPoll) {\n                this._bootstrapPoll = setTimeout(function() {\n                  _this.poll();\n                  _this._bootstrapPoll = setTimeout(function() {\n                    if (!_this._poller) {\n                      _this.poll();\n                    }\n                    _this._bootstrapPoll = null;\n                  }, _this.pollingInterval);\n                }, 0);\n              }\n            } else if (!value && this._poller) {\n              clearInterval(this._poller);\n              this._poller = null;\n            }\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(BaseProvider2.prototype, \"pollingInterval\", {\n          get: function() {\n            return this._pollingInterval;\n          },\n          set: function(value) {\n            var _this = this;\n            if (typeof value !== \"number\" || value <= 0 || parseInt(String(value)) != value) {\n              throw new Error(\"invalid polling interval\");\n            }\n            this._pollingInterval = value;\n            if (this._poller) {\n              clearInterval(this._poller);\n              this._poller = setInterval(function() {\n                _this.poll();\n              }, this._pollingInterval);\n            }\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.prototype._getFastBlockNumber = function() {\n          var _this = this;\n          var now = getTime();\n          if (now - this._fastQueryDate > 2 * this._pollingInterval) {\n            this._fastQueryDate = now;\n            this._fastBlockNumberPromise = this.getBlockNumber().then(function(blockNumber) {\n              if (_this._fastBlockNumber == null || blockNumber > _this._fastBlockNumber) {\n                _this._fastBlockNumber = blockNumber;\n              }\n              return _this._fastBlockNumber;\n            });\n          }\n          return this._fastBlockNumberPromise;\n        };\n        BaseProvider2.prototype._setFastBlockNumber = function(blockNumber) {\n          if (this._fastBlockNumber != null && blockNumber < this._fastBlockNumber) {\n            return;\n          }\n          this._fastQueryDate = getTime();\n          if (this._fastBlockNumber == null || blockNumber > this._fastBlockNumber) {\n            this._fastBlockNumber = blockNumber;\n            this._fastBlockNumberPromise = Promise.resolve(blockNumber);\n          }\n        };\n        BaseProvider2.prototype.waitForTransaction = function(transactionHash, confirmations, timeout) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this._waitForTransaction(transactionHash, confirmations == null ? 1 : confirmations, timeout || 0, null)];\n            });\n          });\n        };\n        BaseProvider2.prototype._waitForTransaction = function(transactionHash, confirmations, timeout, replaceable) {\n          return __awaiter(this, void 0, void 0, function() {\n            var receipt;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getTransactionReceipt(transactionHash)];\n                case 1:\n                  receipt = _a.sent();\n                  if ((receipt ? receipt.confirmations : 0) >= confirmations) {\n                    return [2, receipt];\n                  }\n                  return [2, new Promise(function(resolve, reject) {\n                    var cancelFuncs = [];\n                    var done = false;\n                    var alreadyDone = function() {\n                      if (done) {\n                        return true;\n                      }\n                      done = true;\n                      cancelFuncs.forEach(function(func) {\n                        func();\n                      });\n                      return false;\n                    };\n                    var minedHandler = function(receipt2) {\n                      if (receipt2.confirmations < confirmations) {\n                        return;\n                      }\n                      if (alreadyDone()) {\n                        return;\n                      }\n                      resolve(receipt2);\n                    };\n                    _this.on(transactionHash, minedHandler);\n                    cancelFuncs.push(function() {\n                      _this.removeListener(transactionHash, minedHandler);\n                    });\n                    if (replaceable) {\n                      var lastBlockNumber_1 = replaceable.startBlock;\n                      var scannedBlock_1 = null;\n                      var replaceHandler_1 = function(blockNumber) {\n                        return __awaiter(_this, void 0, void 0, function() {\n                          var _this2 = this;\n                          return __generator(this, function(_a2) {\n                            switch (_a2.label) {\n                              case 0:\n                                if (done) {\n                                  return [\n                                    2\n                                    /*return*/\n                                  ];\n                                }\n                                return [4, stall(1e3)];\n                              case 1:\n                                _a2.sent();\n                                this.getTransactionCount(replaceable.from).then(function(nonce) {\n                                  return __awaiter(_this2, void 0, void 0, function() {\n                                    var mined, block, ti, tx, receipt_1, reason;\n                                    return __generator(this, function(_a3) {\n                                      switch (_a3.label) {\n                                        case 0:\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (!(nonce <= replaceable.nonce)) return [3, 1];\n                                          lastBlockNumber_1 = blockNumber;\n                                          return [3, 9];\n                                        case 1:\n                                          return [4, this.getTransaction(transactionHash)];\n                                        case 2:\n                                          mined = _a3.sent();\n                                          if (mined && mined.blockNumber != null) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (scannedBlock_1 == null) {\n                                            scannedBlock_1 = lastBlockNumber_1 - 3;\n                                            if (scannedBlock_1 < replaceable.startBlock) {\n                                              scannedBlock_1 = replaceable.startBlock;\n                                            }\n                                          }\n                                          _a3.label = 3;\n                                        case 3:\n                                          if (!(scannedBlock_1 <= blockNumber)) return [3, 9];\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          return [4, this.getBlockWithTransactions(scannedBlock_1)];\n                                        case 4:\n                                          block = _a3.sent();\n                                          ti = 0;\n                                          _a3.label = 5;\n                                        case 5:\n                                          if (!(ti < block.transactions.length)) return [3, 8];\n                                          tx = block.transactions[ti];\n                                          if (tx.hash === transactionHash) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (!(tx.from === replaceable.from && tx.nonce === replaceable.nonce)) return [3, 7];\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          return [4, this.waitForTransaction(tx.hash, confirmations)];\n                                        case 6:\n                                          receipt_1 = _a3.sent();\n                                          if (alreadyDone()) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          reason = \"replaced\";\n                                          if (tx.data === replaceable.data && tx.to === replaceable.to && tx.value.eq(replaceable.value)) {\n                                            reason = \"repriced\";\n                                          } else if (tx.data === \"0x\" && tx.from === tx.to && tx.value.isZero()) {\n                                            reason = \"cancelled\";\n                                          }\n                                          reject(logger.makeError(\"transaction was replaced\", logger_1.Logger.errors.TRANSACTION_REPLACED, {\n                                            cancelled: reason === \"replaced\" || reason === \"cancelled\",\n                                            reason,\n                                            replacement: this._wrapTransaction(tx),\n                                            hash: transactionHash,\n                                            receipt: receipt_1\n                                          }));\n                                          return [\n                                            2\n                                            /*return*/\n                                          ];\n                                        case 7:\n                                          ti++;\n                                          return [3, 5];\n                                        case 8:\n                                          scannedBlock_1++;\n                                          return [3, 3];\n                                        case 9:\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          this.once(\"block\", replaceHandler_1);\n                                          return [\n                                            2\n                                            /*return*/\n                                          ];\n                                      }\n                                    });\n                                  });\n                                }, function(error) {\n                                  if (done) {\n                                    return;\n                                  }\n                                  _this2.once(\"block\", replaceHandler_1);\n                                });\n                                return [\n                                  2\n                                  /*return*/\n                                ];\n                            }\n                          });\n                        });\n                      };\n                      if (done) {\n                        return;\n                      }\n                      _this.once(\"block\", replaceHandler_1);\n                      cancelFuncs.push(function() {\n                        _this.removeListener(\"block\", replaceHandler_1);\n                      });\n                    }\n                    if (typeof timeout === \"number\" && timeout > 0) {\n                      var timer_1 = setTimeout(function() {\n                        if (alreadyDone()) {\n                          return;\n                        }\n                        reject(logger.makeError(\"timeout exceeded\", logger_1.Logger.errors.TIMEOUT, { timeout }));\n                      }, timeout);\n                      if (timer_1.unref) {\n                        timer_1.unref();\n                      }\n                      cancelFuncs.push(function() {\n                        clearTimeout(timer_1);\n                      });\n                    }\n                  })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBlockNumber = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this._getInternalBlockNumber(0)];\n            });\n          });\n        };\n        BaseProvider2.prototype.getGasPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, this.perform(\"getGasPrice\", {})];\n                case 2:\n                  result = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getGasPrice\",\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBalance = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getBalance\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getBalance\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getTransactionCount = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getTransactionCount\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result).toNumber()];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getTransactionCount\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getCode = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getCode\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getCode\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getStorageAt = function(addressOrName, position, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag),\n                    position: Promise.resolve(position).then(function(p) {\n                      return (0, bytes_1.hexValue)(p);\n                    })\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getStorageAt\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getStorageAt\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._wrapTransaction = function(tx, hash, startBlock) {\n          var _this = this;\n          if (hash != null && (0, bytes_1.hexDataLength)(hash) !== 32) {\n            throw new Error(\"invalid response - sendTransaction\");\n          }\n          var result = tx;\n          if (hash != null && tx.hash !== hash) {\n            logger.throwError(\"Transaction hash mismatch from Provider.sendTransaction.\", logger_1.Logger.errors.UNKNOWN_ERROR, { expectedHash: tx.hash, returnedHash: hash });\n          }\n          result.wait = function(confirms, timeout) {\n            return __awaiter(_this, void 0, void 0, function() {\n              var replacement, receipt;\n              return __generator(this, function(_a) {\n                switch (_a.label) {\n                  case 0:\n                    if (confirms == null) {\n                      confirms = 1;\n                    }\n                    if (timeout == null) {\n                      timeout = 0;\n                    }\n                    replacement = void 0;\n                    if (confirms !== 0 && startBlock != null) {\n                      replacement = {\n                        data: tx.data,\n                        from: tx.from,\n                        nonce: tx.nonce,\n                        to: tx.to,\n                        value: tx.value,\n                        startBlock\n                      };\n                    }\n                    return [4, this._waitForTransaction(tx.hash, confirms, timeout, replacement)];\n                  case 1:\n                    receipt = _a.sent();\n                    if (receipt == null && confirms === 0) {\n                      return [2, null];\n                    }\n                    this._emitted[\"t:\" + tx.hash] = receipt.blockNumber;\n                    if (receipt.status === 0) {\n                      logger.throwError(\"transaction failed\", logger_1.Logger.errors.CALL_EXCEPTION, {\n                        transactionHash: tx.hash,\n                        transaction: tx,\n                        receipt\n                      });\n                    }\n                    return [2, receipt];\n                }\n              });\n            });\n          };\n          return result;\n        };\n        BaseProvider2.prototype.sendTransaction = function(signedTransaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var hexTx, tx, blockNumber, hash, error_7;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, Promise.resolve(signedTransaction).then(function(t) {\n                    return (0, bytes_1.hexlify)(t);\n                  })];\n                case 2:\n                  hexTx = _a.sent();\n                  tx = this.formatter.transaction(signedTransaction);\n                  if (tx.confirmations == null) {\n                    tx.confirmations = 0;\n                  }\n                  return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                case 3:\n                  blockNumber = _a.sent();\n                  _a.label = 4;\n                case 4:\n                  _a.trys.push([4, 6, , 7]);\n                  return [4, this.perform(\"sendTransaction\", { signedTransaction: hexTx })];\n                case 5:\n                  hash = _a.sent();\n                  return [2, this._wrapTransaction(tx, hash, blockNumber)];\n                case 6:\n                  error_7 = _a.sent();\n                  error_7.transaction = tx;\n                  error_7.transactionHash = tx.hash;\n                  throw error_7;\n                case 7:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getTransactionRequest = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var values, tx, _a, _b;\n            var _this = this;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, transaction];\n                case 1:\n                  values = _c.sent();\n                  tx = {};\n                  [\"from\", \"to\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? _this._getAddress(v) : null;\n                    });\n                  });\n                  [\"gasLimit\", \"gasPrice\", \"maxFeePerGas\", \"maxPriorityFeePerGas\", \"value\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? bignumber_1.BigNumber.from(v) : null;\n                    });\n                  });\n                  [\"type\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v != null ? v : null;\n                    });\n                  });\n                  if (values.accessList) {\n                    tx.accessList = this.formatter.accessList(values.accessList);\n                  }\n                  [\"data\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? (0, bytes_1.hexlify)(v) : null;\n                    });\n                  });\n                  _b = (_a = this.formatter).transactionRequest;\n                  return [4, (0, properties_1.resolveProperties)(tx)];\n                case 2:\n                  return [2, _b.apply(_a, [_c.sent()])];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getFilter = function(filter) {\n          return __awaiter(this, void 0, void 0, function() {\n            var result, _a, _b;\n            var _this = this;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, filter];\n                case 1:\n                  filter = _c.sent();\n                  result = {};\n                  if (filter.address != null) {\n                    result.address = this._getAddress(filter.address);\n                  }\n                  [\"blockHash\", \"topics\"].forEach(function(key) {\n                    if (filter[key] == null) {\n                      return;\n                    }\n                    result[key] = filter[key];\n                  });\n                  [\"fromBlock\", \"toBlock\"].forEach(function(key) {\n                    if (filter[key] == null) {\n                      return;\n                    }\n                    result[key] = _this._getBlockTag(filter[key]);\n                  });\n                  _b = (_a = this.formatter).filter;\n                  return [4, (0, properties_1.resolveProperties)(result)];\n                case 2:\n                  return [2, _b.apply(_a, [_c.sent()])];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.call = function(transaction, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    transaction: this._getTransactionRequest(transaction),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"call\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"call\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.estimateGas = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    transaction: this._getTransactionRequest(transaction)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"estimateGas\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"estimateGas\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getAddress = function(addressOrName) {\n          return __awaiter(this, void 0, void 0, function() {\n            var address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, addressOrName];\n                case 1:\n                  addressOrName = _a.sent();\n                  if (typeof addressOrName !== \"string\") {\n                    logger.throwArgumentError(\"invalid address or ENS name\", \"name\", addressOrName);\n                  }\n                  return [4, this.resolveName(addressOrName)];\n                case 2:\n                  address = _a.sent();\n                  if (address == null) {\n                    logger.throwError(\"ENS name not configured\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                      operation: \"resolveName(\" + JSON.stringify(addressOrName) + \")\"\n                    });\n                  }\n                  return [2, address];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getBlock = function(blockHashOrBlockTag, includeTransactions) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber, params, _a, error_8;\n            var _this = this;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _b.sent();\n                  return [4, blockHashOrBlockTag];\n                case 2:\n                  blockHashOrBlockTag = _b.sent();\n                  blockNumber = -128;\n                  params = {\n                    includeTransactions: !!includeTransactions\n                  };\n                  if (!(0, bytes_1.isHexString)(blockHashOrBlockTag, 32)) return [3, 3];\n                  params.blockHash = blockHashOrBlockTag;\n                  return [3, 6];\n                case 3:\n                  _b.trys.push([3, 5, , 6]);\n                  _a = params;\n                  return [4, this._getBlockTag(blockHashOrBlockTag)];\n                case 4:\n                  _a.blockTag = _b.sent();\n                  if ((0, bytes_1.isHexString)(params.blockTag)) {\n                    blockNumber = parseInt(params.blockTag.substring(2), 16);\n                  }\n                  return [3, 6];\n                case 5:\n                  error_8 = _b.sent();\n                  logger.throwArgumentError(\"invalid block hash or block tag\", \"blockHashOrBlockTag\", blockHashOrBlockTag);\n                  return [3, 6];\n                case 6:\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var block, blockNumber_1, i, tx, confirmations, blockWithTxs;\n                      var _this2 = this;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getBlock\", params)];\n                          case 1:\n                            block = _a2.sent();\n                            if (block == null) {\n                              if (params.blockHash != null) {\n                                if (this._emitted[\"b:\" + params.blockHash] == null) {\n                                  return [2, null];\n                                }\n                              }\n                              if (params.blockTag != null) {\n                                if (blockNumber > this._emitted.block) {\n                                  return [2, null];\n                                }\n                              }\n                              return [2, void 0];\n                            }\n                            if (!includeTransactions) return [3, 8];\n                            blockNumber_1 = null;\n                            i = 0;\n                            _a2.label = 2;\n                          case 2:\n                            if (!(i < block.transactions.length)) return [3, 7];\n                            tx = block.transactions[i];\n                            if (!(tx.blockNumber == null)) return [3, 3];\n                            tx.confirmations = 0;\n                            return [3, 6];\n                          case 3:\n                            if (!(tx.confirmations == null)) return [3, 6];\n                            if (!(blockNumber_1 == null)) return [3, 5];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 4:\n                            blockNumber_1 = _a2.sent();\n                            _a2.label = 5;\n                          case 5:\n                            confirmations = blockNumber_1 - tx.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            tx.confirmations = confirmations;\n                            _a2.label = 6;\n                          case 6:\n                            i++;\n                            return [3, 2];\n                          case 7:\n                            blockWithTxs = this.formatter.blockWithTransactions(block);\n                            blockWithTxs.transactions = blockWithTxs.transactions.map(function(tx2) {\n                              return _this2._wrapTransaction(tx2);\n                            });\n                            return [2, blockWithTxs];\n                          case 8:\n                            return [2, this.formatter.block(block)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBlock = function(blockHashOrBlockTag) {\n          return this._getBlock(blockHashOrBlockTag, false);\n        };\n        BaseProvider2.prototype.getBlockWithTransactions = function(blockHashOrBlockTag) {\n          return this._getBlock(blockHashOrBlockTag, true);\n        };\n        BaseProvider2.prototype.getTransaction = function(transactionHash) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, transactionHash];\n                case 2:\n                  transactionHash = _a.sent();\n                  params = { transactionHash: this.formatter.hash(transactionHash, true) };\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var result, tx, blockNumber, confirmations;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getTransaction\", params)];\n                          case 1:\n                            result = _a2.sent();\n                            if (result == null) {\n                              if (this._emitted[\"t:\" + transactionHash] == null) {\n                                return [2, null];\n                              }\n                              return [2, void 0];\n                            }\n                            tx = this.formatter.transactionResponse(result);\n                            if (!(tx.blockNumber == null)) return [3, 2];\n                            tx.confirmations = 0;\n                            return [3, 4];\n                          case 2:\n                            if (!(tx.confirmations == null)) return [3, 4];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 3:\n                            blockNumber = _a2.sent();\n                            confirmations = blockNumber - tx.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            tx.confirmations = confirmations;\n                            _a2.label = 4;\n                          case 4:\n                            return [2, this._wrapTransaction(tx)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getTransactionReceipt = function(transactionHash) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, transactionHash];\n                case 2:\n                  transactionHash = _a.sent();\n                  params = { transactionHash: this.formatter.hash(transactionHash, true) };\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var result, receipt, blockNumber, confirmations;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getTransactionReceipt\", params)];\n                          case 1:\n                            result = _a2.sent();\n                            if (result == null) {\n                              if (this._emitted[\"t:\" + transactionHash] == null) {\n                                return [2, null];\n                              }\n                              return [2, void 0];\n                            }\n                            if (result.blockHash == null) {\n                              return [2, void 0];\n                            }\n                            receipt = this.formatter.receipt(result);\n                            if (!(receipt.blockNumber == null)) return [3, 2];\n                            receipt.confirmations = 0;\n                            return [3, 4];\n                          case 2:\n                            if (!(receipt.confirmations == null)) return [3, 4];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 3:\n                            blockNumber = _a2.sent();\n                            confirmations = blockNumber - receipt.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            receipt.confirmations = confirmations;\n                            _a2.label = 4;\n                          case 4:\n                            return [2, receipt];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getLogs = function(filter) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, logs;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({ filter: this._getFilter(filter) })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getLogs\", params)];\n                case 3:\n                  logs = _a.sent();\n                  logs.forEach(function(log) {\n                    if (log.removed == null) {\n                      log.removed = false;\n                    }\n                  });\n                  return [2, formatter_1.Formatter.arrayOf(this.formatter.filterLog.bind(this.formatter))(logs)];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getEtherPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [2, this.perform(\"getEtherPrice\", {})];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getBlockTag = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, blockTag];\n                case 1:\n                  blockTag = _a.sent();\n                  if (!(typeof blockTag === \"number\" && blockTag < 0)) return [3, 3];\n                  if (blockTag % 1) {\n                    logger.throwArgumentError(\"invalid BlockTag\", \"blockTag\", blockTag);\n                  }\n                  return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                case 2:\n                  blockNumber = _a.sent();\n                  blockNumber += blockTag;\n                  if (blockNumber < 0) {\n                    blockNumber = 0;\n                  }\n                  return [2, this.formatter.blockTag(blockNumber)];\n                case 3:\n                  return [2, this.formatter.blockTag(blockTag)];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getResolver = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var address, error_9;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  _a.trys.push([0, 2, , 3]);\n                  return [4, this._getResolver(name2)];\n                case 1:\n                  address = _a.sent();\n                  if (address == null) {\n                    return [2, null];\n                  }\n                  return [2, new Resolver(this, address, name2)];\n                case 2:\n                  error_9 = _a.sent();\n                  if (error_9.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  return [2, null];\n                case 3:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getResolver = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, transaction, _a, _b, error_10;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  network = _c.sent();\n                  if (!network.ensAddress) {\n                    logger.throwError(\"network does not support ENS\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"ENS\", network: network.name });\n                  }\n                  transaction = {\n                    to: network.ensAddress,\n                    data: \"0x0178b8bf\" + (0, hash_1.namehash)(name2).substring(2)\n                  };\n                  _c.label = 2;\n                case 2:\n                  _c.trys.push([2, 4, , 5]);\n                  _b = (_a = this.formatter).callAddress;\n                  return [4, this.call(transaction)];\n                case 3:\n                  return [2, _b.apply(_a, [_c.sent()])];\n                case 4:\n                  error_10 = _c.sent();\n                  if (error_10.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  throw error_10;\n                case 5:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.resolveName = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var resolver;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, name2];\n                case 1:\n                  name2 = _a.sent();\n                  try {\n                    return [2, Promise.resolve(this.formatter.address(name2))];\n                  } catch (error) {\n                    if ((0, bytes_1.isHexString)(name2)) {\n                      throw error;\n                    }\n                  }\n                  if (typeof name2 !== \"string\") {\n                    logger.throwArgumentError(\"invalid ENS name\", \"name\", name2);\n                  }\n                  return [4, this.getResolver(name2)];\n                case 2:\n                  resolver = _a.sent();\n                  if (!resolver) {\n                    return [2, null];\n                  }\n                  return [4, resolver.getAddress()];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.lookupAddress = function(address) {\n          return __awaiter(this, void 0, void 0, function() {\n            var reverseName, resolverAddress, bytes, _a, length, name2, addr;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, address];\n                case 1:\n                  address = _b.sent();\n                  address = this.formatter.address(address);\n                  reverseName = address.substring(2).toLowerCase() + \".addr.reverse\";\n                  return [4, this._getResolver(reverseName)];\n                case 2:\n                  resolverAddress = _b.sent();\n                  if (!resolverAddress) {\n                    return [2, null];\n                  }\n                  _a = bytes_1.arrayify;\n                  return [4, this.call({\n                    to: resolverAddress,\n                    data: \"0x691f3431\" + (0, hash_1.namehash)(reverseName).substring(2)\n                  })];\n                case 3:\n                  bytes = _a.apply(void 0, [_b.sent()]);\n                  if (bytes.length < 32 || !bignumber_1.BigNumber.from(bytes.slice(0, 32)).eq(32)) {\n                    return [2, null];\n                  }\n                  bytes = bytes.slice(32);\n                  if (bytes.length < 32) {\n                    return [2, null];\n                  }\n                  length = bignumber_1.BigNumber.from(bytes.slice(0, 32)).toNumber();\n                  bytes = bytes.slice(32);\n                  if (length > bytes.length) {\n                    return [2, null];\n                  }\n                  name2 = (0, strings_1.toUtf8String)(bytes.slice(0, length));\n                  return [4, this.resolveName(name2)];\n                case 4:\n                  addr = _b.sent();\n                  if (addr != address) {\n                    return [2, null];\n                  }\n                  return [2, name2];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getAvatar = function(nameOrAddress) {\n          return __awaiter(this, void 0, void 0, function() {\n            var resolver, address, reverseName, resolverAddress, avatar;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  resolver = null;\n                  if (!(0, bytes_1.isHexString)(nameOrAddress)) return [3, 2];\n                  address = this.formatter.address(nameOrAddress);\n                  reverseName = address.substring(2).toLowerCase() + \".addr.reverse\";\n                  return [4, this._getResolver(reverseName)];\n                case 1:\n                  resolverAddress = _a.sent();\n                  if (!resolverAddress) {\n                    return [2, null];\n                  }\n                  resolver = new Resolver(this, resolverAddress, \"_\", address);\n                  return [3, 4];\n                case 2:\n                  return [4, this.getResolver(nameOrAddress)];\n                case 3:\n                  resolver = _a.sent();\n                  if (!resolver) {\n                    return [2, null];\n                  }\n                  _a.label = 4;\n                case 4:\n                  return [4, resolver.getAvatar()];\n                case 5:\n                  avatar = _a.sent();\n                  if (avatar == null) {\n                    return [2, null];\n                  }\n                  return [2, avatar.url];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.perform = function(method, params) {\n          return logger.throwError(method + \" not implemented\", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method });\n        };\n        BaseProvider2.prototype._startEvent = function(event) {\n          this.polling = this._events.filter(function(e) {\n            return e.pollable();\n          }).length > 0;\n        };\n        BaseProvider2.prototype._stopEvent = function(event) {\n          this.polling = this._events.filter(function(e) {\n            return e.pollable();\n          }).length > 0;\n        };\n        BaseProvider2.prototype._addEventListener = function(eventName, listener, once) {\n          var event = new Event(getEventTag(eventName), listener, once);\n          this._events.push(event);\n          this._startEvent(event);\n          return this;\n        };\n        BaseProvider2.prototype.on = function(eventName, listener) {\n          return this._addEventListener(eventName, listener, false);\n        };\n        BaseProvider2.prototype.once = function(eventName, listener) {\n          return this._addEventListener(eventName, listener, true);\n        };\n        BaseProvider2.prototype.emit = function(eventName) {\n          var _this = this;\n          var args = [];\n          for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n          }\n          var result = false;\n          var stopped = [];\n          var eventTag = getEventTag(eventName);\n          this._events = this._events.filter(function(event) {\n            if (event.tag !== eventTag) {\n              return true;\n            }\n            setTimeout(function() {\n              event.listener.apply(_this, args);\n            }, 0);\n            result = true;\n            if (event.once) {\n              stopped.push(event);\n              return false;\n            }\n            return true;\n          });\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return result;\n        };\n        BaseProvider2.prototype.listenerCount = function(eventName) {\n          if (!eventName) {\n            return this._events.length;\n          }\n          var eventTag = getEventTag(eventName);\n          return this._events.filter(function(event) {\n            return event.tag === eventTag;\n          }).length;\n        };\n        BaseProvider2.prototype.listeners = function(eventName) {\n          if (eventName == null) {\n            return this._events.map(function(event) {\n              return event.listener;\n            });\n          }\n          var eventTag = getEventTag(eventName);\n          return this._events.filter(function(event) {\n            return event.tag === eventTag;\n          }).map(function(event) {\n            return event.listener;\n          });\n        };\n        BaseProvider2.prototype.off = function(eventName, listener) {\n          var _this = this;\n          if (listener == null) {\n            return this.removeAllListeners(eventName);\n          }\n          var stopped = [];\n          var found = false;\n          var eventTag = getEventTag(eventName);\n          this._events = this._events.filter(function(event) {\n            if (event.tag !== eventTag || event.listener != listener) {\n              return true;\n            }\n            if (found) {\n              return true;\n            }\n            found = true;\n            stopped.push(event);\n            return false;\n          });\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return this;\n        };\n        BaseProvider2.prototype.removeAllListeners = function(eventName) {\n          var _this = this;\n          var stopped = [];\n          if (eventName == null) {\n            stopped = this._events;\n            this._events = [];\n          } else {\n            var eventTag_1 = getEventTag(eventName);\n            this._events = this._events.filter(function(event) {\n              if (event.tag !== eventTag_1) {\n                return true;\n              }\n              stopped.push(event);\n              return false;\n            });\n          }\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return this;\n        };\n        return BaseProvider2;\n      }(abstract_provider_1.Provider)\n    );\n    exports2.BaseProvider = BaseProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/json-rpc-provider.js\nvar require_json_rpc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/json-rpc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.JsonRpcProvider = exports2.JsonRpcSigner = void 0;\n    var abstract_signer_1 = require_lib13();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var properties_1 = require_lib4();\n    var strings_1 = require_lib9();\n    var transactions_1 = require_lib15();\n    var web_1 = require_lib27();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var base_provider_1 = require_base_provider();\n    var errorGas = [\"call\", \"estimateGas\"];\n    function checkError(method, error, params) {\n      if (method === \"call\" && error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        var e = error.error;\n        if (e && e.message.match(\"reverted\") && (0, bytes_1.isHexString)(e.data)) {\n          return e.data;\n        }\n        logger.throwError(\"missing revert data in call exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n          error,\n          data: \"0x\"\n        });\n      }\n      var message = error.message;\n      if (error.code === logger_1.Logger.errors.SERVER_ERROR && error.error && typeof error.error.message === \"string\") {\n        message = error.error.message;\n      } else if (typeof error.body === \"string\") {\n        message = error.body;\n      } else if (typeof error.responseText === \"string\") {\n        message = error.responseText;\n      }\n      message = (message || \"\").toLowerCase();\n      var transaction = params.transaction || params.signedTransaction;\n      if (message.match(/insufficient funds|base fee exceeds gas limit/)) {\n        logger.throwError(\"insufficient funds for intrinsic transaction cost\", logger_1.Logger.errors.INSUFFICIENT_FUNDS, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/nonce too low/)) {\n        logger.throwError(\"nonce has already been used\", logger_1.Logger.errors.NONCE_EXPIRED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/replacement transaction underpriced/)) {\n        logger.throwError(\"replacement fee too low\", logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/only replay-protected/)) {\n        logger.throwError(\"legacy pre-eip-155 transactions not supported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (errorGas.indexOf(method) >= 0 && message.match(/gas required exceeds allowance|always failing transaction|execution reverted/)) {\n        logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n          error,\n          method,\n          transaction\n        });\n      }\n      throw error;\n    }\n    function timer(timeout) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, timeout);\n      });\n    }\n    function getResult(payload) {\n      if (payload.error) {\n        var error = new Error(payload.error.message);\n        error.code = payload.error.code;\n        error.data = payload.error.data;\n        throw error;\n      }\n      return payload.result;\n    }\n    function getLowerCase(value) {\n      if (value) {\n        return value.toLowerCase();\n      }\n      return value;\n    }\n    var _constructorGuard = {};\n    var JsonRpcSigner = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcSigner2, _super);\n        function JsonRpcSigner2(constructorGuard, provider, addressOrIndex) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, JsonRpcSigner2);\n          _this = _super.call(this) || this;\n          if (constructorGuard !== _constructorGuard) {\n            throw new Error(\"do not call the JsonRpcSigner constructor directly; use provider.getSigner\");\n          }\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider);\n          if (addressOrIndex == null) {\n            addressOrIndex = 0;\n          }\n          if (typeof addressOrIndex === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"_address\", _this.provider.formatter.address(addressOrIndex));\n            (0, properties_1.defineReadOnly)(_this, \"_index\", null);\n          } else if (typeof addressOrIndex === \"number\") {\n            (0, properties_1.defineReadOnly)(_this, \"_index\", addressOrIndex);\n            (0, properties_1.defineReadOnly)(_this, \"_address\", null);\n          } else {\n            logger.throwArgumentError(\"invalid address or index\", \"addressOrIndex\", addressOrIndex);\n          }\n          return _this;\n        }\n        JsonRpcSigner2.prototype.connect = function(provider) {\n          return logger.throwError(\"cannot alter JSON-RPC Signer connection\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"connect\"\n          });\n        };\n        JsonRpcSigner2.prototype.connectUnchecked = function() {\n          return new UncheckedJsonRpcSigner(_constructorGuard, this.provider, this._address || this._index);\n        };\n        JsonRpcSigner2.prototype.getAddress = function() {\n          var _this = this;\n          if (this._address) {\n            return Promise.resolve(this._address);\n          }\n          return this.provider.send(\"eth_accounts\", []).then(function(accounts) {\n            if (accounts.length <= _this._index) {\n              logger.throwError(\"unknown account #\" + _this._index, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"getAddress\"\n              });\n            }\n            return _this.provider.formatter.address(accounts[_this._index]);\n          });\n        };\n        JsonRpcSigner2.prototype.sendUncheckedTransaction = function(transaction) {\n          var _this = this;\n          transaction = (0, properties_1.shallowCopy)(transaction);\n          var fromAddress = this.getAddress().then(function(address) {\n            if (address) {\n              address = address.toLowerCase();\n            }\n            return address;\n          });\n          if (transaction.gasLimit == null) {\n            var estimate = (0, properties_1.shallowCopy)(transaction);\n            estimate.from = fromAddress;\n            transaction.gasLimit = this.provider.estimateGas(estimate);\n          }\n          if (transaction.to != null) {\n            transaction.to = Promise.resolve(transaction.to).then(function(to) {\n              return __awaiter(_this, void 0, void 0, function() {\n                var address;\n                return __generator(this, function(_a) {\n                  switch (_a.label) {\n                    case 0:\n                      if (to == null) {\n                        return [2, null];\n                      }\n                      return [4, this.provider.resolveName(to)];\n                    case 1:\n                      address = _a.sent();\n                      if (address == null) {\n                        logger.throwArgumentError(\"provided ENS name resolves to null\", \"tx.to\", to);\n                      }\n                      return [2, address];\n                  }\n                });\n              });\n            });\n          }\n          return (0, properties_1.resolveProperties)({\n            tx: (0, properties_1.resolveProperties)(transaction),\n            sender: fromAddress\n          }).then(function(_a) {\n            var tx = _a.tx, sender = _a.sender;\n            if (tx.from != null) {\n              if (tx.from.toLowerCase() !== sender) {\n                logger.throwArgumentError(\"from address mismatch\", \"transaction\", transaction);\n              }\n            } else {\n              tx.from = sender;\n            }\n            var hexTx = _this.provider.constructor.hexlifyTransaction(tx, { from: true });\n            return _this.provider.send(\"eth_sendTransaction\", [hexTx]).then(function(hash) {\n              return hash;\n            }, function(error) {\n              return checkError(\"sendTransaction\", error, hexTx);\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.signTransaction = function(transaction) {\n          return logger.throwError(\"signing transactions is unsupported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"signTransaction\"\n          });\n        };\n        JsonRpcSigner2.prototype.sendTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber, hash, error_1;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.provider._getInternalBlockNumber(100 + 2 * this.provider.pollingInterval)];\n                case 1:\n                  blockNumber = _a.sent();\n                  return [4, this.sendUncheckedTransaction(transaction)];\n                case 2:\n                  hash = _a.sent();\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var tx;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.provider.getTransaction(hash)];\n                          case 1:\n                            tx = _a2.sent();\n                            if (tx === null) {\n                              return [2, void 0];\n                            }\n                            return [2, this.provider._wrapTransaction(tx, hash, blockNumber)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this.provider })];\n                case 4:\n                  return [2, _a.sent()];\n                case 5:\n                  error_1 = _a.sent();\n                  error_1.transactionHash = hash;\n                  throw error_1;\n                case 6:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.signMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            var data, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  data = typeof message === \"string\" ? (0, strings_1.toUtf8Bytes)(message) : message;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"personal_sign\", [(0, bytes_1.hexlify)(data), address.toLowerCase()])];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype._legacySignMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            var data, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  data = typeof message === \"string\" ? (0, strings_1.toUtf8Bytes)(message) : message;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"eth_sign\", [address.toLowerCase(), (0, bytes_1.hexlify)(data)])];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype._signTypedData = function(domain, types, value) {\n          return __awaiter(this, void 0, void 0, function() {\n            var populated, address;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, hash_1._TypedDataEncoder.resolveNames(domain, types, value, function(name2) {\n                    return _this.provider.resolveName(name2);\n                  })];\n                case 1:\n                  populated = _a.sent();\n                  return [4, this.getAddress()];\n                case 2:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"eth_signTypedData_v4\", [\n                    address.toLowerCase(),\n                    JSON.stringify(hash_1._TypedDataEncoder.getPayload(populated.domain, types, populated.value))\n                  ])];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.unlock = function(password) {\n          return __awaiter(this, void 0, void 0, function() {\n            var provider, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  provider = this.provider;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [2, provider.send(\"personal_unlockAccount\", [address.toLowerCase(), password, null])];\n              }\n            });\n          });\n        };\n        return JsonRpcSigner2;\n      }(abstract_signer_1.Signer)\n    );\n    exports2.JsonRpcSigner = JsonRpcSigner;\n    var UncheckedJsonRpcSigner = (\n      /** @class */\n      function(_super) {\n        __extends(UncheckedJsonRpcSigner2, _super);\n        function UncheckedJsonRpcSigner2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        UncheckedJsonRpcSigner2.prototype.sendTransaction = function(transaction) {\n          var _this = this;\n          return this.sendUncheckedTransaction(transaction).then(function(hash) {\n            return {\n              hash,\n              nonce: null,\n              gasLimit: null,\n              gasPrice: null,\n              data: null,\n              value: null,\n              chainId: null,\n              confirmations: 0,\n              from: null,\n              wait: function(confirmations) {\n                return _this.provider.waitForTransaction(hash, confirmations);\n              }\n            };\n          });\n        };\n        return UncheckedJsonRpcSigner2;\n      }(JsonRpcSigner)\n    );\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      value: true,\n      type: true,\n      accessList: true,\n      maxFeePerGas: true,\n      maxPriorityFeePerGas: true\n    };\n    var JsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcProvider2, _super);\n        function JsonRpcProvider2(url, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, JsonRpcProvider2);\n          var networkOrReady = network;\n          if (networkOrReady == null) {\n            networkOrReady = new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                _this.detectNetwork().then(function(network2) {\n                  resolve(network2);\n                }, function(error) {\n                  reject(error);\n                });\n              }, 0);\n            });\n          }\n          _this = _super.call(this, networkOrReady) || this;\n          if (!url) {\n            url = (0, properties_1.getStatic)(_this.constructor, \"defaultUrl\")();\n          }\n          if (typeof url === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"connection\", Object.freeze({\n              url\n            }));\n          } else {\n            (0, properties_1.defineReadOnly)(_this, \"connection\", Object.freeze((0, properties_1.shallowCopy)(url)));\n          }\n          _this._nextId = 42;\n          return _this;\n        }\n        Object.defineProperty(JsonRpcProvider2.prototype, \"_cache\", {\n          get: function() {\n            if (this._eventLoopCache == null) {\n              this._eventLoopCache = {};\n            }\n            return this._eventLoopCache;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        JsonRpcProvider2.defaultUrl = function() {\n          return \"http://localhost:8545\";\n        };\n        JsonRpcProvider2.prototype.detectNetwork = function() {\n          var _this = this;\n          if (!this._cache[\"detectNetwork\"]) {\n            this._cache[\"detectNetwork\"] = this._uncachedDetectNetwork();\n            setTimeout(function() {\n              _this._cache[\"detectNetwork\"] = null;\n            }, 0);\n          }\n          return this._cache[\"detectNetwork\"];\n        };\n        JsonRpcProvider2.prototype._uncachedDetectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var chainId, error_2, error_3, getNetwork;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, timer(0)];\n                case 1:\n                  _a.sent();\n                  chainId = null;\n                  _a.label = 2;\n                case 2:\n                  _a.trys.push([2, 4, , 9]);\n                  return [4, this.send(\"eth_chainId\", [])];\n                case 3:\n                  chainId = _a.sent();\n                  return [3, 9];\n                case 4:\n                  error_2 = _a.sent();\n                  _a.label = 5;\n                case 5:\n                  _a.trys.push([5, 7, , 8]);\n                  return [4, this.send(\"net_version\", [])];\n                case 6:\n                  chainId = _a.sent();\n                  return [3, 8];\n                case 7:\n                  error_3 = _a.sent();\n                  return [3, 8];\n                case 8:\n                  return [3, 9];\n                case 9:\n                  if (chainId != null) {\n                    getNetwork = (0, properties_1.getStatic)(this.constructor, \"getNetwork\");\n                    try {\n                      return [2, getNetwork(bignumber_1.BigNumber.from(chainId).toNumber())];\n                    } catch (error) {\n                      return [2, logger.throwError(\"could not detect network\", logger_1.Logger.errors.NETWORK_ERROR, {\n                        chainId,\n                        event: \"invalidNetwork\",\n                        serverError: error\n                      })];\n                    }\n                  }\n                  return [2, logger.throwError(\"could not detect network\", logger_1.Logger.errors.NETWORK_ERROR, {\n                    event: \"noNetwork\"\n                  })];\n              }\n            });\n          });\n        };\n        JsonRpcProvider2.prototype.getSigner = function(addressOrIndex) {\n          return new JsonRpcSigner(_constructorGuard, this, addressOrIndex);\n        };\n        JsonRpcProvider2.prototype.getUncheckedSigner = function(addressOrIndex) {\n          return this.getSigner(addressOrIndex).connectUnchecked();\n        };\n        JsonRpcProvider2.prototype.listAccounts = function() {\n          var _this = this;\n          return this.send(\"eth_accounts\", []).then(function(accounts) {\n            return accounts.map(function(a) {\n              return _this.formatter.address(a);\n            });\n          });\n        };\n        JsonRpcProvider2.prototype.send = function(method, params) {\n          var _this = this;\n          var request = {\n            method,\n            params,\n            id: this._nextId++,\n            jsonrpc: \"2.0\"\n          };\n          this.emit(\"debug\", {\n            action: \"request\",\n            request: (0, properties_1.deepCopy)(request),\n            provider: this\n          });\n          var cache = [\"eth_chainId\", \"eth_blockNumber\"].indexOf(method) >= 0;\n          if (cache && this._cache[method]) {\n            return this._cache[method];\n          }\n          var result = (0, web_1.fetchJson)(this.connection, JSON.stringify(request), getResult).then(function(result2) {\n            _this.emit(\"debug\", {\n              action: \"response\",\n              request,\n              response: result2,\n              provider: _this\n            });\n            return result2;\n          }, function(error) {\n            _this.emit(\"debug\", {\n              action: \"response\",\n              error,\n              request,\n              provider: _this\n            });\n            throw error;\n          });\n          if (cache) {\n            this._cache[method] = result;\n            setTimeout(function() {\n              _this._cache[method] = null;\n            }, 0);\n          }\n          return result;\n        };\n        JsonRpcProvider2.prototype.prepareRequest = function(method, params) {\n          switch (method) {\n            case \"getBlockNumber\":\n              return [\"eth_blockNumber\", []];\n            case \"getGasPrice\":\n              return [\"eth_gasPrice\", []];\n            case \"getBalance\":\n              return [\"eth_getBalance\", [getLowerCase(params.address), params.blockTag]];\n            case \"getTransactionCount\":\n              return [\"eth_getTransactionCount\", [getLowerCase(params.address), params.blockTag]];\n            case \"getCode\":\n              return [\"eth_getCode\", [getLowerCase(params.address), params.blockTag]];\n            case \"getStorageAt\":\n              return [\"eth_getStorageAt\", [getLowerCase(params.address), params.position, params.blockTag]];\n            case \"sendTransaction\":\n              return [\"eth_sendRawTransaction\", [params.signedTransaction]];\n            case \"getBlock\":\n              if (params.blockTag) {\n                return [\"eth_getBlockByNumber\", [params.blockTag, !!params.includeTransactions]];\n              } else if (params.blockHash) {\n                return [\"eth_getBlockByHash\", [params.blockHash, !!params.includeTransactions]];\n              }\n              return null;\n            case \"getTransaction\":\n              return [\"eth_getTransactionByHash\", [params.transactionHash]];\n            case \"getTransactionReceipt\":\n              return [\"eth_getTransactionReceipt\", [params.transactionHash]];\n            case \"call\": {\n              var hexlifyTransaction = (0, properties_1.getStatic)(this.constructor, \"hexlifyTransaction\");\n              return [\"eth_call\", [hexlifyTransaction(params.transaction, { from: true }), params.blockTag]];\n            }\n            case \"estimateGas\": {\n              var hexlifyTransaction = (0, properties_1.getStatic)(this.constructor, \"hexlifyTransaction\");\n              return [\"eth_estimateGas\", [hexlifyTransaction(params.transaction, { from: true })]];\n            }\n            case \"getLogs\":\n              if (params.filter && params.filter.address != null) {\n                params.filter.address = getLowerCase(params.filter.address);\n              }\n              return [\"eth_getLogs\", [params.filter]];\n            default:\n              break;\n          }\n          return null;\n        };\n        JsonRpcProvider2.prototype.perform = function(method, params) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, feeData, args, error_4;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"call\" || method === \"estimateGas\")) return [3, 2];\n                  tx = params.transaction;\n                  if (!(tx && tx.type != null && bignumber_1.BigNumber.from(tx.type).isZero())) return [3, 2];\n                  if (!(tx.maxFeePerGas == null && tx.maxPriorityFeePerGas == null)) return [3, 2];\n                  return [4, this.getFeeData()];\n                case 1:\n                  feeData = _a.sent();\n                  if (feeData.maxFeePerGas == null && feeData.maxPriorityFeePerGas == null) {\n                    params = (0, properties_1.shallowCopy)(params);\n                    params.transaction = (0, properties_1.shallowCopy)(tx);\n                    delete params.transaction.type;\n                  }\n                  _a.label = 2;\n                case 2:\n                  args = this.prepareRequest(method, params);\n                  if (args == null) {\n                    logger.throwError(method + \" not implemented\", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method });\n                  }\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, this.send(args[0], args[1])];\n                case 4:\n                  return [2, _a.sent()];\n                case 5:\n                  error_4 = _a.sent();\n                  return [2, checkError(method, error_4, params)];\n                case 6:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        JsonRpcProvider2.prototype._startEvent = function(event) {\n          if (event.tag === \"pending\") {\n            this._startPending();\n          }\n          _super.prototype._startEvent.call(this, event);\n        };\n        JsonRpcProvider2.prototype._startPending = function() {\n          if (this._pendingFilter != null) {\n            return;\n          }\n          var self2 = this;\n          var pendingFilter = this.send(\"eth_newPendingTransactionFilter\", []);\n          this._pendingFilter = pendingFilter;\n          pendingFilter.then(function(filterId) {\n            function poll() {\n              self2.send(\"eth_getFilterChanges\", [filterId]).then(function(hashes) {\n                if (self2._pendingFilter != pendingFilter) {\n                  return null;\n                }\n                var seq = Promise.resolve();\n                hashes.forEach(function(hash) {\n                  self2._emitted[\"t:\" + hash.toLowerCase()] = \"pending\";\n                  seq = seq.then(function() {\n                    return self2.getTransaction(hash).then(function(tx) {\n                      self2.emit(\"pending\", tx);\n                      return null;\n                    });\n                  });\n                });\n                return seq.then(function() {\n                  return timer(1e3);\n                });\n              }).then(function() {\n                if (self2._pendingFilter != pendingFilter) {\n                  self2.send(\"eth_uninstallFilter\", [filterId]);\n                  return;\n                }\n                setTimeout(function() {\n                  poll();\n                }, 0);\n                return null;\n              }).catch(function(error) {\n              });\n            }\n            poll();\n            return filterId;\n          }).catch(function(error) {\n          });\n        };\n        JsonRpcProvider2.prototype._stopEvent = function(event) {\n          if (event.tag === \"pending\" && this.listenerCount(\"pending\") === 0) {\n            this._pendingFilter = null;\n          }\n          _super.prototype._stopEvent.call(this, event);\n        };\n        JsonRpcProvider2.hexlifyTransaction = function(transaction, allowExtra) {\n          var allowed = (0, properties_1.shallowCopy)(allowedTransactionKeys);\n          if (allowExtra) {\n            for (var key in allowExtra) {\n              if (allowExtra[key]) {\n                allowed[key] = true;\n              }\n            }\n          }\n          (0, properties_1.checkProperties)(transaction, allowed);\n          var result = {};\n          [\"gasLimit\", \"gasPrice\", \"type\", \"maxFeePerGas\", \"maxPriorityFeePerGas\", \"nonce\", \"value\"].forEach(function(key2) {\n            if (transaction[key2] == null) {\n              return;\n            }\n            var value = (0, bytes_1.hexValue)(transaction[key2]);\n            if (key2 === \"gasLimit\") {\n              key2 = \"gas\";\n            }\n            result[key2] = value;\n          });\n          [\"from\", \"to\", \"data\"].forEach(function(key2) {\n            if (transaction[key2] == null) {\n              return;\n            }\n            result[key2] = (0, bytes_1.hexlify)(transaction[key2]);\n          });\n          if (transaction.accessList) {\n            result[\"accessList\"] = (0, transactions_1.accessListify)(transaction.accessList);\n          }\n          return result;\n        };\n        return JsonRpcProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.JsonRpcProvider = JsonRpcProvider;\n  }\n});\n\n// node_modules/ws/lib/constants.js\nvar require_constants = __commonJS({\n  \"node_modules/ws/lib/constants.js\"(exports2, module2) {\n    \"use strict\";\n    module2.exports = {\n      BINARY_TYPES: [\"nodebuffer\", \"arraybuffer\", \"fragments\"],\n      GUID: \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\",\n      kStatusCode: Symbol(\"status-code\"),\n      kWebSocket: Symbol(\"websocket\"),\n      EMPTY_BUFFER: Buffer.alloc(0),\n      NOOP: () => {\n      }\n    };\n  }\n});\n\n// node_modules/ws/lib/buffer-util.js\nvar require_buffer_util = __commonJS({\n  \"node_modules/ws/lib/buffer-util.js\"(exports2, module2) {\n    \"use strict\";\n    var { EMPTY_BUFFER } = require_constants();\n    function concat(list, totalLength) {\n      if (list.length === 0) return EMPTY_BUFFER;\n      if (list.length === 1) return list[0];\n      const target = Buffer.allocUnsafe(totalLength);\n      let offset = 0;\n      for (let i = 0; i < list.length; i++) {\n        const buf = list[i];\n        target.set(buf, offset);\n        offset += buf.length;\n      }\n      if (offset < totalLength) return target.slice(0, offset);\n      return target;\n    }\n    function _mask(source, mask, output, offset, length) {\n      for (let i = 0; i < length; i++) {\n        output[offset + i] = source[i] ^ mask[i & 3];\n      }\n    }\n    function _unmask(buffer, mask) {\n      const length = buffer.length;\n      for (let i = 0; i < length; i++) {\n        buffer[i] ^= mask[i & 3];\n      }\n    }\n    function toArrayBuffer(buf) {\n      if (buf.byteLength === buf.buffer.byteLength) {\n        return buf.buffer;\n      }\n      return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n    }\n    function toBuffer(data) {\n      toBuffer.readOnly = true;\n      if (Buffer.isBuffer(data)) return data;\n      let buf;\n      if (data instanceof ArrayBuffer) {\n        buf = Buffer.from(data);\n      } else if (ArrayBuffer.isView(data)) {\n        buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n      } else {\n        buf = Buffer.from(data);\n        toBuffer.readOnly = false;\n      }\n      return buf;\n    }\n    try {\n      const bufferUtil = require(\"bufferutil\");\n      const bu = bufferUtil.BufferUtil || bufferUtil;\n      module2.exports = {\n        concat,\n        mask(source, mask, output, offset, length) {\n          if (length < 48) _mask(source, mask, output, offset, length);\n          else bu.mask(source, mask, output, offset, length);\n        },\n        toArrayBuffer,\n        toBuffer,\n        unmask(buffer, mask) {\n          if (buffer.length < 32) _unmask(buffer, mask);\n          else bu.unmask(buffer, mask);\n        }\n      };\n    } catch (e) {\n      module2.exports = {\n        concat,\n        mask: _mask,\n        toArrayBuffer,\n        toBuffer,\n        unmask: _unmask\n      };\n    }\n  }\n});\n\n// node_modules/ws/lib/limiter.js\nvar require_limiter = __commonJS({\n  \"node_modules/ws/lib/limiter.js\"(exports2, module2) {\n    \"use strict\";\n    var kDone = Symbol(\"kDone\");\n    var kRun = Symbol(\"kRun\");\n    var Limiter = class {\n      /**\n       * Creates a new `Limiter`.\n       *\n       * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n       *     to run concurrently\n       */\n      constructor(concurrency) {\n        this[kDone] = () => {\n          this.pending--;\n          this[kRun]();\n        };\n        this.concurrency = concurrency || Infinity;\n        this.jobs = [];\n        this.pending = 0;\n      }\n      /**\n       * Adds a job to the queue.\n       *\n       * @param {Function} job The job to run\n       * @public\n       */\n      add(job) {\n        this.jobs.push(job);\n        this[kRun]();\n      }\n      /**\n       * Removes a job from the queue and runs it if possible.\n       *\n       * @private\n       */\n      [kRun]() {\n        if (this.pending === this.concurrency) return;\n        if (this.jobs.length) {\n          const job = this.jobs.shift();\n          this.pending++;\n          job(this[kDone]);\n        }\n      }\n    };\n    module2.exports = Limiter;\n  }\n});\n\n// node_modules/ws/lib/permessage-deflate.js\nvar require_permessage_deflate = __commonJS({\n  \"node_modules/ws/lib/permessage-deflate.js\"(exports2, module2) {\n    \"use strict\";\n    var zlib = require(\"zlib\");\n    var bufferUtil = require_buffer_util();\n    var Limiter = require_limiter();\n    var { kStatusCode, NOOP } = require_constants();\n    var TRAILER = Buffer.from([0, 0, 255, 255]);\n    var kPerMessageDeflate = Symbol(\"permessage-deflate\");\n    var kTotalLength = Symbol(\"total-length\");\n    var kCallback = Symbol(\"callback\");\n    var kBuffers = Symbol(\"buffers\");\n    var kError = Symbol(\"error\");\n    var zlibLimiter;\n    var PerMessageDeflate = class {\n      /**\n       * Creates a PerMessageDeflate instance.\n       *\n       * @param {Object} [options] Configuration options\n       * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n       *     disabling of server context takeover\n       * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n       *     acknowledge disabling of client context takeover\n       * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n       *     use of a custom server window size\n       * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n       *     for, or request, a custom client window size\n       * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n       *     deflate\n       * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n       *     inflate\n       * @param {Number} [options.threshold=1024] Size (in bytes) below which\n       *     messages should not be compressed\n       * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n       *     calls to zlib\n       * @param {Boolean} [isServer=false] Create the instance in either server or\n       *     client mode\n       * @param {Number} [maxPayload=0] The maximum allowed message length\n       */\n      constructor(options, isServer, maxPayload) {\n        this._maxPayload = maxPayload | 0;\n        this._options = options || {};\n        this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024;\n        this._isServer = !!isServer;\n        this._deflate = null;\n        this._inflate = null;\n        this.params = null;\n        if (!zlibLimiter) {\n          const concurrency = this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10;\n          zlibLimiter = new Limiter(concurrency);\n        }\n      }\n      /**\n       * @type {String}\n       */\n      static get extensionName() {\n        return \"permessage-deflate\";\n      }\n      /**\n       * Create an extension negotiation offer.\n       *\n       * @return {Object} Extension parameters\n       * @public\n       */\n      offer() {\n        const params = {};\n        if (this._options.serverNoContextTakeover) {\n          params.server_no_context_takeover = true;\n        }\n        if (this._options.clientNoContextTakeover) {\n          params.client_no_context_takeover = true;\n        }\n        if (this._options.serverMaxWindowBits) {\n          params.server_max_window_bits = this._options.serverMaxWindowBits;\n        }\n        if (this._options.clientMaxWindowBits) {\n          params.client_max_window_bits = this._options.clientMaxWindowBits;\n        } else if (this._options.clientMaxWindowBits == null) {\n          params.client_max_window_bits = true;\n        }\n        return params;\n      }\n      /**\n       * Accept an extension negotiation offer/response.\n       *\n       * @param {Array} configurations The extension negotiation offers/reponse\n       * @return {Object} Accepted configuration\n       * @public\n       */\n      accept(configurations) {\n        configurations = this.normalizeParams(configurations);\n        this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations);\n        return this.params;\n      }\n      /**\n       * Releases all resources used by the extension.\n       *\n       * @public\n       */\n      cleanup() {\n        if (this._inflate) {\n          this._inflate.close();\n          this._inflate = null;\n        }\n        if (this._deflate) {\n          const callback = this._deflate[kCallback];\n          this._deflate.close();\n          this._deflate = null;\n          if (callback) {\n            callback(\n              new Error(\n                \"The deflate stream was closed while data was being processed\"\n              )\n            );\n          }\n        }\n      }\n      /**\n       *  Accept an extension negotiation offer.\n       *\n       * @param {Array} offers The extension negotiation offers\n       * @return {Object} Accepted configuration\n       * @private\n       */\n      acceptAsServer(offers) {\n        const opts = this._options;\n        const accepted = offers.find((params) => {\n          if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === \"number\" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === \"number\" && !params.client_max_window_bits) {\n            return false;\n          }\n          return true;\n        });\n        if (!accepted) {\n          throw new Error(\"None of the extension offers can be accepted\");\n        }\n        if (opts.serverNoContextTakeover) {\n          accepted.server_no_context_takeover = true;\n        }\n        if (opts.clientNoContextTakeover) {\n          accepted.client_no_context_takeover = true;\n        }\n        if (typeof opts.serverMaxWindowBits === \"number\") {\n          accepted.server_max_window_bits = opts.serverMaxWindowBits;\n        }\n        if (typeof opts.clientMaxWindowBits === \"number\") {\n          accepted.client_max_window_bits = opts.clientMaxWindowBits;\n        } else if (accepted.client_max_window_bits === true || opts.clientMaxWindowBits === false) {\n          delete accepted.client_max_window_bits;\n        }\n        return accepted;\n      }\n      /**\n       * Accept the extension negotiation response.\n       *\n       * @param {Array} response The extension negotiation response\n       * @return {Object} Accepted configuration\n       * @private\n       */\n      acceptAsClient(response) {\n        const params = response[0];\n        if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) {\n          throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n        }\n        if (!params.client_max_window_bits) {\n          if (typeof this._options.clientMaxWindowBits === \"number\") {\n            params.client_max_window_bits = this._options.clientMaxWindowBits;\n          }\n        } else if (this._options.clientMaxWindowBits === false || typeof this._options.clientMaxWindowBits === \"number\" && params.client_max_window_bits > this._options.clientMaxWindowBits) {\n          throw new Error(\n            'Unexpected or invalid parameter \"client_max_window_bits\"'\n          );\n        }\n        return params;\n      }\n      /**\n       * Normalize parameters.\n       *\n       * @param {Array} configurations The extension negotiation offers/reponse\n       * @return {Array} The offers/response with normalized parameters\n       * @private\n       */\n      normalizeParams(configurations) {\n        configurations.forEach((params) => {\n          Object.keys(params).forEach((key) => {\n            let value = params[key];\n            if (value.length > 1) {\n              throw new Error(`Parameter \"${key}\" must have only a single value`);\n            }\n            value = value[0];\n            if (key === \"client_max_window_bits\") {\n              if (value !== true) {\n                const num = +value;\n                if (!Number.isInteger(num) || num < 8 || num > 15) {\n                  throw new TypeError(\n                    `Invalid value for parameter \"${key}\": ${value}`\n                  );\n                }\n                value = num;\n              } else if (!this._isServer) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n            } else if (key === \"server_max_window_bits\") {\n              const num = +value;\n              if (!Number.isInteger(num) || num < 8 || num > 15) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n              value = num;\n            } else if (key === \"client_no_context_takeover\" || key === \"server_no_context_takeover\") {\n              if (value !== true) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n            } else {\n              throw new Error(`Unknown parameter \"${key}\"`);\n            }\n            params[key] = value;\n          });\n        });\n        return configurations;\n      }\n      /**\n       * Decompress data. Concurrency limited.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @public\n       */\n      decompress(data, fin, callback) {\n        zlibLimiter.add((done) => {\n          this._decompress(data, fin, (err, result) => {\n            done();\n            callback(err, result);\n          });\n        });\n      }\n      /**\n       * Compress data. Concurrency limited.\n       *\n       * @param {Buffer} data Data to compress\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @public\n       */\n      compress(data, fin, callback) {\n        zlibLimiter.add((done) => {\n          this._compress(data, fin, (err, result) => {\n            done();\n            callback(err, result);\n          });\n        });\n      }\n      /**\n       * Decompress data.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @private\n       */\n      _decompress(data, fin, callback) {\n        const endpoint = this._isServer ? \"client\" : \"server\";\n        if (!this._inflate) {\n          const key = `${endpoint}_max_window_bits`;\n          const windowBits = typeof this.params[key] !== \"number\" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key];\n          this._inflate = zlib.createInflateRaw({\n            ...this._options.zlibInflateOptions,\n            windowBits\n          });\n          this._inflate[kPerMessageDeflate] = this;\n          this._inflate[kTotalLength] = 0;\n          this._inflate[kBuffers] = [];\n          this._inflate.on(\"error\", inflateOnError);\n          this._inflate.on(\"data\", inflateOnData);\n        }\n        this._inflate[kCallback] = callback;\n        this._inflate.write(data);\n        if (fin) this._inflate.write(TRAILER);\n        this._inflate.flush(() => {\n          const err = this._inflate[kError];\n          if (err) {\n            this._inflate.close();\n            this._inflate = null;\n            callback(err);\n            return;\n          }\n          const data2 = bufferUtil.concat(\n            this._inflate[kBuffers],\n            this._inflate[kTotalLength]\n          );\n          if (this._inflate._readableState.endEmitted) {\n            this._inflate.close();\n            this._inflate = null;\n          } else {\n            this._inflate[kTotalLength] = 0;\n            this._inflate[kBuffers] = [];\n            if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n              this._inflate.reset();\n            }\n          }\n          callback(null, data2);\n        });\n      }\n      /**\n       * Compress data.\n       *\n       * @param {Buffer} data Data to compress\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @private\n       */\n      _compress(data, fin, callback) {\n        const endpoint = this._isServer ? \"server\" : \"client\";\n        if (!this._deflate) {\n          const key = `${endpoint}_max_window_bits`;\n          const windowBits = typeof this.params[key] !== \"number\" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key];\n          this._deflate = zlib.createDeflateRaw({\n            ...this._options.zlibDeflateOptions,\n            windowBits\n          });\n          this._deflate[kTotalLength] = 0;\n          this._deflate[kBuffers] = [];\n          this._deflate.on(\"error\", NOOP);\n          this._deflate.on(\"data\", deflateOnData);\n        }\n        this._deflate[kCallback] = callback;\n        this._deflate.write(data);\n        this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n          if (!this._deflate) {\n            return;\n          }\n          let data2 = bufferUtil.concat(\n            this._deflate[kBuffers],\n            this._deflate[kTotalLength]\n          );\n          if (fin) data2 = data2.slice(0, data2.length - 4);\n          this._deflate[kCallback] = null;\n          this._deflate[kTotalLength] = 0;\n          this._deflate[kBuffers] = [];\n          if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n            this._deflate.reset();\n          }\n          callback(null, data2);\n        });\n      }\n    };\n    module2.exports = PerMessageDeflate;\n    function deflateOnData(chunk) {\n      this[kBuffers].push(chunk);\n      this[kTotalLength] += chunk.length;\n    }\n    function inflateOnData(chunk) {\n      this[kTotalLength] += chunk.length;\n      if (this[kPerMessageDeflate]._maxPayload < 1 || this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload) {\n        this[kBuffers].push(chunk);\n        return;\n      }\n      this[kError] = new RangeError(\"Max payload size exceeded\");\n      this[kError][kStatusCode] = 1009;\n      this.removeListener(\"data\", inflateOnData);\n      this.reset();\n    }\n    function inflateOnError(err) {\n      this[kPerMessageDeflate]._inflate = null;\n      err[kStatusCode] = 1007;\n      this[kCallback](err);\n    }\n  }\n});\n\n// node_modules/ws/lib/validation.js\nvar require_validation = __commonJS({\n  \"node_modules/ws/lib/validation.js\"(exports2, module2) {\n    \"use strict\";\n    function isValidStatusCode(code) {\n      return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999;\n    }\n    function _isValidUTF8(buf) {\n      const len = buf.length;\n      let i = 0;\n      while (i < len) {\n        if ((buf[i] & 128) === 0) {\n          i++;\n        } else if ((buf[i] & 224) === 192) {\n          if (i + 1 === len || (buf[i + 1] & 192) !== 128 || (buf[i] & 254) === 192) {\n            return false;\n          }\n          i += 2;\n        } else if ((buf[i] & 240) === 224) {\n          if (i + 2 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || buf[i] === 224 && (buf[i + 1] & 224) === 128 || // Overlong\n          buf[i] === 237 && (buf[i + 1] & 224) === 160) {\n            return false;\n          }\n          i += 3;\n        } else if ((buf[i] & 248) === 240) {\n          if (i + 3 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || (buf[i + 3] & 192) !== 128 || buf[i] === 240 && (buf[i + 1] & 240) === 128 || // Overlong\n          buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) {\n            return false;\n          }\n          i += 4;\n        } else {\n          return false;\n        }\n      }\n      return true;\n    }\n    try {\n      let isValidUTF8 = require(\"utf-8-validate\");\n      if (typeof isValidUTF8 === \"object\") {\n        isValidUTF8 = isValidUTF8.Validation.isValidUTF8;\n      }\n      module2.exports = {\n        isValidStatusCode,\n        isValidUTF8(buf) {\n          return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf);\n        }\n      };\n    } catch (e) {\n      module2.exports = {\n        isValidStatusCode,\n        isValidUTF8: _isValidUTF8\n      };\n    }\n  }\n});\n\n// node_modules/ws/lib/receiver.js\nvar require_receiver = __commonJS({\n  \"node_modules/ws/lib/receiver.js\"(exports2, module2) {\n    \"use strict\";\n    var { Writable } = require(\"stream\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var {\n      BINARY_TYPES,\n      EMPTY_BUFFER,\n      kStatusCode,\n      kWebSocket\n    } = require_constants();\n    var { concat, toArrayBuffer, unmask } = require_buffer_util();\n    var { isValidStatusCode, isValidUTF8 } = require_validation();\n    var GET_INFO = 0;\n    var GET_PAYLOAD_LENGTH_16 = 1;\n    var GET_PAYLOAD_LENGTH_64 = 2;\n    var GET_MASK = 3;\n    var GET_DATA = 4;\n    var INFLATING = 5;\n    var Receiver = class extends Writable {\n      /**\n       * Creates a Receiver instance.\n       *\n       * @param {String} [binaryType=nodebuffer] The type for binary data\n       * @param {Object} [extensions] An object containing the negotiated extensions\n       * @param {Boolean} [isServer=false] Specifies whether to operate in client or\n       *     server mode\n       * @param {Number} [maxPayload=0] The maximum allowed message length\n       */\n      constructor(binaryType, extensions, isServer, maxPayload) {\n        super();\n        this._binaryType = binaryType || BINARY_TYPES[0];\n        this[kWebSocket] = void 0;\n        this._extensions = extensions || {};\n        this._isServer = !!isServer;\n        this._maxPayload = maxPayload | 0;\n        this._bufferedBytes = 0;\n        this._buffers = [];\n        this._compressed = false;\n        this._payloadLength = 0;\n        this._mask = void 0;\n        this._fragmented = 0;\n        this._masked = false;\n        this._fin = false;\n        this._opcode = 0;\n        this._totalPayloadLength = 0;\n        this._messageLength = 0;\n        this._fragments = [];\n        this._state = GET_INFO;\n        this._loop = false;\n      }\n      /**\n       * Implements `Writable.prototype._write()`.\n       *\n       * @param {Buffer} chunk The chunk of data to write\n       * @param {String} encoding The character encoding of `chunk`\n       * @param {Function} cb Callback\n       * @private\n       */\n      _write(chunk, encoding, cb) {\n        if (this._opcode === 8 && this._state == GET_INFO) return cb();\n        this._bufferedBytes += chunk.length;\n        this._buffers.push(chunk);\n        this.startLoop(cb);\n      }\n      /**\n       * Consumes `n` bytes from the buffered data.\n       *\n       * @param {Number} n The number of bytes to consume\n       * @return {Buffer} The consumed bytes\n       * @private\n       */\n      consume(n) {\n        this._bufferedBytes -= n;\n        if (n === this._buffers[0].length) return this._buffers.shift();\n        if (n < this._buffers[0].length) {\n          const buf = this._buffers[0];\n          this._buffers[0] = buf.slice(n);\n          return buf.slice(0, n);\n        }\n        const dst = Buffer.allocUnsafe(n);\n        do {\n          const buf = this._buffers[0];\n          const offset = dst.length - n;\n          if (n >= buf.length) {\n            dst.set(this._buffers.shift(), offset);\n          } else {\n            dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n            this._buffers[0] = buf.slice(n);\n          }\n          n -= buf.length;\n        } while (n > 0);\n        return dst;\n      }\n      /**\n       * Starts the parsing loop.\n       *\n       * @param {Function} cb Callback\n       * @private\n       */\n      startLoop(cb) {\n        let err;\n        this._loop = true;\n        do {\n          switch (this._state) {\n            case GET_INFO:\n              err = this.getInfo();\n              break;\n            case GET_PAYLOAD_LENGTH_16:\n              err = this.getPayloadLength16();\n              break;\n            case GET_PAYLOAD_LENGTH_64:\n              err = this.getPayloadLength64();\n              break;\n            case GET_MASK:\n              this.getMask();\n              break;\n            case GET_DATA:\n              err = this.getData(cb);\n              break;\n            default:\n              this._loop = false;\n              return;\n          }\n        } while (this._loop);\n        cb(err);\n      }\n      /**\n       * Reads the first two bytes of a frame.\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getInfo() {\n        if (this._bufferedBytes < 2) {\n          this._loop = false;\n          return;\n        }\n        const buf = this.consume(2);\n        if ((buf[0] & 48) !== 0) {\n          this._loop = false;\n          return error(RangeError, \"RSV2 and RSV3 must be clear\", true, 1002);\n        }\n        const compressed = (buf[0] & 64) === 64;\n        if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n          this._loop = false;\n          return error(RangeError, \"RSV1 must be clear\", true, 1002);\n        }\n        this._fin = (buf[0] & 128) === 128;\n        this._opcode = buf[0] & 15;\n        this._payloadLength = buf[1] & 127;\n        if (this._opcode === 0) {\n          if (compressed) {\n            this._loop = false;\n            return error(RangeError, \"RSV1 must be clear\", true, 1002);\n          }\n          if (!this._fragmented) {\n            this._loop = false;\n            return error(RangeError, \"invalid opcode 0\", true, 1002);\n          }\n          this._opcode = this._fragmented;\n        } else if (this._opcode === 1 || this._opcode === 2) {\n          if (this._fragmented) {\n            this._loop = false;\n            return error(RangeError, `invalid opcode ${this._opcode}`, true, 1002);\n          }\n          this._compressed = compressed;\n        } else if (this._opcode > 7 && this._opcode < 11) {\n          if (!this._fin) {\n            this._loop = false;\n            return error(RangeError, \"FIN must be set\", true, 1002);\n          }\n          if (compressed) {\n            this._loop = false;\n            return error(RangeError, \"RSV1 must be clear\", true, 1002);\n          }\n          if (this._payloadLength > 125) {\n            this._loop = false;\n            return error(\n              RangeError,\n              `invalid payload length ${this._payloadLength}`,\n              true,\n              1002\n            );\n          }\n        } else {\n          this._loop = false;\n          return error(RangeError, `invalid opcode ${this._opcode}`, true, 1002);\n        }\n        if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n        this._masked = (buf[1] & 128) === 128;\n        if (this._isServer) {\n          if (!this._masked) {\n            this._loop = false;\n            return error(RangeError, \"MASK must be set\", true, 1002);\n          }\n        } else if (this._masked) {\n          this._loop = false;\n          return error(RangeError, \"MASK must be clear\", true, 1002);\n        }\n        if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n        else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n        else return this.haveLength();\n      }\n      /**\n       * Gets extended payload length (7+16).\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getPayloadLength16() {\n        if (this._bufferedBytes < 2) {\n          this._loop = false;\n          return;\n        }\n        this._payloadLength = this.consume(2).readUInt16BE(0);\n        return this.haveLength();\n      }\n      /**\n       * Gets extended payload length (7+64).\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getPayloadLength64() {\n        if (this._bufferedBytes < 8) {\n          this._loop = false;\n          return;\n        }\n        const buf = this.consume(8);\n        const num = buf.readUInt32BE(0);\n        if (num > Math.pow(2, 53 - 32) - 1) {\n          this._loop = false;\n          return error(\n            RangeError,\n            \"Unsupported WebSocket frame: payload length > 2^53 - 1\",\n            false,\n            1009\n          );\n        }\n        this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n        return this.haveLength();\n      }\n      /**\n       * Payload length has been read.\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      haveLength() {\n        if (this._payloadLength && this._opcode < 8) {\n          this._totalPayloadLength += this._payloadLength;\n          if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n            this._loop = false;\n            return error(RangeError, \"Max payload size exceeded\", false, 1009);\n          }\n        }\n        if (this._masked) this._state = GET_MASK;\n        else this._state = GET_DATA;\n      }\n      /**\n       * Reads mask bytes.\n       *\n       * @private\n       */\n      getMask() {\n        if (this._bufferedBytes < 4) {\n          this._loop = false;\n          return;\n        }\n        this._mask = this.consume(4);\n        this._state = GET_DATA;\n      }\n      /**\n       * Reads data bytes.\n       *\n       * @param {Function} cb Callback\n       * @return {(Error|RangeError|undefined)} A possible error\n       * @private\n       */\n      getData(cb) {\n        let data = EMPTY_BUFFER;\n        if (this._payloadLength) {\n          if (this._bufferedBytes < this._payloadLength) {\n            this._loop = false;\n            return;\n          }\n          data = this.consume(this._payloadLength);\n          if (this._masked) unmask(data, this._mask);\n        }\n        if (this._opcode > 7) return this.controlMessage(data);\n        if (this._compressed) {\n          this._state = INFLATING;\n          this.decompress(data, cb);\n          return;\n        }\n        if (data.length) {\n          this._messageLength = this._totalPayloadLength;\n          this._fragments.push(data);\n        }\n        return this.dataMessage();\n      }\n      /**\n       * Decompresses data.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Function} cb Callback\n       * @private\n       */\n      decompress(data, cb) {\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n          if (err) return cb(err);\n          if (buf.length) {\n            this._messageLength += buf.length;\n            if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n              return cb(\n                error(RangeError, \"Max payload size exceeded\", false, 1009)\n              );\n            }\n            this._fragments.push(buf);\n          }\n          const er = this.dataMessage();\n          if (er) return cb(er);\n          this.startLoop(cb);\n        });\n      }\n      /**\n       * Handles a data message.\n       *\n       * @return {(Error|undefined)} A possible error\n       * @private\n       */\n      dataMessage() {\n        if (this._fin) {\n          const messageLength = this._messageLength;\n          const fragments = this._fragments;\n          this._totalPayloadLength = 0;\n          this._messageLength = 0;\n          this._fragmented = 0;\n          this._fragments = [];\n          if (this._opcode === 2) {\n            let data;\n            if (this._binaryType === \"nodebuffer\") {\n              data = concat(fragments, messageLength);\n            } else if (this._binaryType === \"arraybuffer\") {\n              data = toArrayBuffer(concat(fragments, messageLength));\n            } else {\n              data = fragments;\n            }\n            this.emit(\"message\", data);\n          } else {\n            const buf = concat(fragments, messageLength);\n            if (!isValidUTF8(buf)) {\n              this._loop = false;\n              return error(Error, \"invalid UTF-8 sequence\", true, 1007);\n            }\n            this.emit(\"message\", buf.toString());\n          }\n        }\n        this._state = GET_INFO;\n      }\n      /**\n       * Handles a control message.\n       *\n       * @param {Buffer} data Data to handle\n       * @return {(Error|RangeError|undefined)} A possible error\n       * @private\n       */\n      controlMessage(data) {\n        if (this._opcode === 8) {\n          this._loop = false;\n          if (data.length === 0) {\n            this.emit(\"conclude\", 1005, \"\");\n            this.end();\n          } else if (data.length === 1) {\n            return error(RangeError, \"invalid payload length 1\", true, 1002);\n          } else {\n            const code = data.readUInt16BE(0);\n            if (!isValidStatusCode(code)) {\n              return error(RangeError, `invalid status code ${code}`, true, 1002);\n            }\n            const buf = data.slice(2);\n            if (!isValidUTF8(buf)) {\n              return error(Error, \"invalid UTF-8 sequence\", true, 1007);\n            }\n            this.emit(\"conclude\", code, buf.toString());\n            this.end();\n          }\n        } else if (this._opcode === 9) {\n          this.emit(\"ping\", data);\n        } else {\n          this.emit(\"pong\", data);\n        }\n        this._state = GET_INFO;\n      }\n    };\n    module2.exports = Receiver;\n    function error(ErrorCtor, message, prefix, statusCode) {\n      const err = new ErrorCtor(\n        prefix ? `Invalid WebSocket frame: ${message}` : message\n      );\n      Error.captureStackTrace(err, error);\n      err[kStatusCode] = statusCode;\n      return err;\n    }\n  }\n});\n\n// node_modules/ws/lib/sender.js\nvar require_sender = __commonJS({\n  \"node_modules/ws/lib/sender.js\"(exports2, module2) {\n    \"use strict\";\n    var { randomFillSync } = require(\"crypto\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var { EMPTY_BUFFER } = require_constants();\n    var { isValidStatusCode } = require_validation();\n    var { mask: applyMask, toBuffer } = require_buffer_util();\n    var mask = Buffer.alloc(4);\n    var Sender = class _Sender {\n      /**\n       * Creates a Sender instance.\n       *\n       * @param {net.Socket} socket The connection socket\n       * @param {Object} [extensions] An object containing the negotiated extensions\n       */\n      constructor(socket, extensions) {\n        this._extensions = extensions || {};\n        this._socket = socket;\n        this._firstFragment = true;\n        this._compress = false;\n        this._bufferedBytes = 0;\n        this._deflating = false;\n        this._queue = [];\n      }\n      /**\n       * Frames a piece of data according to the HyBi WebSocket protocol.\n       *\n       * @param {Buffer} data The data to frame\n       * @param {Object} options Options object\n       * @param {Number} options.opcode The opcode\n       * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n       *     modified\n       * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n       *     FIN bit\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n       *     RSV1 bit\n       * @return {Buffer[]} The framed data as a list of `Buffer` instances\n       * @public\n       */\n      static frame(data, options) {\n        const merge = options.mask && options.readOnly;\n        let offset = options.mask ? 6 : 2;\n        let payloadLength = data.length;\n        if (data.length >= 65536) {\n          offset += 8;\n          payloadLength = 127;\n        } else if (data.length > 125) {\n          offset += 2;\n          payloadLength = 126;\n        }\n        const target = Buffer.allocUnsafe(merge ? data.length + offset : offset);\n        target[0] = options.fin ? options.opcode | 128 : options.opcode;\n        if (options.rsv1) target[0] |= 64;\n        target[1] = payloadLength;\n        if (payloadLength === 126) {\n          target.writeUInt16BE(data.length, 2);\n        } else if (payloadLength === 127) {\n          target.writeUInt32BE(0, 2);\n          target.writeUInt32BE(data.length, 6);\n        }\n        if (!options.mask) return [target, data];\n        randomFillSync(mask, 0, 4);\n        target[1] |= 128;\n        target[offset - 4] = mask[0];\n        target[offset - 3] = mask[1];\n        target[offset - 2] = mask[2];\n        target[offset - 1] = mask[3];\n        if (merge) {\n          applyMask(data, mask, target, offset, data.length);\n          return [target];\n        }\n        applyMask(data, mask, data, 0, data.length);\n        return [target, data];\n      }\n      /**\n       * Sends a close message to the other peer.\n       *\n       * @param {Number} [code] The status code component of the body\n       * @param {String} [data] The message component of the body\n       * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      close(code, data, mask2, cb) {\n        let buf;\n        if (code === void 0) {\n          buf = EMPTY_BUFFER;\n        } else if (typeof code !== \"number\" || !isValidStatusCode(code)) {\n          throw new TypeError(\"First argument must be a valid error code number\");\n        } else if (data === void 0 || data === \"\") {\n          buf = Buffer.allocUnsafe(2);\n          buf.writeUInt16BE(code, 0);\n        } else {\n          const length = Buffer.byteLength(data);\n          if (length > 123) {\n            throw new RangeError(\"The message must not be greater than 123 bytes\");\n          }\n          buf = Buffer.allocUnsafe(2 + length);\n          buf.writeUInt16BE(code, 0);\n          buf.write(data, 2);\n        }\n        if (this._deflating) {\n          this.enqueue([this.doClose, buf, mask2, cb]);\n        } else {\n          this.doClose(buf, mask2, cb);\n        }\n      }\n      /**\n       * Frames and sends a close message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doClose(data, mask2, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 8,\n            mask: mask2,\n            readOnly: false\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a ping message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      ping(data, mask2, cb) {\n        const buf = toBuffer(data);\n        if (buf.length > 125) {\n          throw new RangeError(\"The data size must not be greater than 125 bytes\");\n        }\n        if (this._deflating) {\n          this.enqueue([this.doPing, buf, mask2, toBuffer.readOnly, cb]);\n        } else {\n          this.doPing(buf, mask2, toBuffer.readOnly, cb);\n        }\n      }\n      /**\n       * Frames and sends a ping message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doPing(data, mask2, readOnly, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 9,\n            mask: mask2,\n            readOnly\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a pong message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      pong(data, mask2, cb) {\n        const buf = toBuffer(data);\n        if (buf.length > 125) {\n          throw new RangeError(\"The data size must not be greater than 125 bytes\");\n        }\n        if (this._deflating) {\n          this.enqueue([this.doPong, buf, mask2, toBuffer.readOnly, cb]);\n        } else {\n          this.doPong(buf, mask2, toBuffer.readOnly, cb);\n        }\n      }\n      /**\n       * Frames and sends a pong message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doPong(data, mask2, readOnly, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 10,\n            mask: mask2,\n            readOnly\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a data message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Object} options Options object\n       * @param {Boolean} [options.compress=false] Specifies whether or not to\n       *     compress `data`\n       * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n       *     or text\n       * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n       *     last one\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      send(data, options, cb) {\n        const buf = toBuffer(data);\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        let opcode = options.binary ? 2 : 1;\n        let rsv1 = options.compress;\n        if (this._firstFragment) {\n          this._firstFragment = false;\n          if (rsv1 && perMessageDeflate) {\n            rsv1 = buf.length >= perMessageDeflate._threshold;\n          }\n          this._compress = rsv1;\n        } else {\n          rsv1 = false;\n          opcode = 0;\n        }\n        if (options.fin) this._firstFragment = true;\n        if (perMessageDeflate) {\n          const opts = {\n            fin: options.fin,\n            rsv1,\n            opcode,\n            mask: options.mask,\n            readOnly: toBuffer.readOnly\n          };\n          if (this._deflating) {\n            this.enqueue([this.dispatch, buf, this._compress, opts, cb]);\n          } else {\n            this.dispatch(buf, this._compress, opts, cb);\n          }\n        } else {\n          this.sendFrame(\n            _Sender.frame(buf, {\n              fin: options.fin,\n              rsv1: false,\n              opcode,\n              mask: options.mask,\n              readOnly: toBuffer.readOnly\n            }),\n            cb\n          );\n        }\n      }\n      /**\n       * Dispatches a data message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [compress=false] Specifies whether or not to compress\n       *     `data`\n       * @param {Object} options Options object\n       * @param {Number} options.opcode The opcode\n       * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n       *     modified\n       * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n       *     FIN bit\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n       *     RSV1 bit\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      dispatch(data, compress, options, cb) {\n        if (!compress) {\n          this.sendFrame(_Sender.frame(data, options), cb);\n          return;\n        }\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        this._bufferedBytes += data.length;\n        this._deflating = true;\n        perMessageDeflate.compress(data, options.fin, (_, buf) => {\n          if (this._socket.destroyed) {\n            const err = new Error(\n              \"The socket was closed while data was being compressed\"\n            );\n            if (typeof cb === \"function\") cb(err);\n            for (let i = 0; i < this._queue.length; i++) {\n              const callback = this._queue[i][4];\n              if (typeof callback === \"function\") callback(err);\n            }\n            return;\n          }\n          this._bufferedBytes -= data.length;\n          this._deflating = false;\n          options.readOnly = false;\n          this.sendFrame(_Sender.frame(buf, options), cb);\n          this.dequeue();\n        });\n      }\n      /**\n       * Executes queued send operations.\n       *\n       * @private\n       */\n      dequeue() {\n        while (!this._deflating && this._queue.length) {\n          const params = this._queue.shift();\n          this._bufferedBytes -= params[1].length;\n          Reflect.apply(params[0], this, params.slice(1));\n        }\n      }\n      /**\n       * Enqueues a send operation.\n       *\n       * @param {Array} params Send operation parameters.\n       * @private\n       */\n      enqueue(params) {\n        this._bufferedBytes += params[1].length;\n        this._queue.push(params);\n      }\n      /**\n       * Sends a frame.\n       *\n       * @param {Buffer[]} list The frame to send\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      sendFrame(list, cb) {\n        if (list.length === 2) {\n          this._socket.cork();\n          this._socket.write(list[0]);\n          this._socket.write(list[1], cb);\n          this._socket.uncork();\n        } else {\n          this._socket.write(list[0], cb);\n        }\n      }\n    };\n    module2.exports = Sender;\n  }\n});\n\n// node_modules/ws/lib/event-target.js\nvar require_event_target = __commonJS({\n  \"node_modules/ws/lib/event-target.js\"(exports2, module2) {\n    \"use strict\";\n    var Event = class {\n      /**\n       * Create a new `Event`.\n       *\n       * @param {String} type The name of the event\n       * @param {Object} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(type, target) {\n        this.target = target;\n        this.type = type;\n      }\n    };\n    var MessageEvent = class extends Event {\n      /**\n       * Create a new `MessageEvent`.\n       *\n       * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(data, target) {\n        super(\"message\", target);\n        this.data = data;\n      }\n    };\n    var CloseEvent = class extends Event {\n      /**\n       * Create a new `CloseEvent`.\n       *\n       * @param {Number} code The status code explaining why the connection is being\n       *     closed\n       * @param {String} reason A human-readable string explaining why the\n       *     connection is closing\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(code, reason, target) {\n        super(\"close\", target);\n        this.wasClean = target._closeFrameReceived && target._closeFrameSent;\n        this.reason = reason;\n        this.code = code;\n      }\n    };\n    var OpenEvent = class extends Event {\n      /**\n       * Create a new `OpenEvent`.\n       *\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(target) {\n        super(\"open\", target);\n      }\n    };\n    var ErrorEvent = class extends Event {\n      /**\n       * Create a new `ErrorEvent`.\n       *\n       * @param {Object} error The error that generated this event\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(error, target) {\n        super(\"error\", target);\n        this.message = error.message;\n        this.error = error;\n      }\n    };\n    var EventTarget = {\n      /**\n       * Register an event listener.\n       *\n       * @param {String} type A string representing the event type to listen for\n       * @param {Function} listener The listener to add\n       * @param {Object} [options] An options object specifies characteristics about\n       *     the event listener\n       * @param {Boolean} [options.once=false] A `Boolean`` indicating that the\n       *     listener should be invoked at most once after being added. If `true`,\n       *     the listener would be automatically removed when invoked.\n       * @public\n       */\n      addEventListener(type, listener, options) {\n        if (typeof listener !== \"function\") return;\n        function onMessage(data) {\n          listener.call(this, new MessageEvent(data, this));\n        }\n        function onClose(code, message) {\n          listener.call(this, new CloseEvent(code, message, this));\n        }\n        function onError(error) {\n          listener.call(this, new ErrorEvent(error, this));\n        }\n        function onOpen() {\n          listener.call(this, new OpenEvent(this));\n        }\n        const method = options && options.once ? \"once\" : \"on\";\n        if (type === \"message\") {\n          onMessage._listener = listener;\n          this[method](type, onMessage);\n        } else if (type === \"close\") {\n          onClose._listener = listener;\n          this[method](type, onClose);\n        } else if (type === \"error\") {\n          onError._listener = listener;\n          this[method](type, onError);\n        } else if (type === \"open\") {\n          onOpen._listener = listener;\n          this[method](type, onOpen);\n        } else {\n          this[method](type, listener);\n        }\n      },\n      /**\n       * Remove an event listener.\n       *\n       * @param {String} type A string representing the event type to remove\n       * @param {Function} listener The listener to remove\n       * @public\n       */\n      removeEventListener(type, listener) {\n        const listeners = this.listeners(type);\n        for (let i = 0; i < listeners.length; i++) {\n          if (listeners[i] === listener || listeners[i]._listener === listener) {\n            this.removeListener(type, listeners[i]);\n          }\n        }\n      }\n    };\n    module2.exports = EventTarget;\n  }\n});\n\n// node_modules/ws/lib/extension.js\nvar require_extension = __commonJS({\n  \"node_modules/ws/lib/extension.js\"(exports2, module2) {\n    \"use strict\";\n    var tokenChars = [\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 0 - 15\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 16 - 31\n      0,\n      1,\n      0,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      1,\n      1,\n      0,\n      1,\n      1,\n      0,\n      // 32 - 47\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 48 - 63\n      0,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      // 64 - 79\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      0,\n      1,\n      1,\n      // 80 - 95\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      // 96 - 111\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      1,\n      0,\n      1,\n      0\n      // 112 - 127\n    ];\n    function push(dest, name2, elem) {\n      if (dest[name2] === void 0) dest[name2] = [elem];\n      else dest[name2].push(elem);\n    }\n    function parse(header) {\n      const offers = /* @__PURE__ */ Object.create(null);\n      if (header === void 0 || header === \"\") return offers;\n      let params = /* @__PURE__ */ Object.create(null);\n      let mustUnescape = false;\n      let isEscaping = false;\n      let inQuotes = false;\n      let extensionName;\n      let paramName;\n      let start = -1;\n      let end = -1;\n      let i = 0;\n      for (; i < header.length; i++) {\n        const code = header.charCodeAt(i);\n        if (extensionName === void 0) {\n          if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (code === 32 || code === 9) {\n            if (end === -1 && start !== -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            const name2 = header.slice(start, end);\n            if (code === 44) {\n              push(offers, name2, params);\n              params = /* @__PURE__ */ Object.create(null);\n            } else {\n              extensionName = name2;\n            }\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        } else if (paramName === void 0) {\n          if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (code === 32 || code === 9) {\n            if (end === -1 && start !== -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            push(params, header.slice(start, end), true);\n            if (code === 44) {\n              push(offers, extensionName, params);\n              params = /* @__PURE__ */ Object.create(null);\n              extensionName = void 0;\n            }\n            start = end = -1;\n          } else if (code === 61 && start !== -1 && end === -1) {\n            paramName = header.slice(start, i);\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        } else {\n          if (isEscaping) {\n            if (tokenChars[code] !== 1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (start === -1) start = i;\n            else if (!mustUnescape) mustUnescape = true;\n            isEscaping = false;\n          } else if (inQuotes) {\n            if (tokenChars[code] === 1) {\n              if (start === -1) start = i;\n            } else if (code === 34 && start !== -1) {\n              inQuotes = false;\n              end = i;\n            } else if (code === 92) {\n              isEscaping = true;\n            } else {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n          } else if (code === 34 && header.charCodeAt(i - 1) === 61) {\n            inQuotes = true;\n          } else if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (start !== -1 && (code === 32 || code === 9)) {\n            if (end === -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            let value = header.slice(start, end);\n            if (mustUnescape) {\n              value = value.replace(/\\\\/g, \"\");\n              mustUnescape = false;\n            }\n            push(params, paramName, value);\n            if (code === 44) {\n              push(offers, extensionName, params);\n              params = /* @__PURE__ */ Object.create(null);\n              extensionName = void 0;\n            }\n            paramName = void 0;\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        }\n      }\n      if (start === -1 || inQuotes) {\n        throw new SyntaxError(\"Unexpected end of input\");\n      }\n      if (end === -1) end = i;\n      const token = header.slice(start, end);\n      if (extensionName === void 0) {\n        push(offers, token, params);\n      } else {\n        if (paramName === void 0) {\n          push(params, token, true);\n        } else if (mustUnescape) {\n          push(params, paramName, token.replace(/\\\\/g, \"\"));\n        } else {\n          push(params, paramName, token);\n        }\n        push(offers, extensionName, params);\n      }\n      return offers;\n    }\n    function format(extensions) {\n      return Object.keys(extensions).map((extension) => {\n        let configurations = extensions[extension];\n        if (!Array.isArray(configurations)) configurations = [configurations];\n        return configurations.map((params) => {\n          return [extension].concat(\n            Object.keys(params).map((k) => {\n              let values = params[k];\n              if (!Array.isArray(values)) values = [values];\n              return values.map((v) => v === true ? k : `${k}=${v}`).join(\"; \");\n            })\n          ).join(\"; \");\n        }).join(\", \");\n      }).join(\", \");\n    }\n    module2.exports = { format, parse };\n  }\n});\n\n// node_modules/ws/lib/websocket.js\nvar require_websocket = __commonJS({\n  \"node_modules/ws/lib/websocket.js\"(exports2, module2) {\n    \"use strict\";\n    var EventEmitter = require(\"events\");\n    var https = require(\"https\");\n    var http = require(\"http\");\n    var net = require(\"net\");\n    var tls = require(\"tls\");\n    var { randomBytes, createHash } = require(\"crypto\");\n    var { URL } = require(\"url\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var Receiver = require_receiver();\n    var Sender = require_sender();\n    var {\n      BINARY_TYPES,\n      EMPTY_BUFFER,\n      GUID,\n      kStatusCode,\n      kWebSocket,\n      NOOP\n    } = require_constants();\n    var { addEventListener, removeEventListener } = require_event_target();\n    var { format, parse } = require_extension();\n    var { toBuffer } = require_buffer_util();\n    var readyStates = [\"CONNECTING\", \"OPEN\", \"CLOSING\", \"CLOSED\"];\n    var protocolVersions = [8, 13];\n    var closeTimeout = 30 * 1e3;\n    var WebSocket = class _WebSocket extends EventEmitter {\n      /**\n       * Create a new `WebSocket`.\n       *\n       * @param {(String|url.URL)} address The URL to which to connect\n       * @param {(String|String[])} [protocols] The subprotocols\n       * @param {Object} [options] Connection options\n       */\n      constructor(address, protocols, options) {\n        super();\n        this._binaryType = BINARY_TYPES[0];\n        this._closeCode = 1006;\n        this._closeFrameReceived = false;\n        this._closeFrameSent = false;\n        this._closeMessage = \"\";\n        this._closeTimer = null;\n        this._extensions = {};\n        this._protocol = \"\";\n        this._readyState = _WebSocket.CONNECTING;\n        this._receiver = null;\n        this._sender = null;\n        this._socket = null;\n        if (address !== null) {\n          this._bufferedAmount = 0;\n          this._isServer = false;\n          this._redirects = 0;\n          if (Array.isArray(protocols)) {\n            protocols = protocols.join(\", \");\n          } else if (typeof protocols === \"object\" && protocols !== null) {\n            options = protocols;\n            protocols = void 0;\n          }\n          initAsClient(this, address, protocols, options);\n        } else {\n          this._isServer = true;\n        }\n      }\n      /**\n       * This deviates from the WHATWG interface since ws doesn't support the\n       * required default \"blob\" type (instead we define a custom \"nodebuffer\"\n       * type).\n       *\n       * @type {String}\n       */\n      get binaryType() {\n        return this._binaryType;\n      }\n      set binaryType(type) {\n        if (!BINARY_TYPES.includes(type)) return;\n        this._binaryType = type;\n        if (this._receiver) this._receiver._binaryType = type;\n      }\n      /**\n       * @type {Number}\n       */\n      get bufferedAmount() {\n        if (!this._socket) return this._bufferedAmount;\n        return this._socket._writableState.length + this._sender._bufferedBytes;\n      }\n      /**\n       * @type {String}\n       */\n      get extensions() {\n        return Object.keys(this._extensions).join();\n      }\n      /**\n       * @type {String}\n       */\n      get protocol() {\n        return this._protocol;\n      }\n      /**\n       * @type {Number}\n       */\n      get readyState() {\n        return this._readyState;\n      }\n      /**\n       * @type {String}\n       */\n      get url() {\n        return this._url;\n      }\n      /**\n       * Set up the socket and the internal resources.\n       *\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Number} [maxPayload=0] The maximum allowed message size\n       * @private\n       */\n      setSocket(socket, head, maxPayload) {\n        const receiver = new Receiver(\n          this.binaryType,\n          this._extensions,\n          this._isServer,\n          maxPayload\n        );\n        this._sender = new Sender(socket, this._extensions);\n        this._receiver = receiver;\n        this._socket = socket;\n        receiver[kWebSocket] = this;\n        socket[kWebSocket] = this;\n        receiver.on(\"conclude\", receiverOnConclude);\n        receiver.on(\"drain\", receiverOnDrain);\n        receiver.on(\"error\", receiverOnError);\n        receiver.on(\"message\", receiverOnMessage);\n        receiver.on(\"ping\", receiverOnPing);\n        receiver.on(\"pong\", receiverOnPong);\n        socket.setTimeout(0);\n        socket.setNoDelay();\n        if (head.length > 0) socket.unshift(head);\n        socket.on(\"close\", socketOnClose);\n        socket.on(\"data\", socketOnData);\n        socket.on(\"end\", socketOnEnd);\n        socket.on(\"error\", socketOnError);\n        this._readyState = _WebSocket.OPEN;\n        this.emit(\"open\");\n      }\n      /**\n       * Emit the `'close'` event.\n       *\n       * @private\n       */\n      emitClose() {\n        if (!this._socket) {\n          this._readyState = _WebSocket.CLOSED;\n          this.emit(\"close\", this._closeCode, this._closeMessage);\n          return;\n        }\n        if (this._extensions[PerMessageDeflate.extensionName]) {\n          this._extensions[PerMessageDeflate.extensionName].cleanup();\n        }\n        this._receiver.removeAllListeners();\n        this._readyState = _WebSocket.CLOSED;\n        this.emit(\"close\", this._closeCode, this._closeMessage);\n      }\n      /**\n       * Start a closing handshake.\n       *\n       *          +----------+   +-----------+   +----------+\n       *     - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n       *    |     +----------+   +-----------+   +----------+     |\n       *          +----------+   +-----------+         |\n       * CLOSING  |ws.close()|<--|close frame|<--+-----+       CLOSING\n       *          +----------+   +-----------+   |\n       *    |           |                        |   +---+        |\n       *                +------------------------+-->|fin| - - - -\n       *    |         +---+                      |   +---+\n       *     - - - - -|fin|<---------------------+\n       *              +---+\n       *\n       * @param {Number} [code] Status code explaining why the connection is closing\n       * @param {String} [data] A string explaining why the connection is closing\n       * @public\n       */\n      close(code, data) {\n        if (this.readyState === _WebSocket.CLOSED) return;\n        if (this.readyState === _WebSocket.CONNECTING) {\n          const msg = \"WebSocket was closed before the connection was established\";\n          return abortHandshake(this, this._req, msg);\n        }\n        if (this.readyState === _WebSocket.CLOSING) {\n          if (this._closeFrameSent && this._closeFrameReceived) this._socket.end();\n          return;\n        }\n        this._readyState = _WebSocket.CLOSING;\n        this._sender.close(code, data, !this._isServer, (err) => {\n          if (err) return;\n          this._closeFrameSent = true;\n          if (this._closeFrameReceived) this._socket.end();\n        });\n        this._closeTimer = setTimeout(\n          this._socket.destroy.bind(this._socket),\n          closeTimeout\n        );\n      }\n      /**\n       * Send a ping.\n       *\n       * @param {*} [data] The data to send\n       * @param {Boolean} [mask] Indicates whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when the ping is sent\n       * @public\n       */\n      ping(data, mask, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof data === \"function\") {\n          cb = data;\n          data = mask = void 0;\n        } else if (typeof mask === \"function\") {\n          cb = mask;\n          mask = void 0;\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        if (mask === void 0) mask = !this._isServer;\n        this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n      }\n      /**\n       * Send a pong.\n       *\n       * @param {*} [data] The data to send\n       * @param {Boolean} [mask] Indicates whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when the pong is sent\n       * @public\n       */\n      pong(data, mask, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof data === \"function\") {\n          cb = data;\n          data = mask = void 0;\n        } else if (typeof mask === \"function\") {\n          cb = mask;\n          mask = void 0;\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        if (mask === void 0) mask = !this._isServer;\n        this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n      }\n      /**\n       * Send a data message.\n       *\n       * @param {*} data The message to send\n       * @param {Object} [options] Options object\n       * @param {Boolean} [options.compress] Specifies whether or not to compress\n       *     `data`\n       * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n       *     text\n       * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n       *     last one\n       * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when data is written out\n       * @public\n       */\n      send(data, options, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof options === \"function\") {\n          cb = options;\n          options = {};\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        const opts = {\n          binary: typeof data !== \"string\",\n          mask: !this._isServer,\n          compress: true,\n          fin: true,\n          ...options\n        };\n        if (!this._extensions[PerMessageDeflate.extensionName]) {\n          opts.compress = false;\n        }\n        this._sender.send(data || EMPTY_BUFFER, opts, cb);\n      }\n      /**\n       * Forcibly close the connection.\n       *\n       * @public\n       */\n      terminate() {\n        if (this.readyState === _WebSocket.CLOSED) return;\n        if (this.readyState === _WebSocket.CONNECTING) {\n          const msg = \"WebSocket was closed before the connection was established\";\n          return abortHandshake(this, this._req, msg);\n        }\n        if (this._socket) {\n          this._readyState = _WebSocket.CLOSING;\n          this._socket.destroy();\n        }\n      }\n    };\n    readyStates.forEach((readyState, i) => {\n      const descriptor = { enumerable: true, value: i };\n      Object.defineProperty(WebSocket.prototype, readyState, descriptor);\n      Object.defineProperty(WebSocket, readyState, descriptor);\n    });\n    [\n      \"binaryType\",\n      \"bufferedAmount\",\n      \"extensions\",\n      \"protocol\",\n      \"readyState\",\n      \"url\"\n    ].forEach((property) => {\n      Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n    });\n    [\"open\", \"error\", \"close\", \"message\"].forEach((method) => {\n      Object.defineProperty(WebSocket.prototype, `on${method}`, {\n        configurable: true,\n        enumerable: true,\n        /**\n         * Return the listener of the event.\n         *\n         * @return {(Function|undefined)} The event listener or `undefined`\n         * @public\n         */\n        get() {\n          const listeners = this.listeners(method);\n          for (let i = 0; i < listeners.length; i++) {\n            if (listeners[i]._listener) return listeners[i]._listener;\n          }\n          return void 0;\n        },\n        /**\n         * Add a listener for the event.\n         *\n         * @param {Function} listener The listener to add\n         * @public\n         */\n        set(listener) {\n          const listeners = this.listeners(method);\n          for (let i = 0; i < listeners.length; i++) {\n            if (listeners[i]._listener) this.removeListener(method, listeners[i]);\n          }\n          this.addEventListener(method, listener);\n        }\n      });\n    });\n    WebSocket.prototype.addEventListener = addEventListener;\n    WebSocket.prototype.removeEventListener = removeEventListener;\n    module2.exports = WebSocket;\n    function initAsClient(websocket, address, protocols, options) {\n      const opts = {\n        protocolVersion: protocolVersions[1],\n        maxPayload: 100 * 1024 * 1024,\n        perMessageDeflate: true,\n        followRedirects: false,\n        maxRedirects: 10,\n        ...options,\n        createConnection: void 0,\n        socketPath: void 0,\n        hostname: void 0,\n        protocol: void 0,\n        timeout: void 0,\n        method: void 0,\n        host: void 0,\n        path: void 0,\n        port: void 0\n      };\n      if (!protocolVersions.includes(opts.protocolVersion)) {\n        throw new RangeError(\n          `Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(\", \")})`\n        );\n      }\n      let parsedUrl;\n      if (address instanceof URL) {\n        parsedUrl = address;\n        websocket._url = address.href;\n      } else {\n        parsedUrl = new URL(address);\n        websocket._url = address;\n      }\n      const isUnixSocket = parsedUrl.protocol === \"ws+unix:\";\n      if (!parsedUrl.host && (!isUnixSocket || !parsedUrl.pathname)) {\n        throw new Error(`Invalid URL: ${websocket.url}`);\n      }\n      const isSecure = parsedUrl.protocol === \"wss:\" || parsedUrl.protocol === \"https:\";\n      const defaultPort = isSecure ? 443 : 80;\n      const key = randomBytes(16).toString(\"base64\");\n      const get = isSecure ? https.get : http.get;\n      let perMessageDeflate;\n      opts.createConnection = isSecure ? tlsConnect : netConnect;\n      opts.defaultPort = opts.defaultPort || defaultPort;\n      opts.port = parsedUrl.port || defaultPort;\n      opts.host = parsedUrl.hostname.startsWith(\"[\") ? parsedUrl.hostname.slice(1, -1) : parsedUrl.hostname;\n      opts.headers = {\n        \"Sec-WebSocket-Version\": opts.protocolVersion,\n        \"Sec-WebSocket-Key\": key,\n        Connection: \"Upgrade\",\n        Upgrade: \"websocket\",\n        ...opts.headers\n      };\n      opts.path = parsedUrl.pathname + parsedUrl.search;\n      opts.timeout = opts.handshakeTimeout;\n      if (opts.perMessageDeflate) {\n        perMessageDeflate = new PerMessageDeflate(\n          opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n          false,\n          opts.maxPayload\n        );\n        opts.headers[\"Sec-WebSocket-Extensions\"] = format({\n          [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n        });\n      }\n      if (protocols) {\n        opts.headers[\"Sec-WebSocket-Protocol\"] = protocols;\n      }\n      if (opts.origin) {\n        if (opts.protocolVersion < 13) {\n          opts.headers[\"Sec-WebSocket-Origin\"] = opts.origin;\n        } else {\n          opts.headers.Origin = opts.origin;\n        }\n      }\n      if (parsedUrl.username || parsedUrl.password) {\n        opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n      }\n      if (isUnixSocket) {\n        const parts = opts.path.split(\":\");\n        opts.socketPath = parts[0];\n        opts.path = parts[1];\n      }\n      let req = websocket._req = get(opts);\n      if (opts.timeout) {\n        req.on(\"timeout\", () => {\n          abortHandshake(websocket, req, \"Opening handshake has timed out\");\n        });\n      }\n      req.on(\"error\", (err) => {\n        if (req === null || req.aborted) return;\n        req = websocket._req = null;\n        websocket._readyState = WebSocket.CLOSING;\n        websocket.emit(\"error\", err);\n        websocket.emitClose();\n      });\n      req.on(\"response\", (res) => {\n        const location = res.headers.location;\n        const statusCode = res.statusCode;\n        if (location && opts.followRedirects && statusCode >= 300 && statusCode < 400) {\n          if (++websocket._redirects > opts.maxRedirects) {\n            abortHandshake(websocket, req, \"Maximum redirects exceeded\");\n            return;\n          }\n          req.abort();\n          const addr = new URL(location, address);\n          initAsClient(websocket, addr, protocols, options);\n        } else if (!websocket.emit(\"unexpected-response\", req, res)) {\n          abortHandshake(\n            websocket,\n            req,\n            `Unexpected server response: ${res.statusCode}`\n          );\n        }\n      });\n      req.on(\"upgrade\", (res, socket, head) => {\n        websocket.emit(\"upgrade\", res);\n        if (websocket.readyState !== WebSocket.CONNECTING) return;\n        req = websocket._req = null;\n        const digest = createHash(\"sha1\").update(key + GUID).digest(\"base64\");\n        if (res.headers[\"sec-websocket-accept\"] !== digest) {\n          abortHandshake(websocket, socket, \"Invalid Sec-WebSocket-Accept header\");\n          return;\n        }\n        const serverProt = res.headers[\"sec-websocket-protocol\"];\n        const protList = (protocols || \"\").split(/, */);\n        let protError;\n        if (!protocols && serverProt) {\n          protError = \"Server sent a subprotocol but none was requested\";\n        } else if (protocols && !serverProt) {\n          protError = \"Server sent no subprotocol\";\n        } else if (serverProt && !protList.includes(serverProt)) {\n          protError = \"Server sent an invalid subprotocol\";\n        }\n        if (protError) {\n          abortHandshake(websocket, socket, protError);\n          return;\n        }\n        if (serverProt) websocket._protocol = serverProt;\n        if (perMessageDeflate) {\n          try {\n            const extensions = parse(res.headers[\"sec-websocket-extensions\"]);\n            if (extensions[PerMessageDeflate.extensionName]) {\n              perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n              websocket._extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n            }\n          } catch (err) {\n            abortHandshake(\n              websocket,\n              socket,\n              \"Invalid Sec-WebSocket-Extensions header\"\n            );\n            return;\n          }\n        }\n        websocket.setSocket(socket, head, opts.maxPayload);\n      });\n    }\n    function netConnect(options) {\n      options.path = options.socketPath;\n      return net.connect(options);\n    }\n    function tlsConnect(options) {\n      options.path = void 0;\n      if (!options.servername && options.servername !== \"\") {\n        options.servername = net.isIP(options.host) ? \"\" : options.host;\n      }\n      return tls.connect(options);\n    }\n    function abortHandshake(websocket, stream, message) {\n      websocket._readyState = WebSocket.CLOSING;\n      const err = new Error(message);\n      Error.captureStackTrace(err, abortHandshake);\n      if (stream.setHeader) {\n        stream.abort();\n        if (stream.socket && !stream.socket.destroyed) {\n          stream.socket.destroy();\n        }\n        stream.once(\"abort\", websocket.emitClose.bind(websocket));\n        websocket.emit(\"error\", err);\n      } else {\n        stream.destroy(err);\n        stream.once(\"error\", websocket.emit.bind(websocket, \"error\"));\n        stream.once(\"close\", websocket.emitClose.bind(websocket));\n      }\n    }\n    function sendAfterClose(websocket, data, cb) {\n      if (data) {\n        const length = toBuffer(data).length;\n        if (websocket._socket) websocket._sender._bufferedBytes += length;\n        else websocket._bufferedAmount += length;\n      }\n      if (cb) {\n        const err = new Error(\n          `WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})`\n        );\n        cb(err);\n      }\n    }\n    function receiverOnConclude(code, reason) {\n      const websocket = this[kWebSocket];\n      websocket._socket.removeListener(\"data\", socketOnData);\n      websocket._socket.resume();\n      websocket._closeFrameReceived = true;\n      websocket._closeMessage = reason;\n      websocket._closeCode = code;\n      if (code === 1005) websocket.close();\n      else websocket.close(code, reason);\n    }\n    function receiverOnDrain() {\n      this[kWebSocket]._socket.resume();\n    }\n    function receiverOnError(err) {\n      const websocket = this[kWebSocket];\n      websocket._socket.removeListener(\"data\", socketOnData);\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._closeCode = err[kStatusCode];\n      websocket.emit(\"error\", err);\n      websocket._socket.destroy();\n    }\n    function receiverOnFinish() {\n      this[kWebSocket].emitClose();\n    }\n    function receiverOnMessage(data) {\n      this[kWebSocket].emit(\"message\", data);\n    }\n    function receiverOnPing(data) {\n      const websocket = this[kWebSocket];\n      websocket.pong(data, !websocket._isServer, NOOP);\n      websocket.emit(\"ping\", data);\n    }\n    function receiverOnPong(data) {\n      this[kWebSocket].emit(\"pong\", data);\n    }\n    function socketOnClose() {\n      const websocket = this[kWebSocket];\n      this.removeListener(\"close\", socketOnClose);\n      this.removeListener(\"end\", socketOnEnd);\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._socket.read();\n      websocket._receiver.end();\n      this.removeListener(\"data\", socketOnData);\n      this[kWebSocket] = void 0;\n      clearTimeout(websocket._closeTimer);\n      if (websocket._receiver._writableState.finished || websocket._receiver._writableState.errorEmitted) {\n        websocket.emitClose();\n      } else {\n        websocket._receiver.on(\"error\", receiverOnFinish);\n        websocket._receiver.on(\"finish\", receiverOnFinish);\n      }\n    }\n    function socketOnData(chunk) {\n      if (!this[kWebSocket]._receiver.write(chunk)) {\n        this.pause();\n      }\n    }\n    function socketOnEnd() {\n      const websocket = this[kWebSocket];\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._receiver.end();\n      this.end();\n    }\n    function socketOnError() {\n      const websocket = this[kWebSocket];\n      this.removeListener(\"error\", socketOnError);\n      this.on(\"error\", NOOP);\n      if (websocket) {\n        websocket._readyState = WebSocket.CLOSING;\n        this.destroy();\n      }\n    }\n  }\n});\n\n// node_modules/ws/lib/stream.js\nvar require_stream = __commonJS({\n  \"node_modules/ws/lib/stream.js\"(exports2, module2) {\n    \"use strict\";\n    var { Duplex } = require(\"stream\");\n    function emitClose(stream) {\n      stream.emit(\"close\");\n    }\n    function duplexOnEnd() {\n      if (!this.destroyed && this._writableState.finished) {\n        this.destroy();\n      }\n    }\n    function duplexOnError(err) {\n      this.removeListener(\"error\", duplexOnError);\n      this.destroy();\n      if (this.listenerCount(\"error\") === 0) {\n        this.emit(\"error\", err);\n      }\n    }\n    function createWebSocketStream(ws, options) {\n      let resumeOnReceiverDrain = true;\n      function receiverOnDrain() {\n        if (resumeOnReceiverDrain) ws._socket.resume();\n      }\n      if (ws.readyState === ws.CONNECTING) {\n        ws.once(\"open\", function open() {\n          ws._receiver.removeAllListeners(\"drain\");\n          ws._receiver.on(\"drain\", receiverOnDrain);\n        });\n      } else {\n        ws._receiver.removeAllListeners(\"drain\");\n        ws._receiver.on(\"drain\", receiverOnDrain);\n      }\n      const duplex = new Duplex({\n        ...options,\n        autoDestroy: false,\n        emitClose: false,\n        objectMode: false,\n        writableObjectMode: false\n      });\n      ws.on(\"message\", function message(msg) {\n        if (!duplex.push(msg)) {\n          resumeOnReceiverDrain = false;\n          ws._socket.pause();\n        }\n      });\n      ws.once(\"error\", function error(err) {\n        if (duplex.destroyed) return;\n        duplex.destroy(err);\n      });\n      ws.once(\"close\", function close() {\n        if (duplex.destroyed) return;\n        duplex.push(null);\n      });\n      duplex._destroy = function(err, callback) {\n        if (ws.readyState === ws.CLOSED) {\n          callback(err);\n          process.nextTick(emitClose, duplex);\n          return;\n        }\n        let called = false;\n        ws.once(\"error\", function error(err2) {\n          called = true;\n          callback(err2);\n        });\n        ws.once(\"close\", function close() {\n          if (!called) callback(err);\n          process.nextTick(emitClose, duplex);\n        });\n        ws.terminate();\n      };\n      duplex._final = function(callback) {\n        if (ws.readyState === ws.CONNECTING) {\n          ws.once(\"open\", function open() {\n            duplex._final(callback);\n          });\n          return;\n        }\n        if (ws._socket === null) return;\n        if (ws._socket._writableState.finished) {\n          callback();\n          if (duplex._readableState.endEmitted) duplex.destroy();\n        } else {\n          ws._socket.once(\"finish\", function finish() {\n            callback();\n          });\n          ws.close();\n        }\n      };\n      duplex._read = function() {\n        if (ws.readyState === ws.OPEN && !resumeOnReceiverDrain) {\n          resumeOnReceiverDrain = true;\n          if (!ws._receiver._writableState.needDrain) ws._socket.resume();\n        }\n      };\n      duplex._write = function(chunk, encoding, callback) {\n        if (ws.readyState === ws.CONNECTING) {\n          ws.once(\"open\", function open() {\n            duplex._write(chunk, encoding, callback);\n          });\n          return;\n        }\n        ws.send(chunk, callback);\n      };\n      duplex.on(\"end\", duplexOnEnd);\n      duplex.on(\"error\", duplexOnError);\n      return duplex;\n    }\n    module2.exports = createWebSocketStream;\n  }\n});\n\n// node_modules/ws/lib/websocket-server.js\nvar require_websocket_server = __commonJS({\n  \"node_modules/ws/lib/websocket-server.js\"(exports2, module2) {\n    \"use strict\";\n    var EventEmitter = require(\"events\");\n    var { createHash } = require(\"crypto\");\n    var { createServer, STATUS_CODES } = require(\"http\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var WebSocket = require_websocket();\n    var { format, parse } = require_extension();\n    var { GUID, kWebSocket } = require_constants();\n    var keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n    var WebSocketServer = class extends EventEmitter {\n      /**\n       * Create a `WebSocketServer` instance.\n       *\n       * @param {Object} options Configuration options\n       * @param {Number} [options.backlog=511] The maximum length of the queue of\n       *     pending connections\n       * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n       *     track clients\n       * @param {Function} [options.handleProtocols] A hook to handle protocols\n       * @param {String} [options.host] The hostname where to bind the server\n       * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n       *     size\n       * @param {Boolean} [options.noServer=false] Enable no server mode\n       * @param {String} [options.path] Accept only connections matching this path\n       * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n       *     permessage-deflate\n       * @param {Number} [options.port] The port where to bind the server\n       * @param {http.Server} [options.server] A pre-created HTTP/S server to use\n       * @param {Function} [options.verifyClient] A hook to reject connections\n       * @param {Function} [callback] A listener for the `listening` event\n       */\n      constructor(options, callback) {\n        super();\n        options = {\n          maxPayload: 100 * 1024 * 1024,\n          perMessageDeflate: false,\n          handleProtocols: null,\n          clientTracking: true,\n          verifyClient: null,\n          noServer: false,\n          backlog: null,\n          // use default (511 as implemented in net.js)\n          server: null,\n          host: null,\n          path: null,\n          port: null,\n          ...options\n        };\n        if (options.port == null && !options.server && !options.noServer) {\n          throw new TypeError(\n            'One of the \"port\", \"server\", or \"noServer\" options must be specified'\n          );\n        }\n        if (options.port != null) {\n          this._server = createServer((req, res) => {\n            const body = STATUS_CODES[426];\n            res.writeHead(426, {\n              \"Content-Length\": body.length,\n              \"Content-Type\": \"text/plain\"\n            });\n            res.end(body);\n          });\n          this._server.listen(\n            options.port,\n            options.host,\n            options.backlog,\n            callback\n          );\n        } else if (options.server) {\n          this._server = options.server;\n        }\n        if (this._server) {\n          const emitConnection = this.emit.bind(this, \"connection\");\n          this._removeListeners = addListeners(this._server, {\n            listening: this.emit.bind(this, \"listening\"),\n            error: this.emit.bind(this, \"error\"),\n            upgrade: (req, socket, head) => {\n              this.handleUpgrade(req, socket, head, emitConnection);\n            }\n          });\n        }\n        if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n        if (options.clientTracking) this.clients = /* @__PURE__ */ new Set();\n        this.options = options;\n      }\n      /**\n       * Returns the bound address, the address family name, and port of the server\n       * as reported by the operating system if listening on an IP socket.\n       * If the server is listening on a pipe or UNIX domain socket, the name is\n       * returned as a string.\n       *\n       * @return {(Object|String|null)} The address of the server\n       * @public\n       */\n      address() {\n        if (this.options.noServer) {\n          throw new Error('The server is operating in \"noServer\" mode');\n        }\n        if (!this._server) return null;\n        return this._server.address();\n      }\n      /**\n       * Close the server.\n       *\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      close(cb) {\n        if (cb) this.once(\"close\", cb);\n        if (this.clients) {\n          for (const client of this.clients) client.terminate();\n        }\n        const server = this._server;\n        if (server) {\n          this._removeListeners();\n          this._removeListeners = this._server = null;\n          if (this.options.port != null) {\n            server.close(() => this.emit(\"close\"));\n            return;\n          }\n        }\n        process.nextTick(emitClose, this);\n      }\n      /**\n       * See if a given request should be handled by this server instance.\n       *\n       * @param {http.IncomingMessage} req Request object to inspect\n       * @return {Boolean} `true` if the request is valid, else `false`\n       * @public\n       */\n      shouldHandle(req) {\n        if (this.options.path) {\n          const index = req.url.indexOf(\"?\");\n          const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n          if (pathname !== this.options.path) return false;\n        }\n        return true;\n      }\n      /**\n       * Handle a HTTP Upgrade request.\n       *\n       * @param {http.IncomingMessage} req The request object\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Function} cb Callback\n       * @public\n       */\n      handleUpgrade(req, socket, head, cb) {\n        socket.on(\"error\", socketOnError);\n        const key = req.headers[\"sec-websocket-key\"] !== void 0 ? req.headers[\"sec-websocket-key\"].trim() : false;\n        const version = +req.headers[\"sec-websocket-version\"];\n        const extensions = {};\n        if (req.method !== \"GET\" || req.headers.upgrade.toLowerCase() !== \"websocket\" || !key || !keyRegex.test(key) || version !== 8 && version !== 13 || !this.shouldHandle(req)) {\n          return abortHandshake(socket, 400);\n        }\n        if (this.options.perMessageDeflate) {\n          const perMessageDeflate = new PerMessageDeflate(\n            this.options.perMessageDeflate,\n            true,\n            this.options.maxPayload\n          );\n          try {\n            const offers = parse(req.headers[\"sec-websocket-extensions\"]);\n            if (offers[PerMessageDeflate.extensionName]) {\n              perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n              extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n            }\n          } catch (err) {\n            return abortHandshake(socket, 400);\n          }\n        }\n        if (this.options.verifyClient) {\n          const info = {\n            origin: req.headers[`${version === 8 ? \"sec-websocket-origin\" : \"origin\"}`],\n            secure: !!(req.socket.authorized || req.socket.encrypted),\n            req\n          };\n          if (this.options.verifyClient.length === 2) {\n            this.options.verifyClient(info, (verified, code, message, headers) => {\n              if (!verified) {\n                return abortHandshake(socket, code || 401, message, headers);\n              }\n              this.completeUpgrade(key, extensions, req, socket, head, cb);\n            });\n            return;\n          }\n          if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n        }\n        this.completeUpgrade(key, extensions, req, socket, head, cb);\n      }\n      /**\n       * Upgrade the connection to WebSocket.\n       *\n       * @param {String} key The value of the `Sec-WebSocket-Key` header\n       * @param {Object} extensions The accepted extensions\n       * @param {http.IncomingMessage} req The request object\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Function} cb Callback\n       * @throws {Error} If called more than once with the same socket\n       * @private\n       */\n      completeUpgrade(key, extensions, req, socket, head, cb) {\n        if (!socket.readable || !socket.writable) return socket.destroy();\n        if (socket[kWebSocket]) {\n          throw new Error(\n            \"server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration\"\n          );\n        }\n        const digest = createHash(\"sha1\").update(key + GUID).digest(\"base64\");\n        const headers = [\n          \"HTTP/1.1 101 Switching Protocols\",\n          \"Upgrade: websocket\",\n          \"Connection: Upgrade\",\n          `Sec-WebSocket-Accept: ${digest}`\n        ];\n        const ws = new WebSocket(null);\n        let protocol = req.headers[\"sec-websocket-protocol\"];\n        if (protocol) {\n          protocol = protocol.split(\",\").map(trim);\n          if (this.options.handleProtocols) {\n            protocol = this.options.handleProtocols(protocol, req);\n          } else {\n            protocol = protocol[0];\n          }\n          if (protocol) {\n            headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n            ws._protocol = protocol;\n          }\n        }\n        if (extensions[PerMessageDeflate.extensionName]) {\n          const params = extensions[PerMessageDeflate.extensionName].params;\n          const value = format({\n            [PerMessageDeflate.extensionName]: [params]\n          });\n          headers.push(`Sec-WebSocket-Extensions: ${value}`);\n          ws._extensions = extensions;\n        }\n        this.emit(\"headers\", headers, req);\n        socket.write(headers.concat(\"\\r\\n\").join(\"\\r\\n\"));\n        socket.removeListener(\"error\", socketOnError);\n        ws.setSocket(socket, head, this.options.maxPayload);\n        if (this.clients) {\n          this.clients.add(ws);\n          ws.on(\"close\", () => this.clients.delete(ws));\n        }\n        cb(ws, req);\n      }\n    };\n    module2.exports = WebSocketServer;\n    function addListeners(server, map) {\n      for (const event of Object.keys(map)) server.on(event, map[event]);\n      return function removeListeners() {\n        for (const event of Object.keys(map)) {\n          server.removeListener(event, map[event]);\n        }\n      };\n    }\n    function emitClose(server) {\n      server.emit(\"close\");\n    }\n    function socketOnError() {\n      this.destroy();\n    }\n    function abortHandshake(socket, code, message, headers) {\n      if (socket.writable) {\n        message = message || STATUS_CODES[code];\n        headers = {\n          Connection: \"close\",\n          \"Content-Type\": \"text/html\",\n          \"Content-Length\": Buffer.byteLength(message),\n          ...headers\n        };\n        socket.write(\n          `HTTP/1.1 ${code} ${STATUS_CODES[code]}\\r\n` + Object.keys(headers).map((h) => `${h}: ${headers[h]}`).join(\"\\r\\n\") + \"\\r\\n\\r\\n\" + message\n        );\n      }\n      socket.removeListener(\"error\", socketOnError);\n      socket.destroy();\n    }\n    function trim(str) {\n      return str.trim();\n    }\n  }\n});\n\n// node_modules/ws/index.js\nvar require_ws = __commonJS({\n  \"node_modules/ws/index.js\"(exports2, module2) {\n    \"use strict\";\n    var WebSocket = require_websocket();\n    WebSocket.createWebSocketStream = require_stream();\n    WebSocket.Server = require_websocket_server();\n    WebSocket.Receiver = require_receiver();\n    WebSocket.Sender = require_sender();\n    module2.exports = WebSocket;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/ws.js\nvar require_ws2 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/ws.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.WebSocket = void 0;\n    var ws_1 = __importDefault(require_ws());\n    exports2.WebSocket = ws_1.default;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/websocket-provider.js\nvar require_websocket_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/websocket-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.WebSocketProvider = void 0;\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var ws_1 = require_ws2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var NextId = 1;\n    var WebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(WebSocketProvider2, _super);\n        function WebSocketProvider2(url, network) {\n          var _this = this;\n          if (network === \"any\") {\n            logger.throwError(\"WebSocketProvider does not support 'any' network yet\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"network:any\"\n            });\n          }\n          _this = _super.call(this, url, network) || this;\n          _this._pollingInterval = -1;\n          _this._wsReady = false;\n          (0, properties_1.defineReadOnly)(_this, \"_websocket\", new ws_1.WebSocket(_this.connection.url));\n          (0, properties_1.defineReadOnly)(_this, \"_requests\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_subs\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_subIds\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_detectNetwork\", _super.prototype.detectNetwork.call(_this));\n          _this._websocket.onopen = function() {\n            _this._wsReady = true;\n            Object.keys(_this._requests).forEach(function(id) {\n              _this._websocket.send(_this._requests[id].payload);\n            });\n          };\n          _this._websocket.onmessage = function(messageEvent) {\n            var data = messageEvent.data;\n            var result = JSON.parse(data);\n            if (result.id != null) {\n              var id = String(result.id);\n              var request = _this._requests[id];\n              delete _this._requests[id];\n              if (result.result !== void 0) {\n                request.callback(null, result.result);\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  request: JSON.parse(request.payload),\n                  response: result.result,\n                  provider: _this\n                });\n              } else {\n                var error = null;\n                if (result.error) {\n                  error = new Error(result.error.message || \"unknown error\");\n                  (0, properties_1.defineReadOnly)(error, \"code\", result.error.code || null);\n                  (0, properties_1.defineReadOnly)(error, \"response\", data);\n                } else {\n                  error = new Error(\"unknown error\");\n                }\n                request.callback(error, void 0);\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  error,\n                  request: JSON.parse(request.payload),\n                  provider: _this\n                });\n              }\n            } else if (result.method === \"eth_subscription\") {\n              var sub = _this._subs[result.params.subscription];\n              if (sub) {\n                sub.processFunc(result.params.result);\n              }\n            } else {\n              console.warn(\"this should not happen\");\n            }\n          };\n          var fauxPoll = setInterval(function() {\n            _this.emit(\"poll\");\n          }, 1e3);\n          if (fauxPoll.unref) {\n            fauxPoll.unref();\n          }\n          return _this;\n        }\n        WebSocketProvider2.prototype.detectNetwork = function() {\n          return this._detectNetwork;\n        };\n        Object.defineProperty(WebSocketProvider2.prototype, \"pollingInterval\", {\n          get: function() {\n            return 0;\n          },\n          set: function(value) {\n            logger.throwError(\"cannot set polling interval on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setPollingInterval\"\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        WebSocketProvider2.prototype.resetEventsBlock = function(blockNumber) {\n          logger.throwError(\"cannot reset events block on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"resetEventBlock\"\n          });\n        };\n        WebSocketProvider2.prototype.poll = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, null];\n            });\n          });\n        };\n        Object.defineProperty(WebSocketProvider2.prototype, \"polling\", {\n          set: function(value) {\n            if (!value) {\n              return;\n            }\n            logger.throwError(\"cannot set polling on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setPolling\"\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        WebSocketProvider2.prototype.send = function(method, params) {\n          var _this = this;\n          var rid = NextId++;\n          return new Promise(function(resolve, reject) {\n            function callback(error, result) {\n              if (error) {\n                return reject(error);\n              }\n              return resolve(result);\n            }\n            var payload = JSON.stringify({\n              method,\n              params,\n              id: rid,\n              jsonrpc: \"2.0\"\n            });\n            _this.emit(\"debug\", {\n              action: \"request\",\n              request: JSON.parse(payload),\n              provider: _this\n            });\n            _this._requests[String(rid)] = { callback, payload };\n            if (_this._wsReady) {\n              _this._websocket.send(payload);\n            }\n          });\n        };\n        WebSocketProvider2.defaultUrl = function() {\n          return \"ws://localhost:8546\";\n        };\n        WebSocketProvider2.prototype._subscribe = function(tag, param, processFunc) {\n          return __awaiter(this, void 0, void 0, function() {\n            var subIdPromise, subId;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  subIdPromise = this._subIds[tag];\n                  if (subIdPromise == null) {\n                    subIdPromise = Promise.all(param).then(function(param2) {\n                      return _this.send(\"eth_subscribe\", param2);\n                    });\n                    this._subIds[tag] = subIdPromise;\n                  }\n                  return [4, subIdPromise];\n                case 1:\n                  subId = _a.sent();\n                  this._subs[subId] = { tag, processFunc };\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        WebSocketProvider2.prototype._startEvent = function(event) {\n          var _this = this;\n          switch (event.type) {\n            case \"block\":\n              this._subscribe(\"block\", [\"newHeads\"], function(result) {\n                var blockNumber = bignumber_1.BigNumber.from(result.number).toNumber();\n                _this._emitted.block = blockNumber;\n                _this.emit(\"block\", blockNumber);\n              });\n              break;\n            case \"pending\":\n              this._subscribe(\"pending\", [\"newPendingTransactions\"], function(result) {\n                _this.emit(\"pending\", result);\n              });\n              break;\n            case \"filter\":\n              this._subscribe(event.tag, [\"logs\", this._getFilter(event.filter)], function(result) {\n                if (result.removed == null) {\n                  result.removed = false;\n                }\n                _this.emit(event.filter, _this.formatter.filterLog(result));\n              });\n              break;\n            case \"tx\": {\n              var emitReceipt_1 = function(event2) {\n                var hash = event2.hash;\n                _this.getTransactionReceipt(hash).then(function(receipt) {\n                  if (!receipt) {\n                    return;\n                  }\n                  _this.emit(hash, receipt);\n                });\n              };\n              emitReceipt_1(event);\n              this._subscribe(\"tx\", [\"newHeads\"], function(result) {\n                _this._events.filter(function(e) {\n                  return e.type === \"tx\";\n                }).forEach(emitReceipt_1);\n              });\n              break;\n            }\n            case \"debug\":\n            case \"poll\":\n            case \"willPoll\":\n            case \"didPoll\":\n            case \"error\":\n              break;\n            default:\n              console.log(\"unhandled:\", event);\n              break;\n          }\n        };\n        WebSocketProvider2.prototype._stopEvent = function(event) {\n          var _this = this;\n          var tag = event.tag;\n          if (event.type === \"tx\") {\n            if (this._events.filter(function(e) {\n              return e.type === \"tx\";\n            }).length) {\n              return;\n            }\n            tag = \"tx\";\n          } else if (this.listenerCount(event.event)) {\n            return;\n          }\n          var subId = this._subIds[tag];\n          if (!subId) {\n            return;\n          }\n          delete this._subIds[tag];\n          subId.then(function(subId2) {\n            if (!_this._subs[subId2]) {\n              return;\n            }\n            delete _this._subs[subId2];\n            _this.send(\"eth_unsubscribe\", [subId2]);\n          });\n        };\n        WebSocketProvider2.prototype.destroy = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(this._websocket.readyState === ws_1.WebSocket.CONNECTING)) return [3, 2];\n                  return [4, new Promise(function(resolve) {\n                    _this._websocket.onopen = function() {\n                      resolve(true);\n                    };\n                    _this._websocket.onerror = function() {\n                      resolve(false);\n                    };\n                  })];\n                case 1:\n                  _a.sent();\n                  _a.label = 2;\n                case 2:\n                  this._websocket.close(1e3);\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        return WebSocketProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.WebSocketProvider = WebSocketProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/url-json-rpc-provider.js\nvar require_url_json_rpc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/url-json-rpc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.UrlJsonRpcProvider = exports2.StaticJsonRpcProvider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var StaticJsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(StaticJsonRpcProvider2, _super);\n        function StaticJsonRpcProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        StaticJsonRpcProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  network = this.network;\n                  if (!(network == null)) return [3, 2];\n                  return [4, _super.prototype.detectNetwork.call(this)];\n                case 1:\n                  network = _a.sent();\n                  if (!network) {\n                    logger.throwError(\"no network detected\", logger_1.Logger.errors.UNKNOWN_ERROR, {});\n                  }\n                  if (this._network == null) {\n                    (0, properties_1.defineReadOnly)(this, \"_network\", network);\n                    this.emit(\"network\", network, null);\n                  }\n                  _a.label = 2;\n                case 2:\n                  return [2, network];\n              }\n            });\n          });\n        };\n        return StaticJsonRpcProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.StaticJsonRpcProvider = StaticJsonRpcProvider;\n    var UrlJsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(UrlJsonRpcProvider2, _super);\n        function UrlJsonRpcProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkAbstract(_newTarget, UrlJsonRpcProvider2);\n          network = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n          apiKey = (0, properties_1.getStatic)(_newTarget, \"getApiKey\")(apiKey);\n          var connection = (0, properties_1.getStatic)(_newTarget, \"getUrl\")(network, apiKey);\n          _this = _super.call(this, connection, network) || this;\n          if (typeof apiKey === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"apiKey\", apiKey);\n          } else if (apiKey != null) {\n            Object.keys(apiKey).forEach(function(key) {\n              (0, properties_1.defineReadOnly)(_this, key, apiKey[key]);\n            });\n          }\n          return _this;\n        }\n        UrlJsonRpcProvider2.prototype._startPending = function() {\n          logger.warn(\"WARNING: API provider does not support pending filters\");\n        };\n        UrlJsonRpcProvider2.prototype.isCommunityResource = function() {\n          return false;\n        };\n        UrlJsonRpcProvider2.prototype.getSigner = function(address) {\n          return logger.throwError(\"API provider does not support signing\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"getSigner\" });\n        };\n        UrlJsonRpcProvider2.prototype.listAccounts = function() {\n          return Promise.resolve([]);\n        };\n        UrlJsonRpcProvider2.getApiKey = function(apiKey) {\n          return apiKey;\n        };\n        UrlJsonRpcProvider2.getUrl = function(network, apiKey) {\n          return logger.throwError(\"not implemented; sub-classes must override getUrl\", logger_1.Logger.errors.NOT_IMPLEMENTED, {\n            operation: \"getUrl\"\n          });\n        };\n        return UrlJsonRpcProvider2;\n      }(StaticJsonRpcProvider)\n    );\n    exports2.UrlJsonRpcProvider = UrlJsonRpcProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/alchemy-provider.js\nvar require_alchemy_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/alchemy-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AlchemyProvider = exports2.AlchemyWebSocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var formatter_1 = require_formatter();\n    var websocket_provider_1 = require_websocket_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultApiKey = \"_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC\";\n    var AlchemyWebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(AlchemyWebSocketProvider2, _super);\n        function AlchemyWebSocketProvider2(network, apiKey) {\n          var _this = this;\n          var provider = new AlchemyProvider(network, apiKey);\n          var url = provider.connection.url.replace(/^http/i, \"ws\").replace(\".alchemyapi.\", \".ws.alchemyapi.\");\n          _this = _super.call(this, url, provider.network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", provider.apiKey);\n          return _this;\n        }\n        AlchemyWebSocketProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return AlchemyWebSocketProvider2;\n      }(websocket_provider_1.WebSocketProvider)\n    );\n    exports2.AlchemyWebSocketProvider = AlchemyWebSocketProvider;\n    var AlchemyProvider = (\n      /** @class */\n      function(_super) {\n        __extends(AlchemyProvider2, _super);\n        function AlchemyProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        AlchemyProvider2.getWebSocketProvider = function(network, apiKey) {\n          return new AlchemyWebSocketProvider(network, apiKey);\n        };\n        AlchemyProvider2.getApiKey = function(apiKey) {\n          if (apiKey == null) {\n            return defaultApiKey;\n          }\n          if (apiKey && typeof apiKey !== \"string\") {\n            logger.throwArgumentError(\"invalid apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKey;\n        };\n        AlchemyProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"eth-mainnet.alchemyapi.io/v2/\";\n              break;\n            case \"ropsten\":\n              host = \"eth-ropsten.alchemyapi.io/v2/\";\n              break;\n            case \"rinkeby\":\n              host = \"eth-rinkeby.alchemyapi.io/v2/\";\n              break;\n            case \"goerli\":\n              host = \"eth-goerli.alchemyapi.io/v2/\";\n              break;\n            case \"kovan\":\n              host = \"eth-kovan.alchemyapi.io/v2/\";\n              break;\n            case \"matic\":\n              host = \"polygon-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"maticmum\":\n              host = \"polygon-mumbai.g.alchemy.com/v2/\";\n              break;\n            case \"arbitrum\":\n              host = \"arb-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"arbitrum-rinkeby\":\n              host = \"arb-rinkeby.g.alchemy.com/v2/\";\n              break;\n            case \"optimism\":\n              host = \"opt-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"optimism-kovan\":\n              host = \"opt-kovan.g.alchemy.com/v2/\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return {\n            allowGzip: true,\n            url: \"https://\" + host + apiKey,\n            throttleCallback: function(attempt, url) {\n              if (apiKey === defaultApiKey) {\n                (0, formatter_1.showThrottleMessage)();\n              }\n              return Promise.resolve(true);\n            }\n          };\n        };\n        AlchemyProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return AlchemyProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.AlchemyProvider = AlchemyProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/cloudflare-provider.js\nvar require_cloudflare_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/cloudflare-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.CloudflareProvider = void 0;\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var CloudflareProvider = (\n      /** @class */\n      function(_super) {\n        __extends(CloudflareProvider2, _super);\n        function CloudflareProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        CloudflareProvider2.getApiKey = function(apiKey) {\n          if (apiKey != null) {\n            logger.throwArgumentError(\"apiKey not supported for cloudflare\", \"apiKey\", apiKey);\n          }\n          return null;\n        };\n        CloudflareProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"https://cloudflare-eth.com/\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return host;\n        };\n        CloudflareProvider2.prototype.perform = function(method, params) {\n          return __awaiter(this, void 0, void 0, function() {\n            var block;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"getBlockNumber\")) return [3, 2];\n                  return [4, _super.prototype.perform.call(this, \"getBlock\", { blockTag: \"latest\" })];\n                case 1:\n                  block = _a.sent();\n                  return [2, block.number];\n                case 2:\n                  return [2, _super.prototype.perform.call(this, method, params)];\n              }\n            });\n          });\n        };\n        return CloudflareProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.CloudflareProvider = CloudflareProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/etherscan-provider.js\nvar require_etherscan_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/etherscan-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherscanProvider = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var web_1 = require_lib27();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var base_provider_1 = require_base_provider();\n    function getTransactionPostData(transaction) {\n      var result = {};\n      for (var key in transaction) {\n        if (transaction[key] == null) {\n          continue;\n        }\n        var value = transaction[key];\n        if (key === \"type\" && value === 0) {\n          continue;\n        }\n        if ({ type: true, gasLimit: true, gasPrice: true, maxFeePerGs: true, maxPriorityFeePerGas: true, nonce: true, value: true }[key]) {\n          value = (0, bytes_1.hexValue)((0, bytes_1.hexlify)(value));\n        } else if (key === \"accessList\") {\n          value = \"[\" + (0, transactions_1.accessListify)(value).map(function(set) {\n            return '{address:\"' + set.address + '\",storageKeys:[\"' + set.storageKeys.join('\",\"') + '\"]}';\n          }).join(\",\") + \"]\";\n        } else {\n          value = (0, bytes_1.hexlify)(value);\n        }\n        result[key] = value;\n      }\n      return result;\n    }\n    function getResult(result) {\n      if (result.status == 0 && (result.message === \"No records found\" || result.message === \"No transactions found\")) {\n        return result.result;\n      }\n      if (result.status != 1 || result.message != \"OK\") {\n        var error = new Error(\"invalid response\");\n        error.result = JSON.stringify(result);\n        if ((result.result || \"\").toLowerCase().indexOf(\"rate limit\") >= 0) {\n          error.throttleRetry = true;\n        }\n        throw error;\n      }\n      return result.result;\n    }\n    function getJsonResult(result) {\n      if (result && result.status == 0 && result.message == \"NOTOK\" && (result.result || \"\").toLowerCase().indexOf(\"rate limit\") >= 0) {\n        var error = new Error(\"throttled response\");\n        error.result = JSON.stringify(result);\n        error.throttleRetry = true;\n        throw error;\n      }\n      if (result.jsonrpc != \"2.0\") {\n        var error = new Error(\"invalid response\");\n        error.result = JSON.stringify(result);\n        throw error;\n      }\n      if (result.error) {\n        var error = new Error(result.error.message || \"unknown error\");\n        if (result.error.code) {\n          error.code = result.error.code;\n        }\n        if (result.error.data) {\n          error.data = result.error.data;\n        }\n        throw error;\n      }\n      return result.result;\n    }\n    function checkLogTag(blockTag) {\n      if (blockTag === \"pending\") {\n        throw new Error(\"pending not supported\");\n      }\n      if (blockTag === \"latest\") {\n        return blockTag;\n      }\n      return parseInt(blockTag.substring(2), 16);\n    }\n    var defaultApiKey = \"9D13ZE7XSBTJ94N9BNJ2MA33VMAY2YPIRB\";\n    function checkError(method, error, transaction) {\n      if (method === \"call\" && error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        var e = error.error;\n        if (e && (e.message.match(/reverted/i) || e.message.match(/VM execution error/i))) {\n          var data = e.data;\n          if (data) {\n            data = \"0x\" + data.replace(/^.*0x/i, \"\");\n          }\n          if ((0, bytes_1.isHexString)(data)) {\n            return data;\n          }\n          logger.throwError(\"missing revert data in call exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n            error,\n            data: \"0x\"\n          });\n        }\n      }\n      var message = error.message;\n      if (error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        if (error.error && typeof error.error.message === \"string\") {\n          message = error.error.message;\n        } else if (typeof error.body === \"string\") {\n          message = error.body;\n        } else if (typeof error.responseText === \"string\") {\n          message = error.responseText;\n        }\n      }\n      message = (message || \"\").toLowerCase();\n      if (message.match(/insufficient funds/)) {\n        logger.throwError(\"insufficient funds for intrinsic transaction cost\", logger_1.Logger.errors.INSUFFICIENT_FUNDS, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/same hash was already imported|transaction nonce is too low|nonce too low/)) {\n        logger.throwError(\"nonce has already been used\", logger_1.Logger.errors.NONCE_EXPIRED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/another transaction with same nonce/)) {\n        logger.throwError(\"replacement fee too low\", logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/execution failed due to an exception|execution reverted/)) {\n        logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n          error,\n          method,\n          transaction\n        });\n      }\n      throw error;\n    }\n    var EtherscanProvider = (\n      /** @class */\n      function(_super) {\n        __extends(EtherscanProvider2, _super);\n        function EtherscanProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, EtherscanProvider2);\n          _this = _super.call(this, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"baseUrl\", _this.getBaseUrl());\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", apiKey || defaultApiKey);\n          return _this;\n        }\n        EtherscanProvider2.prototype.getBaseUrl = function() {\n          switch (this.network ? this.network.name : \"invalid\") {\n            case \"homestead\":\n              return \"https://api.etherscan.io\";\n            case \"ropsten\":\n              return \"https://api-ropsten.etherscan.io\";\n            case \"rinkeby\":\n              return \"https://api-rinkeby.etherscan.io\";\n            case \"kovan\":\n              return \"https://api-kovan.etherscan.io\";\n            case \"goerli\":\n              return \"https://api-goerli.etherscan.io\";\n            default:\n          }\n          return logger.throwArgumentError(\"unsupported network\", \"network\", name);\n        };\n        EtherscanProvider2.prototype.getUrl = function(module3, params) {\n          var query = Object.keys(params).reduce(function(accum, key) {\n            var value = params[key];\n            if (value != null) {\n              accum += \"&\" + key + \"=\" + value;\n            }\n            return accum;\n          }, \"\");\n          var apiKey = this.apiKey ? \"&apikey=\" + this.apiKey : \"\";\n          return this.baseUrl + \"/api?module=\" + module3 + query + apiKey;\n        };\n        EtherscanProvider2.prototype.getPostUrl = function() {\n          return this.baseUrl + \"/api\";\n        };\n        EtherscanProvider2.prototype.getPostData = function(module3, params) {\n          params.module = module3;\n          params.apikey = this.apiKey;\n          return params;\n        };\n        EtherscanProvider2.prototype.fetch = function(module3, params, post) {\n          return __awaiter(this, void 0, void 0, function() {\n            var url, payload, procFunc, connection, payloadStr, result;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  url = post ? this.getPostUrl() : this.getUrl(module3, params);\n                  payload = post ? this.getPostData(module3, params) : null;\n                  procFunc = module3 === \"proxy\" ? getJsonResult : getResult;\n                  this.emit(\"debug\", {\n                    action: \"request\",\n                    request: url,\n                    provider: this\n                  });\n                  connection = {\n                    url,\n                    throttleSlotInterval: 1e3,\n                    throttleCallback: function(attempt, url2) {\n                      if (_this.isCommunityResource()) {\n                        (0, formatter_1.showThrottleMessage)();\n                      }\n                      return Promise.resolve(true);\n                    }\n                  };\n                  payloadStr = null;\n                  if (payload) {\n                    connection.headers = { \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\" };\n                    payloadStr = Object.keys(payload).map(function(key) {\n                      return key + \"=\" + payload[key];\n                    }).join(\"&\");\n                  }\n                  return [4, (0, web_1.fetchJson)(connection, payloadStr, procFunc || getJsonResult)];\n                case 1:\n                  result = _a.sent();\n                  this.emit(\"debug\", {\n                    action: \"response\",\n                    request: url,\n                    response: (0, properties_1.deepCopy)(result),\n                    provider: this\n                  });\n                  return [2, result];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this.network];\n            });\n          });\n        };\n        EtherscanProvider2.prototype.perform = function(method, params) {\n          return __awaiter(this, void 0, void 0, function() {\n            var _a, postData, error_1, postData, error_2, args, topic0, logs, blocks, i, log, block, _b;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  _a = method;\n                  switch (_a) {\n                    case \"getBlockNumber\":\n                      return [3, 1];\n                    case \"getGasPrice\":\n                      return [3, 2];\n                    case \"getBalance\":\n                      return [3, 3];\n                    case \"getTransactionCount\":\n                      return [3, 4];\n                    case \"getCode\":\n                      return [3, 5];\n                    case \"getStorageAt\":\n                      return [3, 6];\n                    case \"sendTransaction\":\n                      return [3, 7];\n                    case \"getBlock\":\n                      return [3, 8];\n                    case \"getTransaction\":\n                      return [3, 9];\n                    case \"getTransactionReceipt\":\n                      return [3, 10];\n                    case \"call\":\n                      return [3, 11];\n                    case \"estimateGas\":\n                      return [3, 15];\n                    case \"getLogs\":\n                      return [3, 19];\n                    case \"getEtherPrice\":\n                      return [3, 26];\n                  }\n                  return [3, 28];\n                case 1:\n                  return [2, this.fetch(\"proxy\", { action: \"eth_blockNumber\" })];\n                case 2:\n                  return [2, this.fetch(\"proxy\", { action: \"eth_gasPrice\" })];\n                case 3:\n                  return [2, this.fetch(\"account\", {\n                    action: \"balance\",\n                    address: params.address,\n                    tag: params.blockTag\n                  })];\n                case 4:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionCount\",\n                    address: params.address,\n                    tag: params.blockTag\n                  })];\n                case 5:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getCode\",\n                    address: params.address,\n                    tag: params.blockTag\n                  })];\n                case 6:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getStorageAt\",\n                    address: params.address,\n                    position: params.position,\n                    tag: params.blockTag\n                  })];\n                case 7:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_sendRawTransaction\",\n                    hex: params.signedTransaction\n                  }, true).catch(function(error) {\n                    return checkError(\"sendTransaction\", error, params.signedTransaction);\n                  })];\n                case 8:\n                  if (params.blockTag) {\n                    return [2, this.fetch(\"proxy\", {\n                      action: \"eth_getBlockByNumber\",\n                      tag: params.blockTag,\n                      boolean: params.includeTransactions ? \"true\" : \"false\"\n                    })];\n                  }\n                  throw new Error(\"getBlock by blockHash not implemented\");\n                case 9:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionByHash\",\n                    txhash: params.transactionHash\n                  })];\n                case 10:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionReceipt\",\n                    txhash: params.transactionHash\n                  })];\n                case 11:\n                  if (params.blockTag !== \"latest\") {\n                    throw new Error(\"EtherscanProvider does not support blockTag for call\");\n                  }\n                  postData = getTransactionPostData(params.transaction);\n                  postData.module = \"proxy\";\n                  postData.action = \"eth_call\";\n                  _c.label = 12;\n                case 12:\n                  _c.trys.push([12, 14, , 15]);\n                  return [4, this.fetch(\"proxy\", postData, true)];\n                case 13:\n                  return [2, _c.sent()];\n                case 14:\n                  error_1 = _c.sent();\n                  return [2, checkError(\"call\", error_1, params.transaction)];\n                case 15:\n                  postData = getTransactionPostData(params.transaction);\n                  postData.module = \"proxy\";\n                  postData.action = \"eth_estimateGas\";\n                  _c.label = 16;\n                case 16:\n                  _c.trys.push([16, 18, , 19]);\n                  return [4, this.fetch(\"proxy\", postData, true)];\n                case 17:\n                  return [2, _c.sent()];\n                case 18:\n                  error_2 = _c.sent();\n                  return [2, checkError(\"estimateGas\", error_2, params.transaction)];\n                case 19:\n                  args = { action: \"getLogs\" };\n                  if (params.filter.fromBlock) {\n                    args.fromBlock = checkLogTag(params.filter.fromBlock);\n                  }\n                  if (params.filter.toBlock) {\n                    args.toBlock = checkLogTag(params.filter.toBlock);\n                  }\n                  if (params.filter.address) {\n                    args.address = params.filter.address;\n                  }\n                  if (params.filter.topics && params.filter.topics.length > 0) {\n                    if (params.filter.topics.length > 1) {\n                      logger.throwError(\"unsupported topic count\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { topics: params.filter.topics });\n                    }\n                    if (params.filter.topics.length === 1) {\n                      topic0 = params.filter.topics[0];\n                      if (typeof topic0 !== \"string\" || topic0.length !== 66) {\n                        logger.throwError(\"unsupported topic format\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { topic0 });\n                      }\n                      args.topic0 = topic0;\n                    }\n                  }\n                  return [4, this.fetch(\"logs\", args)];\n                case 20:\n                  logs = _c.sent();\n                  blocks = {};\n                  i = 0;\n                  _c.label = 21;\n                case 21:\n                  if (!(i < logs.length)) return [3, 25];\n                  log = logs[i];\n                  if (log.blockHash != null) {\n                    return [3, 24];\n                  }\n                  if (!(blocks[log.blockNumber] == null)) return [3, 23];\n                  return [4, this.getBlock(log.blockNumber)];\n                case 22:\n                  block = _c.sent();\n                  if (block) {\n                    blocks[log.blockNumber] = block.hash;\n                  }\n                  _c.label = 23;\n                case 23:\n                  log.blockHash = blocks[log.blockNumber];\n                  _c.label = 24;\n                case 24:\n                  i++;\n                  return [3, 21];\n                case 25:\n                  return [2, logs];\n                case 26:\n                  if (this.network.name !== \"homestead\") {\n                    return [2, 0];\n                  }\n                  _b = parseFloat;\n                  return [4, this.fetch(\"stats\", { action: \"ethprice\" })];\n                case 27:\n                  return [2, _b.apply(void 0, [_c.sent().ethusd])];\n                case 28:\n                  return [3, 29];\n                case 29:\n                  return [2, _super.prototype.perform.call(this, method, params)];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.getHistory = function(addressOrName, startBlock, endBlock) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            var _a;\n            var _this = this;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  _a = {\n                    action: \"txlist\"\n                  };\n                  return [4, this.resolveName(addressOrName)];\n                case 1:\n                  params = (_a.address = _b.sent(), _a.startblock = startBlock == null ? 0 : startBlock, _a.endblock = endBlock == null ? 99999999 : endBlock, _a.sort = \"asc\", _a);\n                  return [4, this.fetch(\"account\", params)];\n                case 2:\n                  result = _b.sent();\n                  return [2, result.map(function(tx) {\n                    [\"contractAddress\", \"to\"].forEach(function(key) {\n                      if (tx[key] == \"\") {\n                        delete tx[key];\n                      }\n                    });\n                    if (tx.creates == null && tx.contractAddress != null) {\n                      tx.creates = tx.contractAddress;\n                    }\n                    var item = _this.formatter.transactionResponse(tx);\n                    if (tx.timeStamp) {\n                      item.timestamp = parseInt(tx.timeStamp);\n                    }\n                    return item;\n                  })];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return EtherscanProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.EtherscanProvider = EtherscanProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/fallback-provider.js\nvar require_fallback_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/fallback-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FallbackProvider = void 0;\n    var abstract_provider_1 = require_lib12();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var random_1 = require_lib22();\n    var web_1 = require_lib27();\n    var base_provider_1 = require_base_provider();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    function now() {\n      return (/* @__PURE__ */ new Date()).getTime();\n    }\n    function checkNetworks(networks) {\n      var result = null;\n      for (var i = 0; i < networks.length; i++) {\n        var network = networks[i];\n        if (network == null) {\n          return null;\n        }\n        if (result) {\n          if (!(result.name === network.name && result.chainId === network.chainId && (result.ensAddress === network.ensAddress || result.ensAddress == null && network.ensAddress == null))) {\n            logger.throwArgumentError(\"provider mismatch\", \"networks\", networks);\n          }\n        } else {\n          result = network;\n        }\n      }\n      return result;\n    }\n    function median(values, maxDelta) {\n      values = values.slice().sort();\n      var middle = Math.floor(values.length / 2);\n      if (values.length % 2) {\n        return values[middle];\n      }\n      var a = values[middle - 1], b = values[middle];\n      if (maxDelta != null && Math.abs(a - b) > maxDelta) {\n        return null;\n      }\n      return (a + b) / 2;\n    }\n    function serialize(value) {\n      if (value === null) {\n        return \"null\";\n      } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n        return JSON.stringify(value);\n      } else if (typeof value === \"string\") {\n        return value;\n      } else if (bignumber_1.BigNumber.isBigNumber(value)) {\n        return value.toString();\n      } else if (Array.isArray(value)) {\n        return JSON.stringify(value.map(function(i) {\n          return serialize(i);\n        }));\n      } else if (typeof value === \"object\") {\n        var keys = Object.keys(value);\n        keys.sort();\n        return \"{\" + keys.map(function(key) {\n          var v = value[key];\n          if (typeof v === \"function\") {\n            v = \"[function]\";\n          } else {\n            v = serialize(v);\n          }\n          return JSON.stringify(key) + \":\" + v;\n        }).join(\",\") + \"}\";\n      }\n      throw new Error(\"unknown value type: \" + typeof value);\n    }\n    var nextRid = 1;\n    function stall(duration) {\n      var cancel = null;\n      var timer = null;\n      var promise = new Promise(function(resolve) {\n        cancel = function() {\n          if (timer) {\n            clearTimeout(timer);\n            timer = null;\n          }\n          resolve();\n        };\n        timer = setTimeout(cancel, duration);\n      });\n      var wait = function(func) {\n        promise = promise.then(func);\n        return promise;\n      };\n      function getPromise() {\n        return promise;\n      }\n      return { cancel, getPromise, wait };\n    }\n    var ForwardErrors = [\n      logger_1.Logger.errors.CALL_EXCEPTION,\n      logger_1.Logger.errors.INSUFFICIENT_FUNDS,\n      logger_1.Logger.errors.NONCE_EXPIRED,\n      logger_1.Logger.errors.REPLACEMENT_UNDERPRICED,\n      logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT\n    ];\n    var ForwardProperties = [\n      \"address\",\n      \"args\",\n      \"errorArgs\",\n      \"errorSignature\",\n      \"method\",\n      \"transaction\"\n    ];\n    function exposeDebugConfig(config, now2) {\n      var result = {\n        weight: config.weight\n      };\n      Object.defineProperty(result, \"provider\", { get: function() {\n        return config.provider;\n      } });\n      if (config.start) {\n        result.start = config.start;\n      }\n      if (now2) {\n        result.duration = now2 - config.start;\n      }\n      if (config.done) {\n        if (config.error) {\n          result.error = config.error;\n        } else {\n          result.result = config.result || null;\n        }\n      }\n      return result;\n    }\n    function normalizedTally(normalize, quorum) {\n      return function(configs) {\n        var tally = {};\n        configs.forEach(function(c) {\n          var value = normalize(c.result);\n          if (!tally[value]) {\n            tally[value] = { count: 0, result: c.result };\n          }\n          tally[value].count++;\n        });\n        var keys = Object.keys(tally);\n        for (var i = 0; i < keys.length; i++) {\n          var check = tally[keys[i]];\n          if (check.count >= quorum) {\n            return check.result;\n          }\n        }\n        return void 0;\n      };\n    }\n    function getProcessFunc(provider, method, params) {\n      var normalize = serialize;\n      switch (method) {\n        case \"getBlockNumber\":\n          return function(configs) {\n            var values = configs.map(function(c) {\n              return c.result;\n            });\n            var blockNumber = median(configs.map(function(c) {\n              return c.result;\n            }), 2);\n            if (blockNumber == null) {\n              return void 0;\n            }\n            blockNumber = Math.ceil(blockNumber);\n            if (values.indexOf(blockNumber + 1) >= 0) {\n              blockNumber++;\n            }\n            if (blockNumber >= provider._highestBlockNumber) {\n              provider._highestBlockNumber = blockNumber;\n            }\n            return provider._highestBlockNumber;\n          };\n        case \"getGasPrice\":\n          return function(configs) {\n            var values = configs.map(function(c) {\n              return c.result;\n            });\n            values.sort();\n            return values[Math.floor(values.length / 2)];\n          };\n        case \"getEtherPrice\":\n          return function(configs) {\n            return median(configs.map(function(c) {\n              return c.result;\n            }));\n          };\n        case \"getBalance\":\n        case \"getTransactionCount\":\n        case \"getCode\":\n        case \"getStorageAt\":\n        case \"call\":\n        case \"estimateGas\":\n        case \"getLogs\":\n          break;\n        case \"getTransaction\":\n        case \"getTransactionReceipt\":\n          normalize = function(tx) {\n            if (tx == null) {\n              return null;\n            }\n            tx = (0, properties_1.shallowCopy)(tx);\n            tx.confirmations = -1;\n            return serialize(tx);\n          };\n          break;\n        case \"getBlock\":\n          if (params.includeTransactions) {\n            normalize = function(block) {\n              if (block == null) {\n                return null;\n              }\n              block = (0, properties_1.shallowCopy)(block);\n              block.transactions = block.transactions.map(function(tx) {\n                tx = (0, properties_1.shallowCopy)(tx);\n                tx.confirmations = -1;\n                return tx;\n              });\n              return serialize(block);\n            };\n          } else {\n            normalize = function(block) {\n              if (block == null) {\n                return null;\n              }\n              return serialize(block);\n            };\n          }\n          break;\n        default:\n          throw new Error(\"unknown method: \" + method);\n      }\n      return normalizedTally(normalize, provider.quorum);\n    }\n    function waitForSync(config, blockNumber) {\n      return __awaiter(this, void 0, void 0, function() {\n        var provider;\n        return __generator(this, function(_a) {\n          provider = config.provider;\n          if (provider.blockNumber != null && provider.blockNumber >= blockNumber || blockNumber === -1) {\n            return [2, provider];\n          }\n          return [2, (0, web_1.poll)(function() {\n            return new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                if (provider.blockNumber >= blockNumber) {\n                  return resolve(provider);\n                }\n                if (config.cancelled) {\n                  return resolve(null);\n                }\n                return resolve(void 0);\n              }, 0);\n            });\n          }, { oncePoll: provider })];\n        });\n      });\n    }\n    function getRunner(config, currentBlockNumber, method, params) {\n      return __awaiter(this, void 0, void 0, function() {\n        var provider, _a, filter;\n        return __generator(this, function(_b) {\n          switch (_b.label) {\n            case 0:\n              provider = config.provider;\n              _a = method;\n              switch (_a) {\n                case \"getBlockNumber\":\n                  return [3, 1];\n                case \"getGasPrice\":\n                  return [3, 1];\n                case \"getEtherPrice\":\n                  return [3, 2];\n                case \"getBalance\":\n                  return [3, 3];\n                case \"getTransactionCount\":\n                  return [3, 3];\n                case \"getCode\":\n                  return [3, 3];\n                case \"getStorageAt\":\n                  return [3, 6];\n                case \"getBlock\":\n                  return [3, 9];\n                case \"call\":\n                  return [3, 12];\n                case \"estimateGas\":\n                  return [3, 12];\n                case \"getTransaction\":\n                  return [3, 15];\n                case \"getTransactionReceipt\":\n                  return [3, 15];\n                case \"getLogs\":\n                  return [3, 16];\n              }\n              return [3, 19];\n            case 1:\n              return [2, provider[method]()];\n            case 2:\n              if (provider.getEtherPrice) {\n                return [2, provider.getEtherPrice()];\n              }\n              return [3, 19];\n            case 3:\n              if (!(params.blockTag && (0, bytes_1.isHexString)(params.blockTag))) return [3, 5];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 4:\n              provider = _b.sent();\n              _b.label = 5;\n            case 5:\n              return [2, provider[method](params.address, params.blockTag || \"latest\")];\n            case 6:\n              if (!(params.blockTag && (0, bytes_1.isHexString)(params.blockTag))) return [3, 8];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 7:\n              provider = _b.sent();\n              _b.label = 8;\n            case 8:\n              return [2, provider.getStorageAt(params.address, params.position, params.blockTag || \"latest\")];\n            case 9:\n              if (!(params.blockTag && (0, bytes_1.isHexString)(params.blockTag))) return [3, 11];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 10:\n              provider = _b.sent();\n              _b.label = 11;\n            case 11:\n              return [2, provider[params.includeTransactions ? \"getBlockWithTransactions\" : \"getBlock\"](params.blockTag || params.blockHash)];\n            case 12:\n              if (!(params.blockTag && (0, bytes_1.isHexString)(params.blockTag))) return [3, 14];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 13:\n              provider = _b.sent();\n              _b.label = 14;\n            case 14:\n              return [2, provider[method](params.transaction)];\n            case 15:\n              return [2, provider[method](params.transactionHash)];\n            case 16:\n              filter = params.filter;\n              if (!(filter.fromBlock && (0, bytes_1.isHexString)(filter.fromBlock) || filter.toBlock && (0, bytes_1.isHexString)(filter.toBlock))) return [3, 18];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 17:\n              provider = _b.sent();\n              _b.label = 18;\n            case 18:\n              return [2, provider.getLogs(filter)];\n            case 19:\n              return [2, logger.throwError(\"unknown method error\", logger_1.Logger.errors.UNKNOWN_ERROR, {\n                method,\n                params\n              })];\n          }\n        });\n      });\n    }\n    var FallbackProvider = (\n      /** @class */\n      function(_super) {\n        __extends(FallbackProvider2, _super);\n        function FallbackProvider2(providers, quorum) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, FallbackProvider2);\n          if (providers.length === 0) {\n            logger.throwArgumentError(\"missing providers\", \"providers\", providers);\n          }\n          var providerConfigs = providers.map(function(configOrProvider, index) {\n            if (abstract_provider_1.Provider.isProvider(configOrProvider)) {\n              var stallTimeout = (0, formatter_1.isCommunityResource)(configOrProvider) ? 2e3 : 750;\n              var priority = 1;\n              return Object.freeze({ provider: configOrProvider, weight: 1, stallTimeout, priority });\n            }\n            var config = (0, properties_1.shallowCopy)(configOrProvider);\n            if (config.priority == null) {\n              config.priority = 1;\n            }\n            if (config.stallTimeout == null) {\n              config.stallTimeout = (0, formatter_1.isCommunityResource)(configOrProvider) ? 2e3 : 750;\n            }\n            if (config.weight == null) {\n              config.weight = 1;\n            }\n            var weight = config.weight;\n            if (weight % 1 || weight > 512 || weight < 1) {\n              logger.throwArgumentError(\"invalid weight; must be integer in [1, 512]\", \"providers[\" + index + \"].weight\", weight);\n            }\n            return Object.freeze(config);\n          });\n          var total = providerConfigs.reduce(function(accum, c) {\n            return accum + c.weight;\n          }, 0);\n          if (quorum == null) {\n            quorum = total / 2;\n          } else if (quorum > total) {\n            logger.throwArgumentError(\"quorum will always fail; larger than total weight\", \"quorum\", quorum);\n          }\n          var networkOrReady = checkNetworks(providerConfigs.map(function(c) {\n            return c.provider.network;\n          }));\n          if (networkOrReady == null) {\n            networkOrReady = new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                _this.detectNetwork().then(resolve, reject);\n              }, 0);\n            });\n          }\n          _this = _super.call(this, networkOrReady) || this;\n          (0, properties_1.defineReadOnly)(_this, \"providerConfigs\", Object.freeze(providerConfigs));\n          (0, properties_1.defineReadOnly)(_this, \"quorum\", quorum);\n          _this._highestBlockNumber = -1;\n          return _this;\n        }\n        FallbackProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var networks;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, Promise.all(this.providerConfigs.map(function(c) {\n                    return c.provider.getNetwork();\n                  }))];\n                case 1:\n                  networks = _a.sent();\n                  return [2, checkNetworks(networks)];\n              }\n            });\n          });\n        };\n        FallbackProvider2.prototype.perform = function(method, params) {\n          return __awaiter(this, void 0, void 0, function() {\n            var results, i_1, result, processFunc, configs, currentBlockNumber, i, first, _loop_1, this_1, state_1;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"sendTransaction\")) return [3, 2];\n                  return [4, Promise.all(this.providerConfigs.map(function(c) {\n                    return c.provider.sendTransaction(params.signedTransaction).then(function(result2) {\n                      return result2.hash;\n                    }, function(error) {\n                      return error;\n                    });\n                  }))];\n                case 1:\n                  results = _a.sent();\n                  for (i_1 = 0; i_1 < results.length; i_1++) {\n                    result = results[i_1];\n                    if (typeof result === \"string\") {\n                      return [2, result];\n                    }\n                  }\n                  throw results[0];\n                case 2:\n                  if (!(this._highestBlockNumber === -1 && method !== \"getBlockNumber\")) return [3, 4];\n                  return [4, this.getBlockNumber()];\n                case 3:\n                  _a.sent();\n                  _a.label = 4;\n                case 4:\n                  processFunc = getProcessFunc(this, method, params);\n                  configs = (0, random_1.shuffled)(this.providerConfigs.map(properties_1.shallowCopy));\n                  configs.sort(function(a, b) {\n                    return a.priority - b.priority;\n                  });\n                  currentBlockNumber = this._highestBlockNumber;\n                  i = 0;\n                  first = true;\n                  _loop_1 = function() {\n                    var t0, inflightWeight, _loop_2, waiting, results2, result2, errors;\n                    return __generator(this, function(_b) {\n                      switch (_b.label) {\n                        case 0:\n                          t0 = now();\n                          inflightWeight = configs.filter(function(c) {\n                            return c.runner && t0 - c.start < c.stallTimeout;\n                          }).reduce(function(accum, c) {\n                            return accum + c.weight;\n                          }, 0);\n                          _loop_2 = function() {\n                            var config = configs[i++];\n                            var rid = nextRid++;\n                            config.start = now();\n                            config.staller = stall(config.stallTimeout);\n                            config.staller.wait(function() {\n                              config.staller = null;\n                            });\n                            config.runner = getRunner(config, currentBlockNumber, method, params).then(function(result3) {\n                              config.done = true;\n                              config.result = result3;\n                              if (_this.listenerCount(\"debug\")) {\n                                _this.emit(\"debug\", {\n                                  action: \"request\",\n                                  rid,\n                                  backend: exposeDebugConfig(config, now()),\n                                  request: { method, params: (0, properties_1.deepCopy)(params) },\n                                  provider: _this\n                                });\n                              }\n                            }, function(error) {\n                              config.done = true;\n                              config.error = error;\n                              if (_this.listenerCount(\"debug\")) {\n                                _this.emit(\"debug\", {\n                                  action: \"request\",\n                                  rid,\n                                  backend: exposeDebugConfig(config, now()),\n                                  request: { method, params: (0, properties_1.deepCopy)(params) },\n                                  provider: _this\n                                });\n                              }\n                            });\n                            if (this_1.listenerCount(\"debug\")) {\n                              this_1.emit(\"debug\", {\n                                action: \"request\",\n                                rid,\n                                backend: exposeDebugConfig(config, null),\n                                request: { method, params: (0, properties_1.deepCopy)(params) },\n                                provider: this_1\n                              });\n                            }\n                            inflightWeight += config.weight;\n                          };\n                          while (inflightWeight < this_1.quorum && i < configs.length) {\n                            _loop_2();\n                          }\n                          waiting = [];\n                          configs.forEach(function(c) {\n                            if (c.done || !c.runner) {\n                              return;\n                            }\n                            waiting.push(c.runner);\n                            if (c.staller) {\n                              waiting.push(c.staller.getPromise());\n                            }\n                          });\n                          if (!waiting.length) return [3, 2];\n                          return [4, Promise.race(waiting)];\n                        case 1:\n                          _b.sent();\n                          _b.label = 2;\n                        case 2:\n                          results2 = configs.filter(function(c) {\n                            return c.done && c.error == null;\n                          });\n                          if (!(results2.length >= this_1.quorum)) return [3, 5];\n                          result2 = processFunc(results2);\n                          if (result2 !== void 0) {\n                            configs.forEach(function(c) {\n                              if (c.staller) {\n                                c.staller.cancel();\n                              }\n                              c.cancelled = true;\n                            });\n                            return [2, { value: result2 }];\n                          }\n                          if (!!first) return [3, 4];\n                          return [4, stall(100).getPromise()];\n                        case 3:\n                          _b.sent();\n                          _b.label = 4;\n                        case 4:\n                          first = false;\n                          _b.label = 5;\n                        case 5:\n                          errors = configs.reduce(function(accum, c) {\n                            if (!c.done || c.error == null) {\n                              return accum;\n                            }\n                            var code = c.error.code;\n                            if (ForwardErrors.indexOf(code) >= 0) {\n                              if (!accum[code]) {\n                                accum[code] = { error: c.error, weight: 0 };\n                              }\n                              accum[code].weight += c.weight;\n                            }\n                            return accum;\n                          }, {});\n                          Object.keys(errors).forEach(function(errorCode) {\n                            var tally = errors[errorCode];\n                            if (tally.weight < _this.quorum) {\n                              return;\n                            }\n                            configs.forEach(function(c) {\n                              if (c.staller) {\n                                c.staller.cancel();\n                              }\n                              c.cancelled = true;\n                            });\n                            var e = tally.error;\n                            var props = {};\n                            ForwardProperties.forEach(function(name2) {\n                              if (e[name2] == null) {\n                                return;\n                              }\n                              props[name2] = e[name2];\n                            });\n                            logger.throwError(e.reason || e.message, errorCode, props);\n                          });\n                          if (configs.filter(function(c) {\n                            return !c.done;\n                          }).length === 0) {\n                            return [2, \"break\"];\n                          }\n                          return [\n                            2\n                            /*return*/\n                          ];\n                      }\n                    });\n                  };\n                  this_1 = this;\n                  _a.label = 5;\n                case 5:\n                  if (false) return [3, 7];\n                  return [5, _loop_1()];\n                case 6:\n                  state_1 = _a.sent();\n                  if (typeof state_1 === \"object\")\n                    return [2, state_1.value];\n                  if (state_1 === \"break\")\n                    return [3, 7];\n                  return [3, 5];\n                case 7:\n                  configs.forEach(function(c) {\n                    if (c.staller) {\n                      c.staller.cancel();\n                    }\n                    c.cancelled = true;\n                  });\n                  return [2, logger.throwError(\"failed to meet quorum\", logger_1.Logger.errors.SERVER_ERROR, {\n                    method,\n                    params,\n                    //results: configs.map((c) => c.result),\n                    //errors: configs.map((c) => c.error),\n                    results: configs.map(function(c) {\n                      return exposeDebugConfig(c);\n                    }),\n                    provider: this\n                  })];\n              }\n            });\n          });\n        };\n        return FallbackProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.FallbackProvider = FallbackProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/ipc-provider.js\nvar require_ipc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/ipc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.IpcProvider = void 0;\n    var net_1 = require(\"net\");\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var IpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(IpcProvider2, _super);\n        function IpcProvider2(path, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, IpcProvider2);\n          if (path == null) {\n            logger.throwError(\"missing path\", logger_1.Logger.errors.MISSING_ARGUMENT, { arg: \"path\" });\n          }\n          _this = _super.call(this, \"ipc://\" + path, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"path\", path);\n          return _this;\n        }\n        IpcProvider2.prototype.send = function(method, params) {\n          var _this = this;\n          var payload = JSON.stringify({\n            method,\n            params,\n            id: 42,\n            jsonrpc: \"2.0\"\n          });\n          return new Promise(function(resolve, reject) {\n            var response = Buffer.alloc(0);\n            var stream = (0, net_1.connect)(_this.path);\n            stream.on(\"data\", function(data) {\n              response = Buffer.concat([response, data]);\n            });\n            stream.on(\"end\", function() {\n              try {\n                resolve(JSON.parse(response.toString()).result);\n                stream.destroy();\n              } catch (error) {\n                reject(error);\n                stream.destroy();\n              }\n            });\n            stream.on(\"error\", function(error) {\n              reject(error);\n              stream.destroy();\n            });\n            stream.write(payload);\n            stream.end();\n          });\n        };\n        return IpcProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.IpcProvider = IpcProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/infura-provider.js\nvar require_infura_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/infura-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.InfuraProvider = exports2.InfuraWebSocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var websocket_provider_1 = require_websocket_provider();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultProjectId = \"84842078b09946638c03157f83405213\";\n    var InfuraWebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(InfuraWebSocketProvider2, _super);\n        function InfuraWebSocketProvider2(network, apiKey) {\n          var _this = this;\n          var provider = new InfuraProvider(network, apiKey);\n          var connection = provider.connection;\n          if (connection.password) {\n            logger.throwError(\"INFURA WebSocket project secrets unsupported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"InfuraProvider.getWebSocketProvider()\"\n            });\n          }\n          var url = connection.url.replace(/^http/i, \"ws\").replace(\"/v3/\", \"/ws/v3/\");\n          _this = _super.call(this, url, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", provider.projectId);\n          (0, properties_1.defineReadOnly)(_this, \"projectId\", provider.projectId);\n          (0, properties_1.defineReadOnly)(_this, \"projectSecret\", provider.projectSecret);\n          return _this;\n        }\n        InfuraWebSocketProvider2.prototype.isCommunityResource = function() {\n          return this.projectId === defaultProjectId;\n        };\n        return InfuraWebSocketProvider2;\n      }(websocket_provider_1.WebSocketProvider)\n    );\n    exports2.InfuraWebSocketProvider = InfuraWebSocketProvider;\n    var InfuraProvider = (\n      /** @class */\n      function(_super) {\n        __extends(InfuraProvider2, _super);\n        function InfuraProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        InfuraProvider2.getWebSocketProvider = function(network, apiKey) {\n          return new InfuraWebSocketProvider(network, apiKey);\n        };\n        InfuraProvider2.getApiKey = function(apiKey) {\n          var apiKeyObj = {\n            apiKey: defaultProjectId,\n            projectId: defaultProjectId,\n            projectSecret: null\n          };\n          if (apiKey == null) {\n            return apiKeyObj;\n          }\n          if (typeof apiKey === \"string\") {\n            apiKeyObj.projectId = apiKey;\n          } else if (apiKey.projectSecret != null) {\n            logger.assertArgument(typeof apiKey.projectId === \"string\", \"projectSecret requires a projectId\", \"projectId\", apiKey.projectId);\n            logger.assertArgument(typeof apiKey.projectSecret === \"string\", \"invalid projectSecret\", \"projectSecret\", \"[REDACTED]\");\n            apiKeyObj.projectId = apiKey.projectId;\n            apiKeyObj.projectSecret = apiKey.projectSecret;\n          } else if (apiKey.projectId) {\n            apiKeyObj.projectId = apiKey.projectId;\n          }\n          apiKeyObj.apiKey = apiKeyObj.projectId;\n          return apiKeyObj;\n        };\n        InfuraProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network ? network.name : \"unknown\") {\n            case \"homestead\":\n              host = \"mainnet.infura.io\";\n              break;\n            case \"ropsten\":\n              host = \"ropsten.infura.io\";\n              break;\n            case \"rinkeby\":\n              host = \"rinkeby.infura.io\";\n              break;\n            case \"kovan\":\n              host = \"kovan.infura.io\";\n              break;\n            case \"goerli\":\n              host = \"goerli.infura.io\";\n              break;\n            case \"matic\":\n              host = \"polygon-mainnet.infura.io\";\n              break;\n            case \"maticmum\":\n              host = \"polygon-mumbai.infura.io\";\n              break;\n            case \"optimism\":\n              host = \"optimism-mainnet.infura.io\";\n              break;\n            case \"optimism-kovan\":\n              host = \"optimism-kovan.infura.io\";\n              break;\n            case \"arbitrum\":\n              host = \"arbitrum-mainnet.infura.io\";\n              break;\n            case \"arbitrum-rinkeby\":\n              host = \"arbitrum-rinkeby.infura.io\";\n              break;\n            default:\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n          }\n          var connection = {\n            allowGzip: true,\n            url: \"https://\" + host + \"/v3/\" + apiKey.projectId,\n            throttleCallback: function(attempt, url) {\n              if (apiKey.projectId === defaultProjectId) {\n                (0, formatter_1.showThrottleMessage)();\n              }\n              return Promise.resolve(true);\n            }\n          };\n          if (apiKey.projectSecret != null) {\n            connection.user = \"\";\n            connection.password = apiKey.projectSecret;\n          }\n          return connection;\n        };\n        InfuraProvider2.prototype.isCommunityResource = function() {\n          return this.projectId === defaultProjectId;\n        };\n        return InfuraProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.InfuraProvider = InfuraProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/json-rpc-batch-provider.js\nvar require_json_rpc_batch_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/json-rpc-batch-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.JsonRpcBatchProvider = void 0;\n    var properties_1 = require_lib4();\n    var web_1 = require_lib27();\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var JsonRpcBatchProvider = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcBatchProvider2, _super);\n        function JsonRpcBatchProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        JsonRpcBatchProvider2.prototype.send = function(method, params) {\n          var _this = this;\n          var request = {\n            method,\n            params,\n            id: this._nextId++,\n            jsonrpc: \"2.0\"\n          };\n          if (this._pendingBatch == null) {\n            this._pendingBatch = [];\n          }\n          var inflightRequest = { request, resolve: null, reject: null };\n          var promise = new Promise(function(resolve, reject) {\n            inflightRequest.resolve = resolve;\n            inflightRequest.reject = reject;\n          });\n          this._pendingBatch.push(inflightRequest);\n          if (!this._pendingBatchAggregator) {\n            this._pendingBatchAggregator = setTimeout(function() {\n              var batch = _this._pendingBatch;\n              _this._pendingBatch = null;\n              _this._pendingBatchAggregator = null;\n              var request2 = batch.map(function(inflight) {\n                return inflight.request;\n              });\n              _this.emit(\"debug\", {\n                action: \"requestBatch\",\n                request: (0, properties_1.deepCopy)(request2),\n                provider: _this\n              });\n              return (0, web_1.fetchJson)(_this.connection, JSON.stringify(request2)).then(function(result) {\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  request: request2,\n                  response: result,\n                  provider: _this\n                });\n                batch.forEach(function(inflightRequest2, index) {\n                  var payload = result[index];\n                  if (payload.error) {\n                    var error = new Error(payload.error.message);\n                    error.code = payload.error.code;\n                    error.data = payload.error.data;\n                    inflightRequest2.reject(error);\n                  } else {\n                    inflightRequest2.resolve(payload.result);\n                  }\n                });\n              }, function(error) {\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  error,\n                  request: request2,\n                  provider: _this\n                });\n                batch.forEach(function(inflightRequest2) {\n                  inflightRequest2.reject(error);\n                });\n              });\n            }, 10);\n          }\n          return promise;\n        };\n        return JsonRpcBatchProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.JsonRpcBatchProvider = JsonRpcBatchProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/nodesmith-provider.js\nvar require_nodesmith_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/nodesmith-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NodesmithProvider = void 0;\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var defaultApiKey = \"ETHERS_JS_SHARED\";\n    var NodesmithProvider = (\n      /** @class */\n      function(_super) {\n        __extends(NodesmithProvider2, _super);\n        function NodesmithProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        NodesmithProvider2.getApiKey = function(apiKey) {\n          if (apiKey && typeof apiKey !== \"string\") {\n            logger.throwArgumentError(\"invalid apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKey || defaultApiKey;\n        };\n        NodesmithProvider2.getUrl = function(network, apiKey) {\n          logger.warn(\"NodeSmith will be discontinued on 2019-12-20; please migrate to another platform.\");\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"https://ethereum.api.nodesmith.io/v1/mainnet/jsonrpc\";\n              break;\n            case \"ropsten\":\n              host = \"https://ethereum.api.nodesmith.io/v1/ropsten/jsonrpc\";\n              break;\n            case \"rinkeby\":\n              host = \"https://ethereum.api.nodesmith.io/v1/rinkeby/jsonrpc\";\n              break;\n            case \"goerli\":\n              host = \"https://ethereum.api.nodesmith.io/v1/goerli/jsonrpc\";\n              break;\n            case \"kovan\":\n              host = \"https://ethereum.api.nodesmith.io/v1/kovan/jsonrpc\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return host + \"?apiKey=\" + apiKey;\n        };\n        return NodesmithProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.NodesmithProvider = NodesmithProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/pocket-provider.js\nvar require_pocket_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/pocket-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.PocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultApplicationIds = {\n      homestead: \"6004bcd10040261633ade990\",\n      ropsten: \"6004bd4d0040261633ade991\",\n      rinkeby: \"6004bda20040261633ade994\",\n      goerli: \"6004bd860040261633ade992\"\n    };\n    var PocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(PocketProvider2, _super);\n        function PocketProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          if (apiKey == null) {\n            var n = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n            if (n) {\n              var applicationId = defaultApplicationIds[n.name];\n              if (applicationId) {\n                apiKey = {\n                  applicationId,\n                  loadBalancer: true\n                };\n              }\n            }\n            if (apiKey == null) {\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n            }\n          }\n          _this = _super.call(this, network, apiKey) || this;\n          return _this;\n        }\n        PocketProvider2.getApiKey = function(apiKey) {\n          if (apiKey == null) {\n            logger.throwArgumentError(\"PocketProvider.getApiKey does not support null apiKey\", \"apiKey\", apiKey);\n          }\n          var apiKeyObj = {\n            applicationId: null,\n            loadBalancer: false,\n            applicationSecretKey: null\n          };\n          if (typeof apiKey === \"string\") {\n            apiKeyObj.applicationId = apiKey;\n          } else if (apiKey.applicationSecretKey != null) {\n            logger.assertArgument(typeof apiKey.applicationId === \"string\", \"applicationSecretKey requires an applicationId\", \"applicationId\", apiKey.applicationId);\n            logger.assertArgument(typeof apiKey.applicationSecretKey === \"string\", \"invalid applicationSecretKey\", \"applicationSecretKey\", \"[REDACTED]\");\n            apiKeyObj.applicationId = apiKey.applicationId;\n            apiKeyObj.applicationSecretKey = apiKey.applicationSecretKey;\n            apiKeyObj.loadBalancer = !!apiKey.loadBalancer;\n          } else if (apiKey.applicationId) {\n            logger.assertArgument(typeof apiKey.applicationId === \"string\", \"apiKey.applicationId must be a string\", \"apiKey.applicationId\", apiKey.applicationId);\n            apiKeyObj.applicationId = apiKey.applicationId;\n            apiKeyObj.loadBalancer = !!apiKey.loadBalancer;\n          } else {\n            logger.throwArgumentError(\"unsupported PocketProvider apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKeyObj;\n        };\n        PocketProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network ? network.name : \"unknown\") {\n            case \"homestead\":\n              host = \"eth-mainnet.gateway.pokt.network\";\n              break;\n            case \"ropsten\":\n              host = \"eth-ropsten.gateway.pokt.network\";\n              break;\n            case \"rinkeby\":\n              host = \"eth-rinkeby.gateway.pokt.network\";\n              break;\n            case \"goerli\":\n              host = \"eth-goerli.gateway.pokt.network\";\n              break;\n            default:\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n          }\n          var url = null;\n          if (apiKey.loadBalancer) {\n            url = \"https://\" + host + \"/v1/lb/\" + apiKey.applicationId;\n          } else {\n            url = \"https://\" + host + \"/v1/\" + apiKey.applicationId;\n          }\n          var connection = { url };\n          connection.headers = {};\n          if (apiKey.applicationSecretKey != null) {\n            connection.user = \"\";\n            connection.password = apiKey.applicationSecretKey;\n          }\n          return connection;\n        };\n        PocketProvider2.prototype.isCommunityResource = function() {\n          return this.applicationId === defaultApplicationIds[this.network.name];\n        };\n        return PocketProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.PocketProvider = PocketProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/web3-provider.js\nvar require_web3_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/web3-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Web3Provider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var _nextId = 1;\n    function buildWeb3LegacyFetcher(provider, sendFunc) {\n      var fetcher = \"Web3LegacyFetcher\";\n      return function(method, params) {\n        var _this = this;\n        var request = {\n          method,\n          params,\n          id: _nextId++,\n          jsonrpc: \"2.0\"\n        };\n        return new Promise(function(resolve, reject) {\n          _this.emit(\"debug\", {\n            action: \"request\",\n            fetcher,\n            request: (0, properties_1.deepCopy)(request),\n            provider: _this\n          });\n          sendFunc(request, function(error, response) {\n            if (error) {\n              _this.emit(\"debug\", {\n                action: \"response\",\n                fetcher,\n                error,\n                request,\n                provider: _this\n              });\n              return reject(error);\n            }\n            _this.emit(\"debug\", {\n              action: \"response\",\n              fetcher,\n              request,\n              response,\n              provider: _this\n            });\n            if (response.error) {\n              var error_1 = new Error(response.error.message);\n              error_1.code = response.error.code;\n              error_1.data = response.error.data;\n              return reject(error_1);\n            }\n            resolve(response.result);\n          });\n        });\n      };\n    }\n    function buildEip1193Fetcher(provider) {\n      return function(method, params) {\n        var _this = this;\n        if (params == null) {\n          params = [];\n        }\n        var request = { method, params };\n        this.emit(\"debug\", {\n          action: \"request\",\n          fetcher: \"Eip1193Fetcher\",\n          request: (0, properties_1.deepCopy)(request),\n          provider: this\n        });\n        return provider.request(request).then(function(response) {\n          _this.emit(\"debug\", {\n            action: \"response\",\n            fetcher: \"Eip1193Fetcher\",\n            request,\n            response,\n            provider: _this\n          });\n          return response;\n        }, function(error) {\n          _this.emit(\"debug\", {\n            action: \"response\",\n            fetcher: \"Eip1193Fetcher\",\n            request,\n            error,\n            provider: _this\n          });\n          throw error;\n        });\n      };\n    }\n    var Web3Provider = (\n      /** @class */\n      function(_super) {\n        __extends(Web3Provider2, _super);\n        function Web3Provider2(provider, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Web3Provider2);\n          if (provider == null) {\n            logger.throwArgumentError(\"missing provider\", \"provider\", provider);\n          }\n          var path = null;\n          var jsonRpcFetchFunc = null;\n          var subprovider = null;\n          if (typeof provider === \"function\") {\n            path = \"unknown:\";\n            jsonRpcFetchFunc = provider;\n          } else {\n            path = provider.host || provider.path || \"\";\n            if (!path && provider.isMetaMask) {\n              path = \"metamask\";\n            }\n            subprovider = provider;\n            if (provider.request) {\n              if (path === \"\") {\n                path = \"eip-1193:\";\n              }\n              jsonRpcFetchFunc = buildEip1193Fetcher(provider);\n            } else if (provider.sendAsync) {\n              jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider));\n            } else if (provider.send) {\n              jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider));\n            } else {\n              logger.throwArgumentError(\"unsupported provider\", \"provider\", provider);\n            }\n            if (!path) {\n              path = \"unknown:\";\n            }\n          }\n          _this = _super.call(this, path, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"jsonRpcFetchFunc\", jsonRpcFetchFunc);\n          (0, properties_1.defineReadOnly)(_this, \"provider\", subprovider);\n          return _this;\n        }\n        Web3Provider2.prototype.send = function(method, params) {\n          return this.jsonRpcFetchFunc(method, params);\n        };\n        return Web3Provider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.Web3Provider = Web3Provider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/index.js\nvar require_lib28 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Formatter = exports2.showThrottleMessage = exports2.isCommunityResourcable = exports2.isCommunityResource = exports2.getNetwork = exports2.getDefaultProvider = exports2.JsonRpcSigner = exports2.IpcProvider = exports2.WebSocketProvider = exports2.Web3Provider = exports2.StaticJsonRpcProvider = exports2.PocketProvider = exports2.NodesmithProvider = exports2.JsonRpcBatchProvider = exports2.JsonRpcProvider = exports2.InfuraWebSocketProvider = exports2.InfuraProvider = exports2.EtherscanProvider = exports2.CloudflareProvider = exports2.AlchemyWebSocketProvider = exports2.AlchemyProvider = exports2.FallbackProvider = exports2.UrlJsonRpcProvider = exports2.Resolver = exports2.BaseProvider = exports2.Provider = void 0;\n    var abstract_provider_1 = require_lib12();\n    Object.defineProperty(exports2, \"Provider\", { enumerable: true, get: function() {\n      return abstract_provider_1.Provider;\n    } });\n    var networks_1 = require_lib25();\n    Object.defineProperty(exports2, \"getNetwork\", { enumerable: true, get: function() {\n      return networks_1.getNetwork;\n    } });\n    var base_provider_1 = require_base_provider();\n    Object.defineProperty(exports2, \"BaseProvider\", { enumerable: true, get: function() {\n      return base_provider_1.BaseProvider;\n    } });\n    Object.defineProperty(exports2, \"Resolver\", { enumerable: true, get: function() {\n      return base_provider_1.Resolver;\n    } });\n    var alchemy_provider_1 = require_alchemy_provider();\n    Object.defineProperty(exports2, \"AlchemyProvider\", { enumerable: true, get: function() {\n      return alchemy_provider_1.AlchemyProvider;\n    } });\n    Object.defineProperty(exports2, \"AlchemyWebSocketProvider\", { enumerable: true, get: function() {\n      return alchemy_provider_1.AlchemyWebSocketProvider;\n    } });\n    var cloudflare_provider_1 = require_cloudflare_provider();\n    Object.defineProperty(exports2, \"CloudflareProvider\", { enumerable: true, get: function() {\n      return cloudflare_provider_1.CloudflareProvider;\n    } });\n    var etherscan_provider_1 = require_etherscan_provider();\n    Object.defineProperty(exports2, \"EtherscanProvider\", { enumerable: true, get: function() {\n      return etherscan_provider_1.EtherscanProvider;\n    } });\n    var fallback_provider_1 = require_fallback_provider();\n    Object.defineProperty(exports2, \"FallbackProvider\", { enumerable: true, get: function() {\n      return fallback_provider_1.FallbackProvider;\n    } });\n    var ipc_provider_1 = require_ipc_provider();\n    Object.defineProperty(exports2, \"IpcProvider\", { enumerable: true, get: function() {\n      return ipc_provider_1.IpcProvider;\n    } });\n    var infura_provider_1 = require_infura_provider();\n    Object.defineProperty(exports2, \"InfuraProvider\", { enumerable: true, get: function() {\n      return infura_provider_1.InfuraProvider;\n    } });\n    Object.defineProperty(exports2, \"InfuraWebSocketProvider\", { enumerable: true, get: function() {\n      return infura_provider_1.InfuraWebSocketProvider;\n    } });\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    Object.defineProperty(exports2, \"JsonRpcProvider\", { enumerable: true, get: function() {\n      return json_rpc_provider_1.JsonRpcProvider;\n    } });\n    Object.defineProperty(exports2, \"JsonRpcSigner\", { enumerable: true, get: function() {\n      return json_rpc_provider_1.JsonRpcSigner;\n    } });\n    var json_rpc_batch_provider_1 = require_json_rpc_batch_provider();\n    Object.defineProperty(exports2, \"JsonRpcBatchProvider\", { enumerable: true, get: function() {\n      return json_rpc_batch_provider_1.JsonRpcBatchProvider;\n    } });\n    var nodesmith_provider_1 = require_nodesmith_provider();\n    Object.defineProperty(exports2, \"NodesmithProvider\", { enumerable: true, get: function() {\n      return nodesmith_provider_1.NodesmithProvider;\n    } });\n    var pocket_provider_1 = require_pocket_provider();\n    Object.defineProperty(exports2, \"PocketProvider\", { enumerable: true, get: function() {\n      return pocket_provider_1.PocketProvider;\n    } });\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    Object.defineProperty(exports2, \"StaticJsonRpcProvider\", { enumerable: true, get: function() {\n      return url_json_rpc_provider_1.StaticJsonRpcProvider;\n    } });\n    Object.defineProperty(exports2, \"UrlJsonRpcProvider\", { enumerable: true, get: function() {\n      return url_json_rpc_provider_1.UrlJsonRpcProvider;\n    } });\n    var web3_provider_1 = require_web3_provider();\n    Object.defineProperty(exports2, \"Web3Provider\", { enumerable: true, get: function() {\n      return web3_provider_1.Web3Provider;\n    } });\n    var websocket_provider_1 = require_websocket_provider();\n    Object.defineProperty(exports2, \"WebSocketProvider\", { enumerable: true, get: function() {\n      return websocket_provider_1.WebSocketProvider;\n    } });\n    var formatter_1 = require_formatter();\n    Object.defineProperty(exports2, \"Formatter\", { enumerable: true, get: function() {\n      return formatter_1.Formatter;\n    } });\n    Object.defineProperty(exports2, \"isCommunityResourcable\", { enumerable: true, get: function() {\n      return formatter_1.isCommunityResourcable;\n    } });\n    Object.defineProperty(exports2, \"isCommunityResource\", { enumerable: true, get: function() {\n      return formatter_1.isCommunityResource;\n    } });\n    Object.defineProperty(exports2, \"showThrottleMessage\", { enumerable: true, get: function() {\n      return formatter_1.showThrottleMessage;\n    } });\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getDefaultProvider(network, options) {\n      if (network == null) {\n        network = \"homestead\";\n      }\n      if (typeof network === \"string\") {\n        var match = network.match(/^(ws|http)s?:/i);\n        if (match) {\n          switch (match[1]) {\n            case \"http\":\n              return new json_rpc_provider_1.JsonRpcProvider(network);\n            case \"ws\":\n              return new websocket_provider_1.WebSocketProvider(network);\n            default:\n              logger.throwArgumentError(\"unsupported URL scheme\", \"network\", network);\n          }\n        }\n      }\n      var n = (0, networks_1.getNetwork)(network);\n      if (!n || !n._defaultProvider) {\n        logger.throwError(\"unsupported getDefaultProvider network\", logger_1.Logger.errors.NETWORK_ERROR, {\n          operation: \"getDefaultProvider\",\n          network\n        });\n      }\n      return n._defaultProvider({\n        FallbackProvider: fallback_provider_1.FallbackProvider,\n        AlchemyProvider: alchemy_provider_1.AlchemyProvider,\n        CloudflareProvider: cloudflare_provider_1.CloudflareProvider,\n        EtherscanProvider: etherscan_provider_1.EtherscanProvider,\n        InfuraProvider: infura_provider_1.InfuraProvider,\n        JsonRpcProvider: json_rpc_provider_1.JsonRpcProvider,\n        NodesmithProvider: nodesmith_provider_1.NodesmithProvider,\n        PocketProvider: pocket_provider_1.PocketProvider,\n        Web3Provider: web3_provider_1.Web3Provider,\n        IpcProvider: ipc_provider_1.IpcProvider\n      }, options);\n    }\n    exports2.getDefaultProvider = getDefaultProvider;\n  }\n});\n\n// node_modules/@ethersproject/solidity/lib/_version.js\nvar require_version23 = __commonJS({\n  \"node_modules/@ethersproject/solidity/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"solidity/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/solidity/lib/index.js\nvar require_lib29 = __commonJS({\n  \"node_modules/@ethersproject/solidity/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.sha256 = exports2.keccak256 = exports2.pack = void 0;\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var sha2_1 = require_lib19();\n    var strings_1 = require_lib9();\n    var regexBytes = new RegExp(\"^bytes([0-9]+)$\");\n    var regexNumber = new RegExp(\"^(u?int)([0-9]*)$\");\n    var regexArray = new RegExp(\"^(.*)\\\\[([0-9]*)\\\\]$\");\n    var Zeros = \"0000000000000000000000000000000000000000000000000000000000000000\";\n    var logger_1 = require_lib();\n    var _version_1 = require_version23();\n    var logger = new logger_1.Logger(_version_1.version);\n    function _pack(type, value, isArray) {\n      switch (type) {\n        case \"address\":\n          if (isArray) {\n            return (0, bytes_1.zeroPad)(value, 32);\n          }\n          return (0, bytes_1.arrayify)(value);\n        case \"string\":\n          return (0, strings_1.toUtf8Bytes)(value);\n        case \"bytes\":\n          return (0, bytes_1.arrayify)(value);\n        case \"bool\":\n          value = value ? \"0x01\" : \"0x00\";\n          if (isArray) {\n            return (0, bytes_1.zeroPad)(value, 32);\n          }\n          return (0, bytes_1.arrayify)(value);\n      }\n      var match = type.match(regexNumber);\n      if (match) {\n        var size = parseInt(match[2] || \"256\");\n        if (match[2] && String(size) !== match[2] || size % 8 !== 0 || size === 0 || size > 256) {\n          logger.throwArgumentError(\"invalid number type\", \"type\", type);\n        }\n        if (isArray) {\n          size = 256;\n        }\n        value = bignumber_1.BigNumber.from(value).toTwos(size);\n        return (0, bytes_1.zeroPad)(value, size / 8);\n      }\n      match = type.match(regexBytes);\n      if (match) {\n        var size = parseInt(match[1]);\n        if (String(size) !== match[1] || size === 0 || size > 32) {\n          logger.throwArgumentError(\"invalid bytes type\", \"type\", type);\n        }\n        if ((0, bytes_1.arrayify)(value).byteLength !== size) {\n          logger.throwArgumentError(\"invalid value for \" + type, \"value\", value);\n        }\n        if (isArray) {\n          return (0, bytes_1.arrayify)((value + Zeros).substring(0, 66));\n        }\n        return value;\n      }\n      match = type.match(regexArray);\n      if (match && Array.isArray(value)) {\n        var baseType_1 = match[1];\n        var count = parseInt(match[2] || String(value.length));\n        if (count != value.length) {\n          logger.throwArgumentError(\"invalid array length for \" + type, \"value\", value);\n        }\n        var result_1 = [];\n        value.forEach(function(value2) {\n          result_1.push(_pack(baseType_1, value2, true));\n        });\n        return (0, bytes_1.concat)(result_1);\n      }\n      return logger.throwArgumentError(\"invalid type\", \"type\", type);\n    }\n    function pack(types, values) {\n      if (types.length != values.length) {\n        logger.throwArgumentError(\"wrong number of values; expected ${ types.length }\", \"values\", values);\n      }\n      var tight = [];\n      types.forEach(function(type, index) {\n        tight.push(_pack(type, values[index]));\n      });\n      return (0, bytes_1.hexlify)((0, bytes_1.concat)(tight));\n    }\n    exports2.pack = pack;\n    function keccak256(types, values) {\n      return (0, keccak256_1.keccak256)(pack(types, values));\n    }\n    exports2.keccak256 = keccak256;\n    function sha256(types, values) {\n      return (0, sha2_1.sha256)(pack(types, values));\n    }\n    exports2.sha256 = sha256;\n  }\n});\n\n// node_modules/@ethersproject/units/lib/_version.js\nvar require_version24 = __commonJS({\n  \"node_modules/@ethersproject/units/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"units/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/units/lib/index.js\nvar require_lib30 = __commonJS({\n  \"node_modules/@ethersproject/units/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parseEther = exports2.formatEther = exports2.parseUnits = exports2.formatUnits = exports2.commify = void 0;\n    var bignumber_1 = require_lib3();\n    var logger_1 = require_lib();\n    var _version_1 = require_version24();\n    var logger = new logger_1.Logger(_version_1.version);\n    var names = [\n      \"wei\",\n      \"kwei\",\n      \"mwei\",\n      \"gwei\",\n      \"szabo\",\n      \"finney\",\n      \"ether\"\n    ];\n    function commify(value) {\n      var comps = String(value).split(\".\");\n      if (comps.length > 2 || !comps[0].match(/^-?[0-9]*$/) || comps[1] && !comps[1].match(/^[0-9]*$/) || value === \".\" || value === \"-.\") {\n        logger.throwArgumentError(\"invalid value\", \"value\", value);\n      }\n      var whole = comps[0];\n      var negative = \"\";\n      if (whole.substring(0, 1) === \"-\") {\n        negative = \"-\";\n        whole = whole.substring(1);\n      }\n      while (whole.substring(0, 1) === \"0\") {\n        whole = whole.substring(1);\n      }\n      if (whole === \"\") {\n        whole = \"0\";\n      }\n      var suffix = \"\";\n      if (comps.length === 2) {\n        suffix = \".\" + (comps[1] || \"0\");\n      }\n      while (suffix.length > 2 && suffix[suffix.length - 1] === \"0\") {\n        suffix = suffix.substring(0, suffix.length - 1);\n      }\n      var formatted = [];\n      while (whole.length) {\n        if (whole.length <= 3) {\n          formatted.unshift(whole);\n          break;\n        } else {\n          var index = whole.length - 3;\n          formatted.unshift(whole.substring(index));\n          whole = whole.substring(0, index);\n        }\n      }\n      return negative + formatted.join(\",\") + suffix;\n    }\n    exports2.commify = commify;\n    function formatUnits(value, unitName) {\n      if (typeof unitName === \"string\") {\n        var index = names.indexOf(unitName);\n        if (index !== -1) {\n          unitName = 3 * index;\n        }\n      }\n      return (0, bignumber_1.formatFixed)(value, unitName != null ? unitName : 18);\n    }\n    exports2.formatUnits = formatUnits;\n    function parseUnits(value, unitName) {\n      if (typeof value !== \"string\") {\n        logger.throwArgumentError(\"value must be a string\", \"value\", value);\n      }\n      if (typeof unitName === \"string\") {\n        var index = names.indexOf(unitName);\n        if (index !== -1) {\n          unitName = 3 * index;\n        }\n      }\n      return (0, bignumber_1.parseFixed)(value, unitName != null ? unitName : 18);\n    }\n    exports2.parseUnits = parseUnits;\n    function formatEther(wei) {\n      return formatUnits(wei, 18);\n    }\n    exports2.formatEther = formatEther;\n    function parseEther(ether) {\n      return parseUnits(ether, 18);\n    }\n    exports2.parseEther = parseEther;\n  }\n});\n\n// node_modules/ethers/lib/utils.js\nvar require_utils5 = __commonJS({\n  \"node_modules/ethers/lib/utils.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n      }\n      __setModuleDefault(result, mod);\n      return result;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.formatBytes32String = exports2.Utf8ErrorFuncs = exports2.toUtf8String = exports2.toUtf8CodePoints = exports2.toUtf8Bytes = exports2._toEscapedUtf8String = exports2.nameprep = exports2.hexDataSlice = exports2.hexDataLength = exports2.hexZeroPad = exports2.hexValue = exports2.hexStripZeros = exports2.hexConcat = exports2.isHexString = exports2.hexlify = exports2.base64 = exports2.base58 = exports2.TransactionDescription = exports2.LogDescription = exports2.Interface = exports2.SigningKey = exports2.HDNode = exports2.defaultPath = exports2.isBytesLike = exports2.isBytes = exports2.zeroPad = exports2.stripZeros = exports2.concat = exports2.arrayify = exports2.shallowCopy = exports2.resolveProperties = exports2.getStatic = exports2.defineReadOnly = exports2.deepCopy = exports2.checkProperties = exports2.poll = exports2.fetchJson = exports2._fetchData = exports2.RLP = exports2.Logger = exports2.checkResultErrors = exports2.FormatTypes = exports2.ParamType = exports2.FunctionFragment = exports2.EventFragment = exports2.ErrorFragment = exports2.ConstructorFragment = exports2.Fragment = exports2.defaultAbiCoder = exports2.AbiCoder = void 0;\n    exports2.Indexed = exports2.Utf8ErrorReason = exports2.UnicodeNormalizationForm = exports2.SupportedAlgorithm = exports2.mnemonicToSeed = exports2.isValidMnemonic = exports2.entropyToMnemonic = exports2.mnemonicToEntropy = exports2.getAccountPath = exports2.verifyTypedData = exports2.verifyMessage = exports2.recoverPublicKey = exports2.computePublicKey = exports2.recoverAddress = exports2.computeAddress = exports2.getJsonWalletAddress = exports2.TransactionTypes = exports2.serializeTransaction = exports2.parseTransaction = exports2.accessListify = exports2.joinSignature = exports2.splitSignature = exports2.soliditySha256 = exports2.solidityKeccak256 = exports2.solidityPack = exports2.shuffled = exports2.randomBytes = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = exports2.keccak256 = exports2.computeHmac = exports2.commify = exports2.parseUnits = exports2.formatUnits = exports2.parseEther = exports2.formatEther = exports2.isAddress = exports2.getCreate2Address = exports2.getContractAddress = exports2.getIcapAddress = exports2.getAddress = exports2._TypedDataEncoder = exports2.id = exports2.isValidName = exports2.namehash = exports2.hashMessage = exports2.parseBytes32String = void 0;\n    var abi_1 = require_lib11();\n    Object.defineProperty(exports2, \"AbiCoder\", { enumerable: true, get: function() {\n      return abi_1.AbiCoder;\n    } });\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return abi_1.checkResultErrors;\n    } });\n    Object.defineProperty(exports2, \"ConstructorFragment\", { enumerable: true, get: function() {\n      return abi_1.ConstructorFragment;\n    } });\n    Object.defineProperty(exports2, \"defaultAbiCoder\", { enumerable: true, get: function() {\n      return abi_1.defaultAbiCoder;\n    } });\n    Object.defineProperty(exports2, \"ErrorFragment\", { enumerable: true, get: function() {\n      return abi_1.ErrorFragment;\n    } });\n    Object.defineProperty(exports2, \"EventFragment\", { enumerable: true, get: function() {\n      return abi_1.EventFragment;\n    } });\n    Object.defineProperty(exports2, \"FormatTypes\", { enumerable: true, get: function() {\n      return abi_1.FormatTypes;\n    } });\n    Object.defineProperty(exports2, \"Fragment\", { enumerable: true, get: function() {\n      return abi_1.Fragment;\n    } });\n    Object.defineProperty(exports2, \"FunctionFragment\", { enumerable: true, get: function() {\n      return abi_1.FunctionFragment;\n    } });\n    Object.defineProperty(exports2, \"Indexed\", { enumerable: true, get: function() {\n      return abi_1.Indexed;\n    } });\n    Object.defineProperty(exports2, \"Interface\", { enumerable: true, get: function() {\n      return abi_1.Interface;\n    } });\n    Object.defineProperty(exports2, \"LogDescription\", { enumerable: true, get: function() {\n      return abi_1.LogDescription;\n    } });\n    Object.defineProperty(exports2, \"ParamType\", { enumerable: true, get: function() {\n      return abi_1.ParamType;\n    } });\n    Object.defineProperty(exports2, \"TransactionDescription\", { enumerable: true, get: function() {\n      return abi_1.TransactionDescription;\n    } });\n    var address_1 = require_lib7();\n    Object.defineProperty(exports2, \"getAddress\", { enumerable: true, get: function() {\n      return address_1.getAddress;\n    } });\n    Object.defineProperty(exports2, \"getCreate2Address\", { enumerable: true, get: function() {\n      return address_1.getCreate2Address;\n    } });\n    Object.defineProperty(exports2, \"getContractAddress\", { enumerable: true, get: function() {\n      return address_1.getContractAddress;\n    } });\n    Object.defineProperty(exports2, \"getIcapAddress\", { enumerable: true, get: function() {\n      return address_1.getIcapAddress;\n    } });\n    Object.defineProperty(exports2, \"isAddress\", { enumerable: true, get: function() {\n      return address_1.isAddress;\n    } });\n    var base64 = __importStar(require_lib26());\n    exports2.base64 = base64;\n    var basex_1 = require_lib17();\n    Object.defineProperty(exports2, \"base58\", { enumerable: true, get: function() {\n      return basex_1.Base58;\n    } });\n    var bytes_1 = require_lib2();\n    Object.defineProperty(exports2, \"arrayify\", { enumerable: true, get: function() {\n      return bytes_1.arrayify;\n    } });\n    Object.defineProperty(exports2, \"concat\", { enumerable: true, get: function() {\n      return bytes_1.concat;\n    } });\n    Object.defineProperty(exports2, \"hexConcat\", { enumerable: true, get: function() {\n      return bytes_1.hexConcat;\n    } });\n    Object.defineProperty(exports2, \"hexDataSlice\", { enumerable: true, get: function() {\n      return bytes_1.hexDataSlice;\n    } });\n    Object.defineProperty(exports2, \"hexDataLength\", { enumerable: true, get: function() {\n      return bytes_1.hexDataLength;\n    } });\n    Object.defineProperty(exports2, \"hexlify\", { enumerable: true, get: function() {\n      return bytes_1.hexlify;\n    } });\n    Object.defineProperty(exports2, \"hexStripZeros\", { enumerable: true, get: function() {\n      return bytes_1.hexStripZeros;\n    } });\n    Object.defineProperty(exports2, \"hexValue\", { enumerable: true, get: function() {\n      return bytes_1.hexValue;\n    } });\n    Object.defineProperty(exports2, \"hexZeroPad\", { enumerable: true, get: function() {\n      return bytes_1.hexZeroPad;\n    } });\n    Object.defineProperty(exports2, \"isBytes\", { enumerable: true, get: function() {\n      return bytes_1.isBytes;\n    } });\n    Object.defineProperty(exports2, \"isBytesLike\", { enumerable: true, get: function() {\n      return bytes_1.isBytesLike;\n    } });\n    Object.defineProperty(exports2, \"isHexString\", { enumerable: true, get: function() {\n      return bytes_1.isHexString;\n    } });\n    Object.defineProperty(exports2, \"joinSignature\", { enumerable: true, get: function() {\n      return bytes_1.joinSignature;\n    } });\n    Object.defineProperty(exports2, \"zeroPad\", { enumerable: true, get: function() {\n      return bytes_1.zeroPad;\n    } });\n    Object.defineProperty(exports2, \"splitSignature\", { enumerable: true, get: function() {\n      return bytes_1.splitSignature;\n    } });\n    Object.defineProperty(exports2, \"stripZeros\", { enumerable: true, get: function() {\n      return bytes_1.stripZeros;\n    } });\n    var hash_1 = require_lib10();\n    Object.defineProperty(exports2, \"_TypedDataEncoder\", { enumerable: true, get: function() {\n      return hash_1._TypedDataEncoder;\n    } });\n    Object.defineProperty(exports2, \"hashMessage\", { enumerable: true, get: function() {\n      return hash_1.hashMessage;\n    } });\n    Object.defineProperty(exports2, \"id\", { enumerable: true, get: function() {\n      return hash_1.id;\n    } });\n    Object.defineProperty(exports2, \"isValidName\", { enumerable: true, get: function() {\n      return hash_1.isValidName;\n    } });\n    Object.defineProperty(exports2, \"namehash\", { enumerable: true, get: function() {\n      return hash_1.namehash;\n    } });\n    var hdnode_1 = require_lib21();\n    Object.defineProperty(exports2, \"defaultPath\", { enumerable: true, get: function() {\n      return hdnode_1.defaultPath;\n    } });\n    Object.defineProperty(exports2, \"entropyToMnemonic\", { enumerable: true, get: function() {\n      return hdnode_1.entropyToMnemonic;\n    } });\n    Object.defineProperty(exports2, \"getAccountPath\", { enumerable: true, get: function() {\n      return hdnode_1.getAccountPath;\n    } });\n    Object.defineProperty(exports2, \"HDNode\", { enumerable: true, get: function() {\n      return hdnode_1.HDNode;\n    } });\n    Object.defineProperty(exports2, \"isValidMnemonic\", { enumerable: true, get: function() {\n      return hdnode_1.isValidMnemonic;\n    } });\n    Object.defineProperty(exports2, \"mnemonicToEntropy\", { enumerable: true, get: function() {\n      return hdnode_1.mnemonicToEntropy;\n    } });\n    Object.defineProperty(exports2, \"mnemonicToSeed\", { enumerable: true, get: function() {\n      return hdnode_1.mnemonicToSeed;\n    } });\n    var json_wallets_1 = require_lib23();\n    Object.defineProperty(exports2, \"getJsonWalletAddress\", { enumerable: true, get: function() {\n      return json_wallets_1.getJsonWalletAddress;\n    } });\n    var keccak256_1 = require_lib5();\n    Object.defineProperty(exports2, \"keccak256\", { enumerable: true, get: function() {\n      return keccak256_1.keccak256;\n    } });\n    var logger_1 = require_lib();\n    Object.defineProperty(exports2, \"Logger\", { enumerable: true, get: function() {\n      return logger_1.Logger;\n    } });\n    var sha2_1 = require_lib19();\n    Object.defineProperty(exports2, \"computeHmac\", { enumerable: true, get: function() {\n      return sha2_1.computeHmac;\n    } });\n    Object.defineProperty(exports2, \"ripemd160\", { enumerable: true, get: function() {\n      return sha2_1.ripemd160;\n    } });\n    Object.defineProperty(exports2, \"sha256\", { enumerable: true, get: function() {\n      return sha2_1.sha256;\n    } });\n    Object.defineProperty(exports2, \"sha512\", { enumerable: true, get: function() {\n      return sha2_1.sha512;\n    } });\n    var solidity_1 = require_lib29();\n    Object.defineProperty(exports2, \"solidityKeccak256\", { enumerable: true, get: function() {\n      return solidity_1.keccak256;\n    } });\n    Object.defineProperty(exports2, \"solidityPack\", { enumerable: true, get: function() {\n      return solidity_1.pack;\n    } });\n    Object.defineProperty(exports2, \"soliditySha256\", { enumerable: true, get: function() {\n      return solidity_1.sha256;\n    } });\n    var random_1 = require_lib22();\n    Object.defineProperty(exports2, \"randomBytes\", { enumerable: true, get: function() {\n      return random_1.randomBytes;\n    } });\n    Object.defineProperty(exports2, \"shuffled\", { enumerable: true, get: function() {\n      return random_1.shuffled;\n    } });\n    var properties_1 = require_lib4();\n    Object.defineProperty(exports2, \"checkProperties\", { enumerable: true, get: function() {\n      return properties_1.checkProperties;\n    } });\n    Object.defineProperty(exports2, \"deepCopy\", { enumerable: true, get: function() {\n      return properties_1.deepCopy;\n    } });\n    Object.defineProperty(exports2, \"defineReadOnly\", { enumerable: true, get: function() {\n      return properties_1.defineReadOnly;\n    } });\n    Object.defineProperty(exports2, \"getStatic\", { enumerable: true, get: function() {\n      return properties_1.getStatic;\n    } });\n    Object.defineProperty(exports2, \"resolveProperties\", { enumerable: true, get: function() {\n      return properties_1.resolveProperties;\n    } });\n    Object.defineProperty(exports2, \"shallowCopy\", { enumerable: true, get: function() {\n      return properties_1.shallowCopy;\n    } });\n    var RLP = __importStar(require_lib6());\n    exports2.RLP = RLP;\n    var signing_key_1 = require_lib14();\n    Object.defineProperty(exports2, \"computePublicKey\", { enumerable: true, get: function() {\n      return signing_key_1.computePublicKey;\n    } });\n    Object.defineProperty(exports2, \"recoverPublicKey\", { enumerable: true, get: function() {\n      return signing_key_1.recoverPublicKey;\n    } });\n    Object.defineProperty(exports2, \"SigningKey\", { enumerable: true, get: function() {\n      return signing_key_1.SigningKey;\n    } });\n    var strings_1 = require_lib9();\n    Object.defineProperty(exports2, \"formatBytes32String\", { enumerable: true, get: function() {\n      return strings_1.formatBytes32String;\n    } });\n    Object.defineProperty(exports2, \"nameprep\", { enumerable: true, get: function() {\n      return strings_1.nameprep;\n    } });\n    Object.defineProperty(exports2, \"parseBytes32String\", { enumerable: true, get: function() {\n      return strings_1.parseBytes32String;\n    } });\n    Object.defineProperty(exports2, \"_toEscapedUtf8String\", { enumerable: true, get: function() {\n      return strings_1._toEscapedUtf8String;\n    } });\n    Object.defineProperty(exports2, \"toUtf8Bytes\", { enumerable: true, get: function() {\n      return strings_1.toUtf8Bytes;\n    } });\n    Object.defineProperty(exports2, \"toUtf8CodePoints\", { enumerable: true, get: function() {\n      return strings_1.toUtf8CodePoints;\n    } });\n    Object.defineProperty(exports2, \"toUtf8String\", { enumerable: true, get: function() {\n      return strings_1.toUtf8String;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorFuncs\", { enumerable: true, get: function() {\n      return strings_1.Utf8ErrorFuncs;\n    } });\n    var transactions_1 = require_lib15();\n    Object.defineProperty(exports2, \"accessListify\", { enumerable: true, get: function() {\n      return transactions_1.accessListify;\n    } });\n    Object.defineProperty(exports2, \"computeAddress\", { enumerable: true, get: function() {\n      return transactions_1.computeAddress;\n    } });\n    Object.defineProperty(exports2, \"parseTransaction\", { enumerable: true, get: function() {\n      return transactions_1.parse;\n    } });\n    Object.defineProperty(exports2, \"recoverAddress\", { enumerable: true, get: function() {\n      return transactions_1.recoverAddress;\n    } });\n    Object.defineProperty(exports2, \"serializeTransaction\", { enumerable: true, get: function() {\n      return transactions_1.serialize;\n    } });\n    Object.defineProperty(exports2, \"TransactionTypes\", { enumerable: true, get: function() {\n      return transactions_1.TransactionTypes;\n    } });\n    var units_1 = require_lib30();\n    Object.defineProperty(exports2, \"commify\", { enumerable: true, get: function() {\n      return units_1.commify;\n    } });\n    Object.defineProperty(exports2, \"formatEther\", { enumerable: true, get: function() {\n      return units_1.formatEther;\n    } });\n    Object.defineProperty(exports2, \"parseEther\", { enumerable: true, get: function() {\n      return units_1.parseEther;\n    } });\n    Object.defineProperty(exports2, \"formatUnits\", { enumerable: true, get: function() {\n      return units_1.formatUnits;\n    } });\n    Object.defineProperty(exports2, \"parseUnits\", { enumerable: true, get: function() {\n      return units_1.parseUnits;\n    } });\n    var wallet_1 = require_lib24();\n    Object.defineProperty(exports2, \"verifyMessage\", { enumerable: true, get: function() {\n      return wallet_1.verifyMessage;\n    } });\n    Object.defineProperty(exports2, \"verifyTypedData\", { enumerable: true, get: function() {\n      return wallet_1.verifyTypedData;\n    } });\n    var web_1 = require_lib27();\n    Object.defineProperty(exports2, \"_fetchData\", { enumerable: true, get: function() {\n      return web_1._fetchData;\n    } });\n    Object.defineProperty(exports2, \"fetchJson\", { enumerable: true, get: function() {\n      return web_1.fetchJson;\n    } });\n    Object.defineProperty(exports2, \"poll\", { enumerable: true, get: function() {\n      return web_1.poll;\n    } });\n    var sha2_2 = require_lib19();\n    Object.defineProperty(exports2, \"SupportedAlgorithm\", { enumerable: true, get: function() {\n      return sha2_2.SupportedAlgorithm;\n    } });\n    var strings_2 = require_lib9();\n    Object.defineProperty(exports2, \"UnicodeNormalizationForm\", { enumerable: true, get: function() {\n      return strings_2.UnicodeNormalizationForm;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorReason\", { enumerable: true, get: function() {\n      return strings_2.Utf8ErrorReason;\n    } });\n  }\n});\n\n// node_modules/ethers/lib/_version.js\nvar require_version25 = __commonJS({\n  \"node_modules/ethers/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"ethers/5.5.2\";\n  }\n});\n\n// node_modules/ethers/lib/ethers.js\nvar require_ethers = __commonJS({\n  \"node_modules/ethers/lib/ethers.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n      }\n      __setModuleDefault(result, mod);\n      return result;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.version = exports2.wordlists = exports2.utils = exports2.logger = exports2.errors = exports2.constants = exports2.FixedNumber = exports2.BigNumber = exports2.ContractFactory = exports2.Contract = exports2.BaseContract = exports2.providers = exports2.getDefaultProvider = exports2.VoidSigner = exports2.Wallet = exports2.Signer = void 0;\n    var contracts_1 = require_lib16();\n    Object.defineProperty(exports2, \"BaseContract\", { enumerable: true, get: function() {\n      return contracts_1.BaseContract;\n    } });\n    Object.defineProperty(exports2, \"Contract\", { enumerable: true, get: function() {\n      return contracts_1.Contract;\n    } });\n    Object.defineProperty(exports2, \"ContractFactory\", { enumerable: true, get: function() {\n      return contracts_1.ContractFactory;\n    } });\n    var bignumber_1 = require_lib3();\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return bignumber_1.BigNumber;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return bignumber_1.FixedNumber;\n    } });\n    var abstract_signer_1 = require_lib13();\n    Object.defineProperty(exports2, \"Signer\", { enumerable: true, get: function() {\n      return abstract_signer_1.Signer;\n    } });\n    Object.defineProperty(exports2, \"VoidSigner\", { enumerable: true, get: function() {\n      return abstract_signer_1.VoidSigner;\n    } });\n    var wallet_1 = require_lib24();\n    Object.defineProperty(exports2, \"Wallet\", { enumerable: true, get: function() {\n      return wallet_1.Wallet;\n    } });\n    var constants = __importStar(require_lib8());\n    exports2.constants = constants;\n    var providers = __importStar(require_lib28());\n    exports2.providers = providers;\n    var providers_1 = require_lib28();\n    Object.defineProperty(exports2, \"getDefaultProvider\", { enumerable: true, get: function() {\n      return providers_1.getDefaultProvider;\n    } });\n    var wordlists_1 = require_lib20();\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return wordlists_1.Wordlist;\n    } });\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return wordlists_1.wordlists;\n    } });\n    var utils = __importStar(require_utils5());\n    exports2.utils = utils;\n    var logger_1 = require_lib();\n    Object.defineProperty(exports2, \"errors\", { enumerable: true, get: function() {\n      return logger_1.ErrorCode;\n    } });\n    var _version_1 = require_version25();\n    Object.defineProperty(exports2, \"version\", { enumerable: true, get: function() {\n      return _version_1.version;\n    } });\n    var logger = new logger_1.Logger(_version_1.version);\n    exports2.logger = logger;\n  }\n});\n\n// node_modules/ethers/lib/index.js\nvar require_lib31 = __commonJS({\n  \"node_modules/ethers/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n      }\n      __setModuleDefault(result, mod);\n      return result;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.version = exports2.wordlists = exports2.utils = exports2.logger = exports2.errors = exports2.constants = exports2.FixedNumber = exports2.BigNumber = exports2.ContractFactory = exports2.Contract = exports2.BaseContract = exports2.providers = exports2.getDefaultProvider = exports2.VoidSigner = exports2.Wallet = exports2.Signer = exports2.ethers = void 0;\n    var ethers2 = __importStar(require_ethers());\n    exports2.ethers = ethers2;\n    try {\n      anyGlobal = window;\n      if (anyGlobal._ethers == null) {\n        anyGlobal._ethers = ethers2;\n      }\n    } catch (error) {\n    }\n    var anyGlobal;\n    var ethers_1 = require_ethers();\n    Object.defineProperty(exports2, \"Signer\", { enumerable: true, get: function() {\n      return ethers_1.Signer;\n    } });\n    Object.defineProperty(exports2, \"Wallet\", { enumerable: true, get: function() {\n      return ethers_1.Wallet;\n    } });\n    Object.defineProperty(exports2, \"VoidSigner\", { enumerable: true, get: function() {\n      return ethers_1.VoidSigner;\n    } });\n    Object.defineProperty(exports2, \"getDefaultProvider\", { enumerable: true, get: function() {\n      return ethers_1.getDefaultProvider;\n    } });\n    Object.defineProperty(exports2, \"providers\", { enumerable: true, get: function() {\n      return ethers_1.providers;\n    } });\n    Object.defineProperty(exports2, \"BaseContract\", { enumerable: true, get: function() {\n      return ethers_1.BaseContract;\n    } });\n    Object.defineProperty(exports2, \"Contract\", { enumerable: true, get: function() {\n      return ethers_1.Contract;\n    } });\n    Object.defineProperty(exports2, \"ContractFactory\", { enumerable: true, get: function() {\n      return ethers_1.ContractFactory;\n    } });\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return ethers_1.BigNumber;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return ethers_1.FixedNumber;\n    } });\n    Object.defineProperty(exports2, \"constants\", { enumerable: true, get: function() {\n      return ethers_1.constants;\n    } });\n    Object.defineProperty(exports2, \"errors\", { enumerable: true, get: function() {\n      return ethers_1.errors;\n    } });\n    Object.defineProperty(exports2, \"logger\", { enumerable: true, get: function() {\n      return ethers_1.logger;\n    } });\n    Object.defineProperty(exports2, \"utils\", { enumerable: true, get: function() {\n      return ethers_1.utils;\n    } });\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return ethers_1.wordlists;\n    } });\n    Object.defineProperty(exports2, \"version\", { enumerable: true, get: function() {\n      return ethers_1.version;\n    } });\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return ethers_1.Wordlist;\n    } });\n  }\n});\n\n// src/getSqrtPriceAtTick.ts\nvar import_decimal = __toESM(require_decimal());\nvar import_ethers = __toESM(require_lib31());\nvar tickArray = process.argv[2].split(\",\");\nvar resultsArray = [];\nfor (let tick of tickArray) {\n  const jsResult = new import_decimal.default(1.0001).pow(tick).sqrt().mul(new import_decimal.default(2).pow(96)).toFixed(0);\n  resultsArray.push(jsResult);\n}\nprocess.stdout.write(import_ethers.ethers.utils.defaultAbiCoder.encode([\"uint160[]\"], [resultsArray]));\n/*! Bundled license information:\n\njs-sha3/src/sha3.js:\n  (**\n   * [js-sha3]{@link https://github.com/emn178/js-sha3}\n   *\n   * @version 0.8.0\n   * @author Chen, Yi-Cyuan [emn178@gmail.com]\n   * @copyright Chen, Yi-Cyuan 2015-2018\n   * @license MIT\n   *)\n*/\n"
  },
  {
    "path": "test/js-scripts/dist/getTickAtSqrtPrice.js",
    "content": "\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __commonJS = (cb, mod) => function __require() {\n  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\n\n// node_modules/decimal.js/decimal.js\nvar require_decimal = __commonJS({\n  \"node_modules/decimal.js/decimal.js\"(exports2, module2) {\n    (function(globalScope) {\n      \"use strict\";\n      var EXP_LIMIT = 9e15, MAX_DIGITS = 1e9, NUMERALS = \"0123456789abcdef\", LN10 = \"2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058\", PI = \"3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789\", DEFAULTS = {\n        // These values must be integers within the stated ranges (inclusive).\n        // Most of these values can be changed at run-time using the `Decimal.config` method.\n        // The maximum number of significant digits of the result of a calculation or base conversion.\n        // E.g. `Decimal.config({ precision: 20 });`\n        precision: 20,\n        // 1 to MAX_DIGITS\n        // The rounding mode used when rounding to `precision`.\n        //\n        // ROUND_UP         0 Away from zero.\n        // ROUND_DOWN       1 Towards zero.\n        // ROUND_CEIL       2 Towards +Infinity.\n        // ROUND_FLOOR      3 Towards -Infinity.\n        // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.\n        // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\n        // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\n        // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\n        // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\n        //\n        // E.g.\n        // `Decimal.rounding = 4;`\n        // `Decimal.rounding = Decimal.ROUND_HALF_UP;`\n        rounding: 4,\n        // 0 to 8\n        // The modulo mode used when calculating the modulus: a mod n.\n        // The quotient (q = a / n) is calculated according to the corresponding rounding mode.\n        // The remainder (r) is calculated as: r = a - n * q.\n        //\n        // UP         0 The remainder is positive if the dividend is negative, else is negative.\n        // DOWN       1 The remainder has the same sign as the dividend (JavaScript %).\n        // FLOOR      3 The remainder has the same sign as the divisor (Python %).\n        // HALF_EVEN  6 The IEEE 754 remainder function.\n        // EUCLID     9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.\n        //\n        // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian\n        // division (9) are commonly used for the modulus operation. The other rounding modes can also\n        // be used, but they may not give useful results.\n        modulo: 1,\n        // 0 to 9\n        // The exponent value at and beneath which `toString` returns exponential notation.\n        // JavaScript numbers: -7\n        toExpNeg: -7,\n        // 0 to -EXP_LIMIT\n        // The exponent value at and above which `toString` returns exponential notation.\n        // JavaScript numbers: 21\n        toExpPos: 21,\n        // 0 to EXP_LIMIT\n        // The minimum exponent value, beneath which underflow to zero occurs.\n        // JavaScript numbers: -324  (5e-324)\n        minE: -EXP_LIMIT,\n        // -1 to -EXP_LIMIT\n        // The maximum exponent value, above which overflow to Infinity occurs.\n        // JavaScript numbers: 308  (1.7976931348623157e+308)\n        maxE: EXP_LIMIT,\n        // 1 to EXP_LIMIT\n        // Whether to use cryptographically-secure random number generation, if available.\n        crypto: false\n        // true/false\n      }, Decimal2, inexact, noConflict, quadrant, external = true, decimalError = \"[DecimalError] \", invalidArgument = decimalError + \"Invalid argument: \", precisionLimitExceeded = decimalError + \"Precision limit exceeded\", cryptoUnavailable = decimalError + \"crypto unavailable\", tag = \"[object Decimal]\", mathfloor = Math.floor, mathpow = Math.pow, isBinary = /^0b([01]+(\\.[01]*)?|\\.[01]+)(p[+-]?\\d+)?$/i, isHex = /^0x([0-9a-f]+(\\.[0-9a-f]*)?|\\.[0-9a-f]+)(p[+-]?\\d+)?$/i, isOctal = /^0o([0-7]+(\\.[0-7]*)?|\\.[0-7]+)(p[+-]?\\d+)?$/i, isDecimal = /^(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i, BASE = 1e7, LOG_BASE = 7, MAX_SAFE_INTEGER = 9007199254740991, LN10_PRECISION = LN10.length - 1, PI_PRECISION = PI.length - 1, P = { toStringTag: tag };\n      P.absoluteValue = P.abs = function() {\n        var x = new this.constructor(this);\n        if (x.s < 0) x.s = 1;\n        return finalise(x);\n      };\n      P.ceil = function() {\n        return finalise(new this.constructor(this), this.e + 1, 2);\n      };\n      P.clampedTo = P.clamp = function(min2, max2) {\n        var k, x = this, Ctor = x.constructor;\n        min2 = new Ctor(min2);\n        max2 = new Ctor(max2);\n        if (!min2.s || !max2.s) return new Ctor(NaN);\n        if (min2.gt(max2)) throw Error(invalidArgument + max2);\n        k = x.cmp(min2);\n        return k < 0 ? min2 : x.cmp(max2) > 0 ? max2 : new Ctor(x);\n      };\n      P.comparedTo = P.cmp = function(y) {\n        var i, j, xdL, ydL, x = this, xd = x.d, yd = (y = new x.constructor(y)).d, xs = x.s, ys = y.s;\n        if (!xd || !yd) {\n          return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;\n        }\n        if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;\n        if (xs !== ys) return xs;\n        if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;\n        xdL = xd.length;\n        ydL = yd.length;\n        for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {\n          if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;\n        }\n        return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;\n      };\n      P.cosine = P.cos = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.d) return new Ctor(NaN);\n        if (!x.d[0]) return new Ctor(1);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\n        Ctor.rounding = 1;\n        x = cosine(Ctor, toLessThanHalfPi(Ctor, x));\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);\n      };\n      P.cubeRoot = P.cbrt = function() {\n        var e, m, n, r, rep, s, sd, t, t3, t3plusx, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        external = false;\n        s = x.s * mathpow(x.s * x, 1 / 3);\n        if (!s || Math.abs(s) == 1 / 0) {\n          n = digitsToString(x.d);\n          e = x.e;\n          if (s = (e - n.length + 1) % 3) n += s == 1 || s == -2 ? \"0\" : \"00\";\n          s = mathpow(n, 1 / 3);\n          e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));\n          if (s == 1 / 0) {\n            n = \"5e\" + e;\n          } else {\n            n = s.toExponential();\n            n = n.slice(0, n.indexOf(\"e\") + 1) + e;\n          }\n          r = new Ctor(n);\n          r.s = x.s;\n        } else {\n          r = new Ctor(s.toString());\n        }\n        sd = (e = Ctor.precision) + 3;\n        for (; ; ) {\n          t = r;\n          t3 = t.times(t).times(t);\n          t3plusx = t3.plus(x);\n          r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);\n          if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\n            n = n.slice(sd - 3, sd + 1);\n            if (n == \"9999\" || !rep && n == \"4999\") {\n              if (!rep) {\n                finalise(t, e + 1, 0);\n                if (t.times(t).times(t).eq(x)) {\n                  r = t;\n                  break;\n                }\n              }\n              sd += 4;\n              rep = 1;\n            } else {\n              if (!+n || !+n.slice(1) && n.charAt(0) == \"5\") {\n                finalise(r, e + 1, 1);\n                m = !r.times(r).times(r).eq(x);\n              }\n              break;\n            }\n          }\n        }\n        external = true;\n        return finalise(r, e, Ctor.rounding, m);\n      };\n      P.decimalPlaces = P.dp = function() {\n        var w, d = this.d, n = NaN;\n        if (d) {\n          w = d.length - 1;\n          n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;\n          w = d[w];\n          if (w) for (; w % 10 == 0; w /= 10) n--;\n          if (n < 0) n = 0;\n        }\n        return n;\n      };\n      P.dividedBy = P.div = function(y) {\n        return divide(this, new this.constructor(y));\n      };\n      P.dividedToIntegerBy = P.divToInt = function(y) {\n        var x = this, Ctor = x.constructor;\n        return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);\n      };\n      P.equals = P.eq = function(y) {\n        return this.cmp(y) === 0;\n      };\n      P.floor = function() {\n        return finalise(new this.constructor(this), this.e + 1, 3);\n      };\n      P.greaterThan = P.gt = function(y) {\n        return this.cmp(y) > 0;\n      };\n      P.greaterThanOrEqualTo = P.gte = function(y) {\n        var k = this.cmp(y);\n        return k == 1 || k === 0;\n      };\n      P.hyperbolicCosine = P.cosh = function() {\n        var k, n, pr, rm, len, x = this, Ctor = x.constructor, one = new Ctor(1);\n        if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);\n        if (x.isZero()) return one;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\n        Ctor.rounding = 1;\n        len = x.d.length;\n        if (len < 32) {\n          k = Math.ceil(len / 3);\n          n = (1 / tinyPow(4, k)).toString();\n        } else {\n          k = 16;\n          n = \"2.3283064365386962890625e-10\";\n        }\n        x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);\n        var cosh2_x, i = k, d8 = new Ctor(8);\n        for (; i--; ) {\n          cosh2_x = x.times(x);\n          x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));\n        }\n        return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);\n      };\n      P.hyperbolicSine = P.sinh = function() {\n        var k, pr, rm, len, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;\n        Ctor.rounding = 1;\n        len = x.d.length;\n        if (len < 3) {\n          x = taylorSeries(Ctor, 2, x, x, true);\n        } else {\n          k = 1.4 * Math.sqrt(len);\n          k = k > 16 ? 16 : k | 0;\n          x = x.times(1 / tinyPow(5, k));\n          x = taylorSeries(Ctor, 2, x, x, true);\n          var sinh2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20);\n          for (; k--; ) {\n            sinh2_x = x.times(x);\n            x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));\n          }\n        }\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(x, pr, rm, true);\n      };\n      P.hyperbolicTangent = P.tanh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(x.s);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 7;\n        Ctor.rounding = 1;\n        return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);\n      };\n      P.inverseCosine = P.acos = function() {\n        var halfPi, x = this, Ctor = x.constructor, k = x.abs().cmp(1), pr = Ctor.precision, rm = Ctor.rounding;\n        if (k !== -1) {\n          return k === 0 ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) : new Ctor(NaN);\n        }\n        if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);\n        Ctor.precision = pr + 6;\n        Ctor.rounding = 1;\n        x = x.asin();\n        halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return halfPi.minus(x);\n      };\n      P.inverseHyperbolicCosine = P.acosh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);\n        if (!x.isFinite()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;\n        Ctor.rounding = 1;\n        external = false;\n        x = x.times(x).minus(1).sqrt().plus(x);\n        external = true;\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.ln();\n      };\n      P.inverseHyperbolicSine = P.asinh = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite() || x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;\n        Ctor.rounding = 1;\n        external = false;\n        x = x.times(x).plus(1).sqrt().plus(x);\n        external = true;\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.ln();\n      };\n      P.inverseHyperbolicTangent = P.atanh = function() {\n        var pr, rm, wpr, xsd, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        xsd = x.sd();\n        if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);\n        Ctor.precision = wpr = xsd - x.e;\n        x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);\n        Ctor.precision = pr + 4;\n        Ctor.rounding = 1;\n        x = x.ln();\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.times(0.5);\n      };\n      P.inverseSine = P.asin = function() {\n        var halfPi, k, pr, rm, x = this, Ctor = x.constructor;\n        if (x.isZero()) return new Ctor(x);\n        k = x.abs().cmp(1);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (k !== -1) {\n          if (k === 0) {\n            halfPi = getPi(Ctor, pr + 4, rm).times(0.5);\n            halfPi.s = x.s;\n            return halfPi;\n          }\n          return new Ctor(NaN);\n        }\n        Ctor.precision = pr + 6;\n        Ctor.rounding = 1;\n        x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return x.times(2);\n      };\n      P.inverseTangent = P.atan = function() {\n        var i, j, k, n, px, t, r, wpr, x2, x = this, Ctor = x.constructor, pr = Ctor.precision, rm = Ctor.rounding;\n        if (!x.isFinite()) {\n          if (!x.s) return new Ctor(NaN);\n          if (pr + 4 <= PI_PRECISION) {\n            r = getPi(Ctor, pr + 4, rm).times(0.5);\n            r.s = x.s;\n            return r;\n          }\n        } else if (x.isZero()) {\n          return new Ctor(x);\n        } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {\n          r = getPi(Ctor, pr + 4, rm).times(0.25);\n          r.s = x.s;\n          return r;\n        }\n        Ctor.precision = wpr = pr + 10;\n        Ctor.rounding = 1;\n        k = Math.min(28, wpr / LOG_BASE + 2 | 0);\n        for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));\n        external = false;\n        j = Math.ceil(wpr / LOG_BASE);\n        n = 1;\n        x2 = x.times(x);\n        r = new Ctor(x);\n        px = x;\n        for (; i !== -1; ) {\n          px = px.times(x2);\n          t = r.minus(px.div(n += 2));\n          px = px.times(x2);\n          r = t.plus(px.div(n += 2));\n          if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--; ) ;\n        }\n        if (k) r = r.times(2 << k - 1);\n        external = true;\n        return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);\n      };\n      P.isFinite = function() {\n        return !!this.d;\n      };\n      P.isInteger = P.isInt = function() {\n        return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;\n      };\n      P.isNaN = function() {\n        return !this.s;\n      };\n      P.isNegative = P.isNeg = function() {\n        return this.s < 0;\n      };\n      P.isPositive = P.isPos = function() {\n        return this.s > 0;\n      };\n      P.isZero = function() {\n        return !!this.d && this.d[0] === 0;\n      };\n      P.lessThan = P.lt = function(y) {\n        return this.cmp(y) < 0;\n      };\n      P.lessThanOrEqualTo = P.lte = function(y) {\n        return this.cmp(y) < 1;\n      };\n      P.logarithm = P.log = function(base) {\n        var isBase10, d, denominator, k, inf, num, sd, r, arg = this, Ctor = arg.constructor, pr = Ctor.precision, rm = Ctor.rounding, guard = 5;\n        if (base == null) {\n          base = new Ctor(10);\n          isBase10 = true;\n        } else {\n          base = new Ctor(base);\n          d = base.d;\n          if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);\n          isBase10 = base.eq(10);\n        }\n        d = arg.d;\n        if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {\n          return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);\n        }\n        if (isBase10) {\n          if (d.length > 1) {\n            inf = true;\n          } else {\n            for (k = d[0]; k % 10 === 0; ) k /= 10;\n            inf = k !== 1;\n          }\n        }\n        external = false;\n        sd = pr + guard;\n        num = naturalLogarithm(arg, sd);\n        denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\n        r = divide(num, denominator, sd, 1);\n        if (checkRoundingDigits(r.d, k = pr, rm)) {\n          do {\n            sd += 10;\n            num = naturalLogarithm(arg, sd);\n            denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);\n            r = divide(num, denominator, sd, 1);\n            if (!inf) {\n              if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {\n                r = finalise(r, pr + 1, 0);\n              }\n              break;\n            }\n          } while (checkRoundingDigits(r.d, k += 10, rm));\n        }\n        external = true;\n        return finalise(r, pr, rm);\n      };\n      P.minus = P.sub = function(y) {\n        var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.d) {\n          if (!x.s || !y.s) y = new Ctor(NaN);\n          else if (x.d) y.s = -y.s;\n          else y = new Ctor(y.d || x.s !== y.s ? x : NaN);\n          return y;\n        }\n        if (x.s != y.s) {\n          y.s = -y.s;\n          return x.plus(y);\n        }\n        xd = x.d;\n        yd = y.d;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (!xd[0] || !yd[0]) {\n          if (yd[0]) y.s = -y.s;\n          else if (xd[0]) y = new Ctor(x);\n          else return new Ctor(rm === 3 ? -0 : 0);\n          return external ? finalise(y, pr, rm) : y;\n        }\n        e = mathfloor(y.e / LOG_BASE);\n        xe = mathfloor(x.e / LOG_BASE);\n        xd = xd.slice();\n        k = xe - e;\n        if (k) {\n          xLTy = k < 0;\n          if (xLTy) {\n            d = xd;\n            k = -k;\n            len = yd.length;\n          } else {\n            d = yd;\n            e = xe;\n            len = xd.length;\n          }\n          i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;\n          if (k > i) {\n            k = i;\n            d.length = 1;\n          }\n          d.reverse();\n          for (i = k; i--; ) d.push(0);\n          d.reverse();\n        } else {\n          i = xd.length;\n          len = yd.length;\n          xLTy = i < len;\n          if (xLTy) len = i;\n          for (i = 0; i < len; i++) {\n            if (xd[i] != yd[i]) {\n              xLTy = xd[i] < yd[i];\n              break;\n            }\n          }\n          k = 0;\n        }\n        if (xLTy) {\n          d = xd;\n          xd = yd;\n          yd = d;\n          y.s = -y.s;\n        }\n        len = xd.length;\n        for (i = yd.length - len; i > 0; --i) xd[len++] = 0;\n        for (i = yd.length; i > k; ) {\n          if (xd[--i] < yd[i]) {\n            for (j = i; j && xd[--j] === 0; ) xd[j] = BASE - 1;\n            --xd[j];\n            xd[i] += BASE;\n          }\n          xd[i] -= yd[i];\n        }\n        for (; xd[--len] === 0; ) xd.pop();\n        for (; xd[0] === 0; xd.shift()) --e;\n        if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);\n        y.d = xd;\n        y.e = getBase10Exponent(xd, e);\n        return external ? finalise(y, pr, rm) : y;\n      };\n      P.modulo = P.mod = function(y) {\n        var q, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);\n        if (!y.d || x.d && !x.d[0]) {\n          return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);\n        }\n        external = false;\n        if (Ctor.modulo == 9) {\n          q = divide(x, y.abs(), 0, 3, 1);\n          q.s *= y.s;\n        } else {\n          q = divide(x, y, 0, Ctor.modulo, 1);\n        }\n        q = q.times(y);\n        external = true;\n        return x.minus(q);\n      };\n      P.naturalExponential = P.exp = function() {\n        return naturalExponential(this);\n      };\n      P.naturalLogarithm = P.ln = function() {\n        return naturalLogarithm(this);\n      };\n      P.negated = P.neg = function() {\n        var x = new this.constructor(this);\n        x.s = -x.s;\n        return finalise(x);\n      };\n      P.plus = P.add = function(y) {\n        var carry, d, e, i, k, len, pr, rm, xd, yd, x = this, Ctor = x.constructor;\n        y = new Ctor(y);\n        if (!x.d || !y.d) {\n          if (!x.s || !y.s) y = new Ctor(NaN);\n          else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);\n          return y;\n        }\n        if (x.s != y.s) {\n          y.s = -y.s;\n          return x.minus(y);\n        }\n        xd = x.d;\n        yd = y.d;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (!xd[0] || !yd[0]) {\n          if (!yd[0]) y = new Ctor(x);\n          return external ? finalise(y, pr, rm) : y;\n        }\n        k = mathfloor(x.e / LOG_BASE);\n        e = mathfloor(y.e / LOG_BASE);\n        xd = xd.slice();\n        i = k - e;\n        if (i) {\n          if (i < 0) {\n            d = xd;\n            i = -i;\n            len = yd.length;\n          } else {\n            d = yd;\n            e = k;\n            len = xd.length;\n          }\n          k = Math.ceil(pr / LOG_BASE);\n          len = k > len ? k + 1 : len + 1;\n          if (i > len) {\n            i = len;\n            d.length = 1;\n          }\n          d.reverse();\n          for (; i--; ) d.push(0);\n          d.reverse();\n        }\n        len = xd.length;\n        i = yd.length;\n        if (len - i < 0) {\n          i = len;\n          d = yd;\n          yd = xd;\n          xd = d;\n        }\n        for (carry = 0; i; ) {\n          carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;\n          xd[i] %= BASE;\n        }\n        if (carry) {\n          xd.unshift(carry);\n          ++e;\n        }\n        for (len = xd.length; xd[--len] == 0; ) xd.pop();\n        y.d = xd;\n        y.e = getBase10Exponent(xd, e);\n        return external ? finalise(y, pr, rm) : y;\n      };\n      P.precision = P.sd = function(z) {\n        var k, x = this;\n        if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);\n        if (x.d) {\n          k = getPrecision(x.d);\n          if (z && x.e + 1 > k) k = x.e + 1;\n        } else {\n          k = NaN;\n        }\n        return k;\n      };\n      P.round = function() {\n        var x = this, Ctor = x.constructor;\n        return finalise(new Ctor(x), x.e + 1, Ctor.rounding);\n      };\n      P.sine = P.sin = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;\n        Ctor.rounding = 1;\n        x = sine(Ctor, toLessThanHalfPi(Ctor, x));\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);\n      };\n      P.squareRoot = P.sqrt = function() {\n        var m, n, sd, r, rep, t, x = this, d = x.d, e = x.e, s = x.s, Ctor = x.constructor;\n        if (s !== 1 || !d || !d[0]) {\n          return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);\n        }\n        external = false;\n        s = Math.sqrt(+x);\n        if (s == 0 || s == 1 / 0) {\n          n = digitsToString(d);\n          if ((n.length + e) % 2 == 0) n += \"0\";\n          s = Math.sqrt(n);\n          e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);\n          if (s == 1 / 0) {\n            n = \"5e\" + e;\n          } else {\n            n = s.toExponential();\n            n = n.slice(0, n.indexOf(\"e\") + 1) + e;\n          }\n          r = new Ctor(n);\n        } else {\n          r = new Ctor(s.toString());\n        }\n        sd = (e = Ctor.precision) + 3;\n        for (; ; ) {\n          t = r;\n          r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);\n          if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {\n            n = n.slice(sd - 3, sd + 1);\n            if (n == \"9999\" || !rep && n == \"4999\") {\n              if (!rep) {\n                finalise(t, e + 1, 0);\n                if (t.times(t).eq(x)) {\n                  r = t;\n                  break;\n                }\n              }\n              sd += 4;\n              rep = 1;\n            } else {\n              if (!+n || !+n.slice(1) && n.charAt(0) == \"5\") {\n                finalise(r, e + 1, 1);\n                m = !r.times(r).eq(x);\n              }\n              break;\n            }\n          }\n        }\n        external = true;\n        return finalise(r, e, Ctor.rounding, m);\n      };\n      P.tangent = P.tan = function() {\n        var pr, rm, x = this, Ctor = x.constructor;\n        if (!x.isFinite()) return new Ctor(NaN);\n        if (x.isZero()) return new Ctor(x);\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        Ctor.precision = pr + 10;\n        Ctor.rounding = 1;\n        x = x.sin();\n        x.s = 1;\n        x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);\n        Ctor.precision = pr;\n        Ctor.rounding = rm;\n        return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);\n      };\n      P.times = P.mul = function(y) {\n        var carry, e, i, k, r, rL, t, xdL, ydL, x = this, Ctor = x.constructor, xd = x.d, yd = (y = new Ctor(y)).d;\n        y.s *= x.s;\n        if (!xd || !xd[0] || !yd || !yd[0]) {\n          return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd ? NaN : !xd || !yd ? y.s / 0 : y.s * 0);\n        }\n        e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);\n        xdL = xd.length;\n        ydL = yd.length;\n        if (xdL < ydL) {\n          r = xd;\n          xd = yd;\n          yd = r;\n          rL = xdL;\n          xdL = ydL;\n          ydL = rL;\n        }\n        r = [];\n        rL = xdL + ydL;\n        for (i = rL; i--; ) r.push(0);\n        for (i = ydL; --i >= 0; ) {\n          carry = 0;\n          for (k = xdL + i; k > i; ) {\n            t = r[k] + yd[i] * xd[k - i - 1] + carry;\n            r[k--] = t % BASE | 0;\n            carry = t / BASE | 0;\n          }\n          r[k] = (r[k] + carry) % BASE | 0;\n        }\n        for (; !r[--rL]; ) r.pop();\n        if (carry) ++e;\n        else r.shift();\n        y.d = r;\n        y.e = getBase10Exponent(r, e);\n        return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;\n      };\n      P.toBinary = function(sd, rm) {\n        return toStringBinary(this, 2, sd, rm);\n      };\n      P.toDecimalPlaces = P.toDP = function(dp, rm) {\n        var x = this, Ctor = x.constructor;\n        x = new Ctor(x);\n        if (dp === void 0) return x;\n        checkInt32(dp, 0, MAX_DIGITS);\n        if (rm === void 0) rm = Ctor.rounding;\n        else checkInt32(rm, 0, 8);\n        return finalise(x, dp + x.e + 1, rm);\n      };\n      P.toExponential = function(dp, rm) {\n        var str, x = this, Ctor = x.constructor;\n        if (dp === void 0) {\n          str = finiteToString(x, true);\n        } else {\n          checkInt32(dp, 0, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          x = finalise(new Ctor(x), dp + 1, rm);\n          str = finiteToString(x, true, dp + 1);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toFixed = function(dp, rm) {\n        var str, y, x = this, Ctor = x.constructor;\n        if (dp === void 0) {\n          str = finiteToString(x);\n        } else {\n          checkInt32(dp, 0, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          y = finalise(new Ctor(x), dp + x.e + 1, rm);\n          str = finiteToString(y, false, dp + y.e + 1);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toFraction = function(maxD) {\n        var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, x = this, xd = x.d, Ctor = x.constructor;\n        if (!xd) return new Ctor(x);\n        n1 = d0 = new Ctor(1);\n        d1 = n0 = new Ctor(0);\n        d = new Ctor(d1);\n        e = d.e = getPrecision(xd) - x.e - 1;\n        k = e % LOG_BASE;\n        d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);\n        if (maxD == null) {\n          maxD = e > 0 ? d : n1;\n        } else {\n          n = new Ctor(maxD);\n          if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);\n          maxD = n.gt(d) ? e > 0 ? d : n1 : n;\n        }\n        external = false;\n        n = new Ctor(digitsToString(xd));\n        pr = Ctor.precision;\n        Ctor.precision = e = xd.length * LOG_BASE * 2;\n        for (; ; ) {\n          q = divide(n, d, 0, 1, 1);\n          d2 = d0.plus(q.times(d1));\n          if (d2.cmp(maxD) == 1) break;\n          d0 = d1;\n          d1 = d2;\n          d2 = n1;\n          n1 = n0.plus(q.times(d2));\n          n0 = d2;\n          d2 = d;\n          d = n.minus(q.times(d2));\n          n = d2;\n        }\n        d2 = divide(maxD.minus(d0), d1, 0, 1, 1);\n        n0 = n0.plus(d2.times(n1));\n        d0 = d0.plus(d2.times(d1));\n        n0.s = n1.s = x.s;\n        r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0];\n        Ctor.precision = pr;\n        external = true;\n        return r;\n      };\n      P.toHexadecimal = P.toHex = function(sd, rm) {\n        return toStringBinary(this, 16, sd, rm);\n      };\n      P.toNearest = function(y, rm) {\n        var x = this, Ctor = x.constructor;\n        x = new Ctor(x);\n        if (y == null) {\n          if (!x.d) return x;\n          y = new Ctor(1);\n          rm = Ctor.rounding;\n        } else {\n          y = new Ctor(y);\n          if (rm === void 0) {\n            rm = Ctor.rounding;\n          } else {\n            checkInt32(rm, 0, 8);\n          }\n          if (!x.d) return y.s ? x : y;\n          if (!y.d) {\n            if (y.s) y.s = x.s;\n            return y;\n          }\n        }\n        if (y.d[0]) {\n          external = false;\n          x = divide(x, y, 0, rm, 1).times(y);\n          external = true;\n          finalise(x);\n        } else {\n          y.s = x.s;\n          x = y;\n        }\n        return x;\n      };\n      P.toNumber = function() {\n        return +this;\n      };\n      P.toOctal = function(sd, rm) {\n        return toStringBinary(this, 8, sd, rm);\n      };\n      P.toPower = P.pow = function(y) {\n        var e, k, pr, r, rm, s, x = this, Ctor = x.constructor, yn = +(y = new Ctor(y));\n        if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));\n        x = new Ctor(x);\n        if (x.eq(1)) return x;\n        pr = Ctor.precision;\n        rm = Ctor.rounding;\n        if (y.eq(1)) return finalise(x, pr, rm);\n        e = mathfloor(y.e / LOG_BASE);\n        if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {\n          r = intPow(Ctor, x, k, pr);\n          return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);\n        }\n        s = x.s;\n        if (s < 0) {\n          if (e < y.d.length - 1) return new Ctor(NaN);\n          if ((y.d[e] & 1) == 0) s = 1;\n          if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {\n            x.s = s;\n            return x;\n          }\n        }\n        k = mathpow(+x, yn);\n        e = k == 0 || !isFinite(k) ? mathfloor(yn * (Math.log(\"0.\" + digitsToString(x.d)) / Math.LN10 + x.e + 1)) : new Ctor(k + \"\").e;\n        if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);\n        external = false;\n        Ctor.rounding = x.s = 1;\n        k = Math.min(12, (e + \"\").length);\n        r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);\n        if (r.d) {\n          r = finalise(r, pr + 5, 1);\n          if (checkRoundingDigits(r.d, pr, rm)) {\n            e = pr + 10;\n            r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);\n            if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {\n              r = finalise(r, pr + 1, 0);\n            }\n          }\n        }\n        r.s = s;\n        external = true;\n        Ctor.rounding = rm;\n        return finalise(r, pr, rm);\n      };\n      P.toPrecision = function(sd, rm) {\n        var str, x = this, Ctor = x.constructor;\n        if (sd === void 0) {\n          str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        } else {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n          x = finalise(new Ctor(x), sd, rm);\n          str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);\n        }\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.toSignificantDigits = P.toSD = function(sd, rm) {\n        var x = this, Ctor = x.constructor;\n        if (sd === void 0) {\n          sd = Ctor.precision;\n          rm = Ctor.rounding;\n        } else {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n        }\n        return finalise(new Ctor(x), sd, rm);\n      };\n      P.toString = function() {\n        var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        return x.isNeg() && !x.isZero() ? \"-\" + str : str;\n      };\n      P.truncated = P.trunc = function() {\n        return finalise(new this.constructor(this), this.e + 1, 1);\n      };\n      P.valueOf = P.toJSON = function() {\n        var x = this, Ctor = x.constructor, str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);\n        return x.isNeg() ? \"-\" + str : str;\n      };\n      function digitsToString(d) {\n        var i, k, ws, indexOfLastWord = d.length - 1, str = \"\", w = d[0];\n        if (indexOfLastWord > 0) {\n          str += w;\n          for (i = 1; i < indexOfLastWord; i++) {\n            ws = d[i] + \"\";\n            k = LOG_BASE - ws.length;\n            if (k) str += getZeroString(k);\n            str += ws;\n          }\n          w = d[i];\n          ws = w + \"\";\n          k = LOG_BASE - ws.length;\n          if (k) str += getZeroString(k);\n        } else if (w === 0) {\n          return \"0\";\n        }\n        for (; w % 10 === 0; ) w /= 10;\n        return str + w;\n      }\n      function checkInt32(i, min2, max2) {\n        if (i !== ~~i || i < min2 || i > max2) {\n          throw Error(invalidArgument + i);\n        }\n      }\n      function checkRoundingDigits(d, i, rm, repeating) {\n        var di, k, r, rd;\n        for (k = d[0]; k >= 10; k /= 10) --i;\n        if (--i < 0) {\n          i += LOG_BASE;\n          di = 0;\n        } else {\n          di = Math.ceil((i + 1) / LOG_BASE);\n          i %= LOG_BASE;\n        }\n        k = mathpow(10, LOG_BASE - i);\n        rd = d[di] % k | 0;\n        if (repeating == null) {\n          if (i < 3) {\n            if (i == 0) rd = rd / 100 | 0;\n            else if (i == 1) rd = rd / 10 | 0;\n            r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 5e4 || rd == 0;\n          } else {\n            r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;\n          }\n        } else {\n          if (i < 4) {\n            if (i == 0) rd = rd / 1e3 | 0;\n            else if (i == 1) rd = rd / 100 | 0;\n            else if (i == 2) rd = rd / 10 | 0;\n            r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;\n          } else {\n            r = ((repeating || rm < 4) && rd + 1 == k || !repeating && rm > 3 && rd + 1 == k / 2) && (d[di + 1] / k / 1e3 | 0) == mathpow(10, i - 3) - 1;\n          }\n        }\n        return r;\n      }\n      function convertBase(str, baseIn, baseOut) {\n        var j, arr = [0], arrL, i = 0, strL = str.length;\n        for (; i < strL; ) {\n          for (arrL = arr.length; arrL--; ) arr[arrL] *= baseIn;\n          arr[0] += NUMERALS.indexOf(str.charAt(i++));\n          for (j = 0; j < arr.length; j++) {\n            if (arr[j] > baseOut - 1) {\n              if (arr[j + 1] === void 0) arr[j + 1] = 0;\n              arr[j + 1] += arr[j] / baseOut | 0;\n              arr[j] %= baseOut;\n            }\n          }\n        }\n        return arr.reverse();\n      }\n      function cosine(Ctor, x) {\n        var k, len, y;\n        if (x.isZero()) return x;\n        len = x.d.length;\n        if (len < 32) {\n          k = Math.ceil(len / 3);\n          y = (1 / tinyPow(4, k)).toString();\n        } else {\n          k = 16;\n          y = \"2.3283064365386962890625e-10\";\n        }\n        Ctor.precision += k;\n        x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));\n        for (var i = k; i--; ) {\n          var cos2x = x.times(x);\n          x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);\n        }\n        Ctor.precision -= k;\n        return x;\n      }\n      var divide = /* @__PURE__ */ function() {\n        function multiplyInteger(x, k, base) {\n          var temp, carry = 0, i = x.length;\n          for (x = x.slice(); i--; ) {\n            temp = x[i] * k + carry;\n            x[i] = temp % base | 0;\n            carry = temp / base | 0;\n          }\n          if (carry) x.unshift(carry);\n          return x;\n        }\n        function compare(a, b, aL, bL) {\n          var i, r;\n          if (aL != bL) {\n            r = aL > bL ? 1 : -1;\n          } else {\n            for (i = r = 0; i < aL; i++) {\n              if (a[i] != b[i]) {\n                r = a[i] > b[i] ? 1 : -1;\n                break;\n              }\n            }\n          }\n          return r;\n        }\n        function subtract(a, b, aL, base) {\n          var i = 0;\n          for (; aL--; ) {\n            a[aL] -= i;\n            i = a[aL] < b[aL] ? 1 : 0;\n            a[aL] = i * base + a[aL] - b[aL];\n          }\n          for (; !a[0] && a.length > 1; ) a.shift();\n        }\n        return function(x, y, pr, rm, dp, base) {\n          var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, yL, yz, Ctor = x.constructor, sign2 = x.s == y.s ? 1 : -1, xd = x.d, yd = y.d;\n          if (!xd || !xd[0] || !yd || !yd[0]) {\n            return new Ctor(\n              // Return NaN if either NaN, or both Infinity or 0.\n              !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : (\n                // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.\n                xd && xd[0] == 0 || !yd ? sign2 * 0 : sign2 / 0\n              )\n            );\n          }\n          if (base) {\n            logBase = 1;\n            e = x.e - y.e;\n          } else {\n            base = BASE;\n            logBase = LOG_BASE;\n            e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);\n          }\n          yL = yd.length;\n          xL = xd.length;\n          q = new Ctor(sign2);\n          qd = q.d = [];\n          for (i = 0; yd[i] == (xd[i] || 0); i++) ;\n          if (yd[i] > (xd[i] || 0)) e--;\n          if (pr == null) {\n            sd = pr = Ctor.precision;\n            rm = Ctor.rounding;\n          } else if (dp) {\n            sd = pr + (x.e - y.e) + 1;\n          } else {\n            sd = pr;\n          }\n          if (sd < 0) {\n            qd.push(1);\n            more = true;\n          } else {\n            sd = sd / logBase + 2 | 0;\n            i = 0;\n            if (yL == 1) {\n              k = 0;\n              yd = yd[0];\n              sd++;\n              for (; (i < xL || k) && sd--; i++) {\n                t = k * base + (xd[i] || 0);\n                qd[i] = t / yd | 0;\n                k = t % yd | 0;\n              }\n              more = k || i < xL;\n            } else {\n              k = base / (yd[0] + 1) | 0;\n              if (k > 1) {\n                yd = multiplyInteger(yd, k, base);\n                xd = multiplyInteger(xd, k, base);\n                yL = yd.length;\n                xL = xd.length;\n              }\n              xi = yL;\n              rem = xd.slice(0, yL);\n              remL = rem.length;\n              for (; remL < yL; ) rem[remL++] = 0;\n              yz = yd.slice();\n              yz.unshift(0);\n              yd0 = yd[0];\n              if (yd[1] >= base / 2) ++yd0;\n              do {\n                k = 0;\n                cmp = compare(yd, rem, yL, remL);\n                if (cmp < 0) {\n                  rem0 = rem[0];\n                  if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);\n                  k = rem0 / yd0 | 0;\n                  if (k > 1) {\n                    if (k >= base) k = base - 1;\n                    prod = multiplyInteger(yd, k, base);\n                    prodL = prod.length;\n                    remL = rem.length;\n                    cmp = compare(prod, rem, prodL, remL);\n                    if (cmp == 1) {\n                      k--;\n                      subtract(prod, yL < prodL ? yz : yd, prodL, base);\n                    }\n                  } else {\n                    if (k == 0) cmp = k = 1;\n                    prod = yd.slice();\n                  }\n                  prodL = prod.length;\n                  if (prodL < remL) prod.unshift(0);\n                  subtract(rem, prod, remL, base);\n                  if (cmp == -1) {\n                    remL = rem.length;\n                    cmp = compare(yd, rem, yL, remL);\n                    if (cmp < 1) {\n                      k++;\n                      subtract(rem, yL < remL ? yz : yd, remL, base);\n                    }\n                  }\n                  remL = rem.length;\n                } else if (cmp === 0) {\n                  k++;\n                  rem = [0];\n                }\n                qd[i++] = k;\n                if (cmp && rem[0]) {\n                  rem[remL++] = xd[xi] || 0;\n                } else {\n                  rem = [xd[xi]];\n                  remL = 1;\n                }\n              } while ((xi++ < xL || rem[0] !== void 0) && sd--);\n              more = rem[0] !== void 0;\n            }\n            if (!qd[0]) qd.shift();\n          }\n          if (logBase == 1) {\n            q.e = e;\n            inexact = more;\n          } else {\n            for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;\n            q.e = i + e * logBase - 1;\n            finalise(q, dp ? pr + q.e + 1 : pr, rm, more);\n          }\n          return q;\n        };\n      }();\n      function finalise(x, sd, rm, isTruncated) {\n        var digits, i, j, k, rd, roundUp, w, xd, xdi, Ctor = x.constructor;\n        out: if (sd != null) {\n          xd = x.d;\n          if (!xd) return x;\n          for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;\n          i = sd - digits;\n          if (i < 0) {\n            i += LOG_BASE;\n            j = sd;\n            w = xd[xdi = 0];\n            rd = w / mathpow(10, digits - j - 1) % 10 | 0;\n          } else {\n            xdi = Math.ceil((i + 1) / LOG_BASE);\n            k = xd.length;\n            if (xdi >= k) {\n              if (isTruncated) {\n                for (; k++ <= xdi; ) xd.push(0);\n                w = rd = 0;\n                digits = 1;\n                i %= LOG_BASE;\n                j = i - LOG_BASE + 1;\n              } else {\n                break out;\n              }\n            } else {\n              w = k = xd[xdi];\n              for (digits = 1; k >= 10; k /= 10) digits++;\n              i %= LOG_BASE;\n              j = i - LOG_BASE + digits;\n              rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;\n            }\n          }\n          isTruncated = isTruncated || sd < 0 || xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));\n          roundUp = rm < 4 ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && // Check whether the digit to the left of the rounding digit is odd.\n          (i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7));\n          if (sd < 1 || !xd[0]) {\n            xd.length = 0;\n            if (roundUp) {\n              sd -= x.e + 1;\n              xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);\n              x.e = -sd || 0;\n            } else {\n              xd[0] = x.e = 0;\n            }\n            return x;\n          }\n          if (i == 0) {\n            xd.length = xdi;\n            k = 1;\n            xdi--;\n          } else {\n            xd.length = xdi + 1;\n            k = mathpow(10, LOG_BASE - i);\n            xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;\n          }\n          if (roundUp) {\n            for (; ; ) {\n              if (xdi == 0) {\n                for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;\n                j = xd[0] += k;\n                for (k = 1; j >= 10; j /= 10) k++;\n                if (i != k) {\n                  x.e++;\n                  if (xd[0] == BASE) xd[0] = 1;\n                }\n                break;\n              } else {\n                xd[xdi] += k;\n                if (xd[xdi] != BASE) break;\n                xd[xdi--] = 0;\n                k = 1;\n              }\n            }\n          }\n          for (i = xd.length; xd[--i] === 0; ) xd.pop();\n        }\n        if (external) {\n          if (x.e > Ctor.maxE) {\n            x.d = null;\n            x.e = NaN;\n          } else if (x.e < Ctor.minE) {\n            x.e = 0;\n            x.d = [0];\n          }\n        }\n        return x;\n      }\n      function finiteToString(x, isExp, sd) {\n        if (!x.isFinite()) return nonFiniteToString(x);\n        var k, e = x.e, str = digitsToString(x.d), len = str.length;\n        if (isExp) {\n          if (sd && (k = sd - len) > 0) {\n            str = str.charAt(0) + \".\" + str.slice(1) + getZeroString(k);\n          } else if (len > 1) {\n            str = str.charAt(0) + \".\" + str.slice(1);\n          }\n          str = str + (x.e < 0 ? \"e\" : \"e+\") + x.e;\n        } else if (e < 0) {\n          str = \"0.\" + getZeroString(-e - 1) + str;\n          if (sd && (k = sd - len) > 0) str += getZeroString(k);\n        } else if (e >= len) {\n          str += getZeroString(e + 1 - len);\n          if (sd && (k = sd - e - 1) > 0) str = str + \".\" + getZeroString(k);\n        } else {\n          if ((k = e + 1) < len) str = str.slice(0, k) + \".\" + str.slice(k);\n          if (sd && (k = sd - len) > 0) {\n            if (e + 1 === len) str += \".\";\n            str += getZeroString(k);\n          }\n        }\n        return str;\n      }\n      function getBase10Exponent(digits, e) {\n        var w = digits[0];\n        for (e *= LOG_BASE; w >= 10; w /= 10) e++;\n        return e;\n      }\n      function getLn10(Ctor, sd, pr) {\n        if (sd > LN10_PRECISION) {\n          external = true;\n          if (pr) Ctor.precision = pr;\n          throw Error(precisionLimitExceeded);\n        }\n        return finalise(new Ctor(LN10), sd, 1, true);\n      }\n      function getPi(Ctor, sd, rm) {\n        if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);\n        return finalise(new Ctor(PI), sd, rm, true);\n      }\n      function getPrecision(digits) {\n        var w = digits.length - 1, len = w * LOG_BASE + 1;\n        w = digits[w];\n        if (w) {\n          for (; w % 10 == 0; w /= 10) len--;\n          for (w = digits[0]; w >= 10; w /= 10) len++;\n        }\n        return len;\n      }\n      function getZeroString(k) {\n        var zs = \"\";\n        for (; k--; ) zs += \"0\";\n        return zs;\n      }\n      function intPow(Ctor, x, n, pr) {\n        var isTruncated, r = new Ctor(1), k = Math.ceil(pr / LOG_BASE + 4);\n        external = false;\n        for (; ; ) {\n          if (n % 2) {\n            r = r.times(x);\n            if (truncate(r.d, k)) isTruncated = true;\n          }\n          n = mathfloor(n / 2);\n          if (n === 0) {\n            n = r.d.length - 1;\n            if (isTruncated && r.d[n] === 0) ++r.d[n];\n            break;\n          }\n          x = x.times(x);\n          truncate(x.d, k);\n        }\n        external = true;\n        return r;\n      }\n      function isOdd(n) {\n        return n.d[n.d.length - 1] & 1;\n      }\n      function maxOrMin(Ctor, args, ltgt) {\n        var y, x = new Ctor(args[0]), i = 0;\n        for (; ++i < args.length; ) {\n          y = new Ctor(args[i]);\n          if (!y.s) {\n            x = y;\n            break;\n          } else if (x[ltgt](y)) {\n            x = y;\n          }\n        }\n        return x;\n      }\n      function naturalExponential(x, sd) {\n        var denominator, guard, j, pow2, sum2, t, wpr, rep = 0, i = 0, k = 0, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision;\n        if (!x.d || !x.d[0] || x.e > 17) {\n          return new Ctor(x.d ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 : x.s ? x.s < 0 ? 0 : x : 0 / 0);\n        }\n        if (sd == null) {\n          external = false;\n          wpr = pr;\n        } else {\n          wpr = sd;\n        }\n        t = new Ctor(0.03125);\n        while (x.e > -2) {\n          x = x.times(t);\n          k += 5;\n        }\n        guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;\n        wpr += guard;\n        denominator = pow2 = sum2 = new Ctor(1);\n        Ctor.precision = wpr;\n        for (; ; ) {\n          pow2 = finalise(pow2.times(x), wpr, 1);\n          denominator = denominator.times(++i);\n          t = sum2.plus(divide(pow2, denominator, wpr, 1));\n          if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) {\n            j = k;\n            while (j--) sum2 = finalise(sum2.times(sum2), wpr, 1);\n            if (sd == null) {\n              if (rep < 3 && checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) {\n                Ctor.precision = wpr += 10;\n                denominator = pow2 = t = new Ctor(1);\n                i = 0;\n                rep++;\n              } else {\n                return finalise(sum2, Ctor.precision = pr, rm, external = true);\n              }\n            } else {\n              Ctor.precision = pr;\n              return sum2;\n            }\n          }\n          sum2 = t;\n        }\n      }\n      function naturalLogarithm(y, sd) {\n        var c, c0, denominator, e, numerator, rep, sum2, t, wpr, x1, x2, n = 1, guard = 10, x = y, xd = x.d, Ctor = x.constructor, rm = Ctor.rounding, pr = Ctor.precision;\n        if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {\n          return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);\n        }\n        if (sd == null) {\n          external = false;\n          wpr = pr;\n        } else {\n          wpr = sd;\n        }\n        Ctor.precision = wpr += guard;\n        c = digitsToString(xd);\n        c0 = c.charAt(0);\n        if (Math.abs(e = x.e) < 15e14) {\n          while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {\n            x = x.times(y);\n            c = digitsToString(x.d);\n            c0 = c.charAt(0);\n            n++;\n          }\n          e = x.e;\n          if (c0 > 1) {\n            x = new Ctor(\"0.\" + c);\n            e++;\n          } else {\n            x = new Ctor(c0 + \".\" + c.slice(1));\n          }\n        } else {\n          t = getLn10(Ctor, wpr + 2, pr).times(e + \"\");\n          x = naturalLogarithm(new Ctor(c0 + \".\" + c.slice(1)), wpr - guard).plus(t);\n          Ctor.precision = pr;\n          return sd == null ? finalise(x, pr, rm, external = true) : x;\n        }\n        x1 = x;\n        sum2 = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);\n        x2 = finalise(x.times(x), wpr, 1);\n        denominator = 3;\n        for (; ; ) {\n          numerator = finalise(numerator.times(x2), wpr, 1);\n          t = sum2.plus(divide(numerator, new Ctor(denominator), wpr, 1));\n          if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum2.d).slice(0, wpr)) {\n            sum2 = sum2.times(2);\n            if (e !== 0) sum2 = sum2.plus(getLn10(Ctor, wpr + 2, pr).times(e + \"\"));\n            sum2 = divide(sum2, new Ctor(n), wpr, 1);\n            if (sd == null) {\n              if (checkRoundingDigits(sum2.d, wpr - guard, rm, rep)) {\n                Ctor.precision = wpr += guard;\n                t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);\n                x2 = finalise(x.times(x), wpr, 1);\n                denominator = rep = 1;\n              } else {\n                return finalise(sum2, Ctor.precision = pr, rm, external = true);\n              }\n            } else {\n              Ctor.precision = pr;\n              return sum2;\n            }\n          }\n          sum2 = t;\n          denominator += 2;\n        }\n      }\n      function nonFiniteToString(x) {\n        return String(x.s * x.s / 0);\n      }\n      function parseDecimal(x, str) {\n        var e, i, len;\n        if ((e = str.indexOf(\".\")) > -1) str = str.replace(\".\", \"\");\n        if ((i = str.search(/e/i)) > 0) {\n          if (e < 0) e = i;\n          e += +str.slice(i + 1);\n          str = str.substring(0, i);\n        } else if (e < 0) {\n          e = str.length;\n        }\n        for (i = 0; str.charCodeAt(i) === 48; i++) ;\n        for (len = str.length; str.charCodeAt(len - 1) === 48; --len) ;\n        str = str.slice(i, len);\n        if (str) {\n          len -= i;\n          x.e = e = e - i - 1;\n          x.d = [];\n          i = (e + 1) % LOG_BASE;\n          if (e < 0) i += LOG_BASE;\n          if (i < len) {\n            if (i) x.d.push(+str.slice(0, i));\n            for (len -= LOG_BASE; i < len; ) x.d.push(+str.slice(i, i += LOG_BASE));\n            str = str.slice(i);\n            i = LOG_BASE - str.length;\n          } else {\n            i -= len;\n          }\n          for (; i--; ) str += \"0\";\n          x.d.push(+str);\n          if (external) {\n            if (x.e > x.constructor.maxE) {\n              x.d = null;\n              x.e = NaN;\n            } else if (x.e < x.constructor.minE) {\n              x.e = 0;\n              x.d = [0];\n            }\n          }\n        } else {\n          x.e = 0;\n          x.d = [0];\n        }\n        return x;\n      }\n      function parseOther(x, str) {\n        var base, Ctor, divisor, i, isFloat, len, p, xd, xe;\n        if (str.indexOf(\"_\") > -1) {\n          str = str.replace(/(\\d)_(?=\\d)/g, \"$1\");\n          if (isDecimal.test(str)) return parseDecimal(x, str);\n        } else if (str === \"Infinity\" || str === \"NaN\") {\n          if (!+str) x.s = NaN;\n          x.e = NaN;\n          x.d = null;\n          return x;\n        }\n        if (isHex.test(str)) {\n          base = 16;\n          str = str.toLowerCase();\n        } else if (isBinary.test(str)) {\n          base = 2;\n        } else if (isOctal.test(str)) {\n          base = 8;\n        } else {\n          throw Error(invalidArgument + str);\n        }\n        i = str.search(/p/i);\n        if (i > 0) {\n          p = +str.slice(i + 1);\n          str = str.substring(2, i);\n        } else {\n          str = str.slice(2);\n        }\n        i = str.indexOf(\".\");\n        isFloat = i >= 0;\n        Ctor = x.constructor;\n        if (isFloat) {\n          str = str.replace(\".\", \"\");\n          len = str.length;\n          i = len - i;\n          divisor = intPow(Ctor, new Ctor(base), i, i * 2);\n        }\n        xd = convertBase(str, base, BASE);\n        xe = xd.length - 1;\n        for (i = xe; xd[i] === 0; --i) xd.pop();\n        if (i < 0) return new Ctor(x.s * 0);\n        x.e = getBase10Exponent(xd, xe);\n        x.d = xd;\n        external = false;\n        if (isFloat) x = divide(x, divisor, len * 4);\n        if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal2.pow(2, p));\n        external = true;\n        return x;\n      }\n      function sine(Ctor, x) {\n        var k, len = x.d.length;\n        if (len < 3) {\n          return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);\n        }\n        k = 1.4 * Math.sqrt(len);\n        k = k > 16 ? 16 : k | 0;\n        x = x.times(1 / tinyPow(5, k));\n        x = taylorSeries(Ctor, 2, x, x);\n        var sin2_x, d5 = new Ctor(5), d16 = new Ctor(16), d20 = new Ctor(20);\n        for (; k--; ) {\n          sin2_x = x.times(x);\n          x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));\n        }\n        return x;\n      }\n      function taylorSeries(Ctor, n, x, y, isHyperbolic) {\n        var j, t, u, x2, i = 1, pr = Ctor.precision, k = Math.ceil(pr / LOG_BASE);\n        external = false;\n        x2 = x.times(x);\n        u = new Ctor(y);\n        for (; ; ) {\n          t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);\n          u = isHyperbolic ? y.plus(t) : y.minus(t);\n          y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);\n          t = u.plus(y);\n          if (t.d[k] !== void 0) {\n            for (j = k; t.d[j] === u.d[j] && j--; ) ;\n            if (j == -1) break;\n          }\n          j = u;\n          u = y;\n          y = t;\n          t = j;\n          i++;\n        }\n        external = true;\n        t.d.length = k + 1;\n        return t;\n      }\n      function tinyPow(b, e) {\n        var n = b;\n        while (--e) n *= b;\n        return n;\n      }\n      function toLessThanHalfPi(Ctor, x) {\n        var t, isNeg = x.s < 0, pi = getPi(Ctor, Ctor.precision, 1), halfPi = pi.times(0.5);\n        x = x.abs();\n        if (x.lte(halfPi)) {\n          quadrant = isNeg ? 4 : 1;\n          return x;\n        }\n        t = x.divToInt(pi);\n        if (t.isZero()) {\n          quadrant = isNeg ? 3 : 2;\n        } else {\n          x = x.minus(t.times(pi));\n          if (x.lte(halfPi)) {\n            quadrant = isOdd(t) ? isNeg ? 2 : 3 : isNeg ? 4 : 1;\n            return x;\n          }\n          quadrant = isOdd(t) ? isNeg ? 1 : 4 : isNeg ? 3 : 2;\n        }\n        return x.minus(pi).abs();\n      }\n      function toStringBinary(x, baseOut, sd, rm) {\n        var base, e, i, k, len, roundUp, str, xd, y, Ctor = x.constructor, isExp = sd !== void 0;\n        if (isExp) {\n          checkInt32(sd, 1, MAX_DIGITS);\n          if (rm === void 0) rm = Ctor.rounding;\n          else checkInt32(rm, 0, 8);\n        } else {\n          sd = Ctor.precision;\n          rm = Ctor.rounding;\n        }\n        if (!x.isFinite()) {\n          str = nonFiniteToString(x);\n        } else {\n          str = finiteToString(x);\n          i = str.indexOf(\".\");\n          if (isExp) {\n            base = 2;\n            if (baseOut == 16) {\n              sd = sd * 4 - 3;\n            } else if (baseOut == 8) {\n              sd = sd * 3 - 2;\n            }\n          } else {\n            base = baseOut;\n          }\n          if (i >= 0) {\n            str = str.replace(\".\", \"\");\n            y = new Ctor(1);\n            y.e = str.length - i;\n            y.d = convertBase(finiteToString(y), 10, base);\n            y.e = y.d.length;\n          }\n          xd = convertBase(str, 10, base);\n          e = len = xd.length;\n          for (; xd[--len] == 0; ) xd.pop();\n          if (!xd[0]) {\n            str = isExp ? \"0p+0\" : \"0\";\n          } else {\n            if (i < 0) {\n              e--;\n            } else {\n              x = new Ctor(x);\n              x.d = xd;\n              x.e = e;\n              x = divide(x, y, sd, rm, 0, base);\n              xd = x.d;\n              e = x.e;\n              roundUp = inexact;\n            }\n            i = xd[sd];\n            k = base / 2;\n            roundUp = roundUp || xd[sd + 1] !== void 0;\n            roundUp = rm < 4 ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || rm === (x.s < 0 ? 8 : 7));\n            xd.length = sd;\n            if (roundUp) {\n              for (; ++xd[--sd] > base - 1; ) {\n                xd[sd] = 0;\n                if (!sd) {\n                  ++e;\n                  xd.unshift(1);\n                }\n              }\n            }\n            for (len = xd.length; !xd[len - 1]; --len) ;\n            for (i = 0, str = \"\"; i < len; i++) str += NUMERALS.charAt(xd[i]);\n            if (isExp) {\n              if (len > 1) {\n                if (baseOut == 16 || baseOut == 8) {\n                  i = baseOut == 16 ? 4 : 3;\n                  for (--len; len % i; len++) str += \"0\";\n                  xd = convertBase(str, base, baseOut);\n                  for (len = xd.length; !xd[len - 1]; --len) ;\n                  for (i = 1, str = \"1.\"; i < len; i++) str += NUMERALS.charAt(xd[i]);\n                } else {\n                  str = str.charAt(0) + \".\" + str.slice(1);\n                }\n              }\n              str = str + (e < 0 ? \"p\" : \"p+\") + e;\n            } else if (e < 0) {\n              for (; ++e; ) str = \"0\" + str;\n              str = \"0.\" + str;\n            } else {\n              if (++e > len) for (e -= len; e--; ) str += \"0\";\n              else if (e < len) str = str.slice(0, e) + \".\" + str.slice(e);\n            }\n          }\n          str = (baseOut == 16 ? \"0x\" : baseOut == 2 ? \"0b\" : baseOut == 8 ? \"0o\" : \"\") + str;\n        }\n        return x.s < 0 ? \"-\" + str : str;\n      }\n      function truncate(arr, len) {\n        if (arr.length > len) {\n          arr.length = len;\n          return true;\n        }\n      }\n      function abs(x) {\n        return new this(x).abs();\n      }\n      function acos(x) {\n        return new this(x).acos();\n      }\n      function acosh(x) {\n        return new this(x).acosh();\n      }\n      function add(x, y) {\n        return new this(x).plus(y);\n      }\n      function asin(x) {\n        return new this(x).asin();\n      }\n      function asinh(x) {\n        return new this(x).asinh();\n      }\n      function atan(x) {\n        return new this(x).atan();\n      }\n      function atanh(x) {\n        return new this(x).atanh();\n      }\n      function atan2(y, x) {\n        y = new this(y);\n        x = new this(x);\n        var r, pr = this.precision, rm = this.rounding, wpr = pr + 4;\n        if (!y.s || !x.s) {\n          r = new this(NaN);\n        } else if (!y.d && !x.d) {\n          r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);\n          r.s = y.s;\n        } else if (!x.d || y.isZero()) {\n          r = x.s < 0 ? getPi(this, pr, rm) : new this(0);\n          r.s = y.s;\n        } else if (!y.d || x.isZero()) {\n          r = getPi(this, wpr, 1).times(0.5);\n          r.s = y.s;\n        } else if (x.s < 0) {\n          this.precision = wpr;\n          this.rounding = 1;\n          r = this.atan(divide(y, x, wpr, 1));\n          x = getPi(this, wpr, 1);\n          this.precision = pr;\n          this.rounding = rm;\n          r = y.s < 0 ? r.minus(x) : r.plus(x);\n        } else {\n          r = this.atan(divide(y, x, wpr, 1));\n        }\n        return r;\n      }\n      function cbrt(x) {\n        return new this(x).cbrt();\n      }\n      function ceil(x) {\n        return finalise(x = new this(x), x.e + 1, 2);\n      }\n      function clamp(x, min2, max2) {\n        return new this(x).clamp(min2, max2);\n      }\n      function config(obj) {\n        if (!obj || typeof obj !== \"object\") throw Error(decimalError + \"Object expected\");\n        var i, p, v, useDefaults = obj.defaults === true, ps = [\n          \"precision\",\n          1,\n          MAX_DIGITS,\n          \"rounding\",\n          0,\n          8,\n          \"toExpNeg\",\n          -EXP_LIMIT,\n          0,\n          \"toExpPos\",\n          0,\n          EXP_LIMIT,\n          \"maxE\",\n          0,\n          EXP_LIMIT,\n          \"minE\",\n          -EXP_LIMIT,\n          0,\n          \"modulo\",\n          0,\n          9\n        ];\n        for (i = 0; i < ps.length; i += 3) {\n          if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];\n          if ((v = obj[p]) !== void 0) {\n            if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;\n            else throw Error(invalidArgument + p + \": \" + v);\n          }\n        }\n        if (p = \"crypto\", useDefaults) this[p] = DEFAULTS[p];\n        if ((v = obj[p]) !== void 0) {\n          if (v === true || v === false || v === 0 || v === 1) {\n            if (v) {\n              if (typeof crypto != \"undefined\" && crypto && (crypto.getRandomValues || crypto.randomBytes)) {\n                this[p] = true;\n              } else {\n                throw Error(cryptoUnavailable);\n              }\n            } else {\n              this[p] = false;\n            }\n          } else {\n            throw Error(invalidArgument + p + \": \" + v);\n          }\n        }\n        return this;\n      }\n      function cos(x) {\n        return new this(x).cos();\n      }\n      function cosh(x) {\n        return new this(x).cosh();\n      }\n      function clone(obj) {\n        var i, p, ps;\n        function Decimal3(v) {\n          var e, i2, t, x = this;\n          if (!(x instanceof Decimal3)) return new Decimal3(v);\n          x.constructor = Decimal3;\n          if (isDecimalInstance(v)) {\n            x.s = v.s;\n            if (external) {\n              if (!v.d || v.e > Decimal3.maxE) {\n                x.e = NaN;\n                x.d = null;\n              } else if (v.e < Decimal3.minE) {\n                x.e = 0;\n                x.d = [0];\n              } else {\n                x.e = v.e;\n                x.d = v.d.slice();\n              }\n            } else {\n              x.e = v.e;\n              x.d = v.d ? v.d.slice() : v.d;\n            }\n            return;\n          }\n          t = typeof v;\n          if (t === \"number\") {\n            if (v === 0) {\n              x.s = 1 / v < 0 ? -1 : 1;\n              x.e = 0;\n              x.d = [0];\n              return;\n            }\n            if (v < 0) {\n              v = -v;\n              x.s = -1;\n            } else {\n              x.s = 1;\n            }\n            if (v === ~~v && v < 1e7) {\n              for (e = 0, i2 = v; i2 >= 10; i2 /= 10) e++;\n              if (external) {\n                if (e > Decimal3.maxE) {\n                  x.e = NaN;\n                  x.d = null;\n                } else if (e < Decimal3.minE) {\n                  x.e = 0;\n                  x.d = [0];\n                } else {\n                  x.e = e;\n                  x.d = [v];\n                }\n              } else {\n                x.e = e;\n                x.d = [v];\n              }\n              return;\n            } else if (v * 0 !== 0) {\n              if (!v) x.s = NaN;\n              x.e = NaN;\n              x.d = null;\n              return;\n            }\n            return parseDecimal(x, v.toString());\n          } else if (t !== \"string\") {\n            throw Error(invalidArgument + v);\n          }\n          if ((i2 = v.charCodeAt(0)) === 45) {\n            v = v.slice(1);\n            x.s = -1;\n          } else {\n            if (i2 === 43) v = v.slice(1);\n            x.s = 1;\n          }\n          return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);\n        }\n        Decimal3.prototype = P;\n        Decimal3.ROUND_UP = 0;\n        Decimal3.ROUND_DOWN = 1;\n        Decimal3.ROUND_CEIL = 2;\n        Decimal3.ROUND_FLOOR = 3;\n        Decimal3.ROUND_HALF_UP = 4;\n        Decimal3.ROUND_HALF_DOWN = 5;\n        Decimal3.ROUND_HALF_EVEN = 6;\n        Decimal3.ROUND_HALF_CEIL = 7;\n        Decimal3.ROUND_HALF_FLOOR = 8;\n        Decimal3.EUCLID = 9;\n        Decimal3.config = Decimal3.set = config;\n        Decimal3.clone = clone;\n        Decimal3.isDecimal = isDecimalInstance;\n        Decimal3.abs = abs;\n        Decimal3.acos = acos;\n        Decimal3.acosh = acosh;\n        Decimal3.add = add;\n        Decimal3.asin = asin;\n        Decimal3.asinh = asinh;\n        Decimal3.atan = atan;\n        Decimal3.atanh = atanh;\n        Decimal3.atan2 = atan2;\n        Decimal3.cbrt = cbrt;\n        Decimal3.ceil = ceil;\n        Decimal3.clamp = clamp;\n        Decimal3.cos = cos;\n        Decimal3.cosh = cosh;\n        Decimal3.div = div;\n        Decimal3.exp = exp;\n        Decimal3.floor = floor;\n        Decimal3.hypot = hypot;\n        Decimal3.ln = ln;\n        Decimal3.log = log;\n        Decimal3.log10 = log10;\n        Decimal3.log2 = log2;\n        Decimal3.max = max;\n        Decimal3.min = min;\n        Decimal3.mod = mod;\n        Decimal3.mul = mul;\n        Decimal3.pow = pow;\n        Decimal3.random = random;\n        Decimal3.round = round;\n        Decimal3.sign = sign;\n        Decimal3.sin = sin;\n        Decimal3.sinh = sinh;\n        Decimal3.sqrt = sqrt;\n        Decimal3.sub = sub;\n        Decimal3.sum = sum;\n        Decimal3.tan = tan;\n        Decimal3.tanh = tanh;\n        Decimal3.trunc = trunc;\n        if (obj === void 0) obj = {};\n        if (obj) {\n          if (obj.defaults !== true) {\n            ps = [\"precision\", \"rounding\", \"toExpNeg\", \"toExpPos\", \"maxE\", \"minE\", \"modulo\", \"crypto\"];\n            for (i = 0; i < ps.length; ) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];\n          }\n        }\n        Decimal3.config(obj);\n        return Decimal3;\n      }\n      function div(x, y) {\n        return new this(x).div(y);\n      }\n      function exp(x) {\n        return new this(x).exp();\n      }\n      function floor(x) {\n        return finalise(x = new this(x), x.e + 1, 3);\n      }\n      function hypot() {\n        var i, n, t = new this(0);\n        external = false;\n        for (i = 0; i < arguments.length; ) {\n          n = new this(arguments[i++]);\n          if (!n.d) {\n            if (n.s) {\n              external = true;\n              return new this(1 / 0);\n            }\n            t = n;\n          } else if (t.d) {\n            t = t.plus(n.times(n));\n          }\n        }\n        external = true;\n        return t.sqrt();\n      }\n      function isDecimalInstance(obj) {\n        return obj instanceof Decimal2 || obj && obj.toStringTag === tag || false;\n      }\n      function ln(x) {\n        return new this(x).ln();\n      }\n      function log(x, y) {\n        return new this(x).log(y);\n      }\n      function log2(x) {\n        return new this(x).log(2);\n      }\n      function log10(x) {\n        return new this(x).log(10);\n      }\n      function max() {\n        return maxOrMin(this, arguments, \"lt\");\n      }\n      function min() {\n        return maxOrMin(this, arguments, \"gt\");\n      }\n      function mod(x, y) {\n        return new this(x).mod(y);\n      }\n      function mul(x, y) {\n        return new this(x).mul(y);\n      }\n      function pow(x, y) {\n        return new this(x).pow(y);\n      }\n      function random(sd) {\n        var d, e, k, n, i = 0, r = new this(1), rd = [];\n        if (sd === void 0) sd = this.precision;\n        else checkInt32(sd, 1, MAX_DIGITS);\n        k = Math.ceil(sd / LOG_BASE);\n        if (!this.crypto) {\n          for (; i < k; ) rd[i++] = Math.random() * 1e7 | 0;\n        } else if (crypto.getRandomValues) {\n          d = crypto.getRandomValues(new Uint32Array(k));\n          for (; i < k; ) {\n            n = d[i];\n            if (n >= 429e7) {\n              d[i] = crypto.getRandomValues(new Uint32Array(1))[0];\n            } else {\n              rd[i++] = n % 1e7;\n            }\n          }\n        } else if (crypto.randomBytes) {\n          d = crypto.randomBytes(k *= 4);\n          for (; i < k; ) {\n            n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 127) << 24);\n            if (n >= 214e7) {\n              crypto.randomBytes(4).copy(d, i);\n            } else {\n              rd.push(n % 1e7);\n              i += 4;\n            }\n          }\n          i = k / 4;\n        } else {\n          throw Error(cryptoUnavailable);\n        }\n        k = rd[--i];\n        sd %= LOG_BASE;\n        if (k && sd) {\n          n = mathpow(10, LOG_BASE - sd);\n          rd[i] = (k / n | 0) * n;\n        }\n        for (; rd[i] === 0; i--) rd.pop();\n        if (i < 0) {\n          e = 0;\n          rd = [0];\n        } else {\n          e = -1;\n          for (; rd[0] === 0; e -= LOG_BASE) rd.shift();\n          for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;\n          if (k < LOG_BASE) e -= LOG_BASE - k;\n        }\n        r.e = e;\n        r.d = rd;\n        return r;\n      }\n      function round(x) {\n        return finalise(x = new this(x), x.e + 1, this.rounding);\n      }\n      function sign(x) {\n        x = new this(x);\n        return x.d ? x.d[0] ? x.s : 0 * x.s : x.s || NaN;\n      }\n      function sin(x) {\n        return new this(x).sin();\n      }\n      function sinh(x) {\n        return new this(x).sinh();\n      }\n      function sqrt(x) {\n        return new this(x).sqrt();\n      }\n      function sub(x, y) {\n        return new this(x).sub(y);\n      }\n      function sum() {\n        var i = 0, args = arguments, x = new this(args[i]);\n        external = false;\n        for (; x.s && ++i < args.length; ) x = x.plus(args[i]);\n        external = true;\n        return finalise(x, this.precision, this.rounding);\n      }\n      function tan(x) {\n        return new this(x).tan();\n      }\n      function tanh(x) {\n        return new this(x).tanh();\n      }\n      function trunc(x) {\n        return finalise(x = new this(x), x.e + 1, 1);\n      }\n      Decimal2 = clone(DEFAULTS);\n      Decimal2.prototype.constructor = Decimal2;\n      Decimal2[\"default\"] = Decimal2.Decimal = Decimal2;\n      LN10 = new Decimal2(LN10);\n      PI = new Decimal2(PI);\n      if (typeof define == \"function\" && define.amd) {\n        define(function() {\n          return Decimal2;\n        });\n      } else if (typeof module2 != \"undefined\" && module2.exports) {\n        if (typeof Symbol == \"function\" && typeof Symbol.iterator == \"symbol\") {\n          P[Symbol[\"for\"](\"nodejs.util.inspect.custom\")] = P.toString;\n          P[Symbol.toStringTag] = \"Decimal\";\n        }\n        module2.exports = Decimal2;\n      } else {\n        if (!globalScope) {\n          globalScope = typeof self != \"undefined\" && self && self.self == self ? self : window;\n        }\n        noConflict = globalScope.Decimal;\n        Decimal2.noConflict = function() {\n          globalScope.Decimal = noConflict;\n          return Decimal2;\n        };\n        globalScope.Decimal = Decimal2;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/bn.js/lib/bn.js\nvar require_bn = __commonJS({\n  \"node_modules/bn.js/lib/bn.js\"(exports2, module2) {\n    (function(module3, exports3) {\n      \"use strict\";\n      function assert(val, msg) {\n        if (!val) throw new Error(msg || \"Assertion failed\");\n      }\n      function inherits(ctor, superCtor) {\n        ctor.super_ = superCtor;\n        var TempCtor = function() {\n        };\n        TempCtor.prototype = superCtor.prototype;\n        ctor.prototype = new TempCtor();\n        ctor.prototype.constructor = ctor;\n      }\n      function BN(number, base, endian) {\n        if (BN.isBN(number)) {\n          return number;\n        }\n        this.negative = 0;\n        this.words = null;\n        this.length = 0;\n        this.red = null;\n        if (number !== null) {\n          if (base === \"le\" || base === \"be\") {\n            endian = base;\n            base = 10;\n          }\n          this._init(number || 0, base || 10, endian || \"be\");\n        }\n      }\n      if (typeof module3 === \"object\") {\n        module3.exports = BN;\n      } else {\n        exports3.BN = BN;\n      }\n      BN.BN = BN;\n      BN.wordSize = 26;\n      var Buffer2;\n      try {\n        if (typeof window !== \"undefined\" && typeof window.Buffer !== \"undefined\") {\n          Buffer2 = window.Buffer;\n        } else {\n          Buffer2 = require(\"buffer\").Buffer;\n        }\n      } catch (e) {\n      }\n      BN.isBN = function isBN(num) {\n        if (num instanceof BN) {\n          return true;\n        }\n        return num !== null && typeof num === \"object\" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n      };\n      BN.max = function max(left, right) {\n        if (left.cmp(right) > 0) return left;\n        return right;\n      };\n      BN.min = function min(left, right) {\n        if (left.cmp(right) < 0) return left;\n        return right;\n      };\n      BN.prototype._init = function init(number, base, endian) {\n        if (typeof number === \"number\") {\n          return this._initNumber(number, base, endian);\n        }\n        if (typeof number === \"object\") {\n          return this._initArray(number, base, endian);\n        }\n        if (base === \"hex\") {\n          base = 16;\n        }\n        assert(base === (base | 0) && base >= 2 && base <= 36);\n        number = number.toString().replace(/\\s+/g, \"\");\n        var start = 0;\n        if (number[0] === \"-\") {\n          start++;\n          this.negative = 1;\n        }\n        if (start < number.length) {\n          if (base === 16) {\n            this._parseHex(number, start, endian);\n          } else {\n            this._parseBase(number, base, start);\n            if (endian === \"le\") {\n              this._initArray(this.toArray(), base, endian);\n            }\n          }\n        }\n      };\n      BN.prototype._initNumber = function _initNumber(number, base, endian) {\n        if (number < 0) {\n          this.negative = 1;\n          number = -number;\n        }\n        if (number < 67108864) {\n          this.words = [number & 67108863];\n          this.length = 1;\n        } else if (number < 4503599627370496) {\n          this.words = [\n            number & 67108863,\n            number / 67108864 & 67108863\n          ];\n          this.length = 2;\n        } else {\n          assert(number < 9007199254740992);\n          this.words = [\n            number & 67108863,\n            number / 67108864 & 67108863,\n            1\n          ];\n          this.length = 3;\n        }\n        if (endian !== \"le\") return;\n        this._initArray(this.toArray(), base, endian);\n      };\n      BN.prototype._initArray = function _initArray(number, base, endian) {\n        assert(typeof number.length === \"number\");\n        if (number.length <= 0) {\n          this.words = [0];\n          this.length = 1;\n          return this;\n        }\n        this.length = Math.ceil(number.length / 3);\n        this.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          this.words[i] = 0;\n        }\n        var j, w;\n        var off = 0;\n        if (endian === \"be\") {\n          for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n            w = number[i] | number[i - 1] << 8 | number[i - 2] << 16;\n            this.words[j] |= w << off & 67108863;\n            this.words[j + 1] = w >>> 26 - off & 67108863;\n            off += 24;\n            if (off >= 26) {\n              off -= 26;\n              j++;\n            }\n          }\n        } else if (endian === \"le\") {\n          for (i = 0, j = 0; i < number.length; i += 3) {\n            w = number[i] | number[i + 1] << 8 | number[i + 2] << 16;\n            this.words[j] |= w << off & 67108863;\n            this.words[j + 1] = w >>> 26 - off & 67108863;\n            off += 24;\n            if (off >= 26) {\n              off -= 26;\n              j++;\n            }\n          }\n        }\n        return this.strip();\n      };\n      function parseHex4Bits(string, index) {\n        var c = string.charCodeAt(index);\n        if (c >= 65 && c <= 70) {\n          return c - 55;\n        } else if (c >= 97 && c <= 102) {\n          return c - 87;\n        } else {\n          return c - 48 & 15;\n        }\n      }\n      function parseHexByte(string, lowerBound, index) {\n        var r = parseHex4Bits(string, index);\n        if (index - 1 >= lowerBound) {\n          r |= parseHex4Bits(string, index - 1) << 4;\n        }\n        return r;\n      }\n      BN.prototype._parseHex = function _parseHex(number, start, endian) {\n        this.length = Math.ceil((number.length - start) / 6);\n        this.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          this.words[i] = 0;\n        }\n        var off = 0;\n        var j = 0;\n        var w;\n        if (endian === \"be\") {\n          for (i = number.length - 1; i >= start; i -= 2) {\n            w = parseHexByte(number, start, i) << off;\n            this.words[j] |= w & 67108863;\n            if (off >= 18) {\n              off -= 18;\n              j += 1;\n              this.words[j] |= w >>> 26;\n            } else {\n              off += 8;\n            }\n          }\n        } else {\n          var parseLength = number.length - start;\n          for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n            w = parseHexByte(number, start, i) << off;\n            this.words[j] |= w & 67108863;\n            if (off >= 18) {\n              off -= 18;\n              j += 1;\n              this.words[j] |= w >>> 26;\n            } else {\n              off += 8;\n            }\n          }\n        }\n        this.strip();\n      };\n      function parseBase(str, start, end, mul) {\n        var r = 0;\n        var len = Math.min(str.length, end);\n        for (var i = start; i < len; i++) {\n          var c = str.charCodeAt(i) - 48;\n          r *= mul;\n          if (c >= 49) {\n            r += c - 49 + 10;\n          } else if (c >= 17) {\n            r += c - 17 + 10;\n          } else {\n            r += c;\n          }\n        }\n        return r;\n      }\n      BN.prototype._parseBase = function _parseBase(number, base, start) {\n        this.words = [0];\n        this.length = 1;\n        for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base) {\n          limbLen++;\n        }\n        limbLen--;\n        limbPow = limbPow / base | 0;\n        var total = number.length - start;\n        var mod = total % limbLen;\n        var end = Math.min(total, total - mod) + start;\n        var word = 0;\n        for (var i = start; i < end; i += limbLen) {\n          word = parseBase(number, i, i + limbLen, base);\n          this.imuln(limbPow);\n          if (this.words[0] + word < 67108864) {\n            this.words[0] += word;\n          } else {\n            this._iaddn(word);\n          }\n        }\n        if (mod !== 0) {\n          var pow = 1;\n          word = parseBase(number, i, number.length, base);\n          for (i = 0; i < mod; i++) {\n            pow *= base;\n          }\n          this.imuln(pow);\n          if (this.words[0] + word < 67108864) {\n            this.words[0] += word;\n          } else {\n            this._iaddn(word);\n          }\n        }\n        this.strip();\n      };\n      BN.prototype.copy = function copy(dest) {\n        dest.words = new Array(this.length);\n        for (var i = 0; i < this.length; i++) {\n          dest.words[i] = this.words[i];\n        }\n        dest.length = this.length;\n        dest.negative = this.negative;\n        dest.red = this.red;\n      };\n      BN.prototype.clone = function clone() {\n        var r = new BN(null);\n        this.copy(r);\n        return r;\n      };\n      BN.prototype._expand = function _expand(size) {\n        while (this.length < size) {\n          this.words[this.length++] = 0;\n        }\n        return this;\n      };\n      BN.prototype.strip = function strip() {\n        while (this.length > 1 && this.words[this.length - 1] === 0) {\n          this.length--;\n        }\n        return this._normSign();\n      };\n      BN.prototype._normSign = function _normSign() {\n        if (this.length === 1 && this.words[0] === 0) {\n          this.negative = 0;\n        }\n        return this;\n      };\n      BN.prototype.inspect = function inspect() {\n        return (this.red ? \"<BN-R: \" : \"<BN: \") + this.toString(16) + \">\";\n      };\n      var zeros = [\n        \"\",\n        \"0\",\n        \"00\",\n        \"000\",\n        \"0000\",\n        \"00000\",\n        \"000000\",\n        \"0000000\",\n        \"00000000\",\n        \"000000000\",\n        \"0000000000\",\n        \"00000000000\",\n        \"000000000000\",\n        \"0000000000000\",\n        \"00000000000000\",\n        \"000000000000000\",\n        \"0000000000000000\",\n        \"00000000000000000\",\n        \"000000000000000000\",\n        \"0000000000000000000\",\n        \"00000000000000000000\",\n        \"000000000000000000000\",\n        \"0000000000000000000000\",\n        \"00000000000000000000000\",\n        \"000000000000000000000000\",\n        \"0000000000000000000000000\"\n      ];\n      var groupSizes = [\n        0,\n        0,\n        25,\n        16,\n        12,\n        11,\n        10,\n        9,\n        8,\n        8,\n        7,\n        7,\n        7,\n        7,\n        6,\n        6,\n        6,\n        6,\n        6,\n        6,\n        6,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5\n      ];\n      var groupBases = [\n        0,\n        0,\n        33554432,\n        43046721,\n        16777216,\n        48828125,\n        60466176,\n        40353607,\n        16777216,\n        43046721,\n        1e7,\n        19487171,\n        35831808,\n        62748517,\n        7529536,\n        11390625,\n        16777216,\n        24137569,\n        34012224,\n        47045881,\n        64e6,\n        4084101,\n        5153632,\n        6436343,\n        7962624,\n        9765625,\n        11881376,\n        14348907,\n        17210368,\n        20511149,\n        243e5,\n        28629151,\n        33554432,\n        39135393,\n        45435424,\n        52521875,\n        60466176\n      ];\n      BN.prototype.toString = function toString(base, padding) {\n        base = base || 10;\n        padding = padding | 0 || 1;\n        var out;\n        if (base === 16 || base === \"hex\") {\n          out = \"\";\n          var off = 0;\n          var carry = 0;\n          for (var i = 0; i < this.length; i++) {\n            var w = this.words[i];\n            var word = ((w << off | carry) & 16777215).toString(16);\n            carry = w >>> 24 - off & 16777215;\n            if (carry !== 0 || i !== this.length - 1) {\n              out = zeros[6 - word.length] + word + out;\n            } else {\n              out = word + out;\n            }\n            off += 2;\n            if (off >= 26) {\n              off -= 26;\n              i--;\n            }\n          }\n          if (carry !== 0) {\n            out = carry.toString(16) + out;\n          }\n          while (out.length % padding !== 0) {\n            out = \"0\" + out;\n          }\n          if (this.negative !== 0) {\n            out = \"-\" + out;\n          }\n          return out;\n        }\n        if (base === (base | 0) && base >= 2 && base <= 36) {\n          var groupSize = groupSizes[base];\n          var groupBase = groupBases[base];\n          out = \"\";\n          var c = this.clone();\n          c.negative = 0;\n          while (!c.isZero()) {\n            var r = c.modn(groupBase).toString(base);\n            c = c.idivn(groupBase);\n            if (!c.isZero()) {\n              out = zeros[groupSize - r.length] + r + out;\n            } else {\n              out = r + out;\n            }\n          }\n          if (this.isZero()) {\n            out = \"0\" + out;\n          }\n          while (out.length % padding !== 0) {\n            out = \"0\" + out;\n          }\n          if (this.negative !== 0) {\n            out = \"-\" + out;\n          }\n          return out;\n        }\n        assert(false, \"Base should be between 2 and 36\");\n      };\n      BN.prototype.toNumber = function toNumber() {\n        var ret = this.words[0];\n        if (this.length === 2) {\n          ret += this.words[1] * 67108864;\n        } else if (this.length === 3 && this.words[2] === 1) {\n          ret += 4503599627370496 + this.words[1] * 67108864;\n        } else if (this.length > 2) {\n          assert(false, \"Number can only safely store up to 53 bits\");\n        }\n        return this.negative !== 0 ? -ret : ret;\n      };\n      BN.prototype.toJSON = function toJSON() {\n        return this.toString(16);\n      };\n      BN.prototype.toBuffer = function toBuffer(endian, length) {\n        assert(typeof Buffer2 !== \"undefined\");\n        return this.toArrayLike(Buffer2, endian, length);\n      };\n      BN.prototype.toArray = function toArray(endian, length) {\n        return this.toArrayLike(Array, endian, length);\n      };\n      BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) {\n        var byteLength = this.byteLength();\n        var reqLength = length || Math.max(1, byteLength);\n        assert(byteLength <= reqLength, \"byte array longer than desired length\");\n        assert(reqLength > 0, \"Requested array length <= 0\");\n        this.strip();\n        var littleEndian = endian === \"le\";\n        var res = new ArrayType(reqLength);\n        var b, i;\n        var q = this.clone();\n        if (!littleEndian) {\n          for (i = 0; i < reqLength - byteLength; i++) {\n            res[i] = 0;\n          }\n          for (i = 0; !q.isZero(); i++) {\n            b = q.andln(255);\n            q.iushrn(8);\n            res[reqLength - i - 1] = b;\n          }\n        } else {\n          for (i = 0; !q.isZero(); i++) {\n            b = q.andln(255);\n            q.iushrn(8);\n            res[i] = b;\n          }\n          for (; i < reqLength; i++) {\n            res[i] = 0;\n          }\n        }\n        return res;\n      };\n      if (Math.clz32) {\n        BN.prototype._countBits = function _countBits(w) {\n          return 32 - Math.clz32(w);\n        };\n      } else {\n        BN.prototype._countBits = function _countBits(w) {\n          var t = w;\n          var r = 0;\n          if (t >= 4096) {\n            r += 13;\n            t >>>= 13;\n          }\n          if (t >= 64) {\n            r += 7;\n            t >>>= 7;\n          }\n          if (t >= 8) {\n            r += 4;\n            t >>>= 4;\n          }\n          if (t >= 2) {\n            r += 2;\n            t >>>= 2;\n          }\n          return r + t;\n        };\n      }\n      BN.prototype._zeroBits = function _zeroBits(w) {\n        if (w === 0) return 26;\n        var t = w;\n        var r = 0;\n        if ((t & 8191) === 0) {\n          r += 13;\n          t >>>= 13;\n        }\n        if ((t & 127) === 0) {\n          r += 7;\n          t >>>= 7;\n        }\n        if ((t & 15) === 0) {\n          r += 4;\n          t >>>= 4;\n        }\n        if ((t & 3) === 0) {\n          r += 2;\n          t >>>= 2;\n        }\n        if ((t & 1) === 0) {\n          r++;\n        }\n        return r;\n      };\n      BN.prototype.bitLength = function bitLength() {\n        var w = this.words[this.length - 1];\n        var hi = this._countBits(w);\n        return (this.length - 1) * 26 + hi;\n      };\n      function toBitArray(num) {\n        var w = new Array(num.bitLength());\n        for (var bit = 0; bit < w.length; bit++) {\n          var off = bit / 26 | 0;\n          var wbit = bit % 26;\n          w[bit] = (num.words[off] & 1 << wbit) >>> wbit;\n        }\n        return w;\n      }\n      BN.prototype.zeroBits = function zeroBits() {\n        if (this.isZero()) return 0;\n        var r = 0;\n        for (var i = 0; i < this.length; i++) {\n          var b = this._zeroBits(this.words[i]);\n          r += b;\n          if (b !== 26) break;\n        }\n        return r;\n      };\n      BN.prototype.byteLength = function byteLength() {\n        return Math.ceil(this.bitLength() / 8);\n      };\n      BN.prototype.toTwos = function toTwos(width) {\n        if (this.negative !== 0) {\n          return this.abs().inotn(width).iaddn(1);\n        }\n        return this.clone();\n      };\n      BN.prototype.fromTwos = function fromTwos(width) {\n        if (this.testn(width - 1)) {\n          return this.notn(width).iaddn(1).ineg();\n        }\n        return this.clone();\n      };\n      BN.prototype.isNeg = function isNeg() {\n        return this.negative !== 0;\n      };\n      BN.prototype.neg = function neg() {\n        return this.clone().ineg();\n      };\n      BN.prototype.ineg = function ineg() {\n        if (!this.isZero()) {\n          this.negative ^= 1;\n        }\n        return this;\n      };\n      BN.prototype.iuor = function iuor(num) {\n        while (this.length < num.length) {\n          this.words[this.length++] = 0;\n        }\n        for (var i = 0; i < num.length; i++) {\n          this.words[i] = this.words[i] | num.words[i];\n        }\n        return this.strip();\n      };\n      BN.prototype.ior = function ior(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuor(num);\n      };\n      BN.prototype.or = function or(num) {\n        if (this.length > num.length) return this.clone().ior(num);\n        return num.clone().ior(this);\n      };\n      BN.prototype.uor = function uor(num) {\n        if (this.length > num.length) return this.clone().iuor(num);\n        return num.clone().iuor(this);\n      };\n      BN.prototype.iuand = function iuand(num) {\n        var b;\n        if (this.length > num.length) {\n          b = num;\n        } else {\n          b = this;\n        }\n        for (var i = 0; i < b.length; i++) {\n          this.words[i] = this.words[i] & num.words[i];\n        }\n        this.length = b.length;\n        return this.strip();\n      };\n      BN.prototype.iand = function iand(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuand(num);\n      };\n      BN.prototype.and = function and(num) {\n        if (this.length > num.length) return this.clone().iand(num);\n        return num.clone().iand(this);\n      };\n      BN.prototype.uand = function uand(num) {\n        if (this.length > num.length) return this.clone().iuand(num);\n        return num.clone().iuand(this);\n      };\n      BN.prototype.iuxor = function iuxor(num) {\n        var a;\n        var b;\n        if (this.length > num.length) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        for (var i = 0; i < b.length; i++) {\n          this.words[i] = a.words[i] ^ b.words[i];\n        }\n        if (this !== a) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        this.length = a.length;\n        return this.strip();\n      };\n      BN.prototype.ixor = function ixor(num) {\n        assert((this.negative | num.negative) === 0);\n        return this.iuxor(num);\n      };\n      BN.prototype.xor = function xor(num) {\n        if (this.length > num.length) return this.clone().ixor(num);\n        return num.clone().ixor(this);\n      };\n      BN.prototype.uxor = function uxor(num) {\n        if (this.length > num.length) return this.clone().iuxor(num);\n        return num.clone().iuxor(this);\n      };\n      BN.prototype.inotn = function inotn(width) {\n        assert(typeof width === \"number\" && width >= 0);\n        var bytesNeeded = Math.ceil(width / 26) | 0;\n        var bitsLeft = width % 26;\n        this._expand(bytesNeeded);\n        if (bitsLeft > 0) {\n          bytesNeeded--;\n        }\n        for (var i = 0; i < bytesNeeded; i++) {\n          this.words[i] = ~this.words[i] & 67108863;\n        }\n        if (bitsLeft > 0) {\n          this.words[i] = ~this.words[i] & 67108863 >> 26 - bitsLeft;\n        }\n        return this.strip();\n      };\n      BN.prototype.notn = function notn(width) {\n        return this.clone().inotn(width);\n      };\n      BN.prototype.setn = function setn(bit, val) {\n        assert(typeof bit === \"number\" && bit >= 0);\n        var off = bit / 26 | 0;\n        var wbit = bit % 26;\n        this._expand(off + 1);\n        if (val) {\n          this.words[off] = this.words[off] | 1 << wbit;\n        } else {\n          this.words[off] = this.words[off] & ~(1 << wbit);\n        }\n        return this.strip();\n      };\n      BN.prototype.iadd = function iadd(num) {\n        var r;\n        if (this.negative !== 0 && num.negative === 0) {\n          this.negative = 0;\n          r = this.isub(num);\n          this.negative ^= 1;\n          return this._normSign();\n        } else if (this.negative === 0 && num.negative !== 0) {\n          num.negative = 0;\n          r = this.isub(num);\n          num.negative = 1;\n          return r._normSign();\n        }\n        var a, b;\n        if (this.length > num.length) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        var carry = 0;\n        for (var i = 0; i < b.length; i++) {\n          r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n          this.words[i] = r & 67108863;\n          carry = r >>> 26;\n        }\n        for (; carry !== 0 && i < a.length; i++) {\n          r = (a.words[i] | 0) + carry;\n          this.words[i] = r & 67108863;\n          carry = r >>> 26;\n        }\n        this.length = a.length;\n        if (carry !== 0) {\n          this.words[this.length] = carry;\n          this.length++;\n        } else if (a !== this) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        return this;\n      };\n      BN.prototype.add = function add(num) {\n        var res;\n        if (num.negative !== 0 && this.negative === 0) {\n          num.negative = 0;\n          res = this.sub(num);\n          num.negative ^= 1;\n          return res;\n        } else if (num.negative === 0 && this.negative !== 0) {\n          this.negative = 0;\n          res = num.sub(this);\n          this.negative = 1;\n          return res;\n        }\n        if (this.length > num.length) return this.clone().iadd(num);\n        return num.clone().iadd(this);\n      };\n      BN.prototype.isub = function isub(num) {\n        if (num.negative !== 0) {\n          num.negative = 0;\n          var r = this.iadd(num);\n          num.negative = 1;\n          return r._normSign();\n        } else if (this.negative !== 0) {\n          this.negative = 0;\n          this.iadd(num);\n          this.negative = 1;\n          return this._normSign();\n        }\n        var cmp = this.cmp(num);\n        if (cmp === 0) {\n          this.negative = 0;\n          this.length = 1;\n          this.words[0] = 0;\n          return this;\n        }\n        var a, b;\n        if (cmp > 0) {\n          a = this;\n          b = num;\n        } else {\n          a = num;\n          b = this;\n        }\n        var carry = 0;\n        for (var i = 0; i < b.length; i++) {\n          r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n          carry = r >> 26;\n          this.words[i] = r & 67108863;\n        }\n        for (; carry !== 0 && i < a.length; i++) {\n          r = (a.words[i] | 0) + carry;\n          carry = r >> 26;\n          this.words[i] = r & 67108863;\n        }\n        if (carry === 0 && i < a.length && a !== this) {\n          for (; i < a.length; i++) {\n            this.words[i] = a.words[i];\n          }\n        }\n        this.length = Math.max(this.length, i);\n        if (a !== this) {\n          this.negative = 1;\n        }\n        return this.strip();\n      };\n      BN.prototype.sub = function sub(num) {\n        return this.clone().isub(num);\n      };\n      function smallMulTo(self2, num, out) {\n        out.negative = num.negative ^ self2.negative;\n        var len = self2.length + num.length | 0;\n        out.length = len;\n        len = len - 1 | 0;\n        var a = self2.words[0] | 0;\n        var b = num.words[0] | 0;\n        var r = a * b;\n        var lo = r & 67108863;\n        var carry = r / 67108864 | 0;\n        out.words[0] = lo;\n        for (var k = 1; k < len; k++) {\n          var ncarry = carry >>> 26;\n          var rword = carry & 67108863;\n          var maxJ = Math.min(k, num.length - 1);\n          for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) {\n            var i = k - j | 0;\n            a = self2.words[i] | 0;\n            b = num.words[j] | 0;\n            r = a * b + rword;\n            ncarry += r / 67108864 | 0;\n            rword = r & 67108863;\n          }\n          out.words[k] = rword | 0;\n          carry = ncarry | 0;\n        }\n        if (carry !== 0) {\n          out.words[k] = carry | 0;\n        } else {\n          out.length--;\n        }\n        return out.strip();\n      }\n      var comb10MulTo = function comb10MulTo2(self2, num, out) {\n        var a = self2.words;\n        var b = num.words;\n        var o = out.words;\n        var c = 0;\n        var lo;\n        var mid;\n        var hi;\n        var a0 = a[0] | 0;\n        var al0 = a0 & 8191;\n        var ah0 = a0 >>> 13;\n        var a1 = a[1] | 0;\n        var al1 = a1 & 8191;\n        var ah1 = a1 >>> 13;\n        var a2 = a[2] | 0;\n        var al2 = a2 & 8191;\n        var ah2 = a2 >>> 13;\n        var a3 = a[3] | 0;\n        var al3 = a3 & 8191;\n        var ah3 = a3 >>> 13;\n        var a4 = a[4] | 0;\n        var al4 = a4 & 8191;\n        var ah4 = a4 >>> 13;\n        var a5 = a[5] | 0;\n        var al5 = a5 & 8191;\n        var ah5 = a5 >>> 13;\n        var a6 = a[6] | 0;\n        var al6 = a6 & 8191;\n        var ah6 = a6 >>> 13;\n        var a7 = a[7] | 0;\n        var al7 = a7 & 8191;\n        var ah7 = a7 >>> 13;\n        var a8 = a[8] | 0;\n        var al8 = a8 & 8191;\n        var ah8 = a8 >>> 13;\n        var a9 = a[9] | 0;\n        var al9 = a9 & 8191;\n        var ah9 = a9 >>> 13;\n        var b0 = b[0] | 0;\n        var bl0 = b0 & 8191;\n        var bh0 = b0 >>> 13;\n        var b1 = b[1] | 0;\n        var bl1 = b1 & 8191;\n        var bh1 = b1 >>> 13;\n        var b2 = b[2] | 0;\n        var bl2 = b2 & 8191;\n        var bh2 = b2 >>> 13;\n        var b3 = b[3] | 0;\n        var bl3 = b3 & 8191;\n        var bh3 = b3 >>> 13;\n        var b4 = b[4] | 0;\n        var bl4 = b4 & 8191;\n        var bh4 = b4 >>> 13;\n        var b5 = b[5] | 0;\n        var bl5 = b5 & 8191;\n        var bh5 = b5 >>> 13;\n        var b6 = b[6] | 0;\n        var bl6 = b6 & 8191;\n        var bh6 = b6 >>> 13;\n        var b7 = b[7] | 0;\n        var bl7 = b7 & 8191;\n        var bh7 = b7 >>> 13;\n        var b8 = b[8] | 0;\n        var bl8 = b8 & 8191;\n        var bh8 = b8 >>> 13;\n        var b9 = b[9] | 0;\n        var bl9 = b9 & 8191;\n        var bh9 = b9 >>> 13;\n        out.negative = self2.negative ^ num.negative;\n        out.length = 19;\n        lo = Math.imul(al0, bl0);\n        mid = Math.imul(al0, bh0);\n        mid = mid + Math.imul(ah0, bl0) | 0;\n        hi = Math.imul(ah0, bh0);\n        var w0 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w0 >>> 26) | 0;\n        w0 &= 67108863;\n        lo = Math.imul(al1, bl0);\n        mid = Math.imul(al1, bh0);\n        mid = mid + Math.imul(ah1, bl0) | 0;\n        hi = Math.imul(ah1, bh0);\n        lo = lo + Math.imul(al0, bl1) | 0;\n        mid = mid + Math.imul(al0, bh1) | 0;\n        mid = mid + Math.imul(ah0, bl1) | 0;\n        hi = hi + Math.imul(ah0, bh1) | 0;\n        var w1 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w1 >>> 26) | 0;\n        w1 &= 67108863;\n        lo = Math.imul(al2, bl0);\n        mid = Math.imul(al2, bh0);\n        mid = mid + Math.imul(ah2, bl0) | 0;\n        hi = Math.imul(ah2, bh0);\n        lo = lo + Math.imul(al1, bl1) | 0;\n        mid = mid + Math.imul(al1, bh1) | 0;\n        mid = mid + Math.imul(ah1, bl1) | 0;\n        hi = hi + Math.imul(ah1, bh1) | 0;\n        lo = lo + Math.imul(al0, bl2) | 0;\n        mid = mid + Math.imul(al0, bh2) | 0;\n        mid = mid + Math.imul(ah0, bl2) | 0;\n        hi = hi + Math.imul(ah0, bh2) | 0;\n        var w2 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w2 >>> 26) | 0;\n        w2 &= 67108863;\n        lo = Math.imul(al3, bl0);\n        mid = Math.imul(al3, bh0);\n        mid = mid + Math.imul(ah3, bl0) | 0;\n        hi = Math.imul(ah3, bh0);\n        lo = lo + Math.imul(al2, bl1) | 0;\n        mid = mid + Math.imul(al2, bh1) | 0;\n        mid = mid + Math.imul(ah2, bl1) | 0;\n        hi = hi + Math.imul(ah2, bh1) | 0;\n        lo = lo + Math.imul(al1, bl2) | 0;\n        mid = mid + Math.imul(al1, bh2) | 0;\n        mid = mid + Math.imul(ah1, bl2) | 0;\n        hi = hi + Math.imul(ah1, bh2) | 0;\n        lo = lo + Math.imul(al0, bl3) | 0;\n        mid = mid + Math.imul(al0, bh3) | 0;\n        mid = mid + Math.imul(ah0, bl3) | 0;\n        hi = hi + Math.imul(ah0, bh3) | 0;\n        var w3 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w3 >>> 26) | 0;\n        w3 &= 67108863;\n        lo = Math.imul(al4, bl0);\n        mid = Math.imul(al4, bh0);\n        mid = mid + Math.imul(ah4, bl0) | 0;\n        hi = Math.imul(ah4, bh0);\n        lo = lo + Math.imul(al3, bl1) | 0;\n        mid = mid + Math.imul(al3, bh1) | 0;\n        mid = mid + Math.imul(ah3, bl1) | 0;\n        hi = hi + Math.imul(ah3, bh1) | 0;\n        lo = lo + Math.imul(al2, bl2) | 0;\n        mid = mid + Math.imul(al2, bh2) | 0;\n        mid = mid + Math.imul(ah2, bl2) | 0;\n        hi = hi + Math.imul(ah2, bh2) | 0;\n        lo = lo + Math.imul(al1, bl3) | 0;\n        mid = mid + Math.imul(al1, bh3) | 0;\n        mid = mid + Math.imul(ah1, bl3) | 0;\n        hi = hi + Math.imul(ah1, bh3) | 0;\n        lo = lo + Math.imul(al0, bl4) | 0;\n        mid = mid + Math.imul(al0, bh4) | 0;\n        mid = mid + Math.imul(ah0, bl4) | 0;\n        hi = hi + Math.imul(ah0, bh4) | 0;\n        var w4 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w4 >>> 26) | 0;\n        w4 &= 67108863;\n        lo = Math.imul(al5, bl0);\n        mid = Math.imul(al5, bh0);\n        mid = mid + Math.imul(ah5, bl0) | 0;\n        hi = Math.imul(ah5, bh0);\n        lo = lo + Math.imul(al4, bl1) | 0;\n        mid = mid + Math.imul(al4, bh1) | 0;\n        mid = mid + Math.imul(ah4, bl1) | 0;\n        hi = hi + Math.imul(ah4, bh1) | 0;\n        lo = lo + Math.imul(al3, bl2) | 0;\n        mid = mid + Math.imul(al3, bh2) | 0;\n        mid = mid + Math.imul(ah3, bl2) | 0;\n        hi = hi + Math.imul(ah3, bh2) | 0;\n        lo = lo + Math.imul(al2, bl3) | 0;\n        mid = mid + Math.imul(al2, bh3) | 0;\n        mid = mid + Math.imul(ah2, bl3) | 0;\n        hi = hi + Math.imul(ah2, bh3) | 0;\n        lo = lo + Math.imul(al1, bl4) | 0;\n        mid = mid + Math.imul(al1, bh4) | 0;\n        mid = mid + Math.imul(ah1, bl4) | 0;\n        hi = hi + Math.imul(ah1, bh4) | 0;\n        lo = lo + Math.imul(al0, bl5) | 0;\n        mid = mid + Math.imul(al0, bh5) | 0;\n        mid = mid + Math.imul(ah0, bl5) | 0;\n        hi = hi + Math.imul(ah0, bh5) | 0;\n        var w5 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w5 >>> 26) | 0;\n        w5 &= 67108863;\n        lo = Math.imul(al6, bl0);\n        mid = Math.imul(al6, bh0);\n        mid = mid + Math.imul(ah6, bl0) | 0;\n        hi = Math.imul(ah6, bh0);\n        lo = lo + Math.imul(al5, bl1) | 0;\n        mid = mid + Math.imul(al5, bh1) | 0;\n        mid = mid + Math.imul(ah5, bl1) | 0;\n        hi = hi + Math.imul(ah5, bh1) | 0;\n        lo = lo + Math.imul(al4, bl2) | 0;\n        mid = mid + Math.imul(al4, bh2) | 0;\n        mid = mid + Math.imul(ah4, bl2) | 0;\n        hi = hi + Math.imul(ah4, bh2) | 0;\n        lo = lo + Math.imul(al3, bl3) | 0;\n        mid = mid + Math.imul(al3, bh3) | 0;\n        mid = mid + Math.imul(ah3, bl3) | 0;\n        hi = hi + Math.imul(ah3, bh3) | 0;\n        lo = lo + Math.imul(al2, bl4) | 0;\n        mid = mid + Math.imul(al2, bh4) | 0;\n        mid = mid + Math.imul(ah2, bl4) | 0;\n        hi = hi + Math.imul(ah2, bh4) | 0;\n        lo = lo + Math.imul(al1, bl5) | 0;\n        mid = mid + Math.imul(al1, bh5) | 0;\n        mid = mid + Math.imul(ah1, bl5) | 0;\n        hi = hi + Math.imul(ah1, bh5) | 0;\n        lo = lo + Math.imul(al0, bl6) | 0;\n        mid = mid + Math.imul(al0, bh6) | 0;\n        mid = mid + Math.imul(ah0, bl6) | 0;\n        hi = hi + Math.imul(ah0, bh6) | 0;\n        var w6 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w6 >>> 26) | 0;\n        w6 &= 67108863;\n        lo = Math.imul(al7, bl0);\n        mid = Math.imul(al7, bh0);\n        mid = mid + Math.imul(ah7, bl0) | 0;\n        hi = Math.imul(ah7, bh0);\n        lo = lo + Math.imul(al6, bl1) | 0;\n        mid = mid + Math.imul(al6, bh1) | 0;\n        mid = mid + Math.imul(ah6, bl1) | 0;\n        hi = hi + Math.imul(ah6, bh1) | 0;\n        lo = lo + Math.imul(al5, bl2) | 0;\n        mid = mid + Math.imul(al5, bh2) | 0;\n        mid = mid + Math.imul(ah5, bl2) | 0;\n        hi = hi + Math.imul(ah5, bh2) | 0;\n        lo = lo + Math.imul(al4, bl3) | 0;\n        mid = mid + Math.imul(al4, bh3) | 0;\n        mid = mid + Math.imul(ah4, bl3) | 0;\n        hi = hi + Math.imul(ah4, bh3) | 0;\n        lo = lo + Math.imul(al3, bl4) | 0;\n        mid = mid + Math.imul(al3, bh4) | 0;\n        mid = mid + Math.imul(ah3, bl4) | 0;\n        hi = hi + Math.imul(ah3, bh4) | 0;\n        lo = lo + Math.imul(al2, bl5) | 0;\n        mid = mid + Math.imul(al2, bh5) | 0;\n        mid = mid + Math.imul(ah2, bl5) | 0;\n        hi = hi + Math.imul(ah2, bh5) | 0;\n        lo = lo + Math.imul(al1, bl6) | 0;\n        mid = mid + Math.imul(al1, bh6) | 0;\n        mid = mid + Math.imul(ah1, bl6) | 0;\n        hi = hi + Math.imul(ah1, bh6) | 0;\n        lo = lo + Math.imul(al0, bl7) | 0;\n        mid = mid + Math.imul(al0, bh7) | 0;\n        mid = mid + Math.imul(ah0, bl7) | 0;\n        hi = hi + Math.imul(ah0, bh7) | 0;\n        var w7 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w7 >>> 26) | 0;\n        w7 &= 67108863;\n        lo = Math.imul(al8, bl0);\n        mid = Math.imul(al8, bh0);\n        mid = mid + Math.imul(ah8, bl0) | 0;\n        hi = Math.imul(ah8, bh0);\n        lo = lo + Math.imul(al7, bl1) | 0;\n        mid = mid + Math.imul(al7, bh1) | 0;\n        mid = mid + Math.imul(ah7, bl1) | 0;\n        hi = hi + Math.imul(ah7, bh1) | 0;\n        lo = lo + Math.imul(al6, bl2) | 0;\n        mid = mid + Math.imul(al6, bh2) | 0;\n        mid = mid + Math.imul(ah6, bl2) | 0;\n        hi = hi + Math.imul(ah6, bh2) | 0;\n        lo = lo + Math.imul(al5, bl3) | 0;\n        mid = mid + Math.imul(al5, bh3) | 0;\n        mid = mid + Math.imul(ah5, bl3) | 0;\n        hi = hi + Math.imul(ah5, bh3) | 0;\n        lo = lo + Math.imul(al4, bl4) | 0;\n        mid = mid + Math.imul(al4, bh4) | 0;\n        mid = mid + Math.imul(ah4, bl4) | 0;\n        hi = hi + Math.imul(ah4, bh4) | 0;\n        lo = lo + Math.imul(al3, bl5) | 0;\n        mid = mid + Math.imul(al3, bh5) | 0;\n        mid = mid + Math.imul(ah3, bl5) | 0;\n        hi = hi + Math.imul(ah3, bh5) | 0;\n        lo = lo + Math.imul(al2, bl6) | 0;\n        mid = mid + Math.imul(al2, bh6) | 0;\n        mid = mid + Math.imul(ah2, bl6) | 0;\n        hi = hi + Math.imul(ah2, bh6) | 0;\n        lo = lo + Math.imul(al1, bl7) | 0;\n        mid = mid + Math.imul(al1, bh7) | 0;\n        mid = mid + Math.imul(ah1, bl7) | 0;\n        hi = hi + Math.imul(ah1, bh7) | 0;\n        lo = lo + Math.imul(al0, bl8) | 0;\n        mid = mid + Math.imul(al0, bh8) | 0;\n        mid = mid + Math.imul(ah0, bl8) | 0;\n        hi = hi + Math.imul(ah0, bh8) | 0;\n        var w8 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w8 >>> 26) | 0;\n        w8 &= 67108863;\n        lo = Math.imul(al9, bl0);\n        mid = Math.imul(al9, bh0);\n        mid = mid + Math.imul(ah9, bl0) | 0;\n        hi = Math.imul(ah9, bh0);\n        lo = lo + Math.imul(al8, bl1) | 0;\n        mid = mid + Math.imul(al8, bh1) | 0;\n        mid = mid + Math.imul(ah8, bl1) | 0;\n        hi = hi + Math.imul(ah8, bh1) | 0;\n        lo = lo + Math.imul(al7, bl2) | 0;\n        mid = mid + Math.imul(al7, bh2) | 0;\n        mid = mid + Math.imul(ah7, bl2) | 0;\n        hi = hi + Math.imul(ah7, bh2) | 0;\n        lo = lo + Math.imul(al6, bl3) | 0;\n        mid = mid + Math.imul(al6, bh3) | 0;\n        mid = mid + Math.imul(ah6, bl3) | 0;\n        hi = hi + Math.imul(ah6, bh3) | 0;\n        lo = lo + Math.imul(al5, bl4) | 0;\n        mid = mid + Math.imul(al5, bh4) | 0;\n        mid = mid + Math.imul(ah5, bl4) | 0;\n        hi = hi + Math.imul(ah5, bh4) | 0;\n        lo = lo + Math.imul(al4, bl5) | 0;\n        mid = mid + Math.imul(al4, bh5) | 0;\n        mid = mid + Math.imul(ah4, bl5) | 0;\n        hi = hi + Math.imul(ah4, bh5) | 0;\n        lo = lo + Math.imul(al3, bl6) | 0;\n        mid = mid + Math.imul(al3, bh6) | 0;\n        mid = mid + Math.imul(ah3, bl6) | 0;\n        hi = hi + Math.imul(ah3, bh6) | 0;\n        lo = lo + Math.imul(al2, bl7) | 0;\n        mid = mid + Math.imul(al2, bh7) | 0;\n        mid = mid + Math.imul(ah2, bl7) | 0;\n        hi = hi + Math.imul(ah2, bh7) | 0;\n        lo = lo + Math.imul(al1, bl8) | 0;\n        mid = mid + Math.imul(al1, bh8) | 0;\n        mid = mid + Math.imul(ah1, bl8) | 0;\n        hi = hi + Math.imul(ah1, bh8) | 0;\n        lo = lo + Math.imul(al0, bl9) | 0;\n        mid = mid + Math.imul(al0, bh9) | 0;\n        mid = mid + Math.imul(ah0, bl9) | 0;\n        hi = hi + Math.imul(ah0, bh9) | 0;\n        var w9 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w9 >>> 26) | 0;\n        w9 &= 67108863;\n        lo = Math.imul(al9, bl1);\n        mid = Math.imul(al9, bh1);\n        mid = mid + Math.imul(ah9, bl1) | 0;\n        hi = Math.imul(ah9, bh1);\n        lo = lo + Math.imul(al8, bl2) | 0;\n        mid = mid + Math.imul(al8, bh2) | 0;\n        mid = mid + Math.imul(ah8, bl2) | 0;\n        hi = hi + Math.imul(ah8, bh2) | 0;\n        lo = lo + Math.imul(al7, bl3) | 0;\n        mid = mid + Math.imul(al7, bh3) | 0;\n        mid = mid + Math.imul(ah7, bl3) | 0;\n        hi = hi + Math.imul(ah7, bh3) | 0;\n        lo = lo + Math.imul(al6, bl4) | 0;\n        mid = mid + Math.imul(al6, bh4) | 0;\n        mid = mid + Math.imul(ah6, bl4) | 0;\n        hi = hi + Math.imul(ah6, bh4) | 0;\n        lo = lo + Math.imul(al5, bl5) | 0;\n        mid = mid + Math.imul(al5, bh5) | 0;\n        mid = mid + Math.imul(ah5, bl5) | 0;\n        hi = hi + Math.imul(ah5, bh5) | 0;\n        lo = lo + Math.imul(al4, bl6) | 0;\n        mid = mid + Math.imul(al4, bh6) | 0;\n        mid = mid + Math.imul(ah4, bl6) | 0;\n        hi = hi + Math.imul(ah4, bh6) | 0;\n        lo = lo + Math.imul(al3, bl7) | 0;\n        mid = mid + Math.imul(al3, bh7) | 0;\n        mid = mid + Math.imul(ah3, bl7) | 0;\n        hi = hi + Math.imul(ah3, bh7) | 0;\n        lo = lo + Math.imul(al2, bl8) | 0;\n        mid = mid + Math.imul(al2, bh8) | 0;\n        mid = mid + Math.imul(ah2, bl8) | 0;\n        hi = hi + Math.imul(ah2, bh8) | 0;\n        lo = lo + Math.imul(al1, bl9) | 0;\n        mid = mid + Math.imul(al1, bh9) | 0;\n        mid = mid + Math.imul(ah1, bl9) | 0;\n        hi = hi + Math.imul(ah1, bh9) | 0;\n        var w10 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w10 >>> 26) | 0;\n        w10 &= 67108863;\n        lo = Math.imul(al9, bl2);\n        mid = Math.imul(al9, bh2);\n        mid = mid + Math.imul(ah9, bl2) | 0;\n        hi = Math.imul(ah9, bh2);\n        lo = lo + Math.imul(al8, bl3) | 0;\n        mid = mid + Math.imul(al8, bh3) | 0;\n        mid = mid + Math.imul(ah8, bl3) | 0;\n        hi = hi + Math.imul(ah8, bh3) | 0;\n        lo = lo + Math.imul(al7, bl4) | 0;\n        mid = mid + Math.imul(al7, bh4) | 0;\n        mid = mid + Math.imul(ah7, bl4) | 0;\n        hi = hi + Math.imul(ah7, bh4) | 0;\n        lo = lo + Math.imul(al6, bl5) | 0;\n        mid = mid + Math.imul(al6, bh5) | 0;\n        mid = mid + Math.imul(ah6, bl5) | 0;\n        hi = hi + Math.imul(ah6, bh5) | 0;\n        lo = lo + Math.imul(al5, bl6) | 0;\n        mid = mid + Math.imul(al5, bh6) | 0;\n        mid = mid + Math.imul(ah5, bl6) | 0;\n        hi = hi + Math.imul(ah5, bh6) | 0;\n        lo = lo + Math.imul(al4, bl7) | 0;\n        mid = mid + Math.imul(al4, bh7) | 0;\n        mid = mid + Math.imul(ah4, bl7) | 0;\n        hi = hi + Math.imul(ah4, bh7) | 0;\n        lo = lo + Math.imul(al3, bl8) | 0;\n        mid = mid + Math.imul(al3, bh8) | 0;\n        mid = mid + Math.imul(ah3, bl8) | 0;\n        hi = hi + Math.imul(ah3, bh8) | 0;\n        lo = lo + Math.imul(al2, bl9) | 0;\n        mid = mid + Math.imul(al2, bh9) | 0;\n        mid = mid + Math.imul(ah2, bl9) | 0;\n        hi = hi + Math.imul(ah2, bh9) | 0;\n        var w11 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w11 >>> 26) | 0;\n        w11 &= 67108863;\n        lo = Math.imul(al9, bl3);\n        mid = Math.imul(al9, bh3);\n        mid = mid + Math.imul(ah9, bl3) | 0;\n        hi = Math.imul(ah9, bh3);\n        lo = lo + Math.imul(al8, bl4) | 0;\n        mid = mid + Math.imul(al8, bh4) | 0;\n        mid = mid + Math.imul(ah8, bl4) | 0;\n        hi = hi + Math.imul(ah8, bh4) | 0;\n        lo = lo + Math.imul(al7, bl5) | 0;\n        mid = mid + Math.imul(al7, bh5) | 0;\n        mid = mid + Math.imul(ah7, bl5) | 0;\n        hi = hi + Math.imul(ah7, bh5) | 0;\n        lo = lo + Math.imul(al6, bl6) | 0;\n        mid = mid + Math.imul(al6, bh6) | 0;\n        mid = mid + Math.imul(ah6, bl6) | 0;\n        hi = hi + Math.imul(ah6, bh6) | 0;\n        lo = lo + Math.imul(al5, bl7) | 0;\n        mid = mid + Math.imul(al5, bh7) | 0;\n        mid = mid + Math.imul(ah5, bl7) | 0;\n        hi = hi + Math.imul(ah5, bh7) | 0;\n        lo = lo + Math.imul(al4, bl8) | 0;\n        mid = mid + Math.imul(al4, bh8) | 0;\n        mid = mid + Math.imul(ah4, bl8) | 0;\n        hi = hi + Math.imul(ah4, bh8) | 0;\n        lo = lo + Math.imul(al3, bl9) | 0;\n        mid = mid + Math.imul(al3, bh9) | 0;\n        mid = mid + Math.imul(ah3, bl9) | 0;\n        hi = hi + Math.imul(ah3, bh9) | 0;\n        var w12 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w12 >>> 26) | 0;\n        w12 &= 67108863;\n        lo = Math.imul(al9, bl4);\n        mid = Math.imul(al9, bh4);\n        mid = mid + Math.imul(ah9, bl4) | 0;\n        hi = Math.imul(ah9, bh4);\n        lo = lo + Math.imul(al8, bl5) | 0;\n        mid = mid + Math.imul(al8, bh5) | 0;\n        mid = mid + Math.imul(ah8, bl5) | 0;\n        hi = hi + Math.imul(ah8, bh5) | 0;\n        lo = lo + Math.imul(al7, bl6) | 0;\n        mid = mid + Math.imul(al7, bh6) | 0;\n        mid = mid + Math.imul(ah7, bl6) | 0;\n        hi = hi + Math.imul(ah7, bh6) | 0;\n        lo = lo + Math.imul(al6, bl7) | 0;\n        mid = mid + Math.imul(al6, bh7) | 0;\n        mid = mid + Math.imul(ah6, bl7) | 0;\n        hi = hi + Math.imul(ah6, bh7) | 0;\n        lo = lo + Math.imul(al5, bl8) | 0;\n        mid = mid + Math.imul(al5, bh8) | 0;\n        mid = mid + Math.imul(ah5, bl8) | 0;\n        hi = hi + Math.imul(ah5, bh8) | 0;\n        lo = lo + Math.imul(al4, bl9) | 0;\n        mid = mid + Math.imul(al4, bh9) | 0;\n        mid = mid + Math.imul(ah4, bl9) | 0;\n        hi = hi + Math.imul(ah4, bh9) | 0;\n        var w13 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w13 >>> 26) | 0;\n        w13 &= 67108863;\n        lo = Math.imul(al9, bl5);\n        mid = Math.imul(al9, bh5);\n        mid = mid + Math.imul(ah9, bl5) | 0;\n        hi = Math.imul(ah9, bh5);\n        lo = lo + Math.imul(al8, bl6) | 0;\n        mid = mid + Math.imul(al8, bh6) | 0;\n        mid = mid + Math.imul(ah8, bl6) | 0;\n        hi = hi + Math.imul(ah8, bh6) | 0;\n        lo = lo + Math.imul(al7, bl7) | 0;\n        mid = mid + Math.imul(al7, bh7) | 0;\n        mid = mid + Math.imul(ah7, bl7) | 0;\n        hi = hi + Math.imul(ah7, bh7) | 0;\n        lo = lo + Math.imul(al6, bl8) | 0;\n        mid = mid + Math.imul(al6, bh8) | 0;\n        mid = mid + Math.imul(ah6, bl8) | 0;\n        hi = hi + Math.imul(ah6, bh8) | 0;\n        lo = lo + Math.imul(al5, bl9) | 0;\n        mid = mid + Math.imul(al5, bh9) | 0;\n        mid = mid + Math.imul(ah5, bl9) | 0;\n        hi = hi + Math.imul(ah5, bh9) | 0;\n        var w14 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w14 >>> 26) | 0;\n        w14 &= 67108863;\n        lo = Math.imul(al9, bl6);\n        mid = Math.imul(al9, bh6);\n        mid = mid + Math.imul(ah9, bl6) | 0;\n        hi = Math.imul(ah9, bh6);\n        lo = lo + Math.imul(al8, bl7) | 0;\n        mid = mid + Math.imul(al8, bh7) | 0;\n        mid = mid + Math.imul(ah8, bl7) | 0;\n        hi = hi + Math.imul(ah8, bh7) | 0;\n        lo = lo + Math.imul(al7, bl8) | 0;\n        mid = mid + Math.imul(al7, bh8) | 0;\n        mid = mid + Math.imul(ah7, bl8) | 0;\n        hi = hi + Math.imul(ah7, bh8) | 0;\n        lo = lo + Math.imul(al6, bl9) | 0;\n        mid = mid + Math.imul(al6, bh9) | 0;\n        mid = mid + Math.imul(ah6, bl9) | 0;\n        hi = hi + Math.imul(ah6, bh9) | 0;\n        var w15 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w15 >>> 26) | 0;\n        w15 &= 67108863;\n        lo = Math.imul(al9, bl7);\n        mid = Math.imul(al9, bh7);\n        mid = mid + Math.imul(ah9, bl7) | 0;\n        hi = Math.imul(ah9, bh7);\n        lo = lo + Math.imul(al8, bl8) | 0;\n        mid = mid + Math.imul(al8, bh8) | 0;\n        mid = mid + Math.imul(ah8, bl8) | 0;\n        hi = hi + Math.imul(ah8, bh8) | 0;\n        lo = lo + Math.imul(al7, bl9) | 0;\n        mid = mid + Math.imul(al7, bh9) | 0;\n        mid = mid + Math.imul(ah7, bl9) | 0;\n        hi = hi + Math.imul(ah7, bh9) | 0;\n        var w16 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w16 >>> 26) | 0;\n        w16 &= 67108863;\n        lo = Math.imul(al9, bl8);\n        mid = Math.imul(al9, bh8);\n        mid = mid + Math.imul(ah9, bl8) | 0;\n        hi = Math.imul(ah9, bh8);\n        lo = lo + Math.imul(al8, bl9) | 0;\n        mid = mid + Math.imul(al8, bh9) | 0;\n        mid = mid + Math.imul(ah8, bl9) | 0;\n        hi = hi + Math.imul(ah8, bh9) | 0;\n        var w17 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w17 >>> 26) | 0;\n        w17 &= 67108863;\n        lo = Math.imul(al9, bl9);\n        mid = Math.imul(al9, bh9);\n        mid = mid + Math.imul(ah9, bl9) | 0;\n        hi = Math.imul(ah9, bh9);\n        var w18 = (c + lo | 0) + ((mid & 8191) << 13) | 0;\n        c = (hi + (mid >>> 13) | 0) + (w18 >>> 26) | 0;\n        w18 &= 67108863;\n        o[0] = w0;\n        o[1] = w1;\n        o[2] = w2;\n        o[3] = w3;\n        o[4] = w4;\n        o[5] = w5;\n        o[6] = w6;\n        o[7] = w7;\n        o[8] = w8;\n        o[9] = w9;\n        o[10] = w10;\n        o[11] = w11;\n        o[12] = w12;\n        o[13] = w13;\n        o[14] = w14;\n        o[15] = w15;\n        o[16] = w16;\n        o[17] = w17;\n        o[18] = w18;\n        if (c !== 0) {\n          o[19] = c;\n          out.length++;\n        }\n        return out;\n      };\n      if (!Math.imul) {\n        comb10MulTo = smallMulTo;\n      }\n      function bigMulTo(self2, num, out) {\n        out.negative = num.negative ^ self2.negative;\n        out.length = self2.length + num.length;\n        var carry = 0;\n        var hncarry = 0;\n        for (var k = 0; k < out.length - 1; k++) {\n          var ncarry = hncarry;\n          hncarry = 0;\n          var rword = carry & 67108863;\n          var maxJ = Math.min(k, num.length - 1);\n          for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) {\n            var i = k - j;\n            var a = self2.words[i] | 0;\n            var b = num.words[j] | 0;\n            var r = a * b;\n            var lo = r & 67108863;\n            ncarry = ncarry + (r / 67108864 | 0) | 0;\n            lo = lo + rword | 0;\n            rword = lo & 67108863;\n            ncarry = ncarry + (lo >>> 26) | 0;\n            hncarry += ncarry >>> 26;\n            ncarry &= 67108863;\n          }\n          out.words[k] = rword;\n          carry = ncarry;\n          ncarry = hncarry;\n        }\n        if (carry !== 0) {\n          out.words[k] = carry;\n        } else {\n          out.length--;\n        }\n        return out.strip();\n      }\n      function jumboMulTo(self2, num, out) {\n        var fftm = new FFTM();\n        return fftm.mulp(self2, num, out);\n      }\n      BN.prototype.mulTo = function mulTo(num, out) {\n        var res;\n        var len = this.length + num.length;\n        if (this.length === 10 && num.length === 10) {\n          res = comb10MulTo(this, num, out);\n        } else if (len < 63) {\n          res = smallMulTo(this, num, out);\n        } else if (len < 1024) {\n          res = bigMulTo(this, num, out);\n        } else {\n          res = jumboMulTo(this, num, out);\n        }\n        return res;\n      };\n      function FFTM(x, y) {\n        this.x = x;\n        this.y = y;\n      }\n      FFTM.prototype.makeRBT = function makeRBT(N) {\n        var t = new Array(N);\n        var l = BN.prototype._countBits(N) - 1;\n        for (var i = 0; i < N; i++) {\n          t[i] = this.revBin(i, l, N);\n        }\n        return t;\n      };\n      FFTM.prototype.revBin = function revBin(x, l, N) {\n        if (x === 0 || x === N - 1) return x;\n        var rb = 0;\n        for (var i = 0; i < l; i++) {\n          rb |= (x & 1) << l - i - 1;\n          x >>= 1;\n        }\n        return rb;\n      };\n      FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) {\n        for (var i = 0; i < N; i++) {\n          rtws[i] = rws[rbt[i]];\n          itws[i] = iws[rbt[i]];\n        }\n      };\n      FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) {\n        this.permute(rbt, rws, iws, rtws, itws, N);\n        for (var s = 1; s < N; s <<= 1) {\n          var l = s << 1;\n          var rtwdf = Math.cos(2 * Math.PI / l);\n          var itwdf = Math.sin(2 * Math.PI / l);\n          for (var p = 0; p < N; p += l) {\n            var rtwdf_ = rtwdf;\n            var itwdf_ = itwdf;\n            for (var j = 0; j < s; j++) {\n              var re = rtws[p + j];\n              var ie = itws[p + j];\n              var ro = rtws[p + j + s];\n              var io = itws[p + j + s];\n              var rx = rtwdf_ * ro - itwdf_ * io;\n              io = rtwdf_ * io + itwdf_ * ro;\n              ro = rx;\n              rtws[p + j] = re + ro;\n              itws[p + j] = ie + io;\n              rtws[p + j + s] = re - ro;\n              itws[p + j + s] = ie - io;\n              if (j !== l) {\n                rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n                itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n                rtwdf_ = rx;\n              }\n            }\n          }\n        }\n      };\n      FFTM.prototype.guessLen13b = function guessLen13b(n, m) {\n        var N = Math.max(m, n) | 1;\n        var odd = N & 1;\n        var i = 0;\n        for (N = N / 2 | 0; N; N = N >>> 1) {\n          i++;\n        }\n        return 1 << i + 1 + odd;\n      };\n      FFTM.prototype.conjugate = function conjugate(rws, iws, N) {\n        if (N <= 1) return;\n        for (var i = 0; i < N / 2; i++) {\n          var t = rws[i];\n          rws[i] = rws[N - i - 1];\n          rws[N - i - 1] = t;\n          t = iws[i];\n          iws[i] = -iws[N - i - 1];\n          iws[N - i - 1] = -t;\n        }\n      };\n      FFTM.prototype.normalize13b = function normalize13b(ws, N) {\n        var carry = 0;\n        for (var i = 0; i < N / 2; i++) {\n          var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry;\n          ws[i] = w & 67108863;\n          if (w < 67108864) {\n            carry = 0;\n          } else {\n            carry = w / 67108864 | 0;\n          }\n        }\n        return ws;\n      };\n      FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) {\n        var carry = 0;\n        for (var i = 0; i < len; i++) {\n          carry = carry + (ws[i] | 0);\n          rws[2 * i] = carry & 8191;\n          carry = carry >>> 13;\n          rws[2 * i + 1] = carry & 8191;\n          carry = carry >>> 13;\n        }\n        for (i = 2 * len; i < N; ++i) {\n          rws[i] = 0;\n        }\n        assert(carry === 0);\n        assert((carry & ~8191) === 0);\n      };\n      FFTM.prototype.stub = function stub(N) {\n        var ph = new Array(N);\n        for (var i = 0; i < N; i++) {\n          ph[i] = 0;\n        }\n        return ph;\n      };\n      FFTM.prototype.mulp = function mulp(x, y, out) {\n        var N = 2 * this.guessLen13b(x.length, y.length);\n        var rbt = this.makeRBT(N);\n        var _ = this.stub(N);\n        var rws = new Array(N);\n        var rwst = new Array(N);\n        var iwst = new Array(N);\n        var nrws = new Array(N);\n        var nrwst = new Array(N);\n        var niwst = new Array(N);\n        var rmws = out.words;\n        rmws.length = N;\n        this.convert13b(x.words, x.length, rws, N);\n        this.convert13b(y.words, y.length, nrws, N);\n        this.transform(rws, _, rwst, iwst, N, rbt);\n        this.transform(nrws, _, nrwst, niwst, N, rbt);\n        for (var i = 0; i < N; i++) {\n          var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n          iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n          rwst[i] = rx;\n        }\n        this.conjugate(rwst, iwst, N);\n        this.transform(rwst, iwst, rmws, _, N, rbt);\n        this.conjugate(rmws, _, N);\n        this.normalize13b(rmws, N);\n        out.negative = x.negative ^ y.negative;\n        out.length = x.length + y.length;\n        return out.strip();\n      };\n      BN.prototype.mul = function mul(num) {\n        var out = new BN(null);\n        out.words = new Array(this.length + num.length);\n        return this.mulTo(num, out);\n      };\n      BN.prototype.mulf = function mulf(num) {\n        var out = new BN(null);\n        out.words = new Array(this.length + num.length);\n        return jumboMulTo(this, num, out);\n      };\n      BN.prototype.imul = function imul(num) {\n        return this.clone().mulTo(num, this);\n      };\n      BN.prototype.imuln = function imuln(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        var carry = 0;\n        for (var i = 0; i < this.length; i++) {\n          var w = (this.words[i] | 0) * num;\n          var lo = (w & 67108863) + (carry & 67108863);\n          carry >>= 26;\n          carry += w / 67108864 | 0;\n          carry += lo >>> 26;\n          this.words[i] = lo & 67108863;\n        }\n        if (carry !== 0) {\n          this.words[i] = carry;\n          this.length++;\n        }\n        return this;\n      };\n      BN.prototype.muln = function muln(num) {\n        return this.clone().imuln(num);\n      };\n      BN.prototype.sqr = function sqr() {\n        return this.mul(this);\n      };\n      BN.prototype.isqr = function isqr() {\n        return this.imul(this.clone());\n      };\n      BN.prototype.pow = function pow(num) {\n        var w = toBitArray(num);\n        if (w.length === 0) return new BN(1);\n        var res = this;\n        for (var i = 0; i < w.length; i++, res = res.sqr()) {\n          if (w[i] !== 0) break;\n        }\n        if (++i < w.length) {\n          for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n            if (w[i] === 0) continue;\n            res = res.mul(q);\n          }\n        }\n        return res;\n      };\n      BN.prototype.iushln = function iushln(bits) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var r = bits % 26;\n        var s = (bits - r) / 26;\n        var carryMask = 67108863 >>> 26 - r << 26 - r;\n        var i;\n        if (r !== 0) {\n          var carry = 0;\n          for (i = 0; i < this.length; i++) {\n            var newCarry = this.words[i] & carryMask;\n            var c = (this.words[i] | 0) - newCarry << r;\n            this.words[i] = c | carry;\n            carry = newCarry >>> 26 - r;\n          }\n          if (carry) {\n            this.words[i] = carry;\n            this.length++;\n          }\n        }\n        if (s !== 0) {\n          for (i = this.length - 1; i >= 0; i--) {\n            this.words[i + s] = this.words[i];\n          }\n          for (i = 0; i < s; i++) {\n            this.words[i] = 0;\n          }\n          this.length += s;\n        }\n        return this.strip();\n      };\n      BN.prototype.ishln = function ishln(bits) {\n        assert(this.negative === 0);\n        return this.iushln(bits);\n      };\n      BN.prototype.iushrn = function iushrn(bits, hint, extended) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var h;\n        if (hint) {\n          h = (hint - hint % 26) / 26;\n        } else {\n          h = 0;\n        }\n        var r = bits % 26;\n        var s = Math.min((bits - r) / 26, this.length);\n        var mask = 67108863 ^ 67108863 >>> r << r;\n        var maskedWords = extended;\n        h -= s;\n        h = Math.max(0, h);\n        if (maskedWords) {\n          for (var i = 0; i < s; i++) {\n            maskedWords.words[i] = this.words[i];\n          }\n          maskedWords.length = s;\n        }\n        if (s === 0) {\n        } else if (this.length > s) {\n          this.length -= s;\n          for (i = 0; i < this.length; i++) {\n            this.words[i] = this.words[i + s];\n          }\n        } else {\n          this.words[0] = 0;\n          this.length = 1;\n        }\n        var carry = 0;\n        for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n          var word = this.words[i] | 0;\n          this.words[i] = carry << 26 - r | word >>> r;\n          carry = word & mask;\n        }\n        if (maskedWords && carry !== 0) {\n          maskedWords.words[maskedWords.length++] = carry;\n        }\n        if (this.length === 0) {\n          this.words[0] = 0;\n          this.length = 1;\n        }\n        return this.strip();\n      };\n      BN.prototype.ishrn = function ishrn(bits, hint, extended) {\n        assert(this.negative === 0);\n        return this.iushrn(bits, hint, extended);\n      };\n      BN.prototype.shln = function shln(bits) {\n        return this.clone().ishln(bits);\n      };\n      BN.prototype.ushln = function ushln(bits) {\n        return this.clone().iushln(bits);\n      };\n      BN.prototype.shrn = function shrn(bits) {\n        return this.clone().ishrn(bits);\n      };\n      BN.prototype.ushrn = function ushrn(bits) {\n        return this.clone().iushrn(bits);\n      };\n      BN.prototype.testn = function testn(bit) {\n        assert(typeof bit === \"number\" && bit >= 0);\n        var r = bit % 26;\n        var s = (bit - r) / 26;\n        var q = 1 << r;\n        if (this.length <= s) return false;\n        var w = this.words[s];\n        return !!(w & q);\n      };\n      BN.prototype.imaskn = function imaskn(bits) {\n        assert(typeof bits === \"number\" && bits >= 0);\n        var r = bits % 26;\n        var s = (bits - r) / 26;\n        assert(this.negative === 0, \"imaskn works only with positive numbers\");\n        if (this.length <= s) {\n          return this;\n        }\n        if (r !== 0) {\n          s++;\n        }\n        this.length = Math.min(s, this.length);\n        if (r !== 0) {\n          var mask = 67108863 ^ 67108863 >>> r << r;\n          this.words[this.length - 1] &= mask;\n        }\n        return this.strip();\n      };\n      BN.prototype.maskn = function maskn(bits) {\n        return this.clone().imaskn(bits);\n      };\n      BN.prototype.iaddn = function iaddn(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        if (num < 0) return this.isubn(-num);\n        if (this.negative !== 0) {\n          if (this.length === 1 && (this.words[0] | 0) < num) {\n            this.words[0] = num - (this.words[0] | 0);\n            this.negative = 0;\n            return this;\n          }\n          this.negative = 0;\n          this.isubn(num);\n          this.negative = 1;\n          return this;\n        }\n        return this._iaddn(num);\n      };\n      BN.prototype._iaddn = function _iaddn(num) {\n        this.words[0] += num;\n        for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) {\n          this.words[i] -= 67108864;\n          if (i === this.length - 1) {\n            this.words[i + 1] = 1;\n          } else {\n            this.words[i + 1]++;\n          }\n        }\n        this.length = Math.max(this.length, i + 1);\n        return this;\n      };\n      BN.prototype.isubn = function isubn(num) {\n        assert(typeof num === \"number\");\n        assert(num < 67108864);\n        if (num < 0) return this.iaddn(-num);\n        if (this.negative !== 0) {\n          this.negative = 0;\n          this.iaddn(num);\n          this.negative = 1;\n          return this;\n        }\n        this.words[0] -= num;\n        if (this.length === 1 && this.words[0] < 0) {\n          this.words[0] = -this.words[0];\n          this.negative = 1;\n        } else {\n          for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n            this.words[i] += 67108864;\n            this.words[i + 1] -= 1;\n          }\n        }\n        return this.strip();\n      };\n      BN.prototype.addn = function addn(num) {\n        return this.clone().iaddn(num);\n      };\n      BN.prototype.subn = function subn(num) {\n        return this.clone().isubn(num);\n      };\n      BN.prototype.iabs = function iabs() {\n        this.negative = 0;\n        return this;\n      };\n      BN.prototype.abs = function abs() {\n        return this.clone().iabs();\n      };\n      BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) {\n        var len = num.length + shift;\n        var i;\n        this._expand(len);\n        var w;\n        var carry = 0;\n        for (i = 0; i < num.length; i++) {\n          w = (this.words[i + shift] | 0) + carry;\n          var right = (num.words[i] | 0) * mul;\n          w -= right & 67108863;\n          carry = (w >> 26) - (right / 67108864 | 0);\n          this.words[i + shift] = w & 67108863;\n        }\n        for (; i < this.length - shift; i++) {\n          w = (this.words[i + shift] | 0) + carry;\n          carry = w >> 26;\n          this.words[i + shift] = w & 67108863;\n        }\n        if (carry === 0) return this.strip();\n        assert(carry === -1);\n        carry = 0;\n        for (i = 0; i < this.length; i++) {\n          w = -(this.words[i] | 0) + carry;\n          carry = w >> 26;\n          this.words[i] = w & 67108863;\n        }\n        this.negative = 1;\n        return this.strip();\n      };\n      BN.prototype._wordDiv = function _wordDiv(num, mode) {\n        var shift = this.length - num.length;\n        var a = this.clone();\n        var b = num;\n        var bhi = b.words[b.length - 1] | 0;\n        var bhiBits = this._countBits(bhi);\n        shift = 26 - bhiBits;\n        if (shift !== 0) {\n          b = b.ushln(shift);\n          a.iushln(shift);\n          bhi = b.words[b.length - 1] | 0;\n        }\n        var m = a.length - b.length;\n        var q;\n        if (mode !== \"mod\") {\n          q = new BN(null);\n          q.length = m + 1;\n          q.words = new Array(q.length);\n          for (var i = 0; i < q.length; i++) {\n            q.words[i] = 0;\n          }\n        }\n        var diff = a.clone()._ishlnsubmul(b, 1, m);\n        if (diff.negative === 0) {\n          a = diff;\n          if (q) {\n            q.words[m] = 1;\n          }\n        }\n        for (var j = m - 1; j >= 0; j--) {\n          var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0);\n          qj = Math.min(qj / bhi | 0, 67108863);\n          a._ishlnsubmul(b, qj, j);\n          while (a.negative !== 0) {\n            qj--;\n            a.negative = 0;\n            a._ishlnsubmul(b, 1, j);\n            if (!a.isZero()) {\n              a.negative ^= 1;\n            }\n          }\n          if (q) {\n            q.words[j] = qj;\n          }\n        }\n        if (q) {\n          q.strip();\n        }\n        a.strip();\n        if (mode !== \"div\" && shift !== 0) {\n          a.iushrn(shift);\n        }\n        return {\n          div: q || null,\n          mod: a\n        };\n      };\n      BN.prototype.divmod = function divmod(num, mode, positive) {\n        assert(!num.isZero());\n        if (this.isZero()) {\n          return {\n            div: new BN(0),\n            mod: new BN(0)\n          };\n        }\n        var div, mod, res;\n        if (this.negative !== 0 && num.negative === 0) {\n          res = this.neg().divmod(num, mode);\n          if (mode !== \"mod\") {\n            div = res.div.neg();\n          }\n          if (mode !== \"div\") {\n            mod = res.mod.neg();\n            if (positive && mod.negative !== 0) {\n              mod.iadd(num);\n            }\n          }\n          return {\n            div,\n            mod\n          };\n        }\n        if (this.negative === 0 && num.negative !== 0) {\n          res = this.divmod(num.neg(), mode);\n          if (mode !== \"mod\") {\n            div = res.div.neg();\n          }\n          return {\n            div,\n            mod: res.mod\n          };\n        }\n        if ((this.negative & num.negative) !== 0) {\n          res = this.neg().divmod(num.neg(), mode);\n          if (mode !== \"div\") {\n            mod = res.mod.neg();\n            if (positive && mod.negative !== 0) {\n              mod.isub(num);\n            }\n          }\n          return {\n            div: res.div,\n            mod\n          };\n        }\n        if (num.length > this.length || this.cmp(num) < 0) {\n          return {\n            div: new BN(0),\n            mod: this\n          };\n        }\n        if (num.length === 1) {\n          if (mode === \"div\") {\n            return {\n              div: this.divn(num.words[0]),\n              mod: null\n            };\n          }\n          if (mode === \"mod\") {\n            return {\n              div: null,\n              mod: new BN(this.modn(num.words[0]))\n            };\n          }\n          return {\n            div: this.divn(num.words[0]),\n            mod: new BN(this.modn(num.words[0]))\n          };\n        }\n        return this._wordDiv(num, mode);\n      };\n      BN.prototype.div = function div(num) {\n        return this.divmod(num, \"div\", false).div;\n      };\n      BN.prototype.mod = function mod(num) {\n        return this.divmod(num, \"mod\", false).mod;\n      };\n      BN.prototype.umod = function umod(num) {\n        return this.divmod(num, \"mod\", true).mod;\n      };\n      BN.prototype.divRound = function divRound(num) {\n        var dm = this.divmod(num);\n        if (dm.mod.isZero()) return dm.div;\n        var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n        var half = num.ushrn(1);\n        var r2 = num.andln(1);\n        var cmp = mod.cmp(half);\n        if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n        return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n      };\n      BN.prototype.modn = function modn(num) {\n        assert(num <= 67108863);\n        var p = (1 << 26) % num;\n        var acc = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          acc = (p * acc + (this.words[i] | 0)) % num;\n        }\n        return acc;\n      };\n      BN.prototype.idivn = function idivn(num) {\n        assert(num <= 67108863);\n        var carry = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          var w = (this.words[i] | 0) + carry * 67108864;\n          this.words[i] = w / num | 0;\n          carry = w % num;\n        }\n        return this.strip();\n      };\n      BN.prototype.divn = function divn(num) {\n        return this.clone().idivn(num);\n      };\n      BN.prototype.egcd = function egcd(p) {\n        assert(p.negative === 0);\n        assert(!p.isZero());\n        var x = this;\n        var y = p.clone();\n        if (x.negative !== 0) {\n          x = x.umod(p);\n        } else {\n          x = x.clone();\n        }\n        var A = new BN(1);\n        var B = new BN(0);\n        var C = new BN(0);\n        var D = new BN(1);\n        var g = 0;\n        while (x.isEven() && y.isEven()) {\n          x.iushrn(1);\n          y.iushrn(1);\n          ++g;\n        }\n        var yp = y.clone();\n        var xp = x.clone();\n        while (!x.isZero()) {\n          for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ;\n          if (i > 0) {\n            x.iushrn(i);\n            while (i-- > 0) {\n              if (A.isOdd() || B.isOdd()) {\n                A.iadd(yp);\n                B.isub(xp);\n              }\n              A.iushrn(1);\n              B.iushrn(1);\n            }\n          }\n          for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ;\n          if (j > 0) {\n            y.iushrn(j);\n            while (j-- > 0) {\n              if (C.isOdd() || D.isOdd()) {\n                C.iadd(yp);\n                D.isub(xp);\n              }\n              C.iushrn(1);\n              D.iushrn(1);\n            }\n          }\n          if (x.cmp(y) >= 0) {\n            x.isub(y);\n            A.isub(C);\n            B.isub(D);\n          } else {\n            y.isub(x);\n            C.isub(A);\n            D.isub(B);\n          }\n        }\n        return {\n          a: C,\n          b: D,\n          gcd: y.iushln(g)\n        };\n      };\n      BN.prototype._invmp = function _invmp(p) {\n        assert(p.negative === 0);\n        assert(!p.isZero());\n        var a = this;\n        var b = p.clone();\n        if (a.negative !== 0) {\n          a = a.umod(p);\n        } else {\n          a = a.clone();\n        }\n        var x1 = new BN(1);\n        var x2 = new BN(0);\n        var delta = b.clone();\n        while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n          for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1) ;\n          if (i > 0) {\n            a.iushrn(i);\n            while (i-- > 0) {\n              if (x1.isOdd()) {\n                x1.iadd(delta);\n              }\n              x1.iushrn(1);\n            }\n          }\n          for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1) ;\n          if (j > 0) {\n            b.iushrn(j);\n            while (j-- > 0) {\n              if (x2.isOdd()) {\n                x2.iadd(delta);\n              }\n              x2.iushrn(1);\n            }\n          }\n          if (a.cmp(b) >= 0) {\n            a.isub(b);\n            x1.isub(x2);\n          } else {\n            b.isub(a);\n            x2.isub(x1);\n          }\n        }\n        var res;\n        if (a.cmpn(1) === 0) {\n          res = x1;\n        } else {\n          res = x2;\n        }\n        if (res.cmpn(0) < 0) {\n          res.iadd(p);\n        }\n        return res;\n      };\n      BN.prototype.gcd = function gcd(num) {\n        if (this.isZero()) return num.abs();\n        if (num.isZero()) return this.abs();\n        var a = this.clone();\n        var b = num.clone();\n        a.negative = 0;\n        b.negative = 0;\n        for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n          a.iushrn(1);\n          b.iushrn(1);\n        }\n        do {\n          while (a.isEven()) {\n            a.iushrn(1);\n          }\n          while (b.isEven()) {\n            b.iushrn(1);\n          }\n          var r = a.cmp(b);\n          if (r < 0) {\n            var t = a;\n            a = b;\n            b = t;\n          } else if (r === 0 || b.cmpn(1) === 0) {\n            break;\n          }\n          a.isub(b);\n        } while (true);\n        return b.iushln(shift);\n      };\n      BN.prototype.invm = function invm(num) {\n        return this.egcd(num).a.umod(num);\n      };\n      BN.prototype.isEven = function isEven() {\n        return (this.words[0] & 1) === 0;\n      };\n      BN.prototype.isOdd = function isOdd() {\n        return (this.words[0] & 1) === 1;\n      };\n      BN.prototype.andln = function andln(num) {\n        return this.words[0] & num;\n      };\n      BN.prototype.bincn = function bincn(bit) {\n        assert(typeof bit === \"number\");\n        var r = bit % 26;\n        var s = (bit - r) / 26;\n        var q = 1 << r;\n        if (this.length <= s) {\n          this._expand(s + 1);\n          this.words[s] |= q;\n          return this;\n        }\n        var carry = q;\n        for (var i = s; carry !== 0 && i < this.length; i++) {\n          var w = this.words[i] | 0;\n          w += carry;\n          carry = w >>> 26;\n          w &= 67108863;\n          this.words[i] = w;\n        }\n        if (carry !== 0) {\n          this.words[i] = carry;\n          this.length++;\n        }\n        return this;\n      };\n      BN.prototype.isZero = function isZero() {\n        return this.length === 1 && this.words[0] === 0;\n      };\n      BN.prototype.cmpn = function cmpn(num) {\n        var negative = num < 0;\n        if (this.negative !== 0 && !negative) return -1;\n        if (this.negative === 0 && negative) return 1;\n        this.strip();\n        var res;\n        if (this.length > 1) {\n          res = 1;\n        } else {\n          if (negative) {\n            num = -num;\n          }\n          assert(num <= 67108863, \"Number is too big\");\n          var w = this.words[0] | 0;\n          res = w === num ? 0 : w < num ? -1 : 1;\n        }\n        if (this.negative !== 0) return -res | 0;\n        return res;\n      };\n      BN.prototype.cmp = function cmp(num) {\n        if (this.negative !== 0 && num.negative === 0) return -1;\n        if (this.negative === 0 && num.negative !== 0) return 1;\n        var res = this.ucmp(num);\n        if (this.negative !== 0) return -res | 0;\n        return res;\n      };\n      BN.prototype.ucmp = function ucmp(num) {\n        if (this.length > num.length) return 1;\n        if (this.length < num.length) return -1;\n        var res = 0;\n        for (var i = this.length - 1; i >= 0; i--) {\n          var a = this.words[i] | 0;\n          var b = num.words[i] | 0;\n          if (a === b) continue;\n          if (a < b) {\n            res = -1;\n          } else if (a > b) {\n            res = 1;\n          }\n          break;\n        }\n        return res;\n      };\n      BN.prototype.gtn = function gtn(num) {\n        return this.cmpn(num) === 1;\n      };\n      BN.prototype.gt = function gt(num) {\n        return this.cmp(num) === 1;\n      };\n      BN.prototype.gten = function gten(num) {\n        return this.cmpn(num) >= 0;\n      };\n      BN.prototype.gte = function gte(num) {\n        return this.cmp(num) >= 0;\n      };\n      BN.prototype.ltn = function ltn(num) {\n        return this.cmpn(num) === -1;\n      };\n      BN.prototype.lt = function lt(num) {\n        return this.cmp(num) === -1;\n      };\n      BN.prototype.lten = function lten(num) {\n        return this.cmpn(num) <= 0;\n      };\n      BN.prototype.lte = function lte(num) {\n        return this.cmp(num) <= 0;\n      };\n      BN.prototype.eqn = function eqn(num) {\n        return this.cmpn(num) === 0;\n      };\n      BN.prototype.eq = function eq(num) {\n        return this.cmp(num) === 0;\n      };\n      BN.red = function red(num) {\n        return new Red(num);\n      };\n      BN.prototype.toRed = function toRed(ctx) {\n        assert(!this.red, \"Already a number in reduction context\");\n        assert(this.negative === 0, \"red works only with positives\");\n        return ctx.convertTo(this)._forceRed(ctx);\n      };\n      BN.prototype.fromRed = function fromRed() {\n        assert(this.red, \"fromRed works only with numbers in reduction context\");\n        return this.red.convertFrom(this);\n      };\n      BN.prototype._forceRed = function _forceRed(ctx) {\n        this.red = ctx;\n        return this;\n      };\n      BN.prototype.forceRed = function forceRed(ctx) {\n        assert(!this.red, \"Already a number in reduction context\");\n        return this._forceRed(ctx);\n      };\n      BN.prototype.redAdd = function redAdd(num) {\n        assert(this.red, \"redAdd works only with red numbers\");\n        return this.red.add(this, num);\n      };\n      BN.prototype.redIAdd = function redIAdd(num) {\n        assert(this.red, \"redIAdd works only with red numbers\");\n        return this.red.iadd(this, num);\n      };\n      BN.prototype.redSub = function redSub(num) {\n        assert(this.red, \"redSub works only with red numbers\");\n        return this.red.sub(this, num);\n      };\n      BN.prototype.redISub = function redISub(num) {\n        assert(this.red, \"redISub works only with red numbers\");\n        return this.red.isub(this, num);\n      };\n      BN.prototype.redShl = function redShl(num) {\n        assert(this.red, \"redShl works only with red numbers\");\n        return this.red.shl(this, num);\n      };\n      BN.prototype.redMul = function redMul(num) {\n        assert(this.red, \"redMul works only with red numbers\");\n        this.red._verify2(this, num);\n        return this.red.mul(this, num);\n      };\n      BN.prototype.redIMul = function redIMul(num) {\n        assert(this.red, \"redMul works only with red numbers\");\n        this.red._verify2(this, num);\n        return this.red.imul(this, num);\n      };\n      BN.prototype.redSqr = function redSqr() {\n        assert(this.red, \"redSqr works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.sqr(this);\n      };\n      BN.prototype.redISqr = function redISqr() {\n        assert(this.red, \"redISqr works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.isqr(this);\n      };\n      BN.prototype.redSqrt = function redSqrt() {\n        assert(this.red, \"redSqrt works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.sqrt(this);\n      };\n      BN.prototype.redInvm = function redInvm() {\n        assert(this.red, \"redInvm works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.invm(this);\n      };\n      BN.prototype.redNeg = function redNeg() {\n        assert(this.red, \"redNeg works only with red numbers\");\n        this.red._verify1(this);\n        return this.red.neg(this);\n      };\n      BN.prototype.redPow = function redPow(num) {\n        assert(this.red && !num.red, \"redPow(normalNum)\");\n        this.red._verify1(this);\n        return this.red.pow(this, num);\n      };\n      var primes = {\n        k256: null,\n        p224: null,\n        p192: null,\n        p25519: null\n      };\n      function MPrime(name2, p) {\n        this.name = name2;\n        this.p = new BN(p, 16);\n        this.n = this.p.bitLength();\n        this.k = new BN(1).iushln(this.n).isub(this.p);\n        this.tmp = this._tmp();\n      }\n      MPrime.prototype._tmp = function _tmp() {\n        var tmp = new BN(null);\n        tmp.words = new Array(Math.ceil(this.n / 13));\n        return tmp;\n      };\n      MPrime.prototype.ireduce = function ireduce(num) {\n        var r = num;\n        var rlen;\n        do {\n          this.split(r, this.tmp);\n          r = this.imulK(r);\n          r = r.iadd(this.tmp);\n          rlen = r.bitLength();\n        } while (rlen > this.n);\n        var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n        if (cmp === 0) {\n          r.words[0] = 0;\n          r.length = 1;\n        } else if (cmp > 0) {\n          r.isub(this.p);\n        } else {\n          if (r.strip !== void 0) {\n            r.strip();\n          } else {\n            r._strip();\n          }\n        }\n        return r;\n      };\n      MPrime.prototype.split = function split(input, out) {\n        input.iushrn(this.n, 0, out);\n      };\n      MPrime.prototype.imulK = function imulK(num) {\n        return num.imul(this.k);\n      };\n      function K256() {\n        MPrime.call(\n          this,\n          \"k256\",\n          \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\"\n        );\n      }\n      inherits(K256, MPrime);\n      K256.prototype.split = function split(input, output) {\n        var mask = 4194303;\n        var outLen = Math.min(input.length, 9);\n        for (var i = 0; i < outLen; i++) {\n          output.words[i] = input.words[i];\n        }\n        output.length = outLen;\n        if (input.length <= 9) {\n          input.words[0] = 0;\n          input.length = 1;\n          return;\n        }\n        var prev = input.words[9];\n        output.words[output.length++] = prev & mask;\n        for (i = 10; i < input.length; i++) {\n          var next = input.words[i] | 0;\n          input.words[i - 10] = (next & mask) << 4 | prev >>> 22;\n          prev = next;\n        }\n        prev >>>= 22;\n        input.words[i - 10] = prev;\n        if (prev === 0 && input.length > 10) {\n          input.length -= 10;\n        } else {\n          input.length -= 9;\n        }\n      };\n      K256.prototype.imulK = function imulK(num) {\n        num.words[num.length] = 0;\n        num.words[num.length + 1] = 0;\n        num.length += 2;\n        var lo = 0;\n        for (var i = 0; i < num.length; i++) {\n          var w = num.words[i] | 0;\n          lo += w * 977;\n          num.words[i] = lo & 67108863;\n          lo = w * 64 + (lo / 67108864 | 0);\n        }\n        if (num.words[num.length - 1] === 0) {\n          num.length--;\n          if (num.words[num.length - 1] === 0) {\n            num.length--;\n          }\n        }\n        return num;\n      };\n      function P224() {\n        MPrime.call(\n          this,\n          \"p224\",\n          \"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\"\n        );\n      }\n      inherits(P224, MPrime);\n      function P192() {\n        MPrime.call(\n          this,\n          \"p192\",\n          \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\"\n        );\n      }\n      inherits(P192, MPrime);\n      function P25519() {\n        MPrime.call(\n          this,\n          \"25519\",\n          \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\"\n        );\n      }\n      inherits(P25519, MPrime);\n      P25519.prototype.imulK = function imulK(num) {\n        var carry = 0;\n        for (var i = 0; i < num.length; i++) {\n          var hi = (num.words[i] | 0) * 19 + carry;\n          var lo = hi & 67108863;\n          hi >>>= 26;\n          num.words[i] = lo;\n          carry = hi;\n        }\n        if (carry !== 0) {\n          num.words[num.length++] = carry;\n        }\n        return num;\n      };\n      BN._prime = function prime(name2) {\n        if (primes[name2]) return primes[name2];\n        var prime2;\n        if (name2 === \"k256\") {\n          prime2 = new K256();\n        } else if (name2 === \"p224\") {\n          prime2 = new P224();\n        } else if (name2 === \"p192\") {\n          prime2 = new P192();\n        } else if (name2 === \"p25519\") {\n          prime2 = new P25519();\n        } else {\n          throw new Error(\"Unknown prime \" + name2);\n        }\n        primes[name2] = prime2;\n        return prime2;\n      };\n      function Red(m) {\n        if (typeof m === \"string\") {\n          var prime = BN._prime(m);\n          this.m = prime.p;\n          this.prime = prime;\n        } else {\n          assert(m.gtn(1), \"modulus must be greater than 1\");\n          this.m = m;\n          this.prime = null;\n        }\n      }\n      Red.prototype._verify1 = function _verify1(a) {\n        assert(a.negative === 0, \"red works only with positives\");\n        assert(a.red, \"red works only with red numbers\");\n      };\n      Red.prototype._verify2 = function _verify2(a, b) {\n        assert((a.negative | b.negative) === 0, \"red works only with positives\");\n        assert(\n          a.red && a.red === b.red,\n          \"red works only with red numbers\"\n        );\n      };\n      Red.prototype.imod = function imod(a) {\n        if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n        return a.umod(this.m)._forceRed(this);\n      };\n      Red.prototype.neg = function neg(a) {\n        if (a.isZero()) {\n          return a.clone();\n        }\n        return this.m.sub(a)._forceRed(this);\n      };\n      Red.prototype.add = function add(a, b) {\n        this._verify2(a, b);\n        var res = a.add(b);\n        if (res.cmp(this.m) >= 0) {\n          res.isub(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Red.prototype.iadd = function iadd(a, b) {\n        this._verify2(a, b);\n        var res = a.iadd(b);\n        if (res.cmp(this.m) >= 0) {\n          res.isub(this.m);\n        }\n        return res;\n      };\n      Red.prototype.sub = function sub(a, b) {\n        this._verify2(a, b);\n        var res = a.sub(b);\n        if (res.cmpn(0) < 0) {\n          res.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Red.prototype.isub = function isub(a, b) {\n        this._verify2(a, b);\n        var res = a.isub(b);\n        if (res.cmpn(0) < 0) {\n          res.iadd(this.m);\n        }\n        return res;\n      };\n      Red.prototype.shl = function shl(a, num) {\n        this._verify1(a);\n        return this.imod(a.ushln(num));\n      };\n      Red.prototype.imul = function imul(a, b) {\n        this._verify2(a, b);\n        return this.imod(a.imul(b));\n      };\n      Red.prototype.mul = function mul(a, b) {\n        this._verify2(a, b);\n        return this.imod(a.mul(b));\n      };\n      Red.prototype.isqr = function isqr(a) {\n        return this.imul(a, a.clone());\n      };\n      Red.prototype.sqr = function sqr(a) {\n        return this.mul(a, a);\n      };\n      Red.prototype.sqrt = function sqrt(a) {\n        if (a.isZero()) return a.clone();\n        var mod3 = this.m.andln(3);\n        assert(mod3 % 2 === 1);\n        if (mod3 === 3) {\n          var pow = this.m.add(new BN(1)).iushrn(2);\n          return this.pow(a, pow);\n        }\n        var q = this.m.subn(1);\n        var s = 0;\n        while (!q.isZero() && q.andln(1) === 0) {\n          s++;\n          q.iushrn(1);\n        }\n        assert(!q.isZero());\n        var one = new BN(1).toRed(this);\n        var nOne = one.redNeg();\n        var lpow = this.m.subn(1).iushrn(1);\n        var z = this.m.bitLength();\n        z = new BN(2 * z * z).toRed(this);\n        while (this.pow(z, lpow).cmp(nOne) !== 0) {\n          z.redIAdd(nOne);\n        }\n        var c = this.pow(z, q);\n        var r = this.pow(a, q.addn(1).iushrn(1));\n        var t = this.pow(a, q);\n        var m = s;\n        while (t.cmp(one) !== 0) {\n          var tmp = t;\n          for (var i = 0; tmp.cmp(one) !== 0; i++) {\n            tmp = tmp.redSqr();\n          }\n          assert(i < m);\n          var b = this.pow(c, new BN(1).iushln(m - i - 1));\n          r = r.redMul(b);\n          c = b.redSqr();\n          t = t.redMul(c);\n          m = i;\n        }\n        return r;\n      };\n      Red.prototype.invm = function invm(a) {\n        var inv = a._invmp(this.m);\n        if (inv.negative !== 0) {\n          inv.negative = 0;\n          return this.imod(inv).redNeg();\n        } else {\n          return this.imod(inv);\n        }\n      };\n      Red.prototype.pow = function pow(a, num) {\n        if (num.isZero()) return new BN(1).toRed(this);\n        if (num.cmpn(1) === 0) return a.clone();\n        var windowSize = 4;\n        var wnd = new Array(1 << windowSize);\n        wnd[0] = new BN(1).toRed(this);\n        wnd[1] = a;\n        for (var i = 2; i < wnd.length; i++) {\n          wnd[i] = this.mul(wnd[i - 1], a);\n        }\n        var res = wnd[0];\n        var current = 0;\n        var currentLen = 0;\n        var start = num.bitLength() % 26;\n        if (start === 0) {\n          start = 26;\n        }\n        for (i = num.length - 1; i >= 0; i--) {\n          var word = num.words[i];\n          for (var j = start - 1; j >= 0; j--) {\n            var bit = word >> j & 1;\n            if (res !== wnd[0]) {\n              res = this.sqr(res);\n            }\n            if (bit === 0 && current === 0) {\n              currentLen = 0;\n              continue;\n            }\n            current <<= 1;\n            current |= bit;\n            currentLen++;\n            if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n            res = this.mul(res, wnd[current]);\n            currentLen = 0;\n            current = 0;\n          }\n          start = 26;\n        }\n        return res;\n      };\n      Red.prototype.convertTo = function convertTo(num) {\n        var r = num.umod(this.m);\n        return r === num ? r.clone() : r;\n      };\n      Red.prototype.convertFrom = function convertFrom(num) {\n        var res = num.clone();\n        res.red = null;\n        return res;\n      };\n      BN.mont = function mont(num) {\n        return new Mont(num);\n      };\n      function Mont(m) {\n        Red.call(this, m);\n        this.shift = this.m.bitLength();\n        if (this.shift % 26 !== 0) {\n          this.shift += 26 - this.shift % 26;\n        }\n        this.r = new BN(1).iushln(this.shift);\n        this.r2 = this.imod(this.r.sqr());\n        this.rinv = this.r._invmp(this.m);\n        this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n        this.minv = this.minv.umod(this.r);\n        this.minv = this.r.sub(this.minv);\n      }\n      inherits(Mont, Red);\n      Mont.prototype.convertTo = function convertTo(num) {\n        return this.imod(num.ushln(this.shift));\n      };\n      Mont.prototype.convertFrom = function convertFrom(num) {\n        var r = this.imod(num.mul(this.rinv));\n        r.red = null;\n        return r;\n      };\n      Mont.prototype.imul = function imul(a, b) {\n        if (a.isZero() || b.isZero()) {\n          a.words[0] = 0;\n          a.length = 1;\n          return a;\n        }\n        var t = a.imul(b);\n        var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n        var u = t.isub(c).iushrn(this.shift);\n        var res = u;\n        if (u.cmp(this.m) >= 0) {\n          res = u.isub(this.m);\n        } else if (u.cmpn(0) < 0) {\n          res = u.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Mont.prototype.mul = function mul(a, b) {\n        if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n        var t = a.mul(b);\n        var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n        var u = t.isub(c).iushrn(this.shift);\n        var res = u;\n        if (u.cmp(this.m) >= 0) {\n          res = u.isub(this.m);\n        } else if (u.cmpn(0) < 0) {\n          res = u.iadd(this.m);\n        }\n        return res._forceRed(this);\n      };\n      Mont.prototype.invm = function invm(a) {\n        var res = this.imod(a._invmp(this.m).mul(this.r2));\n        return res._forceRed(this);\n      };\n    })(typeof module2 === \"undefined\" || module2, exports2);\n  }\n});\n\n// node_modules/@ethersproject/logger/lib/_version.js\nvar require_version = __commonJS({\n  \"node_modules/@ethersproject/logger/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"logger/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/logger/lib/index.js\nvar require_lib = __commonJS({\n  \"node_modules/@ethersproject/logger/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Logger = exports2.ErrorCode = exports2.LogLevel = void 0;\n    var _permanentCensorErrors = false;\n    var _censorErrors = false;\n    var LogLevels = { debug: 1, \"default\": 2, info: 2, warning: 3, error: 4, off: 5 };\n    var _logLevel = LogLevels[\"default\"];\n    var _version_1 = require_version();\n    var _globalLogger = null;\n    function _checkNormalize() {\n      try {\n        var missing_1 = [];\n        [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].forEach(function(form) {\n          try {\n            if (\"test\".normalize(form) !== \"test\") {\n              throw new Error(\"bad normalize\");\n            }\n            ;\n          } catch (error) {\n            missing_1.push(form);\n          }\n        });\n        if (missing_1.length) {\n          throw new Error(\"missing \" + missing_1.join(\", \"));\n        }\n        if (String.fromCharCode(233).normalize(\"NFD\") !== String.fromCharCode(101, 769)) {\n          throw new Error(\"broken implementation\");\n        }\n      } catch (error) {\n        return error.message;\n      }\n      return null;\n    }\n    var _normalizeError = _checkNormalize();\n    var LogLevel;\n    (function(LogLevel2) {\n      LogLevel2[\"DEBUG\"] = \"DEBUG\";\n      LogLevel2[\"INFO\"] = \"INFO\";\n      LogLevel2[\"WARNING\"] = \"WARNING\";\n      LogLevel2[\"ERROR\"] = \"ERROR\";\n      LogLevel2[\"OFF\"] = \"OFF\";\n    })(LogLevel = exports2.LogLevel || (exports2.LogLevel = {}));\n    var ErrorCode;\n    (function(ErrorCode2) {\n      ErrorCode2[\"UNKNOWN_ERROR\"] = \"UNKNOWN_ERROR\";\n      ErrorCode2[\"NOT_IMPLEMENTED\"] = \"NOT_IMPLEMENTED\";\n      ErrorCode2[\"UNSUPPORTED_OPERATION\"] = \"UNSUPPORTED_OPERATION\";\n      ErrorCode2[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n      ErrorCode2[\"SERVER_ERROR\"] = \"SERVER_ERROR\";\n      ErrorCode2[\"TIMEOUT\"] = \"TIMEOUT\";\n      ErrorCode2[\"BUFFER_OVERRUN\"] = \"BUFFER_OVERRUN\";\n      ErrorCode2[\"NUMERIC_FAULT\"] = \"NUMERIC_FAULT\";\n      ErrorCode2[\"MISSING_NEW\"] = \"MISSING_NEW\";\n      ErrorCode2[\"INVALID_ARGUMENT\"] = \"INVALID_ARGUMENT\";\n      ErrorCode2[\"MISSING_ARGUMENT\"] = \"MISSING_ARGUMENT\";\n      ErrorCode2[\"UNEXPECTED_ARGUMENT\"] = \"UNEXPECTED_ARGUMENT\";\n      ErrorCode2[\"CALL_EXCEPTION\"] = \"CALL_EXCEPTION\";\n      ErrorCode2[\"INSUFFICIENT_FUNDS\"] = \"INSUFFICIENT_FUNDS\";\n      ErrorCode2[\"NONCE_EXPIRED\"] = \"NONCE_EXPIRED\";\n      ErrorCode2[\"REPLACEMENT_UNDERPRICED\"] = \"REPLACEMENT_UNDERPRICED\";\n      ErrorCode2[\"UNPREDICTABLE_GAS_LIMIT\"] = \"UNPREDICTABLE_GAS_LIMIT\";\n      ErrorCode2[\"TRANSACTION_REPLACED\"] = \"TRANSACTION_REPLACED\";\n    })(ErrorCode = exports2.ErrorCode || (exports2.ErrorCode = {}));\n    var HEX = \"0123456789abcdef\";\n    var Logger = (\n      /** @class */\n      function() {\n        function Logger2(version) {\n          Object.defineProperty(this, \"version\", {\n            enumerable: true,\n            value: version,\n            writable: false\n          });\n        }\n        Logger2.prototype._log = function(logLevel, args) {\n          var level = logLevel.toLowerCase();\n          if (LogLevels[level] == null) {\n            this.throwArgumentError(\"invalid log level name\", \"logLevel\", logLevel);\n          }\n          if (_logLevel > LogLevels[level]) {\n            return;\n          }\n          console.log.apply(console, args);\n        };\n        Logger2.prototype.debug = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.DEBUG, args);\n        };\n        Logger2.prototype.info = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.INFO, args);\n        };\n        Logger2.prototype.warn = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          this._log(Logger2.levels.WARNING, args);\n        };\n        Logger2.prototype.makeError = function(message, code, params) {\n          if (_censorErrors) {\n            return this.makeError(\"censored error\", code, {});\n          }\n          if (!code) {\n            code = Logger2.errors.UNKNOWN_ERROR;\n          }\n          if (!params) {\n            params = {};\n          }\n          var messageDetails = [];\n          Object.keys(params).forEach(function(key) {\n            var value = params[key];\n            try {\n              if (value instanceof Uint8Array) {\n                var hex = \"\";\n                for (var i = 0; i < value.length; i++) {\n                  hex += HEX[value[i] >> 4];\n                  hex += HEX[value[i] & 15];\n                }\n                messageDetails.push(key + \"=Uint8Array(0x\" + hex + \")\");\n              } else {\n                messageDetails.push(key + \"=\" + JSON.stringify(value));\n              }\n            } catch (error2) {\n              messageDetails.push(key + \"=\" + JSON.stringify(params[key].toString()));\n            }\n          });\n          messageDetails.push(\"code=\" + code);\n          messageDetails.push(\"version=\" + this.version);\n          var reason = message;\n          if (messageDetails.length) {\n            message += \" (\" + messageDetails.join(\", \") + \")\";\n          }\n          var error = new Error(message);\n          error.reason = reason;\n          error.code = code;\n          Object.keys(params).forEach(function(key) {\n            error[key] = params[key];\n          });\n          return error;\n        };\n        Logger2.prototype.throwError = function(message, code, params) {\n          throw this.makeError(message, code, params);\n        };\n        Logger2.prototype.throwArgumentError = function(message, name2, value) {\n          return this.throwError(message, Logger2.errors.INVALID_ARGUMENT, {\n            argument: name2,\n            value\n          });\n        };\n        Logger2.prototype.assert = function(condition, message, code, params) {\n          if (!!condition) {\n            return;\n          }\n          this.throwError(message, code, params);\n        };\n        Logger2.prototype.assertArgument = function(condition, message, name2, value) {\n          if (!!condition) {\n            return;\n          }\n          this.throwArgumentError(message, name2, value);\n        };\n        Logger2.prototype.checkNormalize = function(message) {\n          if (message == null) {\n            message = \"platform missing String.prototype.normalize\";\n          }\n          if (_normalizeError) {\n            this.throwError(\"platform missing String.prototype.normalize\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"String.prototype.normalize\",\n              form: _normalizeError\n            });\n          }\n        };\n        Logger2.prototype.checkSafeUint53 = function(value, message) {\n          if (typeof value !== \"number\") {\n            return;\n          }\n          if (message == null) {\n            message = \"value not safe\";\n          }\n          if (value < 0 || value >= 9007199254740991) {\n            this.throwError(message, Logger2.errors.NUMERIC_FAULT, {\n              operation: \"checkSafeInteger\",\n              fault: \"out-of-safe-range\",\n              value\n            });\n          }\n          if (value % 1) {\n            this.throwError(message, Logger2.errors.NUMERIC_FAULT, {\n              operation: \"checkSafeInteger\",\n              fault: \"non-integer\",\n              value\n            });\n          }\n        };\n        Logger2.prototype.checkArgumentCount = function(count, expectedCount, message) {\n          if (message) {\n            message = \": \" + message;\n          } else {\n            message = \"\";\n          }\n          if (count < expectedCount) {\n            this.throwError(\"missing argument\" + message, Logger2.errors.MISSING_ARGUMENT, {\n              count,\n              expectedCount\n            });\n          }\n          if (count > expectedCount) {\n            this.throwError(\"too many arguments\" + message, Logger2.errors.UNEXPECTED_ARGUMENT, {\n              count,\n              expectedCount\n            });\n          }\n        };\n        Logger2.prototype.checkNew = function(target, kind) {\n          if (target === Object || target == null) {\n            this.throwError(\"missing new\", Logger2.errors.MISSING_NEW, { name: kind.name });\n          }\n        };\n        Logger2.prototype.checkAbstract = function(target, kind) {\n          if (target === kind) {\n            this.throwError(\"cannot instantiate abstract class \" + JSON.stringify(kind.name) + \" directly; use a sub-class\", Logger2.errors.UNSUPPORTED_OPERATION, { name: target.name, operation: \"new\" });\n          } else if (target === Object || target == null) {\n            this.throwError(\"missing new\", Logger2.errors.MISSING_NEW, { name: kind.name });\n          }\n        };\n        Logger2.globalLogger = function() {\n          if (!_globalLogger) {\n            _globalLogger = new Logger2(_version_1.version);\n          }\n          return _globalLogger;\n        };\n        Logger2.setCensorship = function(censorship, permanent) {\n          if (!censorship && permanent) {\n            this.globalLogger().throwError(\"cannot permanently disable censorship\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setCensorship\"\n            });\n          }\n          if (_permanentCensorErrors) {\n            if (!censorship) {\n              return;\n            }\n            this.globalLogger().throwError(\"error censorship permanent\", Logger2.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setCensorship\"\n            });\n          }\n          _censorErrors = !!censorship;\n          _permanentCensorErrors = !!permanent;\n        };\n        Logger2.setLogLevel = function(logLevel) {\n          var level = LogLevels[logLevel.toLowerCase()];\n          if (level == null) {\n            Logger2.globalLogger().warn(\"invalid log level - \" + logLevel);\n            return;\n          }\n          _logLevel = level;\n        };\n        Logger2.from = function(version) {\n          return new Logger2(version);\n        };\n        Logger2.errors = ErrorCode;\n        Logger2.levels = LogLevel;\n        return Logger2;\n      }()\n    );\n    exports2.Logger = Logger;\n  }\n});\n\n// node_modules/@ethersproject/bytes/lib/_version.js\nvar require_version2 = __commonJS({\n  \"node_modules/@ethersproject/bytes/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"bytes/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/bytes/lib/index.js\nvar require_lib2 = __commonJS({\n  \"node_modules/@ethersproject/bytes/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.joinSignature = exports2.splitSignature = exports2.hexZeroPad = exports2.hexStripZeros = exports2.hexValue = exports2.hexConcat = exports2.hexDataSlice = exports2.hexDataLength = exports2.hexlify = exports2.isHexString = exports2.zeroPad = exports2.stripZeros = exports2.concat = exports2.arrayify = exports2.isBytes = exports2.isBytesLike = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version2();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isHexable(value) {\n      return !!value.toHexString;\n    }\n    function addSlice(array) {\n      if (array.slice) {\n        return array;\n      }\n      array.slice = function() {\n        var args = Array.prototype.slice.call(arguments);\n        return addSlice(new Uint8Array(Array.prototype.slice.apply(array, args)));\n      };\n      return array;\n    }\n    function isBytesLike(value) {\n      return isHexString(value) && !(value.length % 2) || isBytes(value);\n    }\n    exports2.isBytesLike = isBytesLike;\n    function isInteger(value) {\n      return typeof value === \"number\" && value == value && value % 1 === 0;\n    }\n    function isBytes(value) {\n      if (value == null) {\n        return false;\n      }\n      if (value.constructor === Uint8Array) {\n        return true;\n      }\n      if (typeof value === \"string\") {\n        return false;\n      }\n      if (!isInteger(value.length) || value.length < 0) {\n        return false;\n      }\n      for (var i = 0; i < value.length; i++) {\n        var v = value[i];\n        if (!isInteger(v) || v < 0 || v >= 256) {\n          return false;\n        }\n      }\n      return true;\n    }\n    exports2.isBytes = isBytes;\n    function arrayify(value, options) {\n      if (!options) {\n        options = {};\n      }\n      if (typeof value === \"number\") {\n        logger.checkSafeUint53(value, \"invalid arrayify value\");\n        var result = [];\n        while (value) {\n          result.unshift(value & 255);\n          value = parseInt(String(value / 256));\n        }\n        if (result.length === 0) {\n          result.push(0);\n        }\n        return addSlice(new Uint8Array(result));\n      }\n      if (options.allowMissingPrefix && typeof value === \"string\" && value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (isHexable(value)) {\n        value = value.toHexString();\n      }\n      if (isHexString(value)) {\n        var hex = value.substring(2);\n        if (hex.length % 2) {\n          if (options.hexPad === \"left\") {\n            hex = \"0x0\" + hex.substring(2);\n          } else if (options.hexPad === \"right\") {\n            hex += \"0\";\n          } else {\n            logger.throwArgumentError(\"hex data is odd-length\", \"value\", value);\n          }\n        }\n        var result = [];\n        for (var i = 0; i < hex.length; i += 2) {\n          result.push(parseInt(hex.substring(i, i + 2), 16));\n        }\n        return addSlice(new Uint8Array(result));\n      }\n      if (isBytes(value)) {\n        return addSlice(new Uint8Array(value));\n      }\n      return logger.throwArgumentError(\"invalid arrayify value\", \"value\", value);\n    }\n    exports2.arrayify = arrayify;\n    function concat(items) {\n      var objects = items.map(function(item) {\n        return arrayify(item);\n      });\n      var length = objects.reduce(function(accum, item) {\n        return accum + item.length;\n      }, 0);\n      var result = new Uint8Array(length);\n      objects.reduce(function(offset, object) {\n        result.set(object, offset);\n        return offset + object.length;\n      }, 0);\n      return addSlice(result);\n    }\n    exports2.concat = concat;\n    function stripZeros(value) {\n      var result = arrayify(value);\n      if (result.length === 0) {\n        return result;\n      }\n      var start = 0;\n      while (start < result.length && result[start] === 0) {\n        start++;\n      }\n      if (start) {\n        result = result.slice(start);\n      }\n      return result;\n    }\n    exports2.stripZeros = stripZeros;\n    function zeroPad(value, length) {\n      value = arrayify(value);\n      if (value.length > length) {\n        logger.throwArgumentError(\"value out of range\", \"value\", arguments[0]);\n      }\n      var result = new Uint8Array(length);\n      result.set(value, length - value.length);\n      return addSlice(result);\n    }\n    exports2.zeroPad = zeroPad;\n    function isHexString(value, length) {\n      if (typeof value !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n        return false;\n      }\n      if (length && value.length !== 2 + 2 * length) {\n        return false;\n      }\n      return true;\n    }\n    exports2.isHexString = isHexString;\n    var HexCharacters = \"0123456789abcdef\";\n    function hexlify(value, options) {\n      if (!options) {\n        options = {};\n      }\n      if (typeof value === \"number\") {\n        logger.checkSafeUint53(value, \"invalid hexlify value\");\n        var hex = \"\";\n        while (value) {\n          hex = HexCharacters[value & 15] + hex;\n          value = Math.floor(value / 16);\n        }\n        if (hex.length) {\n          if (hex.length % 2) {\n            hex = \"0\" + hex;\n          }\n          return \"0x\" + hex;\n        }\n        return \"0x00\";\n      }\n      if (typeof value === \"bigint\") {\n        value = value.toString(16);\n        if (value.length % 2) {\n          return \"0x0\" + value;\n        }\n        return \"0x\" + value;\n      }\n      if (options.allowMissingPrefix && typeof value === \"string\" && value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (isHexable(value)) {\n        return value.toHexString();\n      }\n      if (isHexString(value)) {\n        if (value.length % 2) {\n          if (options.hexPad === \"left\") {\n            value = \"0x0\" + value.substring(2);\n          } else if (options.hexPad === \"right\") {\n            value += \"0\";\n          } else {\n            logger.throwArgumentError(\"hex data is odd-length\", \"value\", value);\n          }\n        }\n        return value.toLowerCase();\n      }\n      if (isBytes(value)) {\n        var result = \"0x\";\n        for (var i = 0; i < value.length; i++) {\n          var v = value[i];\n          result += HexCharacters[(v & 240) >> 4] + HexCharacters[v & 15];\n        }\n        return result;\n      }\n      return logger.throwArgumentError(\"invalid hexlify value\", \"value\", value);\n    }\n    exports2.hexlify = hexlify;\n    function hexDataLength(data) {\n      if (typeof data !== \"string\") {\n        data = hexlify(data);\n      } else if (!isHexString(data) || data.length % 2) {\n        return null;\n      }\n      return (data.length - 2) / 2;\n    }\n    exports2.hexDataLength = hexDataLength;\n    function hexDataSlice(data, offset, endOffset) {\n      if (typeof data !== \"string\") {\n        data = hexlify(data);\n      } else if (!isHexString(data) || data.length % 2) {\n        logger.throwArgumentError(\"invalid hexData\", \"value\", data);\n      }\n      offset = 2 + 2 * offset;\n      if (endOffset != null) {\n        return \"0x\" + data.substring(offset, 2 + 2 * endOffset);\n      }\n      return \"0x\" + data.substring(offset);\n    }\n    exports2.hexDataSlice = hexDataSlice;\n    function hexConcat(items) {\n      var result = \"0x\";\n      items.forEach(function(item) {\n        result += hexlify(item).substring(2);\n      });\n      return result;\n    }\n    exports2.hexConcat = hexConcat;\n    function hexValue(value) {\n      var trimmed = hexStripZeros(hexlify(value, { hexPad: \"left\" }));\n      if (trimmed === \"0x\") {\n        return \"0x0\";\n      }\n      return trimmed;\n    }\n    exports2.hexValue = hexValue;\n    function hexStripZeros(value) {\n      if (typeof value !== \"string\") {\n        value = hexlify(value);\n      }\n      if (!isHexString(value)) {\n        logger.throwArgumentError(\"invalid hex string\", \"value\", value);\n      }\n      value = value.substring(2);\n      var offset = 0;\n      while (offset < value.length && value[offset] === \"0\") {\n        offset++;\n      }\n      return \"0x\" + value.substring(offset);\n    }\n    exports2.hexStripZeros = hexStripZeros;\n    function hexZeroPad(value, length) {\n      if (typeof value !== \"string\") {\n        value = hexlify(value);\n      } else if (!isHexString(value)) {\n        logger.throwArgumentError(\"invalid hex string\", \"value\", value);\n      }\n      if (value.length > 2 * length + 2) {\n        logger.throwArgumentError(\"value out of range\", \"value\", arguments[1]);\n      }\n      while (value.length < 2 * length + 2) {\n        value = \"0x0\" + value.substring(2);\n      }\n      return value;\n    }\n    exports2.hexZeroPad = hexZeroPad;\n    function splitSignature(signature) {\n      var result = {\n        r: \"0x\",\n        s: \"0x\",\n        _vs: \"0x\",\n        recoveryParam: 0,\n        v: 0\n      };\n      if (isBytesLike(signature)) {\n        var bytes = arrayify(signature);\n        if (bytes.length !== 65) {\n          logger.throwArgumentError(\"invalid signature string; must be 65 bytes\", \"signature\", signature);\n        }\n        result.r = hexlify(bytes.slice(0, 32));\n        result.s = hexlify(bytes.slice(32, 64));\n        result.v = bytes[64];\n        if (result.v < 27) {\n          if (result.v === 0 || result.v === 1) {\n            result.v += 27;\n          } else {\n            logger.throwArgumentError(\"signature invalid v byte\", \"signature\", signature);\n          }\n        }\n        result.recoveryParam = 1 - result.v % 2;\n        if (result.recoveryParam) {\n          bytes[32] |= 128;\n        }\n        result._vs = hexlify(bytes.slice(32, 64));\n      } else {\n        result.r = signature.r;\n        result.s = signature.s;\n        result.v = signature.v;\n        result.recoveryParam = signature.recoveryParam;\n        result._vs = signature._vs;\n        if (result._vs != null) {\n          var vs_1 = zeroPad(arrayify(result._vs), 32);\n          result._vs = hexlify(vs_1);\n          var recoveryParam = vs_1[0] >= 128 ? 1 : 0;\n          if (result.recoveryParam == null) {\n            result.recoveryParam = recoveryParam;\n          } else if (result.recoveryParam !== recoveryParam) {\n            logger.throwArgumentError(\"signature recoveryParam mismatch _vs\", \"signature\", signature);\n          }\n          vs_1[0] &= 127;\n          var s = hexlify(vs_1);\n          if (result.s == null) {\n            result.s = s;\n          } else if (result.s !== s) {\n            logger.throwArgumentError(\"signature v mismatch _vs\", \"signature\", signature);\n          }\n        }\n        if (result.recoveryParam == null) {\n          if (result.v == null) {\n            logger.throwArgumentError(\"signature missing v and recoveryParam\", \"signature\", signature);\n          } else if (result.v === 0 || result.v === 1) {\n            result.recoveryParam = result.v;\n          } else {\n            result.recoveryParam = 1 - result.v % 2;\n          }\n        } else {\n          if (result.v == null) {\n            result.v = 27 + result.recoveryParam;\n          } else {\n            var recId = result.v === 0 || result.v === 1 ? result.v : 1 - result.v % 2;\n            if (result.recoveryParam !== recId) {\n              logger.throwArgumentError(\"signature recoveryParam mismatch v\", \"signature\", signature);\n            }\n          }\n        }\n        if (result.r == null || !isHexString(result.r)) {\n          logger.throwArgumentError(\"signature missing or invalid r\", \"signature\", signature);\n        } else {\n          result.r = hexZeroPad(result.r, 32);\n        }\n        if (result.s == null || !isHexString(result.s)) {\n          logger.throwArgumentError(\"signature missing or invalid s\", \"signature\", signature);\n        } else {\n          result.s = hexZeroPad(result.s, 32);\n        }\n        var vs = arrayify(result.s);\n        if (vs[0] >= 128) {\n          logger.throwArgumentError(\"signature s out of range\", \"signature\", signature);\n        }\n        if (result.recoveryParam) {\n          vs[0] |= 128;\n        }\n        var _vs = hexlify(vs);\n        if (result._vs) {\n          if (!isHexString(result._vs)) {\n            logger.throwArgumentError(\"signature invalid _vs\", \"signature\", signature);\n          }\n          result._vs = hexZeroPad(result._vs, 32);\n        }\n        if (result._vs == null) {\n          result._vs = _vs;\n        } else if (result._vs !== _vs) {\n          logger.throwArgumentError(\"signature _vs mismatch v and s\", \"signature\", signature);\n        }\n      }\n      return result;\n    }\n    exports2.splitSignature = splitSignature;\n    function joinSignature(signature) {\n      signature = splitSignature(signature);\n      return hexlify(concat([\n        signature.r,\n        signature.s,\n        signature.recoveryParam ? \"0x1c\" : \"0x1b\"\n      ]));\n    }\n    exports2.joinSignature = joinSignature;\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/_version.js\nvar require_version3 = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"bignumber/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/bignumber.js\nvar require_bignumber = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/bignumber.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._base16To36 = exports2._base36To16 = exports2.BigNumber = exports2.isBigNumberish = void 0;\n    var bn_js_1 = __importDefault(require_bn());\n    var BN = bn_js_1.default.BN;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version3();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _constructorGuard = {};\n    var MAX_SAFE = 9007199254740991;\n    function isBigNumberish(value) {\n      return value != null && (BigNumber.isBigNumber(value) || typeof value === \"number\" && value % 1 === 0 || typeof value === \"string\" && !!value.match(/^-?[0-9]+$/) || (0, bytes_1.isHexString)(value) || typeof value === \"bigint\" || (0, bytes_1.isBytes)(value));\n    }\n    exports2.isBigNumberish = isBigNumberish;\n    var _warnedToStringRadix = false;\n    var BigNumber = (\n      /** @class */\n      function() {\n        function BigNumber2(constructorGuard, hex) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, BigNumber2);\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot call constructor directly; use BigNumber.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new (BigNumber)\"\n            });\n          }\n          this._hex = hex;\n          this._isBigNumber = true;\n          Object.freeze(this);\n        }\n        BigNumber2.prototype.fromTwos = function(value) {\n          return toBigNumber(toBN(this).fromTwos(value));\n        };\n        BigNumber2.prototype.toTwos = function(value) {\n          return toBigNumber(toBN(this).toTwos(value));\n        };\n        BigNumber2.prototype.abs = function() {\n          if (this._hex[0] === \"-\") {\n            return BigNumber2.from(this._hex.substring(1));\n          }\n          return this;\n        };\n        BigNumber2.prototype.add = function(other) {\n          return toBigNumber(toBN(this).add(toBN(other)));\n        };\n        BigNumber2.prototype.sub = function(other) {\n          return toBigNumber(toBN(this).sub(toBN(other)));\n        };\n        BigNumber2.prototype.div = function(other) {\n          var o = BigNumber2.from(other);\n          if (o.isZero()) {\n            throwFault(\"division by zero\", \"div\");\n          }\n          return toBigNumber(toBN(this).div(toBN(other)));\n        };\n        BigNumber2.prototype.mul = function(other) {\n          return toBigNumber(toBN(this).mul(toBN(other)));\n        };\n        BigNumber2.prototype.mod = function(other) {\n          var value = toBN(other);\n          if (value.isNeg()) {\n            throwFault(\"cannot modulo negative values\", \"mod\");\n          }\n          return toBigNumber(toBN(this).umod(value));\n        };\n        BigNumber2.prototype.pow = function(other) {\n          var value = toBN(other);\n          if (value.isNeg()) {\n            throwFault(\"cannot raise to negative values\", \"pow\");\n          }\n          return toBigNumber(toBN(this).pow(value));\n        };\n        BigNumber2.prototype.and = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'and' negative values\", \"and\");\n          }\n          return toBigNumber(toBN(this).and(value));\n        };\n        BigNumber2.prototype.or = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'or' negative values\", \"or\");\n          }\n          return toBigNumber(toBN(this).or(value));\n        };\n        BigNumber2.prototype.xor = function(other) {\n          var value = toBN(other);\n          if (this.isNegative() || value.isNeg()) {\n            throwFault(\"cannot 'xor' negative values\", \"xor\");\n          }\n          return toBigNumber(toBN(this).xor(value));\n        };\n        BigNumber2.prototype.mask = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot mask negative values\", \"mask\");\n          }\n          return toBigNumber(toBN(this).maskn(value));\n        };\n        BigNumber2.prototype.shl = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot shift negative values\", \"shl\");\n          }\n          return toBigNumber(toBN(this).shln(value));\n        };\n        BigNumber2.prototype.shr = function(value) {\n          if (this.isNegative() || value < 0) {\n            throwFault(\"cannot shift negative values\", \"shr\");\n          }\n          return toBigNumber(toBN(this).shrn(value));\n        };\n        BigNumber2.prototype.eq = function(other) {\n          return toBN(this).eq(toBN(other));\n        };\n        BigNumber2.prototype.lt = function(other) {\n          return toBN(this).lt(toBN(other));\n        };\n        BigNumber2.prototype.lte = function(other) {\n          return toBN(this).lte(toBN(other));\n        };\n        BigNumber2.prototype.gt = function(other) {\n          return toBN(this).gt(toBN(other));\n        };\n        BigNumber2.prototype.gte = function(other) {\n          return toBN(this).gte(toBN(other));\n        };\n        BigNumber2.prototype.isNegative = function() {\n          return this._hex[0] === \"-\";\n        };\n        BigNumber2.prototype.isZero = function() {\n          return toBN(this).isZero();\n        };\n        BigNumber2.prototype.toNumber = function() {\n          try {\n            return toBN(this).toNumber();\n          } catch (error) {\n            throwFault(\"overflow\", \"toNumber\", this.toString());\n          }\n          return null;\n        };\n        BigNumber2.prototype.toBigInt = function() {\n          try {\n            return BigInt(this.toString());\n          } catch (e) {\n          }\n          return logger.throwError(\"this platform does not support BigInt\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            value: this.toString()\n          });\n        };\n        BigNumber2.prototype.toString = function() {\n          if (arguments.length > 0) {\n            if (arguments[0] === 10) {\n              if (!_warnedToStringRadix) {\n                _warnedToStringRadix = true;\n                logger.warn(\"BigNumber.toString does not accept any parameters; base-10 is assumed\");\n              }\n            } else if (arguments[0] === 16) {\n              logger.throwError(\"BigNumber.toString does not accept any parameters; use bigNumber.toHexString()\", logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {});\n            } else {\n              logger.throwError(\"BigNumber.toString does not accept parameters\", logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {});\n            }\n          }\n          return toBN(this).toString(10);\n        };\n        BigNumber2.prototype.toHexString = function() {\n          return this._hex;\n        };\n        BigNumber2.prototype.toJSON = function(key) {\n          return { type: \"BigNumber\", hex: this.toHexString() };\n        };\n        BigNumber2.from = function(value) {\n          if (value instanceof BigNumber2) {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            if (value.match(/^-?0x[0-9a-f]+$/i)) {\n              return new BigNumber2(_constructorGuard, toHex(value));\n            }\n            if (value.match(/^-?[0-9]+$/)) {\n              return new BigNumber2(_constructorGuard, toHex(new BN(value)));\n            }\n            return logger.throwArgumentError(\"invalid BigNumber string\", \"value\", value);\n          }\n          if (typeof value === \"number\") {\n            if (value % 1) {\n              throwFault(\"underflow\", \"BigNumber.from\", value);\n            }\n            if (value >= MAX_SAFE || value <= -MAX_SAFE) {\n              throwFault(\"overflow\", \"BigNumber.from\", value);\n            }\n            return BigNumber2.from(String(value));\n          }\n          var anyValue = value;\n          if (typeof anyValue === \"bigint\") {\n            return BigNumber2.from(anyValue.toString());\n          }\n          if ((0, bytes_1.isBytes)(anyValue)) {\n            return BigNumber2.from((0, bytes_1.hexlify)(anyValue));\n          }\n          if (anyValue) {\n            if (anyValue.toHexString) {\n              var hex = anyValue.toHexString();\n              if (typeof hex === \"string\") {\n                return BigNumber2.from(hex);\n              }\n            } else {\n              var hex = anyValue._hex;\n              if (hex == null && anyValue.type === \"BigNumber\") {\n                hex = anyValue.hex;\n              }\n              if (typeof hex === \"string\") {\n                if ((0, bytes_1.isHexString)(hex) || hex[0] === \"-\" && (0, bytes_1.isHexString)(hex.substring(1))) {\n                  return BigNumber2.from(hex);\n                }\n              }\n            }\n          }\n          return logger.throwArgumentError(\"invalid BigNumber value\", \"value\", value);\n        };\n        BigNumber2.isBigNumber = function(value) {\n          return !!(value && value._isBigNumber);\n        };\n        return BigNumber2;\n      }()\n    );\n    exports2.BigNumber = BigNumber;\n    function toHex(value) {\n      if (typeof value !== \"string\") {\n        return toHex(value.toString(16));\n      }\n      if (value[0] === \"-\") {\n        value = value.substring(1);\n        if (value[0] === \"-\") {\n          logger.throwArgumentError(\"invalid hex\", \"value\", value);\n        }\n        value = toHex(value);\n        if (value === \"0x00\") {\n          return value;\n        }\n        return \"-\" + value;\n      }\n      if (value.substring(0, 2) !== \"0x\") {\n        value = \"0x\" + value;\n      }\n      if (value === \"0x\") {\n        return \"0x00\";\n      }\n      if (value.length % 2) {\n        value = \"0x0\" + value.substring(2);\n      }\n      while (value.length > 4 && value.substring(0, 4) === \"0x00\") {\n        value = \"0x\" + value.substring(4);\n      }\n      return value;\n    }\n    function toBigNumber(value) {\n      return BigNumber.from(toHex(value));\n    }\n    function toBN(value) {\n      var hex = BigNumber.from(value).toHexString();\n      if (hex[0] === \"-\") {\n        return new BN(\"-\" + hex.substring(3), 16);\n      }\n      return new BN(hex.substring(2), 16);\n    }\n    function throwFault(fault, operation, value) {\n      var params = { fault, operation };\n      if (value != null) {\n        params.value = value;\n      }\n      return logger.throwError(fault, logger_1.Logger.errors.NUMERIC_FAULT, params);\n    }\n    function _base36To16(value) {\n      return new BN(value, 36).toString(16);\n    }\n    exports2._base36To16 = _base36To16;\n    function _base16To36(value) {\n      return new BN(value, 16).toString(36);\n    }\n    exports2._base16To36 = _base16To36;\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/fixednumber.js\nvar require_fixednumber = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/fixednumber.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FixedNumber = exports2.FixedFormat = exports2.parseFixed = exports2.formatFixed = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version3();\n    var logger = new logger_1.Logger(_version_1.version);\n    var bignumber_1 = require_bignumber();\n    var _constructorGuard = {};\n    var Zero = bignumber_1.BigNumber.from(0);\n    var NegativeOne = bignumber_1.BigNumber.from(-1);\n    function throwFault(message, fault, operation, value) {\n      var params = { fault, operation };\n      if (value !== void 0) {\n        params.value = value;\n      }\n      return logger.throwError(message, logger_1.Logger.errors.NUMERIC_FAULT, params);\n    }\n    var zeros = \"0\";\n    while (zeros.length < 256) {\n      zeros += zeros;\n    }\n    function getMultiplier(decimals) {\n      if (typeof decimals !== \"number\") {\n        try {\n          decimals = bignumber_1.BigNumber.from(decimals).toNumber();\n        } catch (e) {\n        }\n      }\n      if (typeof decimals === \"number\" && decimals >= 0 && decimals <= 256 && !(decimals % 1)) {\n        return \"1\" + zeros.substring(0, decimals);\n      }\n      return logger.throwArgumentError(\"invalid decimal size\", \"decimals\", decimals);\n    }\n    function formatFixed(value, decimals) {\n      if (decimals == null) {\n        decimals = 0;\n      }\n      var multiplier = getMultiplier(decimals);\n      value = bignumber_1.BigNumber.from(value);\n      var negative = value.lt(Zero);\n      if (negative) {\n        value = value.mul(NegativeOne);\n      }\n      var fraction = value.mod(multiplier).toString();\n      while (fraction.length < multiplier.length - 1) {\n        fraction = \"0\" + fraction;\n      }\n      fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1];\n      var whole = value.div(multiplier).toString();\n      if (multiplier.length === 1) {\n        value = whole;\n      } else {\n        value = whole + \".\" + fraction;\n      }\n      if (negative) {\n        value = \"-\" + value;\n      }\n      return value;\n    }\n    exports2.formatFixed = formatFixed;\n    function parseFixed(value, decimals) {\n      if (decimals == null) {\n        decimals = 0;\n      }\n      var multiplier = getMultiplier(decimals);\n      if (typeof value !== \"string\" || !value.match(/^-?[0-9.]+$/)) {\n        logger.throwArgumentError(\"invalid decimal value\", \"value\", value);\n      }\n      var negative = value.substring(0, 1) === \"-\";\n      if (negative) {\n        value = value.substring(1);\n      }\n      if (value === \".\") {\n        logger.throwArgumentError(\"missing value\", \"value\", value);\n      }\n      var comps = value.split(\".\");\n      if (comps.length > 2) {\n        logger.throwArgumentError(\"too many decimal points\", \"value\", value);\n      }\n      var whole = comps[0], fraction = comps[1];\n      if (!whole) {\n        whole = \"0\";\n      }\n      if (!fraction) {\n        fraction = \"0\";\n      }\n      while (fraction[fraction.length - 1] === \"0\") {\n        fraction = fraction.substring(0, fraction.length - 1);\n      }\n      if (fraction.length > multiplier.length - 1) {\n        throwFault(\"fractional component exceeds decimals\", \"underflow\", \"parseFixed\");\n      }\n      if (fraction === \"\") {\n        fraction = \"0\";\n      }\n      while (fraction.length < multiplier.length - 1) {\n        fraction += \"0\";\n      }\n      var wholeValue = bignumber_1.BigNumber.from(whole);\n      var fractionValue = bignumber_1.BigNumber.from(fraction);\n      var wei = wholeValue.mul(multiplier).add(fractionValue);\n      if (negative) {\n        wei = wei.mul(NegativeOne);\n      }\n      return wei;\n    }\n    exports2.parseFixed = parseFixed;\n    var FixedFormat = (\n      /** @class */\n      function() {\n        function FixedFormat2(constructorGuard, signed, width, decimals) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot use FixedFormat constructor; use FixedFormat.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new FixedFormat\"\n            });\n          }\n          this.signed = signed;\n          this.width = width;\n          this.decimals = decimals;\n          this.name = (signed ? \"\" : \"u\") + \"fixed\" + String(width) + \"x\" + String(decimals);\n          this._multiplier = getMultiplier(decimals);\n          Object.freeze(this);\n        }\n        FixedFormat2.from = function(value) {\n          if (value instanceof FixedFormat2) {\n            return value;\n          }\n          if (typeof value === \"number\") {\n            value = \"fixed128x\" + value;\n          }\n          var signed = true;\n          var width = 128;\n          var decimals = 18;\n          if (typeof value === \"string\") {\n            if (value === \"fixed\") {\n            } else if (value === \"ufixed\") {\n              signed = false;\n            } else {\n              var match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/);\n              if (!match) {\n                logger.throwArgumentError(\"invalid fixed format\", \"format\", value);\n              }\n              signed = match[1] !== \"u\";\n              width = parseInt(match[2]);\n              decimals = parseInt(match[3]);\n            }\n          } else if (value) {\n            var check = function(key, type, defaultValue) {\n              if (value[key] == null) {\n                return defaultValue;\n              }\n              if (typeof value[key] !== type) {\n                logger.throwArgumentError(\"invalid fixed format (\" + key + \" not \" + type + \")\", \"format.\" + key, value[key]);\n              }\n              return value[key];\n            };\n            signed = check(\"signed\", \"boolean\", signed);\n            width = check(\"width\", \"number\", width);\n            decimals = check(\"decimals\", \"number\", decimals);\n          }\n          if (width % 8) {\n            logger.throwArgumentError(\"invalid fixed format width (not byte aligned)\", \"format.width\", width);\n          }\n          if (decimals > 80) {\n            logger.throwArgumentError(\"invalid fixed format (decimals too large)\", \"format.decimals\", decimals);\n          }\n          return new FixedFormat2(_constructorGuard, signed, width, decimals);\n        };\n        return FixedFormat2;\n      }()\n    );\n    exports2.FixedFormat = FixedFormat;\n    var FixedNumber = (\n      /** @class */\n      function() {\n        function FixedNumber2(constructorGuard, hex, value, format) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, FixedNumber2);\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"cannot use FixedNumber constructor; use FixedNumber.from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new FixedFormat\"\n            });\n          }\n          this.format = format;\n          this._hex = hex;\n          this._value = value;\n          this._isFixedNumber = true;\n          Object.freeze(this);\n        }\n        FixedNumber2.prototype._checkFormat = function(other) {\n          if (this.format.name !== other.format.name) {\n            logger.throwArgumentError(\"incompatible format; use fixedNumber.toFormat\", \"other\", other);\n          }\n        };\n        FixedNumber2.prototype.addUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.add(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.subUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.sub(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.mulUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.mul(b).div(this.format._multiplier), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.divUnsafe = function(other) {\n          this._checkFormat(other);\n          var a = parseFixed(this._value, this.format.decimals);\n          var b = parseFixed(other._value, other.format.decimals);\n          return FixedNumber2.fromValue(a.mul(this.format._multiplier).div(b), this.format.decimals, this.format);\n        };\n        FixedNumber2.prototype.floor = function() {\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          var result = FixedNumber2.from(comps[0], this.format);\n          var hasFraction = !comps[1].match(/^(0*)$/);\n          if (this.isNegative() && hasFraction) {\n            result = result.subUnsafe(ONE.toFormat(result.format));\n          }\n          return result;\n        };\n        FixedNumber2.prototype.ceiling = function() {\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          var result = FixedNumber2.from(comps[0], this.format);\n          var hasFraction = !comps[1].match(/^(0*)$/);\n          if (!this.isNegative() && hasFraction) {\n            result = result.addUnsafe(ONE.toFormat(result.format));\n          }\n          return result;\n        };\n        FixedNumber2.prototype.round = function(decimals) {\n          if (decimals == null) {\n            decimals = 0;\n          }\n          var comps = this.toString().split(\".\");\n          if (comps.length === 1) {\n            comps.push(\"0\");\n          }\n          if (decimals < 0 || decimals > 80 || decimals % 1) {\n            logger.throwArgumentError(\"invalid decimal count\", \"decimals\", decimals);\n          }\n          if (comps[1].length <= decimals) {\n            return this;\n          }\n          var factor = FixedNumber2.from(\"1\" + zeros.substring(0, decimals), this.format);\n          var bump = BUMP.toFormat(this.format);\n          return this.mulUnsafe(factor).addUnsafe(bump).floor().divUnsafe(factor);\n        };\n        FixedNumber2.prototype.isZero = function() {\n          return this._value === \"0.0\" || this._value === \"0\";\n        };\n        FixedNumber2.prototype.isNegative = function() {\n          return this._value[0] === \"-\";\n        };\n        FixedNumber2.prototype.toString = function() {\n          return this._value;\n        };\n        FixedNumber2.prototype.toHexString = function(width) {\n          if (width == null) {\n            return this._hex;\n          }\n          if (width % 8) {\n            logger.throwArgumentError(\"invalid byte width\", \"width\", width);\n          }\n          var hex = bignumber_1.BigNumber.from(this._hex).fromTwos(this.format.width).toTwos(width).toHexString();\n          return (0, bytes_1.hexZeroPad)(hex, width / 8);\n        };\n        FixedNumber2.prototype.toUnsafeFloat = function() {\n          return parseFloat(this.toString());\n        };\n        FixedNumber2.prototype.toFormat = function(format) {\n          return FixedNumber2.fromString(this._value, format);\n        };\n        FixedNumber2.fromValue = function(value, decimals, format) {\n          if (format == null && decimals != null && !(0, bignumber_1.isBigNumberish)(decimals)) {\n            format = decimals;\n            decimals = null;\n          }\n          if (decimals == null) {\n            decimals = 0;\n          }\n          if (format == null) {\n            format = \"fixed\";\n          }\n          return FixedNumber2.fromString(formatFixed(value, decimals), FixedFormat.from(format));\n        };\n        FixedNumber2.fromString = function(value, format) {\n          if (format == null) {\n            format = \"fixed\";\n          }\n          var fixedFormat = FixedFormat.from(format);\n          var numeric = parseFixed(value, fixedFormat.decimals);\n          if (!fixedFormat.signed && numeric.lt(Zero)) {\n            throwFault(\"unsigned value cannot be negative\", \"overflow\", \"value\", value);\n          }\n          var hex = null;\n          if (fixedFormat.signed) {\n            hex = numeric.toTwos(fixedFormat.width).toHexString();\n          } else {\n            hex = numeric.toHexString();\n            hex = (0, bytes_1.hexZeroPad)(hex, fixedFormat.width / 8);\n          }\n          var decimal = formatFixed(numeric, fixedFormat.decimals);\n          return new FixedNumber2(_constructorGuard, hex, decimal, fixedFormat);\n        };\n        FixedNumber2.fromBytes = function(value, format) {\n          if (format == null) {\n            format = \"fixed\";\n          }\n          var fixedFormat = FixedFormat.from(format);\n          if ((0, bytes_1.arrayify)(value).length > fixedFormat.width / 8) {\n            throw new Error(\"overflow\");\n          }\n          var numeric = bignumber_1.BigNumber.from(value);\n          if (fixedFormat.signed) {\n            numeric = numeric.fromTwos(fixedFormat.width);\n          }\n          var hex = numeric.toTwos((fixedFormat.signed ? 0 : 1) + fixedFormat.width).toHexString();\n          var decimal = formatFixed(numeric, fixedFormat.decimals);\n          return new FixedNumber2(_constructorGuard, hex, decimal, fixedFormat);\n        };\n        FixedNumber2.from = function(value, format) {\n          if (typeof value === \"string\") {\n            return FixedNumber2.fromString(value, format);\n          }\n          if ((0, bytes_1.isBytes)(value)) {\n            return FixedNumber2.fromBytes(value, format);\n          }\n          try {\n            return FixedNumber2.fromValue(value, 0, format);\n          } catch (error) {\n            if (error.code !== logger_1.Logger.errors.INVALID_ARGUMENT) {\n              throw error;\n            }\n          }\n          return logger.throwArgumentError(\"invalid FixedNumber value\", \"value\", value);\n        };\n        FixedNumber2.isFixedNumber = function(value) {\n          return !!(value && value._isFixedNumber);\n        };\n        return FixedNumber2;\n      }()\n    );\n    exports2.FixedNumber = FixedNumber;\n    var ONE = FixedNumber.from(1);\n    var BUMP = FixedNumber.from(\"0.5\");\n  }\n});\n\n// node_modules/@ethersproject/bignumber/lib/index.js\nvar require_lib3 = __commonJS({\n  \"node_modules/@ethersproject/bignumber/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._base36To16 = exports2._base16To36 = exports2.parseFixed = exports2.FixedNumber = exports2.FixedFormat = exports2.formatFixed = exports2.BigNumber = void 0;\n    var bignumber_1 = require_bignumber();\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return bignumber_1.BigNumber;\n    } });\n    var fixednumber_1 = require_fixednumber();\n    Object.defineProperty(exports2, \"formatFixed\", { enumerable: true, get: function() {\n      return fixednumber_1.formatFixed;\n    } });\n    Object.defineProperty(exports2, \"FixedFormat\", { enumerable: true, get: function() {\n      return fixednumber_1.FixedFormat;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return fixednumber_1.FixedNumber;\n    } });\n    Object.defineProperty(exports2, \"parseFixed\", { enumerable: true, get: function() {\n      return fixednumber_1.parseFixed;\n    } });\n    var bignumber_2 = require_bignumber();\n    Object.defineProperty(exports2, \"_base16To36\", { enumerable: true, get: function() {\n      return bignumber_2._base16To36;\n    } });\n    Object.defineProperty(exports2, \"_base36To16\", { enumerable: true, get: function() {\n      return bignumber_2._base36To16;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/properties/lib/_version.js\nvar require_version4 = __commonJS({\n  \"node_modules/@ethersproject/properties/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"properties/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/properties/lib/index.js\nvar require_lib4 = __commonJS({\n  \"node_modules/@ethersproject/properties/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Description = exports2.deepCopy = exports2.shallowCopy = exports2.checkProperties = exports2.resolveProperties = exports2.getStatic = exports2.defineReadOnly = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version4();\n    var logger = new logger_1.Logger(_version_1.version);\n    function defineReadOnly(object, name2, value) {\n      Object.defineProperty(object, name2, {\n        enumerable: true,\n        value,\n        writable: false\n      });\n    }\n    exports2.defineReadOnly = defineReadOnly;\n    function getStatic(ctor, key) {\n      for (var i = 0; i < 32; i++) {\n        if (ctor[key]) {\n          return ctor[key];\n        }\n        if (!ctor.prototype || typeof ctor.prototype !== \"object\") {\n          break;\n        }\n        ctor = Object.getPrototypeOf(ctor.prototype).constructor;\n      }\n      return null;\n    }\n    exports2.getStatic = getStatic;\n    function resolveProperties(object) {\n      return __awaiter(this, void 0, void 0, function() {\n        var promises, results;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              promises = Object.keys(object).map(function(key) {\n                var value = object[key];\n                return Promise.resolve(value).then(function(v) {\n                  return { key, value: v };\n                });\n              });\n              return [4, Promise.all(promises)];\n            case 1:\n              results = _a.sent();\n              return [2, results.reduce(function(accum, result) {\n                accum[result.key] = result.value;\n                return accum;\n              }, {})];\n          }\n        });\n      });\n    }\n    exports2.resolveProperties = resolveProperties;\n    function checkProperties(object, properties) {\n      if (!object || typeof object !== \"object\") {\n        logger.throwArgumentError(\"invalid object\", \"object\", object);\n      }\n      Object.keys(object).forEach(function(key) {\n        if (!properties[key]) {\n          logger.throwArgumentError(\"invalid object key - \" + key, \"transaction:\" + key, object);\n        }\n      });\n    }\n    exports2.checkProperties = checkProperties;\n    function shallowCopy(object) {\n      var result = {};\n      for (var key in object) {\n        result[key] = object[key];\n      }\n      return result;\n    }\n    exports2.shallowCopy = shallowCopy;\n    var opaque = { bigint: true, boolean: true, \"function\": true, number: true, string: true };\n    function _isFrozen(object) {\n      if (object === void 0 || object === null || opaque[typeof object]) {\n        return true;\n      }\n      if (Array.isArray(object) || typeof object === \"object\") {\n        if (!Object.isFrozen(object)) {\n          return false;\n        }\n        var keys = Object.keys(object);\n        for (var i = 0; i < keys.length; i++) {\n          var value = null;\n          try {\n            value = object[keys[i]];\n          } catch (error) {\n            continue;\n          }\n          if (!_isFrozen(value)) {\n            return false;\n          }\n        }\n        return true;\n      }\n      return logger.throwArgumentError(\"Cannot deepCopy \" + typeof object, \"object\", object);\n    }\n    function _deepCopy(object) {\n      if (_isFrozen(object)) {\n        return object;\n      }\n      if (Array.isArray(object)) {\n        return Object.freeze(object.map(function(item) {\n          return deepCopy(item);\n        }));\n      }\n      if (typeof object === \"object\") {\n        var result = {};\n        for (var key in object) {\n          var value = object[key];\n          if (value === void 0) {\n            continue;\n          }\n          defineReadOnly(result, key, deepCopy(value));\n        }\n        return result;\n      }\n      return logger.throwArgumentError(\"Cannot deepCopy \" + typeof object, \"object\", object);\n    }\n    function deepCopy(object) {\n      return _deepCopy(object);\n    }\n    exports2.deepCopy = deepCopy;\n    var Description = (\n      /** @class */\n      /* @__PURE__ */ function() {\n        function Description2(info) {\n          for (var key in info) {\n            this[key] = deepCopy(info[key]);\n          }\n        }\n        return Description2;\n      }()\n    );\n    exports2.Description = Description;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/_version.js\nvar require_version5 = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abi/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/fragments.js\nvar require_fragments = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/fragments.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ErrorFragment = exports2.FunctionFragment = exports2.ConstructorFragment = exports2.EventFragment = exports2.Fragment = exports2.ParamType = exports2.FormatTypes = void 0;\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _constructorGuard = {};\n    var ModifiersBytes = { calldata: true, memory: true, storage: true };\n    var ModifiersNest = { calldata: true, memory: true };\n    function checkModifier(type, name2) {\n      if (type === \"bytes\" || type === \"string\") {\n        if (ModifiersBytes[name2]) {\n          return true;\n        }\n      } else if (type === \"address\") {\n        if (name2 === \"payable\") {\n          return true;\n        }\n      } else if (type.indexOf(\"[\") >= 0 || type === \"tuple\") {\n        if (ModifiersNest[name2]) {\n          return true;\n        }\n      }\n      if (ModifiersBytes[name2] || name2 === \"payable\") {\n        logger.throwArgumentError(\"invalid modifier\", \"name\", name2);\n      }\n      return false;\n    }\n    function parseParamType(param, allowIndexed) {\n      var originalParam = param;\n      function throwError(i2) {\n        logger.throwArgumentError(\"unexpected character at position \" + i2, \"param\", param);\n      }\n      param = param.replace(/\\s/g, \" \");\n      function newNode(parent2) {\n        var node2 = { type: \"\", name: \"\", parent: parent2, state: { allowType: true } };\n        if (allowIndexed) {\n          node2.indexed = false;\n        }\n        return node2;\n      }\n      var parent = { type: \"\", name: \"\", state: { allowType: true } };\n      var node = parent;\n      for (var i = 0; i < param.length; i++) {\n        var c = param[i];\n        switch (c) {\n          case \"(\":\n            if (node.state.allowType && node.type === \"\") {\n              node.type = \"tuple\";\n            } else if (!node.state.allowParams) {\n              throwError(i);\n            }\n            node.state.allowType = false;\n            node.type = verifyType(node.type);\n            node.components = [newNode(node)];\n            node = node.components[0];\n            break;\n          case \")\":\n            delete node.state;\n            if (node.name === \"indexed\") {\n              if (!allowIndexed) {\n                throwError(i);\n              }\n              node.indexed = true;\n              node.name = \"\";\n            }\n            if (checkModifier(node.type, node.name)) {\n              node.name = \"\";\n            }\n            node.type = verifyType(node.type);\n            var child = node;\n            node = node.parent;\n            if (!node) {\n              throwError(i);\n            }\n            delete child.parent;\n            node.state.allowParams = false;\n            node.state.allowName = true;\n            node.state.allowArray = true;\n            break;\n          case \",\":\n            delete node.state;\n            if (node.name === \"indexed\") {\n              if (!allowIndexed) {\n                throwError(i);\n              }\n              node.indexed = true;\n              node.name = \"\";\n            }\n            if (checkModifier(node.type, node.name)) {\n              node.name = \"\";\n            }\n            node.type = verifyType(node.type);\n            var sibling = newNode(node.parent);\n            node.parent.components.push(sibling);\n            delete node.parent;\n            node = sibling;\n            break;\n          case \" \":\n            if (node.state.allowType) {\n              if (node.type !== \"\") {\n                node.type = verifyType(node.type);\n                delete node.state.allowType;\n                node.state.allowName = true;\n                node.state.allowParams = true;\n              }\n            }\n            if (node.state.allowName) {\n              if (node.name !== \"\") {\n                if (node.name === \"indexed\") {\n                  if (!allowIndexed) {\n                    throwError(i);\n                  }\n                  if (node.indexed) {\n                    throwError(i);\n                  }\n                  node.indexed = true;\n                  node.name = \"\";\n                } else if (checkModifier(node.type, node.name)) {\n                  node.name = \"\";\n                } else {\n                  node.state.allowName = false;\n                }\n              }\n            }\n            break;\n          case \"[\":\n            if (!node.state.allowArray) {\n              throwError(i);\n            }\n            node.type += c;\n            node.state.allowArray = false;\n            node.state.allowName = false;\n            node.state.readArray = true;\n            break;\n          case \"]\":\n            if (!node.state.readArray) {\n              throwError(i);\n            }\n            node.type += c;\n            node.state.readArray = false;\n            node.state.allowArray = true;\n            node.state.allowName = true;\n            break;\n          default:\n            if (node.state.allowType) {\n              node.type += c;\n              node.state.allowParams = true;\n              node.state.allowArray = true;\n            } else if (node.state.allowName) {\n              node.name += c;\n              delete node.state.allowArray;\n            } else if (node.state.readArray) {\n              node.type += c;\n            } else {\n              throwError(i);\n            }\n        }\n      }\n      if (node.parent) {\n        logger.throwArgumentError(\"unexpected eof\", \"param\", param);\n      }\n      delete parent.state;\n      if (node.name === \"indexed\") {\n        if (!allowIndexed) {\n          throwError(originalParam.length - 7);\n        }\n        if (node.indexed) {\n          throwError(originalParam.length - 7);\n        }\n        node.indexed = true;\n        node.name = \"\";\n      } else if (checkModifier(node.type, node.name)) {\n        node.name = \"\";\n      }\n      parent.type = verifyType(parent.type);\n      return parent;\n    }\n    function populate(object, params) {\n      for (var key in params) {\n        (0, properties_1.defineReadOnly)(object, key, params[key]);\n      }\n    }\n    exports2.FormatTypes = Object.freeze({\n      // Bare formatting, as is needed for computing a sighash of an event or function\n      sighash: \"sighash\",\n      // Human-Readable with Minimal spacing and without names (compact human-readable)\n      minimal: \"minimal\",\n      // Human-Readable with nice spacing, including all names\n      full: \"full\",\n      // JSON-format a la Solidity\n      json: \"json\"\n    });\n    var paramTypeArray = new RegExp(/^(.*)\\[([0-9]*)\\]$/);\n    var ParamType = (\n      /** @class */\n      function() {\n        function ParamType2(constructorGuard, params) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"use fromString\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new ParamType()\"\n            });\n          }\n          populate(this, params);\n          var match = this.type.match(paramTypeArray);\n          if (match) {\n            populate(this, {\n              arrayLength: parseInt(match[2] || \"-1\"),\n              arrayChildren: ParamType2.fromObject({\n                type: match[1],\n                components: this.components\n              }),\n              baseType: \"array\"\n            });\n          } else {\n            populate(this, {\n              arrayLength: null,\n              arrayChildren: null,\n              baseType: this.components != null ? \"tuple\" : this.type\n            });\n          }\n          this._isParamType = true;\n          Object.freeze(this);\n        }\n        ParamType2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            var result_1 = {\n              type: this.baseType === \"tuple\" ? \"tuple\" : this.type,\n              name: this.name || void 0\n            };\n            if (typeof this.indexed === \"boolean\") {\n              result_1.indexed = this.indexed;\n            }\n            if (this.components) {\n              result_1.components = this.components.map(function(comp) {\n                return JSON.parse(comp.format(format));\n              });\n            }\n            return JSON.stringify(result_1);\n          }\n          var result = \"\";\n          if (this.baseType === \"array\") {\n            result += this.arrayChildren.format(format);\n            result += \"[\" + (this.arrayLength < 0 ? \"\" : String(this.arrayLength)) + \"]\";\n          } else {\n            if (this.baseType === \"tuple\") {\n              if (format !== exports2.FormatTypes.sighash) {\n                result += this.type;\n              }\n              result += \"(\" + this.components.map(function(comp) {\n                return comp.format(format);\n              }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \")\";\n            } else {\n              result += this.type;\n            }\n          }\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.indexed === true) {\n              result += \" indexed\";\n            }\n            if (format === exports2.FormatTypes.full && this.name) {\n              result += \" \" + this.name;\n            }\n          }\n          return result;\n        };\n        ParamType2.from = function(value, allowIndexed) {\n          if (typeof value === \"string\") {\n            return ParamType2.fromString(value, allowIndexed);\n          }\n          return ParamType2.fromObject(value);\n        };\n        ParamType2.fromObject = function(value) {\n          if (ParamType2.isParamType(value)) {\n            return value;\n          }\n          return new ParamType2(_constructorGuard, {\n            name: value.name || null,\n            type: verifyType(value.type),\n            indexed: value.indexed == null ? null : !!value.indexed,\n            components: value.components ? value.components.map(ParamType2.fromObject) : null\n          });\n        };\n        ParamType2.fromString = function(value, allowIndexed) {\n          function ParamTypify(node) {\n            return ParamType2.fromObject({\n              name: node.name,\n              type: node.type,\n              indexed: node.indexed,\n              components: node.components\n            });\n          }\n          return ParamTypify(parseParamType(value, !!allowIndexed));\n        };\n        ParamType2.isParamType = function(value) {\n          return !!(value != null && value._isParamType);\n        };\n        return ParamType2;\n      }()\n    );\n    exports2.ParamType = ParamType;\n    function parseParams(value, allowIndex) {\n      return splitNesting(value).map(function(param) {\n        return ParamType.fromString(param, allowIndex);\n      });\n    }\n    var Fragment = (\n      /** @class */\n      function() {\n        function Fragment2(constructorGuard, params) {\n          if (constructorGuard !== _constructorGuard) {\n            logger.throwError(\"use a static from method\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"new Fragment()\"\n            });\n          }\n          populate(this, params);\n          this._isFragment = true;\n          Object.freeze(this);\n        }\n        Fragment2.from = function(value) {\n          if (Fragment2.isFragment(value)) {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            return Fragment2.fromString(value);\n          }\n          return Fragment2.fromObject(value);\n        };\n        Fragment2.fromObject = function(value) {\n          if (Fragment2.isFragment(value)) {\n            return value;\n          }\n          switch (value.type) {\n            case \"function\":\n              return FunctionFragment.fromObject(value);\n            case \"event\":\n              return EventFragment.fromObject(value);\n            case \"constructor\":\n              return ConstructorFragment.fromObject(value);\n            case \"error\":\n              return ErrorFragment.fromObject(value);\n            case \"fallback\":\n            case \"receive\":\n              return null;\n          }\n          return logger.throwArgumentError(\"invalid fragment object\", \"value\", value);\n        };\n        Fragment2.fromString = function(value) {\n          value = value.replace(/\\s/g, \" \");\n          value = value.replace(/\\(/g, \" (\").replace(/\\)/g, \") \").replace(/\\s+/g, \" \");\n          value = value.trim();\n          if (value.split(\" \")[0] === \"event\") {\n            return EventFragment.fromString(value.substring(5).trim());\n          } else if (value.split(\" \")[0] === \"function\") {\n            return FunctionFragment.fromString(value.substring(8).trim());\n          } else if (value.split(\"(\")[0].trim() === \"constructor\") {\n            return ConstructorFragment.fromString(value.trim());\n          } else if (value.split(\" \")[0] === \"error\") {\n            return ErrorFragment.fromString(value.substring(5).trim());\n          }\n          return logger.throwArgumentError(\"unsupported fragment\", \"value\", value);\n        };\n        Fragment2.isFragment = function(value) {\n          return !!(value && value._isFragment);\n        };\n        return Fragment2;\n      }()\n    );\n    exports2.Fragment = Fragment;\n    var EventFragment = (\n      /** @class */\n      function(_super) {\n        __extends(EventFragment2, _super);\n        function EventFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        EventFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"event\",\n              anonymous: this.anonymous,\n              name: this.name,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          var result = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result += \"event \";\n          }\n          result += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.anonymous) {\n              result += \"anonymous \";\n            }\n          }\n          return result.trim();\n        };\n        EventFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return EventFragment2.fromString(value);\n          }\n          return EventFragment2.fromObject(value);\n        };\n        EventFragment2.fromObject = function(value) {\n          if (EventFragment2.isEventFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"event\") {\n            logger.throwArgumentError(\"invalid event object\", \"value\", value);\n          }\n          var params = {\n            name: verifyIdentifier(value.name),\n            anonymous: value.anonymous,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            type: \"event\"\n          };\n          return new EventFragment2(_constructorGuard, params);\n        };\n        EventFragment2.fromString = function(value) {\n          var match = value.match(regexParen);\n          if (!match) {\n            logger.throwArgumentError(\"invalid event string\", \"value\", value);\n          }\n          var anonymous = false;\n          match[3].split(\" \").forEach(function(modifier) {\n            switch (modifier.trim()) {\n              case \"anonymous\":\n                anonymous = true;\n                break;\n              case \"\":\n                break;\n              default:\n                logger.warn(\"unknown modifier: \" + modifier);\n            }\n          });\n          return EventFragment2.fromObject({\n            name: match[1].trim(),\n            anonymous,\n            inputs: parseParams(match[2], true),\n            type: \"event\"\n          });\n        };\n        EventFragment2.isEventFragment = function(value) {\n          return value && value._isFragment && value.type === \"event\";\n        };\n        return EventFragment2;\n      }(Fragment)\n    );\n    exports2.EventFragment = EventFragment;\n    function parseGas(value, params) {\n      params.gas = null;\n      var comps = value.split(\"@\");\n      if (comps.length !== 1) {\n        if (comps.length > 2) {\n          logger.throwArgumentError(\"invalid human-readable ABI signature\", \"value\", value);\n        }\n        if (!comps[1].match(/^[0-9]+$/)) {\n          logger.throwArgumentError(\"invalid human-readable ABI signature gas\", \"value\", value);\n        }\n        params.gas = bignumber_1.BigNumber.from(comps[1]);\n        return comps[0];\n      }\n      return value;\n    }\n    function parseModifiers(value, params) {\n      params.constant = false;\n      params.payable = false;\n      params.stateMutability = \"nonpayable\";\n      value.split(\" \").forEach(function(modifier) {\n        switch (modifier.trim()) {\n          case \"constant\":\n            params.constant = true;\n            break;\n          case \"payable\":\n            params.payable = true;\n            params.stateMutability = \"payable\";\n            break;\n          case \"nonpayable\":\n            params.payable = false;\n            params.stateMutability = \"nonpayable\";\n            break;\n          case \"pure\":\n            params.constant = true;\n            params.stateMutability = \"pure\";\n            break;\n          case \"view\":\n            params.constant = true;\n            params.stateMutability = \"view\";\n            break;\n          case \"external\":\n          case \"public\":\n          case \"\":\n            break;\n          default:\n            console.log(\"unknown modifier: \" + modifier);\n        }\n      });\n    }\n    function verifyState(value) {\n      var result = {\n        constant: false,\n        payable: true,\n        stateMutability: \"payable\"\n      };\n      if (value.stateMutability != null) {\n        result.stateMutability = value.stateMutability;\n        result.constant = result.stateMutability === \"view\" || result.stateMutability === \"pure\";\n        if (value.constant != null) {\n          if (!!value.constant !== result.constant) {\n            logger.throwArgumentError(\"cannot have constant function with mutability \" + result.stateMutability, \"value\", value);\n          }\n        }\n        result.payable = result.stateMutability === \"payable\";\n        if (value.payable != null) {\n          if (!!value.payable !== result.payable) {\n            logger.throwArgumentError(\"cannot have payable function with mutability \" + result.stateMutability, \"value\", value);\n          }\n        }\n      } else if (value.payable != null) {\n        result.payable = !!value.payable;\n        if (value.constant == null && !result.payable && value.type !== \"constructor\") {\n          logger.throwArgumentError(\"unable to determine stateMutability\", \"value\", value);\n        }\n        result.constant = !!value.constant;\n        if (result.constant) {\n          result.stateMutability = \"view\";\n        } else {\n          result.stateMutability = result.payable ? \"payable\" : \"nonpayable\";\n        }\n        if (result.payable && result.constant) {\n          logger.throwArgumentError(\"cannot have constant payable function\", \"value\", value);\n        }\n      } else if (value.constant != null) {\n        result.constant = !!value.constant;\n        result.payable = !result.constant;\n        result.stateMutability = result.constant ? \"view\" : \"payable\";\n      } else if (value.type !== \"constructor\") {\n        logger.throwArgumentError(\"unable to determine stateMutability\", \"value\", value);\n      }\n      return result;\n    }\n    var ConstructorFragment = (\n      /** @class */\n      function(_super) {\n        __extends(ConstructorFragment2, _super);\n        function ConstructorFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ConstructorFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"constructor\",\n              stateMutability: this.stateMutability !== \"nonpayable\" ? this.stateMutability : void 0,\n              payable: this.payable,\n              gas: this.gas ? this.gas.toNumber() : void 0,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          if (format === exports2.FormatTypes.sighash) {\n            logger.throwError(\"cannot format a constructor for sighash\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"format(sighash)\"\n            });\n          }\n          var result = \"constructor(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (this.stateMutability && this.stateMutability !== \"nonpayable\") {\n            result += this.stateMutability + \" \";\n          }\n          return result.trim();\n        };\n        ConstructorFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return ConstructorFragment2.fromString(value);\n          }\n          return ConstructorFragment2.fromObject(value);\n        };\n        ConstructorFragment2.fromObject = function(value) {\n          if (ConstructorFragment2.isConstructorFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"constructor\") {\n            logger.throwArgumentError(\"invalid constructor object\", \"value\", value);\n          }\n          var state = verifyState(value);\n          if (state.constant) {\n            logger.throwArgumentError(\"constructor cannot be constant\", \"value\", value);\n          }\n          var params = {\n            name: null,\n            type: value.type,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            payable: state.payable,\n            stateMutability: state.stateMutability,\n            gas: value.gas ? bignumber_1.BigNumber.from(value.gas) : null\n          };\n          return new ConstructorFragment2(_constructorGuard, params);\n        };\n        ConstructorFragment2.fromString = function(value) {\n          var params = { type: \"constructor\" };\n          value = parseGas(value, params);\n          var parens = value.match(regexParen);\n          if (!parens || parens[1].trim() !== \"constructor\") {\n            logger.throwArgumentError(\"invalid constructor string\", \"value\", value);\n          }\n          params.inputs = parseParams(parens[2].trim(), false);\n          parseModifiers(parens[3].trim(), params);\n          return ConstructorFragment2.fromObject(params);\n        };\n        ConstructorFragment2.isConstructorFragment = function(value) {\n          return value && value._isFragment && value.type === \"constructor\";\n        };\n        return ConstructorFragment2;\n      }(Fragment)\n    );\n    exports2.ConstructorFragment = ConstructorFragment;\n    var FunctionFragment = (\n      /** @class */\n      function(_super) {\n        __extends(FunctionFragment2, _super);\n        function FunctionFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        FunctionFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"function\",\n              name: this.name,\n              constant: this.constant,\n              stateMutability: this.stateMutability !== \"nonpayable\" ? this.stateMutability : void 0,\n              payable: this.payable,\n              gas: this.gas ? this.gas.toNumber() : void 0,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              }),\n              outputs: this.outputs.map(function(output) {\n                return JSON.parse(output.format(format));\n              })\n            });\n          }\n          var result = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result += \"function \";\n          }\n          result += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          if (format !== exports2.FormatTypes.sighash) {\n            if (this.stateMutability) {\n              if (this.stateMutability !== \"nonpayable\") {\n                result += this.stateMutability + \" \";\n              }\n            } else if (this.constant) {\n              result += \"view \";\n            }\n            if (this.outputs && this.outputs.length) {\n              result += \"returns (\" + this.outputs.map(function(output) {\n                return output.format(format);\n              }).join(\", \") + \") \";\n            }\n            if (this.gas != null) {\n              result += \"@\" + this.gas.toString() + \" \";\n            }\n          }\n          return result.trim();\n        };\n        FunctionFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return FunctionFragment2.fromString(value);\n          }\n          return FunctionFragment2.fromObject(value);\n        };\n        FunctionFragment2.fromObject = function(value) {\n          if (FunctionFragment2.isFunctionFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"function\") {\n            logger.throwArgumentError(\"invalid function object\", \"value\", value);\n          }\n          var state = verifyState(value);\n          var params = {\n            type: value.type,\n            name: verifyIdentifier(value.name),\n            constant: state.constant,\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : [],\n            outputs: value.outputs ? value.outputs.map(ParamType.fromObject) : [],\n            payable: state.payable,\n            stateMutability: state.stateMutability,\n            gas: value.gas ? bignumber_1.BigNumber.from(value.gas) : null\n          };\n          return new FunctionFragment2(_constructorGuard, params);\n        };\n        FunctionFragment2.fromString = function(value) {\n          var params = { type: \"function\" };\n          value = parseGas(value, params);\n          var comps = value.split(\" returns \");\n          if (comps.length > 2) {\n            logger.throwArgumentError(\"invalid function string\", \"value\", value);\n          }\n          var parens = comps[0].match(regexParen);\n          if (!parens) {\n            logger.throwArgumentError(\"invalid function signature\", \"value\", value);\n          }\n          params.name = parens[1].trim();\n          if (params.name) {\n            verifyIdentifier(params.name);\n          }\n          params.inputs = parseParams(parens[2], false);\n          parseModifiers(parens[3].trim(), params);\n          if (comps.length > 1) {\n            var returns = comps[1].match(regexParen);\n            if (returns[1].trim() != \"\" || returns[3].trim() != \"\") {\n              logger.throwArgumentError(\"unexpected tokens\", \"value\", value);\n            }\n            params.outputs = parseParams(returns[2], false);\n          } else {\n            params.outputs = [];\n          }\n          return FunctionFragment2.fromObject(params);\n        };\n        FunctionFragment2.isFunctionFragment = function(value) {\n          return value && value._isFragment && value.type === \"function\";\n        };\n        return FunctionFragment2;\n      }(ConstructorFragment)\n    );\n    exports2.FunctionFragment = FunctionFragment;\n    function checkForbidden(fragment) {\n      var sig = fragment.format();\n      if (sig === \"Error(string)\" || sig === \"Panic(uint256)\") {\n        logger.throwArgumentError(\"cannot specify user defined \" + sig + \" error\", \"fragment\", fragment);\n      }\n      return fragment;\n    }\n    var ErrorFragment = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorFragment2, _super);\n        function ErrorFragment2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ErrorFragment2.prototype.format = function(format) {\n          if (!format) {\n            format = exports2.FormatTypes.sighash;\n          }\n          if (!exports2.FormatTypes[format]) {\n            logger.throwArgumentError(\"invalid format type\", \"format\", format);\n          }\n          if (format === exports2.FormatTypes.json) {\n            return JSON.stringify({\n              type: \"error\",\n              name: this.name,\n              inputs: this.inputs.map(function(input) {\n                return JSON.parse(input.format(format));\n              })\n            });\n          }\n          var result = \"\";\n          if (format !== exports2.FormatTypes.sighash) {\n            result += \"error \";\n          }\n          result += this.name + \"(\" + this.inputs.map(function(input) {\n            return input.format(format);\n          }).join(format === exports2.FormatTypes.full ? \", \" : \",\") + \") \";\n          return result.trim();\n        };\n        ErrorFragment2.from = function(value) {\n          if (typeof value === \"string\") {\n            return ErrorFragment2.fromString(value);\n          }\n          return ErrorFragment2.fromObject(value);\n        };\n        ErrorFragment2.fromObject = function(value) {\n          if (ErrorFragment2.isErrorFragment(value)) {\n            return value;\n          }\n          if (value.type !== \"error\") {\n            logger.throwArgumentError(\"invalid error object\", \"value\", value);\n          }\n          var params = {\n            type: value.type,\n            name: verifyIdentifier(value.name),\n            inputs: value.inputs ? value.inputs.map(ParamType.fromObject) : []\n          };\n          return checkForbidden(new ErrorFragment2(_constructorGuard, params));\n        };\n        ErrorFragment2.fromString = function(value) {\n          var params = { type: \"error\" };\n          var parens = value.match(regexParen);\n          if (!parens) {\n            logger.throwArgumentError(\"invalid error signature\", \"value\", value);\n          }\n          params.name = parens[1].trim();\n          if (params.name) {\n            verifyIdentifier(params.name);\n          }\n          params.inputs = parseParams(parens[2], false);\n          return checkForbidden(ErrorFragment2.fromObject(params));\n        };\n        ErrorFragment2.isErrorFragment = function(value) {\n          return value && value._isFragment && value.type === \"error\";\n        };\n        return ErrorFragment2;\n      }(Fragment)\n    );\n    exports2.ErrorFragment = ErrorFragment;\n    function verifyType(type) {\n      if (type.match(/^uint($|[^1-9])/)) {\n        type = \"uint256\" + type.substring(4);\n      } else if (type.match(/^int($|[^1-9])/)) {\n        type = \"int256\" + type.substring(3);\n      }\n      return type;\n    }\n    var regexIdentifier = new RegExp(\"^[a-zA-Z$_][a-zA-Z0-9$_]*$\");\n    function verifyIdentifier(value) {\n      if (!value || !value.match(regexIdentifier)) {\n        logger.throwArgumentError('invalid identifier \"' + value + '\"', \"value\", value);\n      }\n      return value;\n    }\n    var regexParen = new RegExp(\"^([^)(]*)\\\\((.*)\\\\)([^)(]*)$\");\n    function splitNesting(value) {\n      value = value.trim();\n      var result = [];\n      var accum = \"\";\n      var depth = 0;\n      for (var offset = 0; offset < value.length; offset++) {\n        var c = value[offset];\n        if (c === \",\" && depth === 0) {\n          result.push(accum);\n          accum = \"\";\n        } else {\n          accum += c;\n          if (c === \"(\") {\n            depth++;\n          } else if (c === \")\") {\n            depth--;\n            if (depth === -1) {\n              logger.throwArgumentError(\"unbalanced parenthesis\", \"value\", value);\n            }\n          }\n        }\n      }\n      if (accum) {\n        result.push(accum);\n      }\n      return result;\n    }\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/abstract-coder.js\nvar require_abstract_coder = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/abstract-coder.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Reader = exports2.Writer = exports2.Coder = exports2.checkResultErrors = void 0;\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    function checkResultErrors(result) {\n      var errors = [];\n      var checkErrors = function(path, object) {\n        if (!Array.isArray(object)) {\n          return;\n        }\n        for (var key in object) {\n          var childPath = path.slice();\n          childPath.push(key);\n          try {\n            checkErrors(childPath, object[key]);\n          } catch (error) {\n            errors.push({ path: childPath, error });\n          }\n        }\n      };\n      checkErrors([], result);\n      return errors;\n    }\n    exports2.checkResultErrors = checkResultErrors;\n    var Coder = (\n      /** @class */\n      function() {\n        function Coder2(name2, type, localName, dynamic) {\n          this.name = name2;\n          this.type = type;\n          this.localName = localName;\n          this.dynamic = dynamic;\n        }\n        Coder2.prototype._throwError = function(message, value) {\n          logger.throwArgumentError(message, this.localName, value);\n        };\n        return Coder2;\n      }()\n    );\n    exports2.Coder = Coder;\n    var Writer = (\n      /** @class */\n      function() {\n        function Writer2(wordSize) {\n          (0, properties_1.defineReadOnly)(this, \"wordSize\", wordSize || 32);\n          this._data = [];\n          this._dataLength = 0;\n          this._padding = new Uint8Array(wordSize);\n        }\n        Object.defineProperty(Writer2.prototype, \"data\", {\n          get: function() {\n            return (0, bytes_1.hexConcat)(this._data);\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Writer2.prototype, \"length\", {\n          get: function() {\n            return this._dataLength;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Writer2.prototype._writeData = function(data) {\n          this._data.push(data);\n          this._dataLength += data.length;\n          return data.length;\n        };\n        Writer2.prototype.appendWriter = function(writer) {\n          return this._writeData((0, bytes_1.concat)(writer._data));\n        };\n        Writer2.prototype.writeBytes = function(value) {\n          var bytes = (0, bytes_1.arrayify)(value);\n          var paddingOffset = bytes.length % this.wordSize;\n          if (paddingOffset) {\n            bytes = (0, bytes_1.concat)([bytes, this._padding.slice(paddingOffset)]);\n          }\n          return this._writeData(bytes);\n        };\n        Writer2.prototype._getValue = function(value) {\n          var bytes = (0, bytes_1.arrayify)(bignumber_1.BigNumber.from(value));\n          if (bytes.length > this.wordSize) {\n            logger.throwError(\"value out-of-bounds\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n              length: this.wordSize,\n              offset: bytes.length\n            });\n          }\n          if (bytes.length % this.wordSize) {\n            bytes = (0, bytes_1.concat)([this._padding.slice(bytes.length % this.wordSize), bytes]);\n          }\n          return bytes;\n        };\n        Writer2.prototype.writeValue = function(value) {\n          return this._writeData(this._getValue(value));\n        };\n        Writer2.prototype.writeUpdatableValue = function() {\n          var _this = this;\n          var offset = this._data.length;\n          this._data.push(this._padding);\n          this._dataLength += this.wordSize;\n          return function(value) {\n            _this._data[offset] = _this._getValue(value);\n          };\n        };\n        return Writer2;\n      }()\n    );\n    exports2.Writer = Writer;\n    var Reader = (\n      /** @class */\n      function() {\n        function Reader2(data, wordSize, coerceFunc, allowLoose) {\n          (0, properties_1.defineReadOnly)(this, \"_data\", (0, bytes_1.arrayify)(data));\n          (0, properties_1.defineReadOnly)(this, \"wordSize\", wordSize || 32);\n          (0, properties_1.defineReadOnly)(this, \"_coerceFunc\", coerceFunc);\n          (0, properties_1.defineReadOnly)(this, \"allowLoose\", allowLoose);\n          this._offset = 0;\n        }\n        Object.defineProperty(Reader2.prototype, \"data\", {\n          get: function() {\n            return (0, bytes_1.hexlify)(this._data);\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Reader2.prototype, \"consumed\", {\n          get: function() {\n            return this._offset;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Reader2.coerce = function(name2, value) {\n          var match = name2.match(\"^u?int([0-9]+)$\");\n          if (match && parseInt(match[1]) <= 48) {\n            value = value.toNumber();\n          }\n          return value;\n        };\n        Reader2.prototype.coerce = function(name2, value) {\n          if (this._coerceFunc) {\n            return this._coerceFunc(name2, value);\n          }\n          return Reader2.coerce(name2, value);\n        };\n        Reader2.prototype._peekBytes = function(offset, length, loose) {\n          var alignedLength = Math.ceil(length / this.wordSize) * this.wordSize;\n          if (this._offset + alignedLength > this._data.length) {\n            if (this.allowLoose && loose && this._offset + length <= this._data.length) {\n              alignedLength = length;\n            } else {\n              logger.throwError(\"data out-of-bounds\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n                length: this._data.length,\n                offset: this._offset + alignedLength\n              });\n            }\n          }\n          return this._data.slice(this._offset, this._offset + alignedLength);\n        };\n        Reader2.prototype.subReader = function(offset) {\n          return new Reader2(this._data.slice(this._offset + offset), this.wordSize, this._coerceFunc, this.allowLoose);\n        };\n        Reader2.prototype.readBytes = function(length, loose) {\n          var bytes = this._peekBytes(0, length, !!loose);\n          this._offset += bytes.length;\n          return bytes.slice(0, length);\n        };\n        Reader2.prototype.readValue = function() {\n          return bignumber_1.BigNumber.from(this.readBytes(this.wordSize));\n        };\n        return Reader2;\n      }()\n    );\n    exports2.Reader = Reader;\n  }\n});\n\n// node_modules/js-sha3/src/sha3.js\nvar require_sha3 = __commonJS({\n  \"node_modules/js-sha3/src/sha3.js\"(exports2, module2) {\n    (function() {\n      \"use strict\";\n      var INPUT_ERROR = \"input is invalid type\";\n      var FINALIZE_ERROR = \"finalize already called\";\n      var WINDOW = typeof window === \"object\";\n      var root = WINDOW ? window : {};\n      if (root.JS_SHA3_NO_WINDOW) {\n        WINDOW = false;\n      }\n      var WEB_WORKER = !WINDOW && typeof self === \"object\";\n      var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === \"object\" && process.versions && process.versions.node;\n      if (NODE_JS) {\n        root = global;\n      } else if (WEB_WORKER) {\n        root = self;\n      }\n      var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module2 === \"object\" && module2.exports;\n      var AMD = typeof define === \"function\" && define.amd;\n      var ARRAY_BUFFER = !root.JS_SHA3_NO_ARRAY_BUFFER && typeof ArrayBuffer !== \"undefined\";\n      var HEX_CHARS = \"0123456789abcdef\".split(\"\");\n      var SHAKE_PADDING = [31, 7936, 2031616, 520093696];\n      var CSHAKE_PADDING = [4, 1024, 262144, 67108864];\n      var KECCAK_PADDING = [1, 256, 65536, 16777216];\n      var PADDING = [6, 1536, 393216, 100663296];\n      var SHIFT = [0, 8, 16, 24];\n      var RC = [\n        1,\n        0,\n        32898,\n        0,\n        32906,\n        2147483648,\n        2147516416,\n        2147483648,\n        32907,\n        0,\n        2147483649,\n        0,\n        2147516545,\n        2147483648,\n        32777,\n        2147483648,\n        138,\n        0,\n        136,\n        0,\n        2147516425,\n        0,\n        2147483658,\n        0,\n        2147516555,\n        0,\n        139,\n        2147483648,\n        32905,\n        2147483648,\n        32771,\n        2147483648,\n        32770,\n        2147483648,\n        128,\n        2147483648,\n        32778,\n        0,\n        2147483658,\n        2147483648,\n        2147516545,\n        2147483648,\n        32896,\n        2147483648,\n        2147483649,\n        0,\n        2147516424,\n        2147483648\n      ];\n      var BITS = [224, 256, 384, 512];\n      var SHAKE_BITS = [128, 256];\n      var OUTPUT_TYPES = [\"hex\", \"buffer\", \"arrayBuffer\", \"array\", \"digest\"];\n      var CSHAKE_BYTEPAD = {\n        \"128\": 168,\n        \"256\": 136\n      };\n      if (root.JS_SHA3_NO_NODE_JS || !Array.isArray) {\n        Array.isArray = function(obj) {\n          return Object.prototype.toString.call(obj) === \"[object Array]\";\n        };\n      }\n      if (ARRAY_BUFFER && (root.JS_SHA3_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {\n        ArrayBuffer.isView = function(obj) {\n          return typeof obj === \"object\" && obj.buffer && obj.buffer.constructor === ArrayBuffer;\n        };\n      }\n      var createOutputMethod = function(bits2, padding, outputType) {\n        return function(message) {\n          return new Keccak(bits2, padding, bits2).update(message)[outputType]();\n        };\n      };\n      var createShakeOutputMethod = function(bits2, padding, outputType) {\n        return function(message, outputBits) {\n          return new Keccak(bits2, padding, outputBits).update(message)[outputType]();\n        };\n      };\n      var createCshakeOutputMethod = function(bits2, padding, outputType) {\n        return function(message, outputBits, n, s) {\n          return methods[\"cshake\" + bits2].update(message, outputBits, n, s)[outputType]();\n        };\n      };\n      var createKmacOutputMethod = function(bits2, padding, outputType) {\n        return function(key, message, outputBits, s) {\n          return methods[\"kmac\" + bits2].update(key, message, outputBits, s)[outputType]();\n        };\n      };\n      var createOutputMethods = function(method, createMethod2, bits2, padding) {\n        for (var i2 = 0; i2 < OUTPUT_TYPES.length; ++i2) {\n          var type = OUTPUT_TYPES[i2];\n          method[type] = createMethod2(bits2, padding, type);\n        }\n        return method;\n      };\n      var createMethod = function(bits2, padding) {\n        var method = createOutputMethod(bits2, padding, \"hex\");\n        method.create = function() {\n          return new Keccak(bits2, padding, bits2);\n        };\n        method.update = function(message) {\n          return method.create().update(message);\n        };\n        return createOutputMethods(method, createOutputMethod, bits2, padding);\n      };\n      var createShakeMethod = function(bits2, padding) {\n        var method = createShakeOutputMethod(bits2, padding, \"hex\");\n        method.create = function(outputBits) {\n          return new Keccak(bits2, padding, outputBits);\n        };\n        method.update = function(message, outputBits) {\n          return method.create(outputBits).update(message);\n        };\n        return createOutputMethods(method, createShakeOutputMethod, bits2, padding);\n      };\n      var createCshakeMethod = function(bits2, padding) {\n        var w = CSHAKE_BYTEPAD[bits2];\n        var method = createCshakeOutputMethod(bits2, padding, \"hex\");\n        method.create = function(outputBits, n, s) {\n          if (!n && !s) {\n            return methods[\"shake\" + bits2].create(outputBits);\n          } else {\n            return new Keccak(bits2, padding, outputBits).bytepad([n, s], w);\n          }\n        };\n        method.update = function(message, outputBits, n, s) {\n          return method.create(outputBits, n, s).update(message);\n        };\n        return createOutputMethods(method, createCshakeOutputMethod, bits2, padding);\n      };\n      var createKmacMethod = function(bits2, padding) {\n        var w = CSHAKE_BYTEPAD[bits2];\n        var method = createKmacOutputMethod(bits2, padding, \"hex\");\n        method.create = function(key, outputBits, s) {\n          return new Kmac(bits2, padding, outputBits).bytepad([\"KMAC\", s], w).bytepad([key], w);\n        };\n        method.update = function(key, message, outputBits, s) {\n          return method.create(key, outputBits, s).update(message);\n        };\n        return createOutputMethods(method, createKmacOutputMethod, bits2, padding);\n      };\n      var algorithms = [\n        { name: \"keccak\", padding: KECCAK_PADDING, bits: BITS, createMethod },\n        { name: \"sha3\", padding: PADDING, bits: BITS, createMethod },\n        { name: \"shake\", padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod },\n        { name: \"cshake\", padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createCshakeMethod },\n        { name: \"kmac\", padding: CSHAKE_PADDING, bits: SHAKE_BITS, createMethod: createKmacMethod }\n      ];\n      var methods = {}, methodNames = [];\n      for (var i = 0; i < algorithms.length; ++i) {\n        var algorithm = algorithms[i];\n        var bits = algorithm.bits;\n        for (var j = 0; j < bits.length; ++j) {\n          var methodName = algorithm.name + \"_\" + bits[j];\n          methodNames.push(methodName);\n          methods[methodName] = algorithm.createMethod(bits[j], algorithm.padding);\n          if (algorithm.name !== \"sha3\") {\n            var newMethodName = algorithm.name + bits[j];\n            methodNames.push(newMethodName);\n            methods[newMethodName] = methods[methodName];\n          }\n        }\n      }\n      function Keccak(bits2, padding, outputBits) {\n        this.blocks = [];\n        this.s = [];\n        this.padding = padding;\n        this.outputBits = outputBits;\n        this.reset = true;\n        this.finalized = false;\n        this.block = 0;\n        this.start = 0;\n        this.blockCount = 1600 - (bits2 << 1) >> 5;\n        this.byteCount = this.blockCount << 2;\n        this.outputBlocks = outputBits >> 5;\n        this.extraBytes = (outputBits & 31) >> 3;\n        for (var i2 = 0; i2 < 50; ++i2) {\n          this.s[i2] = 0;\n        }\n      }\n      Keccak.prototype.update = function(message) {\n        if (this.finalized) {\n          throw new Error(FINALIZE_ERROR);\n        }\n        var notString, type = typeof message;\n        if (type !== \"string\") {\n          if (type === \"object\") {\n            if (message === null) {\n              throw new Error(INPUT_ERROR);\n            } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {\n              message = new Uint8Array(message);\n            } else if (!Array.isArray(message)) {\n              if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {\n                throw new Error(INPUT_ERROR);\n              }\n            }\n          } else {\n            throw new Error(INPUT_ERROR);\n          }\n          notString = true;\n        }\n        var blocks = this.blocks, byteCount = this.byteCount, length = message.length, blockCount = this.blockCount, index = 0, s = this.s, i2, code;\n        while (index < length) {\n          if (this.reset) {\n            this.reset = false;\n            blocks[0] = this.block;\n            for (i2 = 1; i2 < blockCount + 1; ++i2) {\n              blocks[i2] = 0;\n            }\n          }\n          if (notString) {\n            for (i2 = this.start; index < length && i2 < byteCount; ++index) {\n              blocks[i2 >> 2] |= message[index] << SHIFT[i2++ & 3];\n            }\n          } else {\n            for (i2 = this.start; index < length && i2 < byteCount; ++index) {\n              code = message.charCodeAt(index);\n              if (code < 128) {\n                blocks[i2 >> 2] |= code << SHIFT[i2++ & 3];\n              } else if (code < 2048) {\n                blocks[i2 >> 2] |= (192 | code >> 6) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              } else if (code < 55296 || code >= 57344) {\n                blocks[i2 >> 2] |= (224 | code >> 12) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 6 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              } else {\n                code = 65536 + ((code & 1023) << 10 | message.charCodeAt(++index) & 1023);\n                blocks[i2 >> 2] |= (240 | code >> 18) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 12 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code >> 6 & 63) << SHIFT[i2++ & 3];\n                blocks[i2 >> 2] |= (128 | code & 63) << SHIFT[i2++ & 3];\n              }\n            }\n          }\n          this.lastByteIndex = i2;\n          if (i2 >= byteCount) {\n            this.start = i2 - byteCount;\n            this.block = blocks[blockCount];\n            for (i2 = 0; i2 < blockCount; ++i2) {\n              s[i2] ^= blocks[i2];\n            }\n            f(s);\n            this.reset = true;\n          } else {\n            this.start = i2;\n          }\n        }\n        return this;\n      };\n      Keccak.prototype.encode = function(x, right) {\n        var o = x & 255, n = 1;\n        var bytes = [o];\n        x = x >> 8;\n        o = x & 255;\n        while (o > 0) {\n          bytes.unshift(o);\n          x = x >> 8;\n          o = x & 255;\n          ++n;\n        }\n        if (right) {\n          bytes.push(n);\n        } else {\n          bytes.unshift(n);\n        }\n        this.update(bytes);\n        return bytes.length;\n      };\n      Keccak.prototype.encodeString = function(str) {\n        var notString, type = typeof str;\n        if (type !== \"string\") {\n          if (type === \"object\") {\n            if (str === null) {\n              throw new Error(INPUT_ERROR);\n            } else if (ARRAY_BUFFER && str.constructor === ArrayBuffer) {\n              str = new Uint8Array(str);\n            } else if (!Array.isArray(str)) {\n              if (!ARRAY_BUFFER || !ArrayBuffer.isView(str)) {\n                throw new Error(INPUT_ERROR);\n              }\n            }\n          } else {\n            throw new Error(INPUT_ERROR);\n          }\n          notString = true;\n        }\n        var bytes = 0, length = str.length;\n        if (notString) {\n          bytes = length;\n        } else {\n          for (var i2 = 0; i2 < str.length; ++i2) {\n            var code = str.charCodeAt(i2);\n            if (code < 128) {\n              bytes += 1;\n            } else if (code < 2048) {\n              bytes += 2;\n            } else if (code < 55296 || code >= 57344) {\n              bytes += 3;\n            } else {\n              code = 65536 + ((code & 1023) << 10 | str.charCodeAt(++i2) & 1023);\n              bytes += 4;\n            }\n          }\n        }\n        bytes += this.encode(bytes * 8);\n        this.update(str);\n        return bytes;\n      };\n      Keccak.prototype.bytepad = function(strs, w) {\n        var bytes = this.encode(w);\n        for (var i2 = 0; i2 < strs.length; ++i2) {\n          bytes += this.encodeString(strs[i2]);\n        }\n        var paddingBytes = w - bytes % w;\n        var zeros = [];\n        zeros.length = paddingBytes;\n        this.update(zeros);\n        return this;\n      };\n      Keccak.prototype.finalize = function() {\n        if (this.finalized) {\n          return;\n        }\n        this.finalized = true;\n        var blocks = this.blocks, i2 = this.lastByteIndex, blockCount = this.blockCount, s = this.s;\n        blocks[i2 >> 2] |= this.padding[i2 & 3];\n        if (this.lastByteIndex === this.byteCount) {\n          blocks[0] = blocks[blockCount];\n          for (i2 = 1; i2 < blockCount + 1; ++i2) {\n            blocks[i2] = 0;\n          }\n        }\n        blocks[blockCount - 1] |= 2147483648;\n        for (i2 = 0; i2 < blockCount; ++i2) {\n          s[i2] ^= blocks[i2];\n        }\n        f(s);\n      };\n      Keccak.prototype.toString = Keccak.prototype.hex = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var hex = \"\", block;\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            block = s[i2];\n            hex += HEX_CHARS[block >> 4 & 15] + HEX_CHARS[block & 15] + HEX_CHARS[block >> 12 & 15] + HEX_CHARS[block >> 8 & 15] + HEX_CHARS[block >> 20 & 15] + HEX_CHARS[block >> 16 & 15] + HEX_CHARS[block >> 28 & 15] + HEX_CHARS[block >> 24 & 15];\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n            i2 = 0;\n          }\n        }\n        if (extraBytes) {\n          block = s[i2];\n          hex += HEX_CHARS[block >> 4 & 15] + HEX_CHARS[block & 15];\n          if (extraBytes > 1) {\n            hex += HEX_CHARS[block >> 12 & 15] + HEX_CHARS[block >> 8 & 15];\n          }\n          if (extraBytes > 2) {\n            hex += HEX_CHARS[block >> 20 & 15] + HEX_CHARS[block >> 16 & 15];\n          }\n        }\n        return hex;\n      };\n      Keccak.prototype.arrayBuffer = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var bytes = this.outputBits >> 3;\n        var buffer;\n        if (extraBytes) {\n          buffer = new ArrayBuffer(outputBlocks + 1 << 2);\n        } else {\n          buffer = new ArrayBuffer(bytes);\n        }\n        var array = new Uint32Array(buffer);\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            array[j2] = s[i2];\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n          }\n        }\n        if (extraBytes) {\n          array[i2] = s[i2];\n          buffer = buffer.slice(0, bytes);\n        }\n        return buffer;\n      };\n      Keccak.prototype.buffer = Keccak.prototype.arrayBuffer;\n      Keccak.prototype.digest = Keccak.prototype.array = function() {\n        this.finalize();\n        var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, extraBytes = this.extraBytes, i2 = 0, j2 = 0;\n        var array = [], offset, block;\n        while (j2 < outputBlocks) {\n          for (i2 = 0; i2 < blockCount && j2 < outputBlocks; ++i2, ++j2) {\n            offset = j2 << 2;\n            block = s[i2];\n            array[offset] = block & 255;\n            array[offset + 1] = block >> 8 & 255;\n            array[offset + 2] = block >> 16 & 255;\n            array[offset + 3] = block >> 24 & 255;\n          }\n          if (j2 % blockCount === 0) {\n            f(s);\n          }\n        }\n        if (extraBytes) {\n          offset = j2 << 2;\n          block = s[i2];\n          array[offset] = block & 255;\n          if (extraBytes > 1) {\n            array[offset + 1] = block >> 8 & 255;\n          }\n          if (extraBytes > 2) {\n            array[offset + 2] = block >> 16 & 255;\n          }\n        }\n        return array;\n      };\n      function Kmac(bits2, padding, outputBits) {\n        Keccak.call(this, bits2, padding, outputBits);\n      }\n      Kmac.prototype = new Keccak();\n      Kmac.prototype.finalize = function() {\n        this.encode(this.outputBits, true);\n        return Keccak.prototype.finalize.call(this);\n      };\n      var f = function(s) {\n        var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;\n        for (n = 0; n < 48; n += 2) {\n          c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];\n          c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];\n          c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];\n          c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];\n          c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];\n          c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];\n          c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];\n          c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];\n          c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];\n          c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];\n          h = c8 ^ (c2 << 1 | c3 >>> 31);\n          l = c9 ^ (c3 << 1 | c2 >>> 31);\n          s[0] ^= h;\n          s[1] ^= l;\n          s[10] ^= h;\n          s[11] ^= l;\n          s[20] ^= h;\n          s[21] ^= l;\n          s[30] ^= h;\n          s[31] ^= l;\n          s[40] ^= h;\n          s[41] ^= l;\n          h = c0 ^ (c4 << 1 | c5 >>> 31);\n          l = c1 ^ (c5 << 1 | c4 >>> 31);\n          s[2] ^= h;\n          s[3] ^= l;\n          s[12] ^= h;\n          s[13] ^= l;\n          s[22] ^= h;\n          s[23] ^= l;\n          s[32] ^= h;\n          s[33] ^= l;\n          s[42] ^= h;\n          s[43] ^= l;\n          h = c2 ^ (c6 << 1 | c7 >>> 31);\n          l = c3 ^ (c7 << 1 | c6 >>> 31);\n          s[4] ^= h;\n          s[5] ^= l;\n          s[14] ^= h;\n          s[15] ^= l;\n          s[24] ^= h;\n          s[25] ^= l;\n          s[34] ^= h;\n          s[35] ^= l;\n          s[44] ^= h;\n          s[45] ^= l;\n          h = c4 ^ (c8 << 1 | c9 >>> 31);\n          l = c5 ^ (c9 << 1 | c8 >>> 31);\n          s[6] ^= h;\n          s[7] ^= l;\n          s[16] ^= h;\n          s[17] ^= l;\n          s[26] ^= h;\n          s[27] ^= l;\n          s[36] ^= h;\n          s[37] ^= l;\n          s[46] ^= h;\n          s[47] ^= l;\n          h = c6 ^ (c0 << 1 | c1 >>> 31);\n          l = c7 ^ (c1 << 1 | c0 >>> 31);\n          s[8] ^= h;\n          s[9] ^= l;\n          s[18] ^= h;\n          s[19] ^= l;\n          s[28] ^= h;\n          s[29] ^= l;\n          s[38] ^= h;\n          s[39] ^= l;\n          s[48] ^= h;\n          s[49] ^= l;\n          b0 = s[0];\n          b1 = s[1];\n          b32 = s[11] << 4 | s[10] >>> 28;\n          b33 = s[10] << 4 | s[11] >>> 28;\n          b14 = s[20] << 3 | s[21] >>> 29;\n          b15 = s[21] << 3 | s[20] >>> 29;\n          b46 = s[31] << 9 | s[30] >>> 23;\n          b47 = s[30] << 9 | s[31] >>> 23;\n          b28 = s[40] << 18 | s[41] >>> 14;\n          b29 = s[41] << 18 | s[40] >>> 14;\n          b20 = s[2] << 1 | s[3] >>> 31;\n          b21 = s[3] << 1 | s[2] >>> 31;\n          b2 = s[13] << 12 | s[12] >>> 20;\n          b3 = s[12] << 12 | s[13] >>> 20;\n          b34 = s[22] << 10 | s[23] >>> 22;\n          b35 = s[23] << 10 | s[22] >>> 22;\n          b16 = s[33] << 13 | s[32] >>> 19;\n          b17 = s[32] << 13 | s[33] >>> 19;\n          b48 = s[42] << 2 | s[43] >>> 30;\n          b49 = s[43] << 2 | s[42] >>> 30;\n          b40 = s[5] << 30 | s[4] >>> 2;\n          b41 = s[4] << 30 | s[5] >>> 2;\n          b22 = s[14] << 6 | s[15] >>> 26;\n          b23 = s[15] << 6 | s[14] >>> 26;\n          b4 = s[25] << 11 | s[24] >>> 21;\n          b5 = s[24] << 11 | s[25] >>> 21;\n          b36 = s[34] << 15 | s[35] >>> 17;\n          b37 = s[35] << 15 | s[34] >>> 17;\n          b18 = s[45] << 29 | s[44] >>> 3;\n          b19 = s[44] << 29 | s[45] >>> 3;\n          b10 = s[6] << 28 | s[7] >>> 4;\n          b11 = s[7] << 28 | s[6] >>> 4;\n          b42 = s[17] << 23 | s[16] >>> 9;\n          b43 = s[16] << 23 | s[17] >>> 9;\n          b24 = s[26] << 25 | s[27] >>> 7;\n          b25 = s[27] << 25 | s[26] >>> 7;\n          b6 = s[36] << 21 | s[37] >>> 11;\n          b7 = s[37] << 21 | s[36] >>> 11;\n          b38 = s[47] << 24 | s[46] >>> 8;\n          b39 = s[46] << 24 | s[47] >>> 8;\n          b30 = s[8] << 27 | s[9] >>> 5;\n          b31 = s[9] << 27 | s[8] >>> 5;\n          b12 = s[18] << 20 | s[19] >>> 12;\n          b13 = s[19] << 20 | s[18] >>> 12;\n          b44 = s[29] << 7 | s[28] >>> 25;\n          b45 = s[28] << 7 | s[29] >>> 25;\n          b26 = s[38] << 8 | s[39] >>> 24;\n          b27 = s[39] << 8 | s[38] >>> 24;\n          b8 = s[48] << 14 | s[49] >>> 18;\n          b9 = s[49] << 14 | s[48] >>> 18;\n          s[0] = b0 ^ ~b2 & b4;\n          s[1] = b1 ^ ~b3 & b5;\n          s[10] = b10 ^ ~b12 & b14;\n          s[11] = b11 ^ ~b13 & b15;\n          s[20] = b20 ^ ~b22 & b24;\n          s[21] = b21 ^ ~b23 & b25;\n          s[30] = b30 ^ ~b32 & b34;\n          s[31] = b31 ^ ~b33 & b35;\n          s[40] = b40 ^ ~b42 & b44;\n          s[41] = b41 ^ ~b43 & b45;\n          s[2] = b2 ^ ~b4 & b6;\n          s[3] = b3 ^ ~b5 & b7;\n          s[12] = b12 ^ ~b14 & b16;\n          s[13] = b13 ^ ~b15 & b17;\n          s[22] = b22 ^ ~b24 & b26;\n          s[23] = b23 ^ ~b25 & b27;\n          s[32] = b32 ^ ~b34 & b36;\n          s[33] = b33 ^ ~b35 & b37;\n          s[42] = b42 ^ ~b44 & b46;\n          s[43] = b43 ^ ~b45 & b47;\n          s[4] = b4 ^ ~b6 & b8;\n          s[5] = b5 ^ ~b7 & b9;\n          s[14] = b14 ^ ~b16 & b18;\n          s[15] = b15 ^ ~b17 & b19;\n          s[24] = b24 ^ ~b26 & b28;\n          s[25] = b25 ^ ~b27 & b29;\n          s[34] = b34 ^ ~b36 & b38;\n          s[35] = b35 ^ ~b37 & b39;\n          s[44] = b44 ^ ~b46 & b48;\n          s[45] = b45 ^ ~b47 & b49;\n          s[6] = b6 ^ ~b8 & b0;\n          s[7] = b7 ^ ~b9 & b1;\n          s[16] = b16 ^ ~b18 & b10;\n          s[17] = b17 ^ ~b19 & b11;\n          s[26] = b26 ^ ~b28 & b20;\n          s[27] = b27 ^ ~b29 & b21;\n          s[36] = b36 ^ ~b38 & b30;\n          s[37] = b37 ^ ~b39 & b31;\n          s[46] = b46 ^ ~b48 & b40;\n          s[47] = b47 ^ ~b49 & b41;\n          s[8] = b8 ^ ~b0 & b2;\n          s[9] = b9 ^ ~b1 & b3;\n          s[18] = b18 ^ ~b10 & b12;\n          s[19] = b19 ^ ~b11 & b13;\n          s[28] = b28 ^ ~b20 & b22;\n          s[29] = b29 ^ ~b21 & b23;\n          s[38] = b38 ^ ~b30 & b32;\n          s[39] = b39 ^ ~b31 & b33;\n          s[48] = b48 ^ ~b40 & b42;\n          s[49] = b49 ^ ~b41 & b43;\n          s[0] ^= RC[n];\n          s[1] ^= RC[n + 1];\n        }\n      };\n      if (COMMON_JS) {\n        module2.exports = methods;\n      } else {\n        for (i = 0; i < methodNames.length; ++i) {\n          root[methodNames[i]] = methods[methodNames[i]];\n        }\n        if (AMD) {\n          define(function() {\n            return methods;\n          });\n        }\n      }\n    })();\n  }\n});\n\n// node_modules/@ethersproject/keccak256/lib/index.js\nvar require_lib5 = __commonJS({\n  \"node_modules/@ethersproject/keccak256/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.keccak256 = void 0;\n    var js_sha3_1 = __importDefault(require_sha3());\n    var bytes_1 = require_lib2();\n    function keccak256(data) {\n      return \"0x\" + js_sha3_1.default.keccak_256((0, bytes_1.arrayify)(data));\n    }\n    exports2.keccak256 = keccak256;\n  }\n});\n\n// node_modules/@ethersproject/rlp/lib/_version.js\nvar require_version6 = __commonJS({\n  \"node_modules/@ethersproject/rlp/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"rlp/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/rlp/lib/index.js\nvar require_lib6 = __commonJS({\n  \"node_modules/@ethersproject/rlp/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decode = exports2.encode = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version6();\n    var logger = new logger_1.Logger(_version_1.version);\n    function arrayifyInteger(value) {\n      var result = [];\n      while (value) {\n        result.unshift(value & 255);\n        value >>= 8;\n      }\n      return result;\n    }\n    function unarrayifyInteger(data, offset, length) {\n      var result = 0;\n      for (var i = 0; i < length; i++) {\n        result = result * 256 + data[offset + i];\n      }\n      return result;\n    }\n    function _encode(object) {\n      if (Array.isArray(object)) {\n        var payload_1 = [];\n        object.forEach(function(child) {\n          payload_1 = payload_1.concat(_encode(child));\n        });\n        if (payload_1.length <= 55) {\n          payload_1.unshift(192 + payload_1.length);\n          return payload_1;\n        }\n        var length_1 = arrayifyInteger(payload_1.length);\n        length_1.unshift(247 + length_1.length);\n        return length_1.concat(payload_1);\n      }\n      if (!(0, bytes_1.isBytesLike)(object)) {\n        logger.throwArgumentError(\"RLP object must be BytesLike\", \"object\", object);\n      }\n      var data = Array.prototype.slice.call((0, bytes_1.arrayify)(object));\n      if (data.length === 1 && data[0] <= 127) {\n        return data;\n      } else if (data.length <= 55) {\n        data.unshift(128 + data.length);\n        return data;\n      }\n      var length = arrayifyInteger(data.length);\n      length.unshift(183 + length.length);\n      return length.concat(data);\n    }\n    function encode(object) {\n      return (0, bytes_1.hexlify)(_encode(object));\n    }\n    exports2.encode = encode;\n    function _decodeChildren(data, offset, childOffset, length) {\n      var result = [];\n      while (childOffset < offset + 1 + length) {\n        var decoded = _decode(data, childOffset);\n        result.push(decoded.result);\n        childOffset += decoded.consumed;\n        if (childOffset > offset + 1 + length) {\n          logger.throwError(\"child data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n      }\n      return { consumed: 1 + length, result };\n    }\n    function _decode(data, offset) {\n      if (data.length === 0) {\n        logger.throwError(\"data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n      }\n      if (data[offset] >= 248) {\n        var lengthLength = data[offset] - 247;\n        if (offset + 1 + lengthLength > data.length) {\n          logger.throwError(\"data short segment too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var length_2 = unarrayifyInteger(data, offset + 1, lengthLength);\n        if (offset + 1 + lengthLength + length_2 > data.length) {\n          logger.throwError(\"data long segment too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        return _decodeChildren(data, offset, offset + 1 + lengthLength, lengthLength + length_2);\n      } else if (data[offset] >= 192) {\n        var length_3 = data[offset] - 192;\n        if (offset + 1 + length_3 > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        return _decodeChildren(data, offset, offset + 1, length_3);\n      } else if (data[offset] >= 184) {\n        var lengthLength = data[offset] - 183;\n        if (offset + 1 + lengthLength > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var length_4 = unarrayifyInteger(data, offset + 1, lengthLength);\n        if (offset + 1 + lengthLength + length_4 > data.length) {\n          logger.throwError(\"data array too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var result = (0, bytes_1.hexlify)(data.slice(offset + 1 + lengthLength, offset + 1 + lengthLength + length_4));\n        return { consumed: 1 + lengthLength + length_4, result };\n      } else if (data[offset] >= 128) {\n        var length_5 = data[offset] - 128;\n        if (offset + 1 + length_5 > data.length) {\n          logger.throwError(\"data too short\", logger_1.Logger.errors.BUFFER_OVERRUN, {});\n        }\n        var result = (0, bytes_1.hexlify)(data.slice(offset + 1, offset + 1 + length_5));\n        return { consumed: 1 + length_5, result };\n      }\n      return { consumed: 1, result: (0, bytes_1.hexlify)(data[offset]) };\n    }\n    function decode(data) {\n      var bytes = (0, bytes_1.arrayify)(data);\n      var decoded = _decode(bytes, 0);\n      if (decoded.consumed !== bytes.length) {\n        logger.throwArgumentError(\"invalid rlp data\", \"data\", data);\n      }\n      return decoded.result;\n    }\n    exports2.decode = decode;\n  }\n});\n\n// node_modules/@ethersproject/address/lib/_version.js\nvar require_version7 = __commonJS({\n  \"node_modules/@ethersproject/address/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"address/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/address/lib/index.js\nvar require_lib7 = __commonJS({\n  \"node_modules/@ethersproject/address/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getCreate2Address = exports2.getContractAddress = exports2.getIcapAddress = exports2.isAddress = exports2.getAddress = void 0;\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var keccak256_1 = require_lib5();\n    var rlp_1 = require_lib6();\n    var logger_1 = require_lib();\n    var _version_1 = require_version7();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getChecksumAddress(address) {\n      if (!(0, bytes_1.isHexString)(address, 20)) {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      address = address.toLowerCase();\n      var chars = address.substring(2).split(\"\");\n      var expanded = new Uint8Array(40);\n      for (var i2 = 0; i2 < 40; i2++) {\n        expanded[i2] = chars[i2].charCodeAt(0);\n      }\n      var hashed = (0, bytes_1.arrayify)((0, keccak256_1.keccak256)(expanded));\n      for (var i2 = 0; i2 < 40; i2 += 2) {\n        if (hashed[i2 >> 1] >> 4 >= 8) {\n          chars[i2] = chars[i2].toUpperCase();\n        }\n        if ((hashed[i2 >> 1] & 15) >= 8) {\n          chars[i2 + 1] = chars[i2 + 1].toUpperCase();\n        }\n      }\n      return \"0x\" + chars.join(\"\");\n    }\n    var MAX_SAFE_INTEGER = 9007199254740991;\n    function log10(x) {\n      if (Math.log10) {\n        return Math.log10(x);\n      }\n      return Math.log(x) / Math.LN10;\n    }\n    var ibanLookup = {};\n    for (i = 0; i < 10; i++) {\n      ibanLookup[String(i)] = String(i);\n    }\n    var i;\n    for (i = 0; i < 26; i++) {\n      ibanLookup[String.fromCharCode(65 + i)] = String(10 + i);\n    }\n    var i;\n    var safeDigits = Math.floor(log10(MAX_SAFE_INTEGER));\n    function ibanChecksum(address) {\n      address = address.toUpperCase();\n      address = address.substring(4) + address.substring(0, 2) + \"00\";\n      var expanded = address.split(\"\").map(function(c) {\n        return ibanLookup[c];\n      }).join(\"\");\n      while (expanded.length >= safeDigits) {\n        var block = expanded.substring(0, safeDigits);\n        expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);\n      }\n      var checksum = String(98 - parseInt(expanded, 10) % 97);\n      while (checksum.length < 2) {\n        checksum = \"0\" + checksum;\n      }\n      return checksum;\n    }\n    function getAddress(address) {\n      var result = null;\n      if (typeof address !== \"string\") {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\n        if (address.substring(0, 2) !== \"0x\") {\n          address = \"0x\" + address;\n        }\n        result = getChecksumAddress(address);\n        if (address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) && result !== address) {\n          logger.throwArgumentError(\"bad address checksum\", \"address\", address);\n        }\n      } else if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\n        if (address.substring(2, 4) !== ibanChecksum(address)) {\n          logger.throwArgumentError(\"bad icap checksum\", \"address\", address);\n        }\n        result = (0, bignumber_1._base36To16)(address.substring(4));\n        while (result.length < 40) {\n          result = \"0\" + result;\n        }\n        result = getChecksumAddress(\"0x\" + result);\n      } else {\n        logger.throwArgumentError(\"invalid address\", \"address\", address);\n      }\n      return result;\n    }\n    exports2.getAddress = getAddress;\n    function isAddress(address) {\n      try {\n        getAddress(address);\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isAddress = isAddress;\n    function getIcapAddress(address) {\n      var base36 = (0, bignumber_1._base16To36)(getAddress(address).substring(2)).toUpperCase();\n      while (base36.length < 30) {\n        base36 = \"0\" + base36;\n      }\n      return \"XE\" + ibanChecksum(\"XE00\" + base36) + base36;\n    }\n    exports2.getIcapAddress = getIcapAddress;\n    function getContractAddress(transaction) {\n      var from = null;\n      try {\n        from = getAddress(transaction.from);\n      } catch (error) {\n        logger.throwArgumentError(\"missing from address\", \"transaction\", transaction);\n      }\n      var nonce = (0, bytes_1.stripZeros)((0, bytes_1.arrayify)(bignumber_1.BigNumber.from(transaction.nonce).toHexString()));\n      return getAddress((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, rlp_1.encode)([from, nonce])), 12));\n    }\n    exports2.getContractAddress = getContractAddress;\n    function getCreate2Address(from, salt, initCodeHash) {\n      if ((0, bytes_1.hexDataLength)(salt) !== 32) {\n        logger.throwArgumentError(\"salt must be 32 bytes\", \"salt\", salt);\n      }\n      if ((0, bytes_1.hexDataLength)(initCodeHash) !== 32) {\n        logger.throwArgumentError(\"initCodeHash must be 32 bytes\", \"initCodeHash\", initCodeHash);\n      }\n      return getAddress((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.concat)([\"0xff\", getAddress(from), salt, initCodeHash])), 12));\n    }\n    exports2.getCreate2Address = getCreate2Address;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/address.js\nvar require_address = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/address.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AddressCoder = void 0;\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var AddressCoder = (\n      /** @class */\n      function(_super) {\n        __extends(AddressCoder2, _super);\n        function AddressCoder2(localName) {\n          return _super.call(this, \"address\", \"address\", localName, false) || this;\n        }\n        AddressCoder2.prototype.defaultValue = function() {\n          return \"0x0000000000000000000000000000000000000000\";\n        };\n        AddressCoder2.prototype.encode = function(writer, value) {\n          try {\n            value = (0, address_1.getAddress)(value);\n          } catch (error) {\n            this._throwError(error.message, value);\n          }\n          return writer.writeValue(value);\n        };\n        AddressCoder2.prototype.decode = function(reader) {\n          return (0, address_1.getAddress)((0, bytes_1.hexZeroPad)(reader.readValue().toHexString(), 20));\n        };\n        return AddressCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.AddressCoder = AddressCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/anonymous.js\nvar require_anonymous = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/anonymous.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AnonymousCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var AnonymousCoder = (\n      /** @class */\n      function(_super) {\n        __extends(AnonymousCoder2, _super);\n        function AnonymousCoder2(coder) {\n          var _this = _super.call(this, coder.name, coder.type, void 0, coder.dynamic) || this;\n          _this.coder = coder;\n          return _this;\n        }\n        AnonymousCoder2.prototype.defaultValue = function() {\n          return this.coder.defaultValue();\n        };\n        AnonymousCoder2.prototype.encode = function(writer, value) {\n          return this.coder.encode(writer, value);\n        };\n        AnonymousCoder2.prototype.decode = function(reader) {\n          return this.coder.decode(reader);\n        };\n        return AnonymousCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.AnonymousCoder = AnonymousCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/array.js\nvar require_array = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/array.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ArrayCoder = exports2.unpack = exports2.pack = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var abstract_coder_1 = require_abstract_coder();\n    var anonymous_1 = require_anonymous();\n    function pack(writer, coders, values) {\n      var arrayValues = null;\n      if (Array.isArray(values)) {\n        arrayValues = values;\n      } else if (values && typeof values === \"object\") {\n        var unique_1 = {};\n        arrayValues = coders.map(function(coder) {\n          var name2 = coder.localName;\n          if (!name2) {\n            logger.throwError(\"cannot encode object for signature with missing names\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              argument: \"values\",\n              coder,\n              value: values\n            });\n          }\n          if (unique_1[name2]) {\n            logger.throwError(\"cannot encode object for signature with duplicate names\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              argument: \"values\",\n              coder,\n              value: values\n            });\n          }\n          unique_1[name2] = true;\n          return values[name2];\n        });\n      } else {\n        logger.throwArgumentError(\"invalid tuple value\", \"tuple\", values);\n      }\n      if (coders.length !== arrayValues.length) {\n        logger.throwArgumentError(\"types/value length mismatch\", \"tuple\", values);\n      }\n      var staticWriter = new abstract_coder_1.Writer(writer.wordSize);\n      var dynamicWriter = new abstract_coder_1.Writer(writer.wordSize);\n      var updateFuncs = [];\n      coders.forEach(function(coder, index) {\n        var value = arrayValues[index];\n        if (coder.dynamic) {\n          var dynamicOffset_1 = dynamicWriter.length;\n          coder.encode(dynamicWriter, value);\n          var updateFunc_1 = staticWriter.writeUpdatableValue();\n          updateFuncs.push(function(baseOffset) {\n            updateFunc_1(baseOffset + dynamicOffset_1);\n          });\n        } else {\n          coder.encode(staticWriter, value);\n        }\n      });\n      updateFuncs.forEach(function(func) {\n        func(staticWriter.length);\n      });\n      var length = writer.appendWriter(staticWriter);\n      length += writer.appendWriter(dynamicWriter);\n      return length;\n    }\n    exports2.pack = pack;\n    function unpack(reader, coders) {\n      var values = [];\n      var baseReader = reader.subReader(0);\n      coders.forEach(function(coder) {\n        var value = null;\n        if (coder.dynamic) {\n          var offset = reader.readValue();\n          var offsetReader = baseReader.subReader(offset.toNumber());\n          try {\n            value = coder.decode(offsetReader);\n          } catch (error) {\n            if (error.code === logger_1.Logger.errors.BUFFER_OVERRUN) {\n              throw error;\n            }\n            value = error;\n            value.baseType = coder.name;\n            value.name = coder.localName;\n            value.type = coder.type;\n          }\n        } else {\n          try {\n            value = coder.decode(reader);\n          } catch (error) {\n            if (error.code === logger_1.Logger.errors.BUFFER_OVERRUN) {\n              throw error;\n            }\n            value = error;\n            value.baseType = coder.name;\n            value.name = coder.localName;\n            value.type = coder.type;\n          }\n        }\n        if (value != void 0) {\n          values.push(value);\n        }\n      });\n      var uniqueNames = coders.reduce(function(accum, coder) {\n        var name2 = coder.localName;\n        if (name2) {\n          if (!accum[name2]) {\n            accum[name2] = 0;\n          }\n          accum[name2]++;\n        }\n        return accum;\n      }, {});\n      coders.forEach(function(coder, index) {\n        var name2 = coder.localName;\n        if (!name2 || uniqueNames[name2] !== 1) {\n          return;\n        }\n        if (name2 === \"length\") {\n          name2 = \"_length\";\n        }\n        if (values[name2] != null) {\n          return;\n        }\n        var value = values[index];\n        if (value instanceof Error) {\n          Object.defineProperty(values, name2, {\n            enumerable: true,\n            get: function() {\n              throw value;\n            }\n          });\n        } else {\n          values[name2] = value;\n        }\n      });\n      var _loop_1 = function(i2) {\n        var value = values[i2];\n        if (value instanceof Error) {\n          Object.defineProperty(values, i2, {\n            enumerable: true,\n            get: function() {\n              throw value;\n            }\n          });\n        }\n      };\n      for (var i = 0; i < values.length; i++) {\n        _loop_1(i);\n      }\n      return Object.freeze(values);\n    }\n    exports2.unpack = unpack;\n    var ArrayCoder = (\n      /** @class */\n      function(_super) {\n        __extends(ArrayCoder2, _super);\n        function ArrayCoder2(coder, length, localName) {\n          var _this = this;\n          var type = coder.type + \"[\" + (length >= 0 ? length : \"\") + \"]\";\n          var dynamic = length === -1 || coder.dynamic;\n          _this = _super.call(this, \"array\", type, localName, dynamic) || this;\n          _this.coder = coder;\n          _this.length = length;\n          return _this;\n        }\n        ArrayCoder2.prototype.defaultValue = function() {\n          var defaultChild = this.coder.defaultValue();\n          var result = [];\n          for (var i = 0; i < this.length; i++) {\n            result.push(defaultChild);\n          }\n          return result;\n        };\n        ArrayCoder2.prototype.encode = function(writer, value) {\n          if (!Array.isArray(value)) {\n            this._throwError(\"expected array value\", value);\n          }\n          var count = this.length;\n          if (count === -1) {\n            count = value.length;\n            writer.writeValue(value.length);\n          }\n          logger.checkArgumentCount(value.length, count, \"coder array\" + (this.localName ? \" \" + this.localName : \"\"));\n          var coders = [];\n          for (var i = 0; i < value.length; i++) {\n            coders.push(this.coder);\n          }\n          return pack(writer, coders, value);\n        };\n        ArrayCoder2.prototype.decode = function(reader) {\n          var count = this.length;\n          if (count === -1) {\n            count = reader.readValue().toNumber();\n            if (count * 32 > reader._data.length) {\n              logger.throwError(\"insufficient data length\", logger_1.Logger.errors.BUFFER_OVERRUN, {\n                length: reader._data.length,\n                count\n              });\n            }\n          }\n          var coders = [];\n          for (var i = 0; i < count; i++) {\n            coders.push(new anonymous_1.AnonymousCoder(this.coder));\n          }\n          return reader.coerce(this.name, unpack(reader, coders));\n        };\n        return ArrayCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.ArrayCoder = ArrayCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/boolean.js\nvar require_boolean = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/boolean.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BooleanCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var BooleanCoder = (\n      /** @class */\n      function(_super) {\n        __extends(BooleanCoder2, _super);\n        function BooleanCoder2(localName) {\n          return _super.call(this, \"bool\", \"bool\", localName, false) || this;\n        }\n        BooleanCoder2.prototype.defaultValue = function() {\n          return false;\n        };\n        BooleanCoder2.prototype.encode = function(writer, value) {\n          return writer.writeValue(value ? 1 : 0);\n        };\n        BooleanCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.type, !reader.readValue().isZero());\n        };\n        return BooleanCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.BooleanCoder = BooleanCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/bytes.js\nvar require_bytes = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/bytes.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BytesCoder = exports2.DynamicBytesCoder = void 0;\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var DynamicBytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(DynamicBytesCoder2, _super);\n        function DynamicBytesCoder2(type, localName) {\n          return _super.call(this, type, type, localName, true) || this;\n        }\n        DynamicBytesCoder2.prototype.defaultValue = function() {\n          return \"0x\";\n        };\n        DynamicBytesCoder2.prototype.encode = function(writer, value) {\n          value = (0, bytes_1.arrayify)(value);\n          var length = writer.writeValue(value.length);\n          length += writer.writeBytes(value);\n          return length;\n        };\n        DynamicBytesCoder2.prototype.decode = function(reader) {\n          return reader.readBytes(reader.readValue().toNumber(), true);\n        };\n        return DynamicBytesCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.DynamicBytesCoder = DynamicBytesCoder;\n    var BytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(BytesCoder2, _super);\n        function BytesCoder2(localName) {\n          return _super.call(this, \"bytes\", localName) || this;\n        }\n        BytesCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, bytes_1.hexlify)(_super.prototype.decode.call(this, reader)));\n        };\n        return BytesCoder2;\n      }(DynamicBytesCoder)\n    );\n    exports2.BytesCoder = BytesCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/fixed-bytes.js\nvar require_fixed_bytes = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/fixed-bytes.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FixedBytesCoder = void 0;\n    var bytes_1 = require_lib2();\n    var abstract_coder_1 = require_abstract_coder();\n    var FixedBytesCoder = (\n      /** @class */\n      function(_super) {\n        __extends(FixedBytesCoder2, _super);\n        function FixedBytesCoder2(size, localName) {\n          var _this = this;\n          var name2 = \"bytes\" + String(size);\n          _this = _super.call(this, name2, name2, localName, false) || this;\n          _this.size = size;\n          return _this;\n        }\n        FixedBytesCoder2.prototype.defaultValue = function() {\n          return \"0x0000000000000000000000000000000000000000000000000000000000000000\".substring(0, 2 + this.size * 2);\n        };\n        FixedBytesCoder2.prototype.encode = function(writer, value) {\n          var data = (0, bytes_1.arrayify)(value);\n          if (data.length !== this.size) {\n            this._throwError(\"incorrect data length\", value);\n          }\n          return writer.writeBytes(data);\n        };\n        FixedBytesCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, bytes_1.hexlify)(reader.readBytes(this.size)));\n        };\n        return FixedBytesCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.FixedBytesCoder = FixedBytesCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/null.js\nvar require_null = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/null.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NullCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var NullCoder = (\n      /** @class */\n      function(_super) {\n        __extends(NullCoder2, _super);\n        function NullCoder2(localName) {\n          return _super.call(this, \"null\", \"\", localName, false) || this;\n        }\n        NullCoder2.prototype.defaultValue = function() {\n          return null;\n        };\n        NullCoder2.prototype.encode = function(writer, value) {\n          if (value != null) {\n            this._throwError(\"not null\", value);\n          }\n          return writer.writeBytes([]);\n        };\n        NullCoder2.prototype.decode = function(reader) {\n          reader.readBytes(0);\n          return reader.coerce(this.name, null);\n        };\n        return NullCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.NullCoder = NullCoder;\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/addresses.js\nvar require_addresses = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/addresses.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AddressZero = void 0;\n    exports2.AddressZero = \"0x0000000000000000000000000000000000000000\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/bignumbers.js\nvar require_bignumbers = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/bignumbers.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.MaxInt256 = exports2.MinInt256 = exports2.MaxUint256 = exports2.WeiPerEther = exports2.Two = exports2.One = exports2.Zero = exports2.NegativeOne = void 0;\n    var bignumber_1 = require_lib3();\n    var NegativeOne = /* @__PURE__ */ bignumber_1.BigNumber.from(-1);\n    exports2.NegativeOne = NegativeOne;\n    var Zero = /* @__PURE__ */ bignumber_1.BigNumber.from(0);\n    exports2.Zero = Zero;\n    var One = /* @__PURE__ */ bignumber_1.BigNumber.from(1);\n    exports2.One = One;\n    var Two = /* @__PURE__ */ bignumber_1.BigNumber.from(2);\n    exports2.Two = Two;\n    var WeiPerEther = /* @__PURE__ */ bignumber_1.BigNumber.from(\"1000000000000000000\");\n    exports2.WeiPerEther = WeiPerEther;\n    var MaxUint256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    exports2.MaxUint256 = MaxUint256;\n    var MinInt256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"-0x8000000000000000000000000000000000000000000000000000000000000000\");\n    exports2.MinInt256 = MinInt256;\n    var MaxInt256 = /* @__PURE__ */ bignumber_1.BigNumber.from(\"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    exports2.MaxInt256 = MaxInt256;\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/hashes.js\nvar require_hashes = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/hashes.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.HashZero = void 0;\n    exports2.HashZero = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/strings.js\nvar require_strings = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/strings.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherSymbol = void 0;\n    exports2.EtherSymbol = \"\\u039E\";\n  }\n});\n\n// node_modules/@ethersproject/constants/lib/index.js\nvar require_lib8 = __commonJS({\n  \"node_modules/@ethersproject/constants/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherSymbol = exports2.HashZero = exports2.MaxInt256 = exports2.MinInt256 = exports2.MaxUint256 = exports2.WeiPerEther = exports2.Two = exports2.One = exports2.Zero = exports2.NegativeOne = exports2.AddressZero = void 0;\n    var addresses_1 = require_addresses();\n    Object.defineProperty(exports2, \"AddressZero\", { enumerable: true, get: function() {\n      return addresses_1.AddressZero;\n    } });\n    var bignumbers_1 = require_bignumbers();\n    Object.defineProperty(exports2, \"NegativeOne\", { enumerable: true, get: function() {\n      return bignumbers_1.NegativeOne;\n    } });\n    Object.defineProperty(exports2, \"Zero\", { enumerable: true, get: function() {\n      return bignumbers_1.Zero;\n    } });\n    Object.defineProperty(exports2, \"One\", { enumerable: true, get: function() {\n      return bignumbers_1.One;\n    } });\n    Object.defineProperty(exports2, \"Two\", { enumerable: true, get: function() {\n      return bignumbers_1.Two;\n    } });\n    Object.defineProperty(exports2, \"WeiPerEther\", { enumerable: true, get: function() {\n      return bignumbers_1.WeiPerEther;\n    } });\n    Object.defineProperty(exports2, \"MaxUint256\", { enumerable: true, get: function() {\n      return bignumbers_1.MaxUint256;\n    } });\n    Object.defineProperty(exports2, \"MinInt256\", { enumerable: true, get: function() {\n      return bignumbers_1.MinInt256;\n    } });\n    Object.defineProperty(exports2, \"MaxInt256\", { enumerable: true, get: function() {\n      return bignumbers_1.MaxInt256;\n    } });\n    var hashes_1 = require_hashes();\n    Object.defineProperty(exports2, \"HashZero\", { enumerable: true, get: function() {\n      return hashes_1.HashZero;\n    } });\n    var strings_1 = require_strings();\n    Object.defineProperty(exports2, \"EtherSymbol\", { enumerable: true, get: function() {\n      return strings_1.EtherSymbol;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/number.js\nvar require_number = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/number.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NumberCoder = void 0;\n    var bignumber_1 = require_lib3();\n    var constants_1 = require_lib8();\n    var abstract_coder_1 = require_abstract_coder();\n    var NumberCoder = (\n      /** @class */\n      function(_super) {\n        __extends(NumberCoder2, _super);\n        function NumberCoder2(size, signed, localName) {\n          var _this = this;\n          var name2 = (signed ? \"int\" : \"uint\") + size * 8;\n          _this = _super.call(this, name2, name2, localName, false) || this;\n          _this.size = size;\n          _this.signed = signed;\n          return _this;\n        }\n        NumberCoder2.prototype.defaultValue = function() {\n          return 0;\n        };\n        NumberCoder2.prototype.encode = function(writer, value) {\n          var v = bignumber_1.BigNumber.from(value);\n          var maxUintValue = constants_1.MaxUint256.mask(writer.wordSize * 8);\n          if (this.signed) {\n            var bounds = maxUintValue.mask(this.size * 8 - 1);\n            if (v.gt(bounds) || v.lt(bounds.add(constants_1.One).mul(constants_1.NegativeOne))) {\n              this._throwError(\"value out-of-bounds\", value);\n            }\n          } else if (v.lt(constants_1.Zero) || v.gt(maxUintValue.mask(this.size * 8))) {\n            this._throwError(\"value out-of-bounds\", value);\n          }\n          v = v.toTwos(this.size * 8).mask(this.size * 8);\n          if (this.signed) {\n            v = v.fromTwos(this.size * 8).toTwos(8 * writer.wordSize);\n          }\n          return writer.writeValue(v);\n        };\n        NumberCoder2.prototype.decode = function(reader) {\n          var value = reader.readValue().mask(this.size * 8);\n          if (this.signed) {\n            value = value.fromTwos(this.size * 8);\n          }\n          return reader.coerce(this.name, value);\n        };\n        return NumberCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.NumberCoder = NumberCoder;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/_version.js\nvar require_version8 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"strings/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/utf8.js\nvar require_utf8 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/utf8.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.toUtf8CodePoints = exports2.toUtf8String = exports2._toUtf8String = exports2._toEscapedUtf8String = exports2.toUtf8Bytes = exports2.Utf8ErrorFuncs = exports2.Utf8ErrorReason = exports2.UnicodeNormalizationForm = void 0;\n    var bytes_1 = require_lib2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version8();\n    var logger = new logger_1.Logger(_version_1.version);\n    var UnicodeNormalizationForm;\n    (function(UnicodeNormalizationForm2) {\n      UnicodeNormalizationForm2[\"current\"] = \"\";\n      UnicodeNormalizationForm2[\"NFC\"] = \"NFC\";\n      UnicodeNormalizationForm2[\"NFD\"] = \"NFD\";\n      UnicodeNormalizationForm2[\"NFKC\"] = \"NFKC\";\n      UnicodeNormalizationForm2[\"NFKD\"] = \"NFKD\";\n    })(UnicodeNormalizationForm = exports2.UnicodeNormalizationForm || (exports2.UnicodeNormalizationForm = {}));\n    var Utf8ErrorReason;\n    (function(Utf8ErrorReason2) {\n      Utf8ErrorReason2[\"UNEXPECTED_CONTINUE\"] = \"unexpected continuation byte\";\n      Utf8ErrorReason2[\"BAD_PREFIX\"] = \"bad codepoint prefix\";\n      Utf8ErrorReason2[\"OVERRUN\"] = \"string overrun\";\n      Utf8ErrorReason2[\"MISSING_CONTINUE\"] = \"missing continuation byte\";\n      Utf8ErrorReason2[\"OUT_OF_RANGE\"] = \"out of UTF-8 range\";\n      Utf8ErrorReason2[\"UTF16_SURROGATE\"] = \"UTF-16 surrogate\";\n      Utf8ErrorReason2[\"OVERLONG\"] = \"overlong representation\";\n    })(Utf8ErrorReason = exports2.Utf8ErrorReason || (exports2.Utf8ErrorReason = {}));\n    function errorFunc(reason, offset, bytes, output, badCodepoint) {\n      return logger.throwArgumentError(\"invalid codepoint at offset \" + offset + \"; \" + reason, \"bytes\", bytes);\n    }\n    function ignoreFunc(reason, offset, bytes, output, badCodepoint) {\n      if (reason === Utf8ErrorReason.BAD_PREFIX || reason === Utf8ErrorReason.UNEXPECTED_CONTINUE) {\n        var i = 0;\n        for (var o = offset + 1; o < bytes.length; o++) {\n          if (bytes[o] >> 6 !== 2) {\n            break;\n          }\n          i++;\n        }\n        return i;\n      }\n      if (reason === Utf8ErrorReason.OVERRUN) {\n        return bytes.length - offset - 1;\n      }\n      return 0;\n    }\n    function replaceFunc(reason, offset, bytes, output, badCodepoint) {\n      if (reason === Utf8ErrorReason.OVERLONG) {\n        output.push(badCodepoint);\n        return 0;\n      }\n      output.push(65533);\n      return ignoreFunc(reason, offset, bytes, output, badCodepoint);\n    }\n    exports2.Utf8ErrorFuncs = Object.freeze({\n      error: errorFunc,\n      ignore: ignoreFunc,\n      replace: replaceFunc\n    });\n    function getUtf8CodePoints(bytes, onError) {\n      if (onError == null) {\n        onError = exports2.Utf8ErrorFuncs.error;\n      }\n      bytes = (0, bytes_1.arrayify)(bytes);\n      var result = [];\n      var i = 0;\n      while (i < bytes.length) {\n        var c = bytes[i++];\n        if (c >> 7 === 0) {\n          result.push(c);\n          continue;\n        }\n        var extraLength = null;\n        var overlongMask = null;\n        if ((c & 224) === 192) {\n          extraLength = 1;\n          overlongMask = 127;\n        } else if ((c & 240) === 224) {\n          extraLength = 2;\n          overlongMask = 2047;\n        } else if ((c & 248) === 240) {\n          extraLength = 3;\n          overlongMask = 65535;\n        } else {\n          if ((c & 192) === 128) {\n            i += onError(Utf8ErrorReason.UNEXPECTED_CONTINUE, i - 1, bytes, result);\n          } else {\n            i += onError(Utf8ErrorReason.BAD_PREFIX, i - 1, bytes, result);\n          }\n          continue;\n        }\n        if (i - 1 + extraLength >= bytes.length) {\n          i += onError(Utf8ErrorReason.OVERRUN, i - 1, bytes, result);\n          continue;\n        }\n        var res = c & (1 << 8 - extraLength - 1) - 1;\n        for (var j = 0; j < extraLength; j++) {\n          var nextChar = bytes[i];\n          if ((nextChar & 192) != 128) {\n            i += onError(Utf8ErrorReason.MISSING_CONTINUE, i, bytes, result);\n            res = null;\n            break;\n          }\n          ;\n          res = res << 6 | nextChar & 63;\n          i++;\n        }\n        if (res === null) {\n          continue;\n        }\n        if (res > 1114111) {\n          i += onError(Utf8ErrorReason.OUT_OF_RANGE, i - 1 - extraLength, bytes, result, res);\n          continue;\n        }\n        if (res >= 55296 && res <= 57343) {\n          i += onError(Utf8ErrorReason.UTF16_SURROGATE, i - 1 - extraLength, bytes, result, res);\n          continue;\n        }\n        if (res <= overlongMask) {\n          i += onError(Utf8ErrorReason.OVERLONG, i - 1 - extraLength, bytes, result, res);\n          continue;\n        }\n        result.push(res);\n      }\n      return result;\n    }\n    function toUtf8Bytes(str, form) {\n      if (form === void 0) {\n        form = UnicodeNormalizationForm.current;\n      }\n      if (form != UnicodeNormalizationForm.current) {\n        logger.checkNormalize();\n        str = str.normalize(form);\n      }\n      var result = [];\n      for (var i = 0; i < str.length; i++) {\n        var c = str.charCodeAt(i);\n        if (c < 128) {\n          result.push(c);\n        } else if (c < 2048) {\n          result.push(c >> 6 | 192);\n          result.push(c & 63 | 128);\n        } else if ((c & 64512) == 55296) {\n          i++;\n          var c2 = str.charCodeAt(i);\n          if (i >= str.length || (c2 & 64512) !== 56320) {\n            throw new Error(\"invalid utf-8 string\");\n          }\n          var pair = 65536 + ((c & 1023) << 10) + (c2 & 1023);\n          result.push(pair >> 18 | 240);\n          result.push(pair >> 12 & 63 | 128);\n          result.push(pair >> 6 & 63 | 128);\n          result.push(pair & 63 | 128);\n        } else {\n          result.push(c >> 12 | 224);\n          result.push(c >> 6 & 63 | 128);\n          result.push(c & 63 | 128);\n        }\n      }\n      return (0, bytes_1.arrayify)(result);\n    }\n    exports2.toUtf8Bytes = toUtf8Bytes;\n    function escapeChar(value) {\n      var hex = \"0000\" + value.toString(16);\n      return \"\\\\u\" + hex.substring(hex.length - 4);\n    }\n    function _toEscapedUtf8String(bytes, onError) {\n      return '\"' + getUtf8CodePoints(bytes, onError).map(function(codePoint) {\n        if (codePoint < 256) {\n          switch (codePoint) {\n            case 8:\n              return \"\\\\b\";\n            case 9:\n              return \"\\\\t\";\n            case 10:\n              return \"\\\\n\";\n            case 13:\n              return \"\\\\r\";\n            case 34:\n              return '\\\\\"';\n            case 92:\n              return \"\\\\\\\\\";\n          }\n          if (codePoint >= 32 && codePoint < 127) {\n            return String.fromCharCode(codePoint);\n          }\n        }\n        if (codePoint <= 65535) {\n          return escapeChar(codePoint);\n        }\n        codePoint -= 65536;\n        return escapeChar((codePoint >> 10 & 1023) + 55296) + escapeChar((codePoint & 1023) + 56320);\n      }).join(\"\") + '\"';\n    }\n    exports2._toEscapedUtf8String = _toEscapedUtf8String;\n    function _toUtf8String(codePoints) {\n      return codePoints.map(function(codePoint) {\n        if (codePoint <= 65535) {\n          return String.fromCharCode(codePoint);\n        }\n        codePoint -= 65536;\n        return String.fromCharCode((codePoint >> 10 & 1023) + 55296, (codePoint & 1023) + 56320);\n      }).join(\"\");\n    }\n    exports2._toUtf8String = _toUtf8String;\n    function toUtf8String(bytes, onError) {\n      return _toUtf8String(getUtf8CodePoints(bytes, onError));\n    }\n    exports2.toUtf8String = toUtf8String;\n    function toUtf8CodePoints(str, form) {\n      if (form === void 0) {\n        form = UnicodeNormalizationForm.current;\n      }\n      return getUtf8CodePoints(toUtf8Bytes(str, form));\n    }\n    exports2.toUtf8CodePoints = toUtf8CodePoints;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/bytes32.js\nvar require_bytes32 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/bytes32.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parseBytes32String = exports2.formatBytes32String = void 0;\n    var constants_1 = require_lib8();\n    var bytes_1 = require_lib2();\n    var utf8_1 = require_utf8();\n    function formatBytes32String(text) {\n      var bytes = (0, utf8_1.toUtf8Bytes)(text);\n      if (bytes.length > 31) {\n        throw new Error(\"bytes32 string must be less than 32 bytes\");\n      }\n      return (0, bytes_1.hexlify)((0, bytes_1.concat)([bytes, constants_1.HashZero]).slice(0, 32));\n    }\n    exports2.formatBytes32String = formatBytes32String;\n    function parseBytes32String(bytes) {\n      var data = (0, bytes_1.arrayify)(bytes);\n      if (data.length !== 32) {\n        throw new Error(\"invalid bytes32 - not 32 bytes long\");\n      }\n      if (data[31] !== 0) {\n        throw new Error(\"invalid bytes32 string - no null terminator\");\n      }\n      var length = 31;\n      while (data[length - 1] === 0) {\n        length--;\n      }\n      return (0, utf8_1.toUtf8String)(data.slice(0, length));\n    }\n    exports2.parseBytes32String = parseBytes32String;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/idna.js\nvar require_idna = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/idna.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.nameprep = exports2._nameprepTableC = exports2._nameprepTableB2 = exports2._nameprepTableA1 = void 0;\n    var utf8_1 = require_utf8();\n    function bytes2(data) {\n      if (data.length % 4 !== 0) {\n        throw new Error(\"bad data\");\n      }\n      var result = [];\n      for (var i = 0; i < data.length; i += 4) {\n        result.push(parseInt(data.substring(i, i + 4), 16));\n      }\n      return result;\n    }\n    function createTable(data, func) {\n      if (!func) {\n        func = function(value) {\n          return [parseInt(value, 16)];\n        };\n      }\n      var lo = 0;\n      var result = {};\n      data.split(\",\").forEach(function(pair) {\n        var comps = pair.split(\":\");\n        lo += parseInt(comps[0], 16);\n        result[lo] = func(comps[1]);\n      });\n      return result;\n    }\n    function createRangeTable(data) {\n      var hi = 0;\n      return data.split(\",\").map(function(v) {\n        var comps = v.split(\"-\");\n        if (comps.length === 1) {\n          comps[1] = \"0\";\n        } else if (comps[1] === \"\") {\n          comps[1] = \"1\";\n        }\n        var lo = hi + parseInt(comps[0], 16);\n        hi = parseInt(comps[1], 16);\n        return { l: lo, h: hi };\n      });\n    }\n    function matchMap(value, ranges) {\n      var lo = 0;\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        lo += range.l;\n        if (value >= lo && value <= lo + range.h && (value - lo) % (range.d || 1) === 0) {\n          if (range.e && range.e.indexOf(value - lo) !== -1) {\n            continue;\n          }\n          return range;\n        }\n      }\n      return null;\n    }\n    var Table_A_1_ranges = createRangeTable(\"221,13-1b,5f-,40-10,51-f,11-3,3-3,2-2,2-4,8,2,15,2d,28-8,88,48,27-,3-5,11-20,27-,8,28,3-5,12,18,b-a,1c-4,6-16,2-d,2-2,2,1b-4,17-9,8f-,10,f,1f-2,1c-34,33-14e,4,36-,13-,6-2,1a-f,4,9-,3-,17,8,2-2,5-,2,8-,3-,4-8,2-3,3,6-,16-6,2-,7-3,3-,17,8,3,3,3-,2,6-3,3-,4-a,5,2-6,10-b,4,8,2,4,17,8,3,6-,b,4,4-,2-e,2-4,b-10,4,9-,3-,17,8,3-,5-,9-2,3-,4-7,3-3,3,4-3,c-10,3,7-2,4,5-2,3,2,3-2,3-2,4-2,9,4-3,6-2,4,5-8,2-e,d-d,4,9,4,18,b,6-3,8,4,5-6,3-8,3-3,b-11,3,9,4,18,b,6-3,8,4,5-6,3-6,2,3-3,b-11,3,9,4,18,11-3,7-,4,5-8,2-7,3-3,b-11,3,13-2,19,a,2-,8-2,2-3,7,2,9-11,4-b,3b-3,1e-24,3,2-,3,2-,2-5,5,8,4,2,2-,3,e,4-,6,2,7-,b-,3-21,49,23-5,1c-3,9,25,10-,2-2f,23,6,3,8-2,5-5,1b-45,27-9,2a-,2-3,5b-4,45-4,53-5,8,40,2,5-,8,2,5-,28,2,5-,20,2,5-,8,2,5-,8,8,18,20,2,5-,8,28,14-5,1d-22,56-b,277-8,1e-2,52-e,e,8-a,18-8,15-b,e,4,3-b,5e-2,b-15,10,b-5,59-7,2b-555,9d-3,5b-5,17-,7-,27-,7-,9,2,2,2,20-,36,10,f-,7,14-,4,a,54-3,2-6,6-5,9-,1c-10,13-1d,1c-14,3c-,10-6,32-b,240-30,28-18,c-14,a0,115-,3,66-,b-76,5,5-,1d,24,2,5-2,2,8-,35-2,19,f-10,1d-3,311-37f,1b,5a-b,d7-19,d-3,41,57-,68-4,29-3,5f,29-37,2e-2,25-c,2c-2,4e-3,30,78-3,64-,20,19b7-49,51a7-59,48e-2,38-738,2ba5-5b,222f-,3c-94,8-b,6-4,1b,6,2,3,3,6d-20,16e-f,41-,37-7,2e-2,11-f,5-b,18-,b,14,5-3,6,88-,2,bf-2,7-,7-,7-,4-2,8,8-9,8-2ff,20,5-b,1c-b4,27-,27-cbb1,f7-9,28-2,b5-221,56,48,3-,2-,3-,5,d,2,5,3,42,5-,9,8,1d,5,6,2-2,8,153-3,123-3,33-27fd,a6da-5128,21f-5df,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3,2-1d,61-ff7d\");\n    var Table_B_1_flags = \"ad,34f,1806,180b,180c,180d,200b,200c,200d,2060,feff\".split(\",\").map(function(v) {\n      return parseInt(v, 16);\n    });\n    var Table_B_2_ranges = [\n      { h: 25, s: 32, l: 65 },\n      { h: 30, s: 32, e: [23], l: 127 },\n      { h: 54, s: 1, e: [48], l: 64, d: 2 },\n      { h: 14, s: 1, l: 57, d: 2 },\n      { h: 44, s: 1, l: 17, d: 2 },\n      { h: 10, s: 1, e: [2, 6, 8], l: 61, d: 2 },\n      { h: 16, s: 1, l: 68, d: 2 },\n      { h: 84, s: 1, e: [18, 24, 66], l: 19, d: 2 },\n      { h: 26, s: 32, e: [17], l: 435 },\n      { h: 22, s: 1, l: 71, d: 2 },\n      { h: 15, s: 80, l: 40 },\n      { h: 31, s: 32, l: 16 },\n      { h: 32, s: 1, l: 80, d: 2 },\n      { h: 52, s: 1, l: 42, d: 2 },\n      { h: 12, s: 1, l: 55, d: 2 },\n      { h: 40, s: 1, e: [38], l: 15, d: 2 },\n      { h: 14, s: 1, l: 48, d: 2 },\n      { h: 37, s: 48, l: 49 },\n      { h: 148, s: 1, l: 6351, d: 2 },\n      { h: 88, s: 1, l: 160, d: 2 },\n      { h: 15, s: 16, l: 704 },\n      { h: 25, s: 26, l: 854 },\n      { h: 25, s: 32, l: 55915 },\n      { h: 37, s: 40, l: 1247 },\n      { h: 25, s: -119711, l: 53248 },\n      { h: 25, s: -119763, l: 52 },\n      { h: 25, s: -119815, l: 52 },\n      { h: 25, s: -119867, e: [1, 4, 5, 7, 8, 11, 12, 17], l: 52 },\n      { h: 25, s: -119919, l: 52 },\n      { h: 24, s: -119971, e: [2, 7, 8, 17], l: 52 },\n      { h: 24, s: -120023, e: [2, 7, 13, 15, 16, 17], l: 52 },\n      { h: 25, s: -120075, l: 52 },\n      { h: 25, s: -120127, l: 52 },\n      { h: 25, s: -120179, l: 52 },\n      { h: 25, s: -120231, l: 52 },\n      { h: 25, s: -120283, l: 52 },\n      { h: 25, s: -120335, l: 52 },\n      { h: 24, s: -119543, e: [17], l: 56 },\n      { h: 24, s: -119601, e: [17], l: 58 },\n      { h: 24, s: -119659, e: [17], l: 58 },\n      { h: 24, s: -119717, e: [17], l: 58 },\n      { h: 24, s: -119775, e: [17], l: 58 }\n    ];\n    var Table_B_2_lut_abs = createTable(\"b5:3bc,c3:ff,7:73,2:253,5:254,3:256,1:257,5:259,1:25b,3:260,1:263,2:269,1:268,5:26f,1:272,2:275,7:280,3:283,5:288,3:28a,1:28b,5:292,3f:195,1:1bf,29:19e,125:3b9,8b:3b2,1:3b8,1:3c5,3:3c6,1:3c0,1a:3ba,1:3c1,1:3c3,2:3b8,1:3b5,1bc9:3b9,1c:1f76,1:1f77,f:1f7a,1:1f7b,d:1f78,1:1f79,1:1f7c,1:1f7d,107:63,5:25b,4:68,1:68,1:68,3:69,1:69,1:6c,3:6e,4:70,1:71,1:72,1:72,1:72,7:7a,2:3c9,2:7a,2:6b,1:e5,1:62,1:63,3:65,1:66,2:6d,b:3b3,1:3c0,6:64,1b574:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3\");\n    var Table_B_2_lut_rel = createTable(\"179:1,2:1,2:1,5:1,2:1,a:4f,a:1,8:1,2:1,2:1,3:1,5:1,3:1,4:1,2:1,3:1,4:1,8:2,1:1,2:2,1:1,2:2,27:2,195:26,2:25,1:25,1:25,2:40,2:3f,1:3f,33:1,11:-6,1:-9,1ac7:-3a,6d:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,b:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,c:-8,2:-8,2:-8,2:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,49:-8,1:-8,1:-4a,1:-4a,d:-56,1:-56,1:-56,1:-56,d:-8,1:-8,f:-8,1:-8,3:-7\");\n    var Table_B_2_complex = createTable(\"df:00730073,51:00690307,19:02BC006E,a7:006A030C,18a:002003B9,16:03B903080301,20:03C503080301,1d7:05650582,190f:00680331,1:00740308,1:0077030A,1:0079030A,1:006102BE,b6:03C50313,2:03C503130300,2:03C503130301,2:03C503130342,2a:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,3:1F7003B9,1:03B103B9,1:03AC03B9,2:03B10342,1:03B1034203B9,5:03B103B9,6:1F7403B9,1:03B703B9,1:03AE03B9,2:03B70342,1:03B7034203B9,5:03B703B9,6:03B903080300,1:03B903080301,3:03B90342,1:03B903080342,b:03C503080300,1:03C503080301,1:03C10313,2:03C50342,1:03C503080342,b:1F7C03B9,1:03C903B9,1:03CE03B9,2:03C90342,1:03C9034203B9,5:03C903B9,ac:00720073,5b:00B00063,6:00B00066,d:006E006F,a:0073006D,1:00740065006C,1:0074006D,124f:006800700061,2:00610075,2:006F0076,b:00700061,1:006E0061,1:03BC0061,1:006D0061,1:006B0061,1:006B0062,1:006D0062,1:00670062,3:00700066,1:006E0066,1:03BC0066,4:0068007A,1:006B0068007A,1:006D0068007A,1:00670068007A,1:00740068007A,15:00700061,1:006B00700061,1:006D00700061,1:006700700061,8:00700076,1:006E0076,1:03BC0076,1:006D0076,1:006B0076,1:006D0076,1:00700077,1:006E0077,1:03BC0077,1:006D0077,1:006B0077,1:006D0077,1:006B03C9,1:006D03C9,2:00620071,3:00632215006B0067,1:0063006F002E,1:00640062,1:00670079,2:00680070,2:006B006B,1:006B006D,9:00700068,2:00700070006D,1:00700072,2:00730076,1:00770062,c723:00660066,1:00660069,1:0066006C,1:006600660069,1:00660066006C,1:00730074,1:00730074,d:05740576,1:05740565,1:0574056B,1:057E0576,1:0574056D\", bytes2);\n    var Table_C_ranges = createRangeTable(\"80-20,2a0-,39c,32,f71,18e,7f2-f,19-7,30-4,7-5,f81-b,5,a800-20ff,4d1-1f,110,fa-6,d174-7,2e84-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,2,1f-5f,ff7f-20001\");\n    function flatten(values) {\n      return values.reduce(function(accum, value) {\n        value.forEach(function(value2) {\n          accum.push(value2);\n        });\n        return accum;\n      }, []);\n    }\n    function _nameprepTableA1(codepoint) {\n      return !!matchMap(codepoint, Table_A_1_ranges);\n    }\n    exports2._nameprepTableA1 = _nameprepTableA1;\n    function _nameprepTableB2(codepoint) {\n      var range = matchMap(codepoint, Table_B_2_ranges);\n      if (range) {\n        return [codepoint + range.s];\n      }\n      var codes = Table_B_2_lut_abs[codepoint];\n      if (codes) {\n        return codes;\n      }\n      var shift = Table_B_2_lut_rel[codepoint];\n      if (shift) {\n        return [codepoint + shift[0]];\n      }\n      var complex = Table_B_2_complex[codepoint];\n      if (complex) {\n        return complex;\n      }\n      return null;\n    }\n    exports2._nameprepTableB2 = _nameprepTableB2;\n    function _nameprepTableC(codepoint) {\n      return !!matchMap(codepoint, Table_C_ranges);\n    }\n    exports2._nameprepTableC = _nameprepTableC;\n    function nameprep(value) {\n      if (value.match(/^[a-z0-9-]*$/i) && value.length <= 59) {\n        return value.toLowerCase();\n      }\n      var codes = (0, utf8_1.toUtf8CodePoints)(value);\n      codes = flatten(codes.map(function(code) {\n        if (Table_B_1_flags.indexOf(code) >= 0) {\n          return [];\n        }\n        if (code >= 65024 && code <= 65039) {\n          return [];\n        }\n        var codesTableB2 = _nameprepTableB2(code);\n        if (codesTableB2) {\n          return codesTableB2;\n        }\n        return [code];\n      }));\n      codes = (0, utf8_1.toUtf8CodePoints)((0, utf8_1._toUtf8String)(codes), utf8_1.UnicodeNormalizationForm.NFKC);\n      codes.forEach(function(code) {\n        if (_nameprepTableC(code)) {\n          throw new Error(\"STRINGPREP_CONTAINS_PROHIBITED\");\n        }\n      });\n      codes.forEach(function(code) {\n        if (_nameprepTableA1(code)) {\n          throw new Error(\"STRINGPREP_CONTAINS_UNASSIGNED\");\n        }\n      });\n      var name2 = (0, utf8_1._toUtf8String)(codes);\n      if (name2.substring(0, 1) === \"-\" || name2.substring(2, 4) === \"--\" || name2.substring(name2.length - 1) === \"-\") {\n        throw new Error(\"invalid hyphen\");\n      }\n      if (name2.length > 63) {\n        throw new Error(\"too long\");\n      }\n      return name2;\n    }\n    exports2.nameprep = nameprep;\n  }\n});\n\n// node_modules/@ethersproject/strings/lib/index.js\nvar require_lib9 = __commonJS({\n  \"node_modules/@ethersproject/strings/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.nameprep = exports2.parseBytes32String = exports2.formatBytes32String = exports2.UnicodeNormalizationForm = exports2.Utf8ErrorReason = exports2.Utf8ErrorFuncs = exports2.toUtf8String = exports2.toUtf8CodePoints = exports2.toUtf8Bytes = exports2._toEscapedUtf8String = void 0;\n    var bytes32_1 = require_bytes32();\n    Object.defineProperty(exports2, \"formatBytes32String\", { enumerable: true, get: function() {\n      return bytes32_1.formatBytes32String;\n    } });\n    Object.defineProperty(exports2, \"parseBytes32String\", { enumerable: true, get: function() {\n      return bytes32_1.parseBytes32String;\n    } });\n    var idna_1 = require_idna();\n    Object.defineProperty(exports2, \"nameprep\", { enumerable: true, get: function() {\n      return idna_1.nameprep;\n    } });\n    var utf8_1 = require_utf8();\n    Object.defineProperty(exports2, \"_toEscapedUtf8String\", { enumerable: true, get: function() {\n      return utf8_1._toEscapedUtf8String;\n    } });\n    Object.defineProperty(exports2, \"toUtf8Bytes\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8Bytes;\n    } });\n    Object.defineProperty(exports2, \"toUtf8CodePoints\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8CodePoints;\n    } });\n    Object.defineProperty(exports2, \"toUtf8String\", { enumerable: true, get: function() {\n      return utf8_1.toUtf8String;\n    } });\n    Object.defineProperty(exports2, \"UnicodeNormalizationForm\", { enumerable: true, get: function() {\n      return utf8_1.UnicodeNormalizationForm;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorFuncs\", { enumerable: true, get: function() {\n      return utf8_1.Utf8ErrorFuncs;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorReason\", { enumerable: true, get: function() {\n      return utf8_1.Utf8ErrorReason;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/string.js\nvar require_string = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/string.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.StringCoder = void 0;\n    var strings_1 = require_lib9();\n    var bytes_1 = require_bytes();\n    var StringCoder = (\n      /** @class */\n      function(_super) {\n        __extends(StringCoder2, _super);\n        function StringCoder2(localName) {\n          return _super.call(this, \"string\", localName) || this;\n        }\n        StringCoder2.prototype.defaultValue = function() {\n          return \"\";\n        };\n        StringCoder2.prototype.encode = function(writer, value) {\n          return _super.prototype.encode.call(this, writer, (0, strings_1.toUtf8Bytes)(value));\n        };\n        StringCoder2.prototype.decode = function(reader) {\n          return (0, strings_1.toUtf8String)(_super.prototype.decode.call(this, reader));\n        };\n        return StringCoder2;\n      }(bytes_1.DynamicBytesCoder)\n    );\n    exports2.StringCoder = StringCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/coders/tuple.js\nvar require_tuple = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/coders/tuple.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TupleCoder = void 0;\n    var abstract_coder_1 = require_abstract_coder();\n    var array_1 = require_array();\n    var TupleCoder = (\n      /** @class */\n      function(_super) {\n        __extends(TupleCoder2, _super);\n        function TupleCoder2(coders, localName) {\n          var _this = this;\n          var dynamic = false;\n          var types = [];\n          coders.forEach(function(coder) {\n            if (coder.dynamic) {\n              dynamic = true;\n            }\n            types.push(coder.type);\n          });\n          var type = \"tuple(\" + types.join(\",\") + \")\";\n          _this = _super.call(this, \"tuple\", type, localName, dynamic) || this;\n          _this.coders = coders;\n          return _this;\n        }\n        TupleCoder2.prototype.defaultValue = function() {\n          var values = [];\n          this.coders.forEach(function(coder) {\n            values.push(coder.defaultValue());\n          });\n          var uniqueNames = this.coders.reduce(function(accum, coder) {\n            var name2 = coder.localName;\n            if (name2) {\n              if (!accum[name2]) {\n                accum[name2] = 0;\n              }\n              accum[name2]++;\n            }\n            return accum;\n          }, {});\n          this.coders.forEach(function(coder, index) {\n            var name2 = coder.localName;\n            if (!name2 || uniqueNames[name2] !== 1) {\n              return;\n            }\n            if (name2 === \"length\") {\n              name2 = \"_length\";\n            }\n            if (values[name2] != null) {\n              return;\n            }\n            values[name2] = values[index];\n          });\n          return Object.freeze(values);\n        };\n        TupleCoder2.prototype.encode = function(writer, value) {\n          return (0, array_1.pack)(writer, this.coders, value);\n        };\n        TupleCoder2.prototype.decode = function(reader) {\n          return reader.coerce(this.name, (0, array_1.unpack)(reader, this.coders));\n        };\n        return TupleCoder2;\n      }(abstract_coder_1.Coder)\n    );\n    exports2.TupleCoder = TupleCoder;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/abi-coder.js\nvar require_abi_coder = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/abi-coder.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.defaultAbiCoder = exports2.AbiCoder = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var abstract_coder_1 = require_abstract_coder();\n    var address_1 = require_address();\n    var array_1 = require_array();\n    var boolean_1 = require_boolean();\n    var bytes_2 = require_bytes();\n    var fixed_bytes_1 = require_fixed_bytes();\n    var null_1 = require_null();\n    var number_1 = require_number();\n    var string_1 = require_string();\n    var tuple_1 = require_tuple();\n    var fragments_1 = require_fragments();\n    var paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);\n    var paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);\n    var AbiCoder = (\n      /** @class */\n      function() {\n        function AbiCoder2(coerceFunc) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, AbiCoder2);\n          (0, properties_1.defineReadOnly)(this, \"coerceFunc\", coerceFunc || null);\n        }\n        AbiCoder2.prototype._getCoder = function(param) {\n          var _this = this;\n          switch (param.baseType) {\n            case \"address\":\n              return new address_1.AddressCoder(param.name);\n            case \"bool\":\n              return new boolean_1.BooleanCoder(param.name);\n            case \"string\":\n              return new string_1.StringCoder(param.name);\n            case \"bytes\":\n              return new bytes_2.BytesCoder(param.name);\n            case \"array\":\n              return new array_1.ArrayCoder(this._getCoder(param.arrayChildren), param.arrayLength, param.name);\n            case \"tuple\":\n              return new tuple_1.TupleCoder((param.components || []).map(function(component) {\n                return _this._getCoder(component);\n              }), param.name);\n            case \"\":\n              return new null_1.NullCoder(param.name);\n          }\n          var match = param.type.match(paramTypeNumber);\n          if (match) {\n            var size = parseInt(match[2] || \"256\");\n            if (size === 0 || size > 256 || size % 8 !== 0) {\n              logger.throwArgumentError(\"invalid \" + match[1] + \" bit length\", \"param\", param);\n            }\n            return new number_1.NumberCoder(size / 8, match[1] === \"int\", param.name);\n          }\n          match = param.type.match(paramTypeBytes);\n          if (match) {\n            var size = parseInt(match[1]);\n            if (size === 0 || size > 32) {\n              logger.throwArgumentError(\"invalid bytes length\", \"param\", param);\n            }\n            return new fixed_bytes_1.FixedBytesCoder(size, param.name);\n          }\n          return logger.throwArgumentError(\"invalid type\", \"type\", param.type);\n        };\n        AbiCoder2.prototype._getWordSize = function() {\n          return 32;\n        };\n        AbiCoder2.prototype._getReader = function(data, allowLoose) {\n          return new abstract_coder_1.Reader(data, this._getWordSize(), this.coerceFunc, allowLoose);\n        };\n        AbiCoder2.prototype._getWriter = function() {\n          return new abstract_coder_1.Writer(this._getWordSize());\n        };\n        AbiCoder2.prototype.getDefaultValue = function(types) {\n          var _this = this;\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          return coder.defaultValue();\n        };\n        AbiCoder2.prototype.encode = function(types, values) {\n          var _this = this;\n          if (types.length !== values.length) {\n            logger.throwError(\"types/values length mismatch\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n              count: { types: types.length, values: values.length },\n              value: { types, values }\n            });\n          }\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          var writer = this._getWriter();\n          coder.encode(writer, values);\n          return writer.data;\n        };\n        AbiCoder2.prototype.decode = function(types, data, loose) {\n          var _this = this;\n          var coders = types.map(function(type) {\n            return _this._getCoder(fragments_1.ParamType.from(type));\n          });\n          var coder = new tuple_1.TupleCoder(coders, \"_\");\n          return coder.decode(this._getReader((0, bytes_1.arrayify)(data), loose));\n        };\n        return AbiCoder2;\n      }()\n    );\n    exports2.AbiCoder = AbiCoder;\n    exports2.defaultAbiCoder = new AbiCoder();\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/id.js\nvar require_id = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/id.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.id = void 0;\n    var keccak256_1 = require_lib5();\n    var strings_1 = require_lib9();\n    function id(text) {\n      return (0, keccak256_1.keccak256)((0, strings_1.toUtf8Bytes)(text));\n    }\n    exports2.id = id;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/_version.js\nvar require_version9 = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"hash/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/namehash.js\nvar require_namehash = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/namehash.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.namehash = exports2.isValidName = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    var keccak256_1 = require_lib5();\n    var logger_1 = require_lib();\n    var _version_1 = require_version9();\n    var logger = new logger_1.Logger(_version_1.version);\n    var Zeros = new Uint8Array(32);\n    Zeros.fill(0);\n    var Partition = new RegExp(\"^((.*)\\\\.)?([^.]+)$\");\n    function isValidName(name2) {\n      try {\n        var comps = name2.split(\".\");\n        for (var i = 0; i < comps.length; i++) {\n          if ((0, strings_1.nameprep)(comps[i]).length === 0) {\n            throw new Error(\"empty\");\n          }\n        }\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isValidName = isValidName;\n    function namehash(name2) {\n      if (typeof name2 !== \"string\") {\n        logger.throwArgumentError(\"invalid ENS name; not a string\", \"name\", name2);\n      }\n      var current = name2;\n      var result = Zeros;\n      while (current.length) {\n        var partition = current.match(Partition);\n        if (partition == null || partition[2] === \"\") {\n          logger.throwArgumentError(\"invalid ENS address; missing component\", \"name\", name2);\n        }\n        var label = (0, strings_1.toUtf8Bytes)((0, strings_1.nameprep)(partition[3]));\n        result = (0, keccak256_1.keccak256)((0, bytes_1.concat)([result, (0, keccak256_1.keccak256)(label)]));\n        current = partition[2] || \"\";\n      }\n      return (0, bytes_1.hexlify)(result);\n    }\n    exports2.namehash = namehash;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/message.js\nvar require_message = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/message.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.hashMessage = exports2.messagePrefix = void 0;\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var strings_1 = require_lib9();\n    exports2.messagePrefix = \"\u0019Ethereum Signed Message:\\n\";\n    function hashMessage(message) {\n      if (typeof message === \"string\") {\n        message = (0, strings_1.toUtf8Bytes)(message);\n      }\n      return (0, keccak256_1.keccak256)((0, bytes_1.concat)([\n        (0, strings_1.toUtf8Bytes)(exports2.messagePrefix),\n        (0, strings_1.toUtf8Bytes)(String(message.length)),\n        message\n      ]));\n    }\n    exports2.hashMessage = hashMessage;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/typed-data.js\nvar require_typed_data = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/typed-data.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TypedDataEncoder = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version9();\n    var logger = new logger_1.Logger(_version_1.version);\n    var id_1 = require_id();\n    var padding = new Uint8Array(32);\n    padding.fill(0);\n    var NegativeOne = bignumber_1.BigNumber.from(-1);\n    var Zero = bignumber_1.BigNumber.from(0);\n    var One = bignumber_1.BigNumber.from(1);\n    var MaxUint256 = bignumber_1.BigNumber.from(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n    function hexPadRight(value) {\n      var bytes = (0, bytes_1.arrayify)(value);\n      var padOffset = bytes.length % 32;\n      if (padOffset) {\n        return (0, bytes_1.hexConcat)([bytes, padding.slice(padOffset)]);\n      }\n      return (0, bytes_1.hexlify)(bytes);\n    }\n    var hexTrue = (0, bytes_1.hexZeroPad)(One.toHexString(), 32);\n    var hexFalse = (0, bytes_1.hexZeroPad)(Zero.toHexString(), 32);\n    var domainFieldTypes = {\n      name: \"string\",\n      version: \"string\",\n      chainId: \"uint256\",\n      verifyingContract: \"address\",\n      salt: \"bytes32\"\n    };\n    var domainFieldNames = [\n      \"name\",\n      \"version\",\n      \"chainId\",\n      \"verifyingContract\",\n      \"salt\"\n    ];\n    function checkString(key) {\n      return function(value) {\n        if (typeof value !== \"string\") {\n          logger.throwArgumentError(\"invalid domain value for \" + JSON.stringify(key), \"domain.\" + key, value);\n        }\n        return value;\n      };\n    }\n    var domainChecks = {\n      name: checkString(\"name\"),\n      version: checkString(\"version\"),\n      chainId: function(value) {\n        try {\n          return bignumber_1.BigNumber.from(value).toString();\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value for \"chainId\"', \"domain.chainId\", value);\n      },\n      verifyingContract: function(value) {\n        try {\n          return (0, address_1.getAddress)(value).toLowerCase();\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value \"verifyingContract\"', \"domain.verifyingContract\", value);\n      },\n      salt: function(value) {\n        try {\n          var bytes = (0, bytes_1.arrayify)(value);\n          if (bytes.length !== 32) {\n            throw new Error(\"bad length\");\n          }\n          return (0, bytes_1.hexlify)(bytes);\n        } catch (error) {\n        }\n        return logger.throwArgumentError('invalid domain value \"salt\"', \"domain.salt\", value);\n      }\n    };\n    function getBaseEncoder(type) {\n      {\n        var match = type.match(/^(u?)int(\\d*)$/);\n        if (match) {\n          var signed = match[1] === \"\";\n          var width = parseInt(match[2] || \"256\");\n          if (width % 8 !== 0 || width > 256 || match[2] && match[2] !== String(width)) {\n            logger.throwArgumentError(\"invalid numeric width\", \"type\", type);\n          }\n          var boundsUpper_1 = MaxUint256.mask(signed ? width - 1 : width);\n          var boundsLower_1 = signed ? boundsUpper_1.add(One).mul(NegativeOne) : Zero;\n          return function(value) {\n            var v = bignumber_1.BigNumber.from(value);\n            if (v.lt(boundsLower_1) || v.gt(boundsUpper_1)) {\n              logger.throwArgumentError(\"value out-of-bounds for \" + type, \"value\", value);\n            }\n            return (0, bytes_1.hexZeroPad)(v.toTwos(256).toHexString(), 32);\n          };\n        }\n      }\n      {\n        var match = type.match(/^bytes(\\d+)$/);\n        if (match) {\n          var width_1 = parseInt(match[1]);\n          if (width_1 === 0 || width_1 > 32 || match[1] !== String(width_1)) {\n            logger.throwArgumentError(\"invalid bytes width\", \"type\", type);\n          }\n          return function(value) {\n            var bytes = (0, bytes_1.arrayify)(value);\n            if (bytes.length !== width_1) {\n              logger.throwArgumentError(\"invalid length for \" + type, \"value\", value);\n            }\n            return hexPadRight(value);\n          };\n        }\n      }\n      switch (type) {\n        case \"address\":\n          return function(value) {\n            return (0, bytes_1.hexZeroPad)((0, address_1.getAddress)(value), 32);\n          };\n        case \"bool\":\n          return function(value) {\n            return !value ? hexFalse : hexTrue;\n          };\n        case \"bytes\":\n          return function(value) {\n            return (0, keccak256_1.keccak256)(value);\n          };\n        case \"string\":\n          return function(value) {\n            return (0, id_1.id)(value);\n          };\n      }\n      return null;\n    }\n    function encodeType(name2, fields) {\n      return name2 + \"(\" + fields.map(function(_a) {\n        var name3 = _a.name, type = _a.type;\n        return type + \" \" + name3;\n      }).join(\",\") + \")\";\n    }\n    var TypedDataEncoder = (\n      /** @class */\n      function() {\n        function TypedDataEncoder2(types) {\n          (0, properties_1.defineReadOnly)(this, \"types\", Object.freeze((0, properties_1.deepCopy)(types)));\n          (0, properties_1.defineReadOnly)(this, \"_encoderCache\", {});\n          (0, properties_1.defineReadOnly)(this, \"_types\", {});\n          var links = {};\n          var parents = {};\n          var subtypes = {};\n          Object.keys(types).forEach(function(type) {\n            links[type] = {};\n            parents[type] = [];\n            subtypes[type] = {};\n          });\n          var _loop_1 = function(name_12) {\n            var uniqueNames = {};\n            types[name_12].forEach(function(field) {\n              if (uniqueNames[field.name]) {\n                logger.throwArgumentError(\"duplicate variable name \" + JSON.stringify(field.name) + \" in \" + JSON.stringify(name_12), \"types\", types);\n              }\n              uniqueNames[field.name] = true;\n              var baseType = field.type.match(/^([^\\x5b]*)(\\x5b|$)/)[1];\n              if (baseType === name_12) {\n                logger.throwArgumentError(\"circular type reference to \" + JSON.stringify(baseType), \"types\", types);\n              }\n              var encoder = getBaseEncoder(baseType);\n              if (encoder) {\n                return;\n              }\n              if (!parents[baseType]) {\n                logger.throwArgumentError(\"unknown type \" + JSON.stringify(baseType), \"types\", types);\n              }\n              parents[baseType].push(name_12);\n              links[name_12][baseType] = true;\n            });\n          };\n          for (var name_1 in types) {\n            _loop_1(name_1);\n          }\n          var primaryTypes = Object.keys(parents).filter(function(n) {\n            return parents[n].length === 0;\n          });\n          if (primaryTypes.length === 0) {\n            logger.throwArgumentError(\"missing primary type\", \"types\", types);\n          } else if (primaryTypes.length > 1) {\n            logger.throwArgumentError(\"ambiguous primary types or unused types: \" + primaryTypes.map(function(t) {\n              return JSON.stringify(t);\n            }).join(\", \"), \"types\", types);\n          }\n          (0, properties_1.defineReadOnly)(this, \"primaryType\", primaryTypes[0]);\n          function checkCircular(type, found) {\n            if (found[type]) {\n              logger.throwArgumentError(\"circular type reference to \" + JSON.stringify(type), \"types\", types);\n            }\n            found[type] = true;\n            Object.keys(links[type]).forEach(function(child) {\n              if (!parents[child]) {\n                return;\n              }\n              checkCircular(child, found);\n              Object.keys(found).forEach(function(subtype) {\n                subtypes[subtype][child] = true;\n              });\n            });\n            delete found[type];\n          }\n          checkCircular(this.primaryType, {});\n          for (var name_2 in subtypes) {\n            var st = Object.keys(subtypes[name_2]);\n            st.sort();\n            this._types[name_2] = encodeType(name_2, types[name_2]) + st.map(function(t) {\n              return encodeType(t, types[t]);\n            }).join(\"\");\n          }\n        }\n        TypedDataEncoder2.prototype.getEncoder = function(type) {\n          var encoder = this._encoderCache[type];\n          if (!encoder) {\n            encoder = this._encoderCache[type] = this._getEncoder(type);\n          }\n          return encoder;\n        };\n        TypedDataEncoder2.prototype._getEncoder = function(type) {\n          var _this = this;\n          {\n            var encoder = getBaseEncoder(type);\n            if (encoder) {\n              return encoder;\n            }\n          }\n          var match = type.match(/^(.*)(\\x5b(\\d*)\\x5d)$/);\n          if (match) {\n            var subtype_1 = match[1];\n            var subEncoder_1 = this.getEncoder(subtype_1);\n            var length_1 = parseInt(match[3]);\n            return function(value) {\n              if (length_1 >= 0 && value.length !== length_1) {\n                logger.throwArgumentError(\"array length mismatch; expected length ${ arrayLength }\", \"value\", value);\n              }\n              var result = value.map(subEncoder_1);\n              if (_this._types[subtype_1]) {\n                result = result.map(keccak256_1.keccak256);\n              }\n              return (0, keccak256_1.keccak256)((0, bytes_1.hexConcat)(result));\n            };\n          }\n          var fields = this.types[type];\n          if (fields) {\n            var encodedType_1 = (0, id_1.id)(this._types[type]);\n            return function(value) {\n              var values = fields.map(function(_a) {\n                var name2 = _a.name, type2 = _a.type;\n                var result = _this.getEncoder(type2)(value[name2]);\n                if (_this._types[type2]) {\n                  return (0, keccak256_1.keccak256)(result);\n                }\n                return result;\n              });\n              values.unshift(encodedType_1);\n              return (0, bytes_1.hexConcat)(values);\n            };\n          }\n          return logger.throwArgumentError(\"unknown type: \" + type, \"type\", type);\n        };\n        TypedDataEncoder2.prototype.encodeType = function(name2) {\n          var result = this._types[name2];\n          if (!result) {\n            logger.throwArgumentError(\"unknown type: \" + JSON.stringify(name2), \"name\", name2);\n          }\n          return result;\n        };\n        TypedDataEncoder2.prototype.encodeData = function(type, value) {\n          return this.getEncoder(type)(value);\n        };\n        TypedDataEncoder2.prototype.hashStruct = function(name2, value) {\n          return (0, keccak256_1.keccak256)(this.encodeData(name2, value));\n        };\n        TypedDataEncoder2.prototype.encode = function(value) {\n          return this.encodeData(this.primaryType, value);\n        };\n        TypedDataEncoder2.prototype.hash = function(value) {\n          return this.hashStruct(this.primaryType, value);\n        };\n        TypedDataEncoder2.prototype._visit = function(type, value, callback) {\n          var _this = this;\n          {\n            var encoder = getBaseEncoder(type);\n            if (encoder) {\n              return callback(type, value);\n            }\n          }\n          var match = type.match(/^(.*)(\\x5b(\\d*)\\x5d)$/);\n          if (match) {\n            var subtype_2 = match[1];\n            var length_2 = parseInt(match[3]);\n            if (length_2 >= 0 && value.length !== length_2) {\n              logger.throwArgumentError(\"array length mismatch; expected length ${ arrayLength }\", \"value\", value);\n            }\n            return value.map(function(v) {\n              return _this._visit(subtype_2, v, callback);\n            });\n          }\n          var fields = this.types[type];\n          if (fields) {\n            return fields.reduce(function(accum, _a) {\n              var name2 = _a.name, type2 = _a.type;\n              accum[name2] = _this._visit(type2, value[name2], callback);\n              return accum;\n            }, {});\n          }\n          return logger.throwArgumentError(\"unknown type: \" + type, \"type\", type);\n        };\n        TypedDataEncoder2.prototype.visit = function(value, callback) {\n          return this._visit(this.primaryType, value, callback);\n        };\n        TypedDataEncoder2.from = function(types) {\n          return new TypedDataEncoder2(types);\n        };\n        TypedDataEncoder2.getPrimaryType = function(types) {\n          return TypedDataEncoder2.from(types).primaryType;\n        };\n        TypedDataEncoder2.hashStruct = function(name2, types, value) {\n          return TypedDataEncoder2.from(types).hashStruct(name2, value);\n        };\n        TypedDataEncoder2.hashDomain = function(domain) {\n          var domainFields = [];\n          for (var name_3 in domain) {\n            var type = domainFieldTypes[name_3];\n            if (!type) {\n              logger.throwArgumentError(\"invalid typed-data domain key: \" + JSON.stringify(name_3), \"domain\", domain);\n            }\n            domainFields.push({ name: name_3, type });\n          }\n          domainFields.sort(function(a, b) {\n            return domainFieldNames.indexOf(a.name) - domainFieldNames.indexOf(b.name);\n          });\n          return TypedDataEncoder2.hashStruct(\"EIP712Domain\", { EIP712Domain: domainFields }, domain);\n        };\n        TypedDataEncoder2.encode = function(domain, types, value) {\n          return (0, bytes_1.hexConcat)([\n            \"0x1901\",\n            TypedDataEncoder2.hashDomain(domain),\n            TypedDataEncoder2.from(types).hash(value)\n          ]);\n        };\n        TypedDataEncoder2.hash = function(domain, types, value) {\n          return (0, keccak256_1.keccak256)(TypedDataEncoder2.encode(domain, types, value));\n        };\n        TypedDataEncoder2.resolveNames = function(domain, types, value, resolveName) {\n          return __awaiter(this, void 0, void 0, function() {\n            var ensCache, encoder, _a, _b, _i, name_4, _c, _d;\n            return __generator(this, function(_e) {\n              switch (_e.label) {\n                case 0:\n                  domain = (0, properties_1.shallowCopy)(domain);\n                  ensCache = {};\n                  if (domain.verifyingContract && !(0, bytes_1.isHexString)(domain.verifyingContract, 20)) {\n                    ensCache[domain.verifyingContract] = \"0x\";\n                  }\n                  encoder = TypedDataEncoder2.from(types);\n                  encoder.visit(value, function(type, value2) {\n                    if (type === \"address\" && !(0, bytes_1.isHexString)(value2, 20)) {\n                      ensCache[value2] = \"0x\";\n                    }\n                    return value2;\n                  });\n                  _a = [];\n                  for (_b in ensCache)\n                    _a.push(_b);\n                  _i = 0;\n                  _e.label = 1;\n                case 1:\n                  if (!(_i < _a.length)) return [3, 4];\n                  name_4 = _a[_i];\n                  _c = ensCache;\n                  _d = name_4;\n                  return [4, resolveName(name_4)];\n                case 2:\n                  _c[_d] = _e.sent();\n                  _e.label = 3;\n                case 3:\n                  _i++;\n                  return [3, 1];\n                case 4:\n                  if (domain.verifyingContract && ensCache[domain.verifyingContract]) {\n                    domain.verifyingContract = ensCache[domain.verifyingContract];\n                  }\n                  value = encoder.visit(value, function(type, value2) {\n                    if (type === \"address\" && ensCache[value2]) {\n                      return ensCache[value2];\n                    }\n                    return value2;\n                  });\n                  return [2, { domain, value }];\n              }\n            });\n          });\n        };\n        TypedDataEncoder2.getPayload = function(domain, types, value) {\n          TypedDataEncoder2.hashDomain(domain);\n          var domainValues = {};\n          var domainTypes = [];\n          domainFieldNames.forEach(function(name2) {\n            var value2 = domain[name2];\n            if (value2 == null) {\n              return;\n            }\n            domainValues[name2] = domainChecks[name2](value2);\n            domainTypes.push({ name: name2, type: domainFieldTypes[name2] });\n          });\n          var encoder = TypedDataEncoder2.from(types);\n          var typesWithDomain = (0, properties_1.shallowCopy)(types);\n          if (typesWithDomain.EIP712Domain) {\n            logger.throwArgumentError(\"types must not contain EIP712Domain type\", \"types.EIP712Domain\", types);\n          } else {\n            typesWithDomain.EIP712Domain = domainTypes;\n          }\n          encoder.encode(value);\n          return {\n            types: typesWithDomain,\n            domain: domainValues,\n            primaryType: encoder.primaryType,\n            message: encoder.visit(value, function(type, value2) {\n              if (type.match(/^bytes(\\d*)/)) {\n                return (0, bytes_1.hexlify)((0, bytes_1.arrayify)(value2));\n              }\n              if (type.match(/^u?int/)) {\n                return bignumber_1.BigNumber.from(value2).toString();\n              }\n              switch (type) {\n                case \"address\":\n                  return value2.toLowerCase();\n                case \"bool\":\n                  return !!value2;\n                case \"string\":\n                  if (typeof value2 !== \"string\") {\n                    logger.throwArgumentError(\"invalid string\", \"value\", value2);\n                  }\n                  return value2;\n              }\n              return logger.throwArgumentError(\"unsupported type\", \"type\", type);\n            })\n          };\n        };\n        return TypedDataEncoder2;\n      }()\n    );\n    exports2.TypedDataEncoder = TypedDataEncoder;\n  }\n});\n\n// node_modules/@ethersproject/hash/lib/index.js\nvar require_lib10 = __commonJS({\n  \"node_modules/@ethersproject/hash/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2._TypedDataEncoder = exports2.hashMessage = exports2.messagePrefix = exports2.isValidName = exports2.namehash = exports2.id = void 0;\n    var id_1 = require_id();\n    Object.defineProperty(exports2, \"id\", { enumerable: true, get: function() {\n      return id_1.id;\n    } });\n    var namehash_1 = require_namehash();\n    Object.defineProperty(exports2, \"isValidName\", { enumerable: true, get: function() {\n      return namehash_1.isValidName;\n    } });\n    Object.defineProperty(exports2, \"namehash\", { enumerable: true, get: function() {\n      return namehash_1.namehash;\n    } });\n    var message_1 = require_message();\n    Object.defineProperty(exports2, \"hashMessage\", { enumerable: true, get: function() {\n      return message_1.hashMessage;\n    } });\n    Object.defineProperty(exports2, \"messagePrefix\", { enumerable: true, get: function() {\n      return message_1.messagePrefix;\n    } });\n    var typed_data_1 = require_typed_data();\n    Object.defineProperty(exports2, \"_TypedDataEncoder\", { enumerable: true, get: function() {\n      return typed_data_1.TypedDataEncoder;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/interface.js\nvar require_interface = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/interface.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Interface = exports2.Indexed = exports2.ErrorDescription = exports2.TransactionDescription = exports2.LogDescription = exports2.checkResultErrors = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var abi_coder_1 = require_abi_coder();\n    var abstract_coder_1 = require_abstract_coder();\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return abstract_coder_1.checkResultErrors;\n    } });\n    var fragments_1 = require_fragments();\n    var logger_1 = require_lib();\n    var _version_1 = require_version5();\n    var logger = new logger_1.Logger(_version_1.version);\n    var LogDescription = (\n      /** @class */\n      function(_super) {\n        __extends(LogDescription2, _super);\n        function LogDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return LogDescription2;\n      }(properties_1.Description)\n    );\n    exports2.LogDescription = LogDescription;\n    var TransactionDescription = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionDescription2, _super);\n        function TransactionDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return TransactionDescription2;\n      }(properties_1.Description)\n    );\n    exports2.TransactionDescription = TransactionDescription;\n    var ErrorDescription = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorDescription2, _super);\n        function ErrorDescription2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return ErrorDescription2;\n      }(properties_1.Description)\n    );\n    exports2.ErrorDescription = ErrorDescription;\n    var Indexed = (\n      /** @class */\n      function(_super) {\n        __extends(Indexed2, _super);\n        function Indexed2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        Indexed2.isIndexed = function(value) {\n          return !!(value && value._isIndexed);\n        };\n        return Indexed2;\n      }(properties_1.Description)\n    );\n    exports2.Indexed = Indexed;\n    var BuiltinErrors = {\n      \"0x08c379a0\": { signature: \"Error(string)\", name: \"Error\", inputs: [\"string\"], reason: true },\n      \"0x4e487b71\": { signature: \"Panic(uint256)\", name: \"Panic\", inputs: [\"uint256\"] }\n    };\n    function wrapAccessError(property, error) {\n      var wrap = new Error(\"deferred error during ABI decoding triggered accessing \" + property);\n      wrap.error = error;\n      return wrap;\n    }\n    var Interface = (\n      /** @class */\n      function() {\n        function Interface2(fragments) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Interface2);\n          var abi = [];\n          if (typeof fragments === \"string\") {\n            abi = JSON.parse(fragments);\n          } else {\n            abi = fragments;\n          }\n          (0, properties_1.defineReadOnly)(this, \"fragments\", abi.map(function(fragment) {\n            return fragments_1.Fragment.from(fragment);\n          }).filter(function(fragment) {\n            return fragment != null;\n          }));\n          (0, properties_1.defineReadOnly)(this, \"_abiCoder\", (0, properties_1.getStatic)(_newTarget, \"getAbiCoder\")());\n          (0, properties_1.defineReadOnly)(this, \"functions\", {});\n          (0, properties_1.defineReadOnly)(this, \"errors\", {});\n          (0, properties_1.defineReadOnly)(this, \"events\", {});\n          (0, properties_1.defineReadOnly)(this, \"structs\", {});\n          this.fragments.forEach(function(fragment) {\n            var bucket = null;\n            switch (fragment.type) {\n              case \"constructor\":\n                if (_this.deploy) {\n                  logger.warn(\"duplicate definition - constructor\");\n                  return;\n                }\n                (0, properties_1.defineReadOnly)(_this, \"deploy\", fragment);\n                return;\n              case \"function\":\n                bucket = _this.functions;\n                break;\n              case \"event\":\n                bucket = _this.events;\n                break;\n              case \"error\":\n                bucket = _this.errors;\n                break;\n              default:\n                return;\n            }\n            var signature = fragment.format();\n            if (bucket[signature]) {\n              logger.warn(\"duplicate definition - \" + signature);\n              return;\n            }\n            bucket[signature] = fragment;\n          });\n          if (!this.deploy) {\n            (0, properties_1.defineReadOnly)(this, \"deploy\", fragments_1.ConstructorFragment.from({\n              payable: false,\n              type: \"constructor\"\n            }));\n          }\n          (0, properties_1.defineReadOnly)(this, \"_isInterface\", true);\n        }\n        Interface2.prototype.format = function(format) {\n          if (!format) {\n            format = fragments_1.FormatTypes.full;\n          }\n          if (format === fragments_1.FormatTypes.sighash) {\n            logger.throwArgumentError(\"interface does not support formatting sighash\", \"format\", format);\n          }\n          var abi = this.fragments.map(function(fragment) {\n            return fragment.format(format);\n          });\n          if (format === fragments_1.FormatTypes.json) {\n            return JSON.stringify(abi.map(function(j) {\n              return JSON.parse(j);\n            }));\n          }\n          return abi;\n        };\n        Interface2.getAbiCoder = function() {\n          return abi_coder_1.defaultAbiCoder;\n        };\n        Interface2.getAddress = function(address) {\n          return (0, address_1.getAddress)(address);\n        };\n        Interface2.getSighash = function(fragment) {\n          return (0, bytes_1.hexDataSlice)((0, hash_1.id)(fragment.format()), 0, 4);\n        };\n        Interface2.getEventTopic = function(eventFragment) {\n          return (0, hash_1.id)(eventFragment.format());\n        };\n        Interface2.prototype.getFunction = function(nameOrSignatureOrSighash) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrSighash)) {\n            for (var name_1 in this.functions) {\n              if (nameOrSignatureOrSighash === this.getSighash(name_1)) {\n                return this.functions[name_1];\n              }\n            }\n            logger.throwArgumentError(\"no matching function\", \"sighash\", nameOrSignatureOrSighash);\n          }\n          if (nameOrSignatureOrSighash.indexOf(\"(\") === -1) {\n            var name_2 = nameOrSignatureOrSighash.trim();\n            var matching = Object.keys(this.functions).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_2;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching function\", \"name\", name_2);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching functions\", \"name\", name_2);\n            }\n            return this.functions[matching[0]];\n          }\n          var result = this.functions[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()];\n          if (!result) {\n            logger.throwArgumentError(\"no matching function\", \"signature\", nameOrSignatureOrSighash);\n          }\n          return result;\n        };\n        Interface2.prototype.getEvent = function(nameOrSignatureOrTopic) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrTopic)) {\n            var topichash = nameOrSignatureOrTopic.toLowerCase();\n            for (var name_3 in this.events) {\n              if (topichash === this.getEventTopic(name_3)) {\n                return this.events[name_3];\n              }\n            }\n            logger.throwArgumentError(\"no matching event\", \"topichash\", topichash);\n          }\n          if (nameOrSignatureOrTopic.indexOf(\"(\") === -1) {\n            var name_4 = nameOrSignatureOrTopic.trim();\n            var matching = Object.keys(this.events).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_4;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching event\", \"name\", name_4);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching events\", \"name\", name_4);\n            }\n            return this.events[matching[0]];\n          }\n          var result = this.events[fragments_1.EventFragment.fromString(nameOrSignatureOrTopic).format()];\n          if (!result) {\n            logger.throwArgumentError(\"no matching event\", \"signature\", nameOrSignatureOrTopic);\n          }\n          return result;\n        };\n        Interface2.prototype.getError = function(nameOrSignatureOrSighash) {\n          if ((0, bytes_1.isHexString)(nameOrSignatureOrSighash)) {\n            var getSighash = (0, properties_1.getStatic)(this.constructor, \"getSighash\");\n            for (var name_5 in this.errors) {\n              var error = this.errors[name_5];\n              if (nameOrSignatureOrSighash === getSighash(error)) {\n                return this.errors[name_5];\n              }\n            }\n            logger.throwArgumentError(\"no matching error\", \"sighash\", nameOrSignatureOrSighash);\n          }\n          if (nameOrSignatureOrSighash.indexOf(\"(\") === -1) {\n            var name_6 = nameOrSignatureOrSighash.trim();\n            var matching = Object.keys(this.errors).filter(function(f) {\n              return f.split(\n                \"(\"\n                /* fix:) */\n              )[0] === name_6;\n            });\n            if (matching.length === 0) {\n              logger.throwArgumentError(\"no matching error\", \"name\", name_6);\n            } else if (matching.length > 1) {\n              logger.throwArgumentError(\"multiple matching errors\", \"name\", name_6);\n            }\n            return this.errors[matching[0]];\n          }\n          var result = this.errors[fragments_1.FunctionFragment.fromString(nameOrSignatureOrSighash).format()];\n          if (!result) {\n            logger.throwArgumentError(\"no matching error\", \"signature\", nameOrSignatureOrSighash);\n          }\n          return result;\n        };\n        Interface2.prototype.getSighash = function(fragment) {\n          if (typeof fragment === \"string\") {\n            try {\n              fragment = this.getFunction(fragment);\n            } catch (error) {\n              try {\n                fragment = this.getError(fragment);\n              } catch (_) {\n                throw error;\n              }\n            }\n          }\n          return (0, properties_1.getStatic)(this.constructor, \"getSighash\")(fragment);\n        };\n        Interface2.prototype.getEventTopic = function(eventFragment) {\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          return (0, properties_1.getStatic)(this.constructor, \"getEventTopic\")(eventFragment);\n        };\n        Interface2.prototype._decodeParams = function(params, data) {\n          return this._abiCoder.decode(params, data);\n        };\n        Interface2.prototype._encodeParams = function(params, values) {\n          return this._abiCoder.encode(params, values);\n        };\n        Interface2.prototype.encodeDeploy = function(values) {\n          return this._encodeParams(this.deploy.inputs, values || []);\n        };\n        Interface2.prototype.decodeErrorResult = function(fragment, data) {\n          if (typeof fragment === \"string\") {\n            fragment = this.getError(fragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          if ((0, bytes_1.hexlify)(bytes.slice(0, 4)) !== this.getSighash(fragment)) {\n            logger.throwArgumentError(\"data signature does not match error \" + fragment.name + \".\", \"data\", (0, bytes_1.hexlify)(bytes));\n          }\n          return this._decodeParams(fragment.inputs, bytes.slice(4));\n        };\n        Interface2.prototype.encodeErrorResult = function(fragment, values) {\n          if (typeof fragment === \"string\") {\n            fragment = this.getError(fragment);\n          }\n          return (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.getSighash(fragment),\n            this._encodeParams(fragment.inputs, values || [])\n          ]));\n        };\n        Interface2.prototype.decodeFunctionData = function(functionFragment, data) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          if ((0, bytes_1.hexlify)(bytes.slice(0, 4)) !== this.getSighash(functionFragment)) {\n            logger.throwArgumentError(\"data signature does not match function \" + functionFragment.name + \".\", \"data\", (0, bytes_1.hexlify)(bytes));\n          }\n          return this._decodeParams(functionFragment.inputs, bytes.slice(4));\n        };\n        Interface2.prototype.encodeFunctionData = function(functionFragment, values) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          return (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.getSighash(functionFragment),\n            this._encodeParams(functionFragment.inputs, values || [])\n          ]));\n        };\n        Interface2.prototype.decodeFunctionResult = function(functionFragment, data) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          var bytes = (0, bytes_1.arrayify)(data);\n          var reason = null;\n          var errorArgs = null;\n          var errorName = null;\n          var errorSignature = null;\n          switch (bytes.length % this._abiCoder._getWordSize()) {\n            case 0:\n              try {\n                return this._abiCoder.decode(functionFragment.outputs, bytes);\n              } catch (error2) {\n              }\n              break;\n            case 4: {\n              var selector = (0, bytes_1.hexlify)(bytes.slice(0, 4));\n              var builtin = BuiltinErrors[selector];\n              if (builtin) {\n                errorArgs = this._abiCoder.decode(builtin.inputs, bytes.slice(4));\n                errorName = builtin.name;\n                errorSignature = builtin.signature;\n                if (builtin.reason) {\n                  reason = errorArgs[0];\n                }\n              } else {\n                try {\n                  var error = this.getError(selector);\n                  errorArgs = this._abiCoder.decode(error.inputs, bytes.slice(4));\n                  errorName = error.name;\n                  errorSignature = error.format();\n                } catch (error2) {\n                  console.log(error2);\n                }\n              }\n              break;\n            }\n          }\n          return logger.throwError(\"call revert exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n            method: functionFragment.format(),\n            errorArgs,\n            errorName,\n            errorSignature,\n            reason\n          });\n        };\n        Interface2.prototype.encodeFunctionResult = function(functionFragment, values) {\n          if (typeof functionFragment === \"string\") {\n            functionFragment = this.getFunction(functionFragment);\n          }\n          return (0, bytes_1.hexlify)(this._abiCoder.encode(functionFragment.outputs, values || []));\n        };\n        Interface2.prototype.encodeFilterTopics = function(eventFragment, values) {\n          var _this = this;\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          if (values.length > eventFragment.inputs.length) {\n            logger.throwError(\"too many arguments for \" + eventFragment.format(), logger_1.Logger.errors.UNEXPECTED_ARGUMENT, {\n              argument: \"values\",\n              value: values\n            });\n          }\n          var topics = [];\n          if (!eventFragment.anonymous) {\n            topics.push(this.getEventTopic(eventFragment));\n          }\n          var encodeTopic = function(param, value) {\n            if (param.type === \"string\") {\n              return (0, hash_1.id)(value);\n            } else if (param.type === \"bytes\") {\n              return (0, keccak256_1.keccak256)((0, bytes_1.hexlify)(value));\n            }\n            if (param.type === \"address\") {\n              _this._abiCoder.encode([\"address\"], [value]);\n            }\n            return (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(value), 32);\n          };\n          values.forEach(function(value, index) {\n            var param = eventFragment.inputs[index];\n            if (!param.indexed) {\n              if (value != null) {\n                logger.throwArgumentError(\"cannot filter non-indexed parameters; must be null\", \"contract.\" + param.name, value);\n              }\n              return;\n            }\n            if (value == null) {\n              topics.push(null);\n            } else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n              logger.throwArgumentError(\"filtering with tuples or arrays not supported\", \"contract.\" + param.name, value);\n            } else if (Array.isArray(value)) {\n              topics.push(value.map(function(value2) {\n                return encodeTopic(param, value2);\n              }));\n            } else {\n              topics.push(encodeTopic(param, value));\n            }\n          });\n          while (topics.length && topics[topics.length - 1] === null) {\n            topics.pop();\n          }\n          return topics;\n        };\n        Interface2.prototype.encodeEventLog = function(eventFragment, values) {\n          var _this = this;\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          var topics = [];\n          var dataTypes = [];\n          var dataValues = [];\n          if (!eventFragment.anonymous) {\n            topics.push(this.getEventTopic(eventFragment));\n          }\n          if (values.length !== eventFragment.inputs.length) {\n            logger.throwArgumentError(\"event arguments/values mismatch\", \"values\", values);\n          }\n          eventFragment.inputs.forEach(function(param, index) {\n            var value = values[index];\n            if (param.indexed) {\n              if (param.type === \"string\") {\n                topics.push((0, hash_1.id)(value));\n              } else if (param.type === \"bytes\") {\n                topics.push((0, keccak256_1.keccak256)(value));\n              } else if (param.baseType === \"tuple\" || param.baseType === \"array\") {\n                throw new Error(\"not implemented\");\n              } else {\n                topics.push(_this._abiCoder.encode([param.type], [value]));\n              }\n            } else {\n              dataTypes.push(param);\n              dataValues.push(value);\n            }\n          });\n          return {\n            data: this._abiCoder.encode(dataTypes, dataValues),\n            topics\n          };\n        };\n        Interface2.prototype.decodeEventLog = function(eventFragment, data, topics) {\n          if (typeof eventFragment === \"string\") {\n            eventFragment = this.getEvent(eventFragment);\n          }\n          if (topics != null && !eventFragment.anonymous) {\n            var topicHash = this.getEventTopic(eventFragment);\n            if (!(0, bytes_1.isHexString)(topics[0], 32) || topics[0].toLowerCase() !== topicHash) {\n              logger.throwError(\"fragment/topic mismatch\", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: \"topics[0]\", expected: topicHash, value: topics[0] });\n            }\n            topics = topics.slice(1);\n          }\n          var indexed = [];\n          var nonIndexed = [];\n          var dynamic = [];\n          eventFragment.inputs.forEach(function(param, index) {\n            if (param.indexed) {\n              if (param.type === \"string\" || param.type === \"bytes\" || param.baseType === \"tuple\" || param.baseType === \"array\") {\n                indexed.push(fragments_1.ParamType.fromObject({ type: \"bytes32\", name: param.name }));\n                dynamic.push(true);\n              } else {\n                indexed.push(param);\n                dynamic.push(false);\n              }\n            } else {\n              nonIndexed.push(param);\n              dynamic.push(false);\n            }\n          });\n          var resultIndexed = topics != null ? this._abiCoder.decode(indexed, (0, bytes_1.concat)(topics)) : null;\n          var resultNonIndexed = this._abiCoder.decode(nonIndexed, data, true);\n          var result = [];\n          var nonIndexedIndex = 0, indexedIndex = 0;\n          eventFragment.inputs.forEach(function(param, index) {\n            if (param.indexed) {\n              if (resultIndexed == null) {\n                result[index] = new Indexed({ _isIndexed: true, hash: null });\n              } else if (dynamic[index]) {\n                result[index] = new Indexed({ _isIndexed: true, hash: resultIndexed[indexedIndex++] });\n              } else {\n                try {\n                  result[index] = resultIndexed[indexedIndex++];\n                } catch (error) {\n                  result[index] = error;\n                }\n              }\n            } else {\n              try {\n                result[index] = resultNonIndexed[nonIndexedIndex++];\n              } catch (error) {\n                result[index] = error;\n              }\n            }\n            if (param.name && result[param.name] == null) {\n              var value_1 = result[index];\n              if (value_1 instanceof Error) {\n                Object.defineProperty(result, param.name, {\n                  enumerable: true,\n                  get: function() {\n                    throw wrapAccessError(\"property \" + JSON.stringify(param.name), value_1);\n                  }\n                });\n              } else {\n                result[param.name] = value_1;\n              }\n            }\n          });\n          var _loop_1 = function(i2) {\n            var value = result[i2];\n            if (value instanceof Error) {\n              Object.defineProperty(result, i2, {\n                enumerable: true,\n                get: function() {\n                  throw wrapAccessError(\"index \" + i2, value);\n                }\n              });\n            }\n          };\n          for (var i = 0; i < result.length; i++) {\n            _loop_1(i);\n          }\n          return Object.freeze(result);\n        };\n        Interface2.prototype.parseTransaction = function(tx) {\n          var fragment = this.getFunction(tx.data.substring(0, 10).toLowerCase());\n          if (!fragment) {\n            return null;\n          }\n          return new TransactionDescription({\n            args: this._abiCoder.decode(fragment.inputs, \"0x\" + tx.data.substring(10)),\n            functionFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            sighash: this.getSighash(fragment),\n            value: bignumber_1.BigNumber.from(tx.value || \"0\")\n          });\n        };\n        Interface2.prototype.parseLog = function(log) {\n          var fragment = this.getEvent(log.topics[0]);\n          if (!fragment || fragment.anonymous) {\n            return null;\n          }\n          return new LogDescription({\n            eventFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            topic: this.getEventTopic(fragment),\n            args: this.decodeEventLog(fragment, log.data, log.topics)\n          });\n        };\n        Interface2.prototype.parseError = function(data) {\n          var hexData = (0, bytes_1.hexlify)(data);\n          var fragment = this.getError(hexData.substring(0, 10).toLowerCase());\n          if (!fragment) {\n            return null;\n          }\n          return new ErrorDescription({\n            args: this._abiCoder.decode(fragment.inputs, \"0x\" + hexData.substring(10)),\n            errorFragment: fragment,\n            name: fragment.name,\n            signature: fragment.format(),\n            sighash: this.getSighash(fragment)\n          });\n        };\n        Interface2.isInterface = function(value) {\n          return !!(value && value._isInterface);\n        };\n        return Interface2;\n      }()\n    );\n    exports2.Interface = Interface;\n  }\n});\n\n// node_modules/@ethersproject/abi/lib/index.js\nvar require_lib11 = __commonJS({\n  \"node_modules/@ethersproject/abi/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.TransactionDescription = exports2.LogDescription = exports2.checkResultErrors = exports2.Indexed = exports2.Interface = exports2.defaultAbiCoder = exports2.AbiCoder = exports2.FormatTypes = exports2.ParamType = exports2.FunctionFragment = exports2.Fragment = exports2.EventFragment = exports2.ErrorFragment = exports2.ConstructorFragment = void 0;\n    var fragments_1 = require_fragments();\n    Object.defineProperty(exports2, \"ConstructorFragment\", { enumerable: true, get: function() {\n      return fragments_1.ConstructorFragment;\n    } });\n    Object.defineProperty(exports2, \"ErrorFragment\", { enumerable: true, get: function() {\n      return fragments_1.ErrorFragment;\n    } });\n    Object.defineProperty(exports2, \"EventFragment\", { enumerable: true, get: function() {\n      return fragments_1.EventFragment;\n    } });\n    Object.defineProperty(exports2, \"FormatTypes\", { enumerable: true, get: function() {\n      return fragments_1.FormatTypes;\n    } });\n    Object.defineProperty(exports2, \"Fragment\", { enumerable: true, get: function() {\n      return fragments_1.Fragment;\n    } });\n    Object.defineProperty(exports2, \"FunctionFragment\", { enumerable: true, get: function() {\n      return fragments_1.FunctionFragment;\n    } });\n    Object.defineProperty(exports2, \"ParamType\", { enumerable: true, get: function() {\n      return fragments_1.ParamType;\n    } });\n    var abi_coder_1 = require_abi_coder();\n    Object.defineProperty(exports2, \"AbiCoder\", { enumerable: true, get: function() {\n      return abi_coder_1.AbiCoder;\n    } });\n    Object.defineProperty(exports2, \"defaultAbiCoder\", { enumerable: true, get: function() {\n      return abi_coder_1.defaultAbiCoder;\n    } });\n    var interface_1 = require_interface();\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return interface_1.checkResultErrors;\n    } });\n    Object.defineProperty(exports2, \"Indexed\", { enumerable: true, get: function() {\n      return interface_1.Indexed;\n    } });\n    Object.defineProperty(exports2, \"Interface\", { enumerable: true, get: function() {\n      return interface_1.Interface;\n    } });\n    Object.defineProperty(exports2, \"LogDescription\", { enumerable: true, get: function() {\n      return interface_1.LogDescription;\n    } });\n    Object.defineProperty(exports2, \"TransactionDescription\", { enumerable: true, get: function() {\n      return interface_1.TransactionDescription;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/abstract-provider/lib/_version.js\nvar require_version10 = __commonJS({\n  \"node_modules/@ethersproject/abstract-provider/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abstract-provider/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/abstract-provider/lib/index.js\nvar require_lib12 = __commonJS({\n  \"node_modules/@ethersproject/abstract-provider/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Provider = exports2.TransactionOrderForkEvent = exports2.TransactionForkEvent = exports2.BlockForkEvent = exports2.ForkEvent = void 0;\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version10();\n    var logger = new logger_1.Logger(_version_1.version);\n    var ForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(ForkEvent2, _super);\n        function ForkEvent2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        ForkEvent2.isForkEvent = function(value) {\n          return !!(value && value._isForkEvent);\n        };\n        return ForkEvent2;\n      }(properties_1.Description)\n    );\n    exports2.ForkEvent = ForkEvent;\n    var BlockForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(BlockForkEvent2, _super);\n        function BlockForkEvent2(blockHash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(blockHash, 32)) {\n            logger.throwArgumentError(\"invalid blockHash\", \"blockHash\", blockHash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isBlockForkEvent: true,\n            expiry: expiry || 0,\n            blockHash\n          }) || this;\n          return _this;\n        }\n        return BlockForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.BlockForkEvent = BlockForkEvent;\n    var TransactionForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionForkEvent2, _super);\n        function TransactionForkEvent2(hash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(hash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"hash\", hash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isTransactionForkEvent: true,\n            expiry: expiry || 0,\n            hash\n          }) || this;\n          return _this;\n        }\n        return TransactionForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.TransactionForkEvent = TransactionForkEvent;\n    var TransactionOrderForkEvent = (\n      /** @class */\n      function(_super) {\n        __extends(TransactionOrderForkEvent2, _super);\n        function TransactionOrderForkEvent2(beforeHash, afterHash, expiry) {\n          var _this = this;\n          if (!(0, bytes_1.isHexString)(beforeHash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"beforeHash\", beforeHash);\n          }\n          if (!(0, bytes_1.isHexString)(afterHash, 32)) {\n            logger.throwArgumentError(\"invalid transaction hash\", \"afterHash\", afterHash);\n          }\n          _this = _super.call(this, {\n            _isForkEvent: true,\n            _isTransactionOrderForkEvent: true,\n            expiry: expiry || 0,\n            beforeHash,\n            afterHash\n          }) || this;\n          return _this;\n        }\n        return TransactionOrderForkEvent2;\n      }(ForkEvent)\n    );\n    exports2.TransactionOrderForkEvent = TransactionOrderForkEvent;\n    var Provider = (\n      /** @class */\n      function() {\n        function Provider2() {\n          var _newTarget = this.constructor;\n          logger.checkAbstract(_newTarget, Provider2);\n          (0, properties_1.defineReadOnly)(this, \"_isProvider\", true);\n        }\n        Provider2.prototype.getFeeData = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var _a, block, gasPrice, maxFeePerGas, maxPriorityFeePerGas;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, (0, properties_1.resolveProperties)({\n                    block: this.getBlock(\"latest\"),\n                    gasPrice: this.getGasPrice().catch(function(error) {\n                      return null;\n                    })\n                  })];\n                case 1:\n                  _a = _b.sent(), block = _a.block, gasPrice = _a.gasPrice;\n                  maxFeePerGas = null, maxPriorityFeePerGas = null;\n                  if (block && block.baseFeePerGas) {\n                    maxPriorityFeePerGas = bignumber_1.BigNumber.from(\"2500000000\");\n                    maxFeePerGas = block.baseFeePerGas.mul(2).add(maxPriorityFeePerGas);\n                  }\n                  return [2, { maxFeePerGas, maxPriorityFeePerGas, gasPrice }];\n              }\n            });\n          });\n        };\n        Provider2.prototype.addListener = function(eventName, listener) {\n          return this.on(eventName, listener);\n        };\n        Provider2.prototype.removeListener = function(eventName, listener) {\n          return this.off(eventName, listener);\n        };\n        Provider2.isProvider = function(value) {\n          return !!(value && value._isProvider);\n        };\n        return Provider2;\n      }()\n    );\n    exports2.Provider = Provider;\n  }\n});\n\n// node_modules/@ethersproject/abstract-signer/lib/_version.js\nvar require_version11 = __commonJS({\n  \"node_modules/@ethersproject/abstract-signer/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"abstract-signer/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/abstract-signer/lib/index.js\nvar require_lib13 = __commonJS({\n  \"node_modules/@ethersproject/abstract-signer/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.VoidSigner = exports2.Signer = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version11();\n    var logger = new logger_1.Logger(_version_1.version);\n    var allowedTransactionKeys = [\n      \"accessList\",\n      \"chainId\",\n      \"customData\",\n      \"data\",\n      \"from\",\n      \"gasLimit\",\n      \"gasPrice\",\n      \"maxFeePerGas\",\n      \"maxPriorityFeePerGas\",\n      \"nonce\",\n      \"to\",\n      \"type\",\n      \"value\"\n    ];\n    var forwardErrors = [\n      logger_1.Logger.errors.INSUFFICIENT_FUNDS,\n      logger_1.Logger.errors.NONCE_EXPIRED,\n      logger_1.Logger.errors.REPLACEMENT_UNDERPRICED\n    ];\n    var Signer = (\n      /** @class */\n      function() {\n        function Signer2() {\n          var _newTarget = this.constructor;\n          logger.checkAbstract(_newTarget, Signer2);\n          (0, properties_1.defineReadOnly)(this, \"_isSigner\", true);\n        }\n        Signer2.prototype.getBalance = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getBalance\");\n                  return [4, this.provider.getBalance(this.getAddress(), blockTag)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getTransactionCount = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getTransactionCount\");\n                  return [4, this.provider.getTransactionCount(this.getAddress(), blockTag)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.estimateGas = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"estimateGas\");\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.provider.estimateGas(tx)];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.call = function(transaction, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"call\");\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.provider.call(tx, blockTag)];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.sendTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, signedTx;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"sendTransaction\");\n                  return [4, this.populateTransaction(transaction)];\n                case 1:\n                  tx = _a.sent();\n                  return [4, this.signTransaction(tx)];\n                case 2:\n                  signedTx = _a.sent();\n                  return [4, this.provider.sendTransaction(signedTx)];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getChainId = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getChainId\");\n                  return [4, this.provider.getNetwork()];\n                case 1:\n                  network = _a.sent();\n                  return [2, network.chainId];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getGasPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getGasPrice\");\n                  return [4, this.provider.getGasPrice()];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.getFeeData = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"getFeeData\");\n                  return [4, this.provider.getFeeData()];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.resolveName = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  this._checkProvider(\"resolveName\");\n                  return [4, this.provider.resolveName(name2)];\n                case 1:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype.checkTransaction = function(transaction) {\n          for (var key in transaction) {\n            if (allowedTransactionKeys.indexOf(key) === -1) {\n              logger.throwArgumentError(\"invalid transaction key: \" + key, \"transaction\", transaction);\n            }\n          }\n          var tx = (0, properties_1.shallowCopy)(transaction);\n          if (tx.from == null) {\n            tx.from = this.getAddress();\n          } else {\n            tx.from = Promise.all([\n              Promise.resolve(tx.from),\n              this.getAddress()\n            ]).then(function(result) {\n              if (result[0].toLowerCase() !== result[1].toLowerCase()) {\n                logger.throwArgumentError(\"from address mismatch\", \"transaction\", transaction);\n              }\n              return result[0];\n            });\n          }\n          return tx;\n        };\n        Signer2.prototype.populateTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, hasEip1559, feeData, gasPrice;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, (0, properties_1.resolveProperties)(this.checkTransaction(transaction))];\n                case 1:\n                  tx = _a.sent();\n                  if (tx.to != null) {\n                    tx.to = Promise.resolve(tx.to).then(function(to) {\n                      return __awaiter(_this, void 0, void 0, function() {\n                        var address;\n                        return __generator(this, function(_a2) {\n                          switch (_a2.label) {\n                            case 0:\n                              if (to == null) {\n                                return [2, null];\n                              }\n                              return [4, this.resolveName(to)];\n                            case 1:\n                              address = _a2.sent();\n                              if (address == null) {\n                                logger.throwArgumentError(\"provided ENS name resolves to null\", \"tx.to\", to);\n                              }\n                              return [2, address];\n                          }\n                        });\n                      });\n                    });\n                    tx.to.catch(function(error) {\n                    });\n                  }\n                  hasEip1559 = tx.maxFeePerGas != null || tx.maxPriorityFeePerGas != null;\n                  if (tx.gasPrice != null && (tx.type === 2 || hasEip1559)) {\n                    logger.throwArgumentError(\"eip-1559 transaction do not support gasPrice\", \"transaction\", transaction);\n                  } else if ((tx.type === 0 || tx.type === 1) && hasEip1559) {\n                    logger.throwArgumentError(\"pre-eip-1559 transaction do not support maxFeePerGas/maxPriorityFeePerGas\", \"transaction\", transaction);\n                  }\n                  if (!((tx.type === 2 || tx.type == null) && (tx.maxFeePerGas != null && tx.maxPriorityFeePerGas != null))) return [3, 2];\n                  tx.type = 2;\n                  return [3, 5];\n                case 2:\n                  if (!(tx.type === 0 || tx.type === 1)) return [3, 3];\n                  if (tx.gasPrice == null) {\n                    tx.gasPrice = this.getGasPrice();\n                  }\n                  return [3, 5];\n                case 3:\n                  return [4, this.getFeeData()];\n                case 4:\n                  feeData = _a.sent();\n                  if (tx.type == null) {\n                    if (feeData.maxFeePerGas != null && feeData.maxPriorityFeePerGas != null) {\n                      tx.type = 2;\n                      if (tx.gasPrice != null) {\n                        gasPrice = tx.gasPrice;\n                        delete tx.gasPrice;\n                        tx.maxFeePerGas = gasPrice;\n                        tx.maxPriorityFeePerGas = gasPrice;\n                      } else {\n                        if (tx.maxFeePerGas == null) {\n                          tx.maxFeePerGas = feeData.maxFeePerGas;\n                        }\n                        if (tx.maxPriorityFeePerGas == null) {\n                          tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n                        }\n                      }\n                    } else if (feeData.gasPrice != null) {\n                      if (hasEip1559) {\n                        logger.throwError(\"network does not support EIP-1559\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                          operation: \"populateTransaction\"\n                        });\n                      }\n                      if (tx.gasPrice == null) {\n                        tx.gasPrice = feeData.gasPrice;\n                      }\n                      tx.type = 0;\n                    } else {\n                      logger.throwError(\"failed to get consistent fee data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                        operation: \"signer.getFeeData\"\n                      });\n                    }\n                  } else if (tx.type === 2) {\n                    if (tx.maxFeePerGas == null) {\n                      tx.maxFeePerGas = feeData.maxFeePerGas;\n                    }\n                    if (tx.maxPriorityFeePerGas == null) {\n                      tx.maxPriorityFeePerGas = feeData.maxPriorityFeePerGas;\n                    }\n                  }\n                  _a.label = 5;\n                case 5:\n                  if (tx.nonce == null) {\n                    tx.nonce = this.getTransactionCount(\"pending\");\n                  }\n                  if (tx.gasLimit == null) {\n                    tx.gasLimit = this.estimateGas(tx).catch(function(error) {\n                      if (forwardErrors.indexOf(error.code) >= 0) {\n                        throw error;\n                      }\n                      return logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n                        error,\n                        tx\n                      });\n                    });\n                  }\n                  if (tx.chainId == null) {\n                    tx.chainId = this.getChainId();\n                  } else {\n                    tx.chainId = Promise.all([\n                      Promise.resolve(tx.chainId),\n                      this.getChainId()\n                    ]).then(function(results) {\n                      if (results[1] !== 0 && results[0] !== results[1]) {\n                        logger.throwArgumentError(\"chainId address mismatch\", \"transaction\", transaction);\n                      }\n                      return results[0];\n                    });\n                  }\n                  return [4, (0, properties_1.resolveProperties)(tx)];\n                case 6:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        Signer2.prototype._checkProvider = function(operation) {\n          if (!this.provider) {\n            logger.throwError(\"missing provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: operation || \"_checkProvider\"\n            });\n          }\n        };\n        Signer2.isSigner = function(value) {\n          return !!(value && value._isSigner);\n        };\n        return Signer2;\n      }()\n    );\n    exports2.Signer = Signer;\n    var VoidSigner = (\n      /** @class */\n      function(_super) {\n        __extends(VoidSigner2, _super);\n        function VoidSigner2(address, provider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, VoidSigner2);\n          _this = _super.call(this) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider || null);\n          return _this;\n        }\n        VoidSigner2.prototype.getAddress = function() {\n          return Promise.resolve(this.address);\n        };\n        VoidSigner2.prototype._fail = function(message, operation) {\n          return Promise.resolve().then(function() {\n            logger.throwError(message, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation });\n          });\n        };\n        VoidSigner2.prototype.signMessage = function(message) {\n          return this._fail(\"VoidSigner cannot sign messages\", \"signMessage\");\n        };\n        VoidSigner2.prototype.signTransaction = function(transaction) {\n          return this._fail(\"VoidSigner cannot sign transactions\", \"signTransaction\");\n        };\n        VoidSigner2.prototype._signTypedData = function(domain, types, value) {\n          return this._fail(\"VoidSigner cannot sign typed data\", \"signTypedData\");\n        };\n        VoidSigner2.prototype.connect = function(provider) {\n          return new VoidSigner2(this.address, provider);\n        };\n        return VoidSigner2;\n      }(Signer)\n    );\n    exports2.VoidSigner = VoidSigner;\n  }\n});\n\n// node_modules/elliptic/package.json\nvar require_package = __commonJS({\n  \"node_modules/elliptic/package.json\"(exports2, module2) {\n    module2.exports = {\n      name: \"elliptic\",\n      version: \"6.5.4\",\n      description: \"EC cryptography\",\n      main: \"lib/elliptic.js\",\n      files: [\n        \"lib\"\n      ],\n      scripts: {\n        lint: \"eslint lib test\",\n        \"lint:fix\": \"npm run lint -- --fix\",\n        unit: \"istanbul test _mocha --reporter=spec test/index.js\",\n        test: \"npm run lint && npm run unit\",\n        version: \"grunt dist && git add dist/\"\n      },\n      repository: {\n        type: \"git\",\n        url: \"git@github.com:indutny/elliptic\"\n      },\n      keywords: [\n        \"EC\",\n        \"Elliptic\",\n        \"curve\",\n        \"Cryptography\"\n      ],\n      author: \"Fedor Indutny <fedor@indutny.com>\",\n      license: \"MIT\",\n      bugs: {\n        url: \"https://github.com/indutny/elliptic/issues\"\n      },\n      homepage: \"https://github.com/indutny/elliptic\",\n      devDependencies: {\n        brfs: \"^2.0.2\",\n        coveralls: \"^3.1.0\",\n        eslint: \"^7.6.0\",\n        grunt: \"^1.2.1\",\n        \"grunt-browserify\": \"^5.3.0\",\n        \"grunt-cli\": \"^1.3.2\",\n        \"grunt-contrib-connect\": \"^3.0.0\",\n        \"grunt-contrib-copy\": \"^1.0.0\",\n        \"grunt-contrib-uglify\": \"^5.0.0\",\n        \"grunt-mocha-istanbul\": \"^5.0.2\",\n        \"grunt-saucelabs\": \"^9.0.1\",\n        istanbul: \"^0.4.5\",\n        mocha: \"^8.0.1\"\n      },\n      dependencies: {\n        \"bn.js\": \"^4.11.9\",\n        brorand: \"^1.1.0\",\n        \"hash.js\": \"^1.0.0\",\n        \"hmac-drbg\": \"^1.0.1\",\n        inherits: \"^2.0.4\",\n        \"minimalistic-assert\": \"^1.0.1\",\n        \"minimalistic-crypto-utils\": \"^1.0.1\"\n      }\n    };\n  }\n});\n\n// node_modules/minimalistic-assert/index.js\nvar require_minimalistic_assert = __commonJS({\n  \"node_modules/minimalistic-assert/index.js\"(exports2, module2) {\n    module2.exports = assert;\n    function assert(val, msg) {\n      if (!val)\n        throw new Error(msg || \"Assertion failed\");\n    }\n    assert.equal = function assertEqual(l, r, msg) {\n      if (l != r)\n        throw new Error(msg || \"Assertion failed: \" + l + \" != \" + r);\n    };\n  }\n});\n\n// node_modules/minimalistic-crypto-utils/lib/utils.js\nvar require_utils = __commonJS({\n  \"node_modules/minimalistic-crypto-utils/lib/utils.js\"(exports2) {\n    \"use strict\";\n    var utils = exports2;\n    function toArray(msg, enc) {\n      if (Array.isArray(msg))\n        return msg.slice();\n      if (!msg)\n        return [];\n      var res = [];\n      if (typeof msg !== \"string\") {\n        for (var i = 0; i < msg.length; i++)\n          res[i] = msg[i] | 0;\n        return res;\n      }\n      if (enc === \"hex\") {\n        msg = msg.replace(/[^a-z0-9]+/ig, \"\");\n        if (msg.length % 2 !== 0)\n          msg = \"0\" + msg;\n        for (var i = 0; i < msg.length; i += 2)\n          res.push(parseInt(msg[i] + msg[i + 1], 16));\n      } else {\n        for (var i = 0; i < msg.length; i++) {\n          var c = msg.charCodeAt(i);\n          var hi = c >> 8;\n          var lo = c & 255;\n          if (hi)\n            res.push(hi, lo);\n          else\n            res.push(lo);\n        }\n      }\n      return res;\n    }\n    utils.toArray = toArray;\n    function zero2(word) {\n      if (word.length === 1)\n        return \"0\" + word;\n      else\n        return word;\n    }\n    utils.zero2 = zero2;\n    function toHex(msg) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++)\n        res += zero2(msg[i].toString(16));\n      return res;\n    }\n    utils.toHex = toHex;\n    utils.encode = function encode(arr, enc) {\n      if (enc === \"hex\")\n        return toHex(arr);\n      else\n        return arr;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/utils.js\nvar require_utils2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/utils.js\"(exports2) {\n    \"use strict\";\n    var utils = exports2;\n    var BN = require_bn();\n    var minAssert = require_minimalistic_assert();\n    var minUtils = require_utils();\n    utils.assert = minAssert;\n    utils.toArray = minUtils.toArray;\n    utils.zero2 = minUtils.zero2;\n    utils.toHex = minUtils.toHex;\n    utils.encode = minUtils.encode;\n    function getNAF(num, w, bits) {\n      var naf = new Array(Math.max(num.bitLength(), bits) + 1);\n      naf.fill(0);\n      var ws = 1 << w + 1;\n      var k = num.clone();\n      for (var i = 0; i < naf.length; i++) {\n        var z;\n        var mod = k.andln(ws - 1);\n        if (k.isOdd()) {\n          if (mod > (ws >> 1) - 1)\n            z = (ws >> 1) - mod;\n          else\n            z = mod;\n          k.isubn(z);\n        } else {\n          z = 0;\n        }\n        naf[i] = z;\n        k.iushrn(1);\n      }\n      return naf;\n    }\n    utils.getNAF = getNAF;\n    function getJSF(k1, k2) {\n      var jsf = [\n        [],\n        []\n      ];\n      k1 = k1.clone();\n      k2 = k2.clone();\n      var d1 = 0;\n      var d2 = 0;\n      var m8;\n      while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {\n        var m14 = k1.andln(3) + d1 & 3;\n        var m24 = k2.andln(3) + d2 & 3;\n        if (m14 === 3)\n          m14 = -1;\n        if (m24 === 3)\n          m24 = -1;\n        var u1;\n        if ((m14 & 1) === 0) {\n          u1 = 0;\n        } else {\n          m8 = k1.andln(7) + d1 & 7;\n          if ((m8 === 3 || m8 === 5) && m24 === 2)\n            u1 = -m14;\n          else\n            u1 = m14;\n        }\n        jsf[0].push(u1);\n        var u2;\n        if ((m24 & 1) === 0) {\n          u2 = 0;\n        } else {\n          m8 = k2.andln(7) + d2 & 7;\n          if ((m8 === 3 || m8 === 5) && m14 === 2)\n            u2 = -m24;\n          else\n            u2 = m24;\n        }\n        jsf[1].push(u2);\n        if (2 * d1 === u1 + 1)\n          d1 = 1 - d1;\n        if (2 * d2 === u2 + 1)\n          d2 = 1 - d2;\n        k1.iushrn(1);\n        k2.iushrn(1);\n      }\n      return jsf;\n    }\n    utils.getJSF = getJSF;\n    function cachedProperty(obj, name2, computer) {\n      var key = \"_\" + name2;\n      obj.prototype[name2] = function cachedProperty2() {\n        return this[key] !== void 0 ? this[key] : this[key] = computer.call(this);\n      };\n    }\n    utils.cachedProperty = cachedProperty;\n    function parseBytes(bytes) {\n      return typeof bytes === \"string\" ? utils.toArray(bytes, \"hex\") : bytes;\n    }\n    utils.parseBytes = parseBytes;\n    function intFromLE(bytes) {\n      return new BN(bytes, \"hex\", \"le\");\n    }\n    utils.intFromLE = intFromLE;\n  }\n});\n\n// node_modules/brorand/index.js\nvar require_brorand = __commonJS({\n  \"node_modules/brorand/index.js\"(exports2, module2) {\n    var r;\n    module2.exports = function rand(len) {\n      if (!r)\n        r = new Rand(null);\n      return r.generate(len);\n    };\n    function Rand(rand) {\n      this.rand = rand;\n    }\n    module2.exports.Rand = Rand;\n    Rand.prototype.generate = function generate(len) {\n      return this._rand(len);\n    };\n    Rand.prototype._rand = function _rand(n) {\n      if (this.rand.getBytes)\n        return this.rand.getBytes(n);\n      var res = new Uint8Array(n);\n      for (var i = 0; i < res.length; i++)\n        res[i] = this.rand.getByte();\n      return res;\n    };\n    if (typeof self === \"object\") {\n      if (self.crypto && self.crypto.getRandomValues) {\n        Rand.prototype._rand = function _rand(n) {\n          var arr = new Uint8Array(n);\n          self.crypto.getRandomValues(arr);\n          return arr;\n        };\n      } else if (self.msCrypto && self.msCrypto.getRandomValues) {\n        Rand.prototype._rand = function _rand(n) {\n          var arr = new Uint8Array(n);\n          self.msCrypto.getRandomValues(arr);\n          return arr;\n        };\n      } else if (typeof window === \"object\") {\n        Rand.prototype._rand = function() {\n          throw new Error(\"Not implemented yet\");\n        };\n      }\n    } else {\n      try {\n        crypto2 = require(\"crypto\");\n        if (typeof crypto2.randomBytes !== \"function\")\n          throw new Error(\"Not supported\");\n        Rand.prototype._rand = function _rand(n) {\n          return crypto2.randomBytes(n);\n        };\n      } catch (e) {\n      }\n    }\n    var crypto2;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/base.js\nvar require_base = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/base.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var getNAF = utils.getNAF;\n    var getJSF = utils.getJSF;\n    var assert = utils.assert;\n    function BaseCurve(type, conf) {\n      this.type = type;\n      this.p = new BN(conf.p, 16);\n      this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);\n      this.zero = new BN(0).toRed(this.red);\n      this.one = new BN(1).toRed(this.red);\n      this.two = new BN(2).toRed(this.red);\n      this.n = conf.n && new BN(conf.n, 16);\n      this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);\n      this._wnafT1 = new Array(4);\n      this._wnafT2 = new Array(4);\n      this._wnafT3 = new Array(4);\n      this._wnafT4 = new Array(4);\n      this._bitLength = this.n ? this.n.bitLength() : 0;\n      var adjustCount = this.n && this.p.div(this.n);\n      if (!adjustCount || adjustCount.cmpn(100) > 0) {\n        this.redN = null;\n      } else {\n        this._maxwellTrick = true;\n        this.redN = this.n.toRed(this.red);\n      }\n    }\n    module2.exports = BaseCurve;\n    BaseCurve.prototype.point = function point() {\n      throw new Error(\"Not implemented\");\n    };\n    BaseCurve.prototype.validate = function validate() {\n      throw new Error(\"Not implemented\");\n    };\n    BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {\n      assert(p.precomputed);\n      var doubles = p._getDoubles();\n      var naf = getNAF(k, 1, this._bitLength);\n      var I = (1 << doubles.step + 1) - (doubles.step % 2 === 0 ? 2 : 1);\n      I /= 3;\n      var repr = [];\n      var j;\n      var nafW;\n      for (j = 0; j < naf.length; j += doubles.step) {\n        nafW = 0;\n        for (var l = j + doubles.step - 1; l >= j; l--)\n          nafW = (nafW << 1) + naf[l];\n        repr.push(nafW);\n      }\n      var a = this.jpoint(null, null, null);\n      var b = this.jpoint(null, null, null);\n      for (var i = I; i > 0; i--) {\n        for (j = 0; j < repr.length; j++) {\n          nafW = repr[j];\n          if (nafW === i)\n            b = b.mixedAdd(doubles.points[j]);\n          else if (nafW === -i)\n            b = b.mixedAdd(doubles.points[j].neg());\n        }\n        a = a.add(b);\n      }\n      return a.toP();\n    };\n    BaseCurve.prototype._wnafMul = function _wnafMul(p, k) {\n      var w = 4;\n      var nafPoints = p._getNAFPoints(w);\n      w = nafPoints.wnd;\n      var wnd = nafPoints.points;\n      var naf = getNAF(k, w, this._bitLength);\n      var acc = this.jpoint(null, null, null);\n      for (var i = naf.length - 1; i >= 0; i--) {\n        for (var l = 0; i >= 0 && naf[i] === 0; i--)\n          l++;\n        if (i >= 0)\n          l++;\n        acc = acc.dblp(l);\n        if (i < 0)\n          break;\n        var z = naf[i];\n        assert(z !== 0);\n        if (p.type === \"affine\") {\n          if (z > 0)\n            acc = acc.mixedAdd(wnd[z - 1 >> 1]);\n          else\n            acc = acc.mixedAdd(wnd[-z - 1 >> 1].neg());\n        } else {\n          if (z > 0)\n            acc = acc.add(wnd[z - 1 >> 1]);\n          else\n            acc = acc.add(wnd[-z - 1 >> 1].neg());\n        }\n      }\n      return p.type === \"affine\" ? acc.toP() : acc;\n    };\n    BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) {\n      var wndWidth = this._wnafT1;\n      var wnd = this._wnafT2;\n      var naf = this._wnafT3;\n      var max = 0;\n      var i;\n      var j;\n      var p;\n      for (i = 0; i < len; i++) {\n        p = points[i];\n        var nafPoints = p._getNAFPoints(defW);\n        wndWidth[i] = nafPoints.wnd;\n        wnd[i] = nafPoints.points;\n      }\n      for (i = len - 1; i >= 1; i -= 2) {\n        var a = i - 1;\n        var b = i;\n        if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n          naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);\n          naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);\n          max = Math.max(naf[a].length, max);\n          max = Math.max(naf[b].length, max);\n          continue;\n        }\n        var comb = [\n          points[a],\n          /* 1 */\n          null,\n          /* 3 */\n          null,\n          /* 5 */\n          points[b]\n          /* 7 */\n        ];\n        if (points[a].y.cmp(points[b].y) === 0) {\n          comb[1] = points[a].add(points[b]);\n          comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n        } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {\n          comb[1] = points[a].toJ().mixedAdd(points[b]);\n          comb[2] = points[a].add(points[b].neg());\n        } else {\n          comb[1] = points[a].toJ().mixedAdd(points[b]);\n          comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n        }\n        var index = [\n          -3,\n          /* -1 -1 */\n          -1,\n          /* -1 0 */\n          -5,\n          /* -1 1 */\n          -7,\n          /* 0 -1 */\n          0,\n          /* 0 0 */\n          7,\n          /* 0 1 */\n          5,\n          /* 1 -1 */\n          1,\n          /* 1 0 */\n          3\n          /* 1 1 */\n        ];\n        var jsf = getJSF(coeffs[a], coeffs[b]);\n        max = Math.max(jsf[0].length, max);\n        naf[a] = new Array(max);\n        naf[b] = new Array(max);\n        for (j = 0; j < max; j++) {\n          var ja = jsf[0][j] | 0;\n          var jb = jsf[1][j] | 0;\n          naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];\n          naf[b][j] = 0;\n          wnd[a] = comb;\n        }\n      }\n      var acc = this.jpoint(null, null, null);\n      var tmp = this._wnafT4;\n      for (i = max; i >= 0; i--) {\n        var k = 0;\n        while (i >= 0) {\n          var zero = true;\n          for (j = 0; j < len; j++) {\n            tmp[j] = naf[j][i] | 0;\n            if (tmp[j] !== 0)\n              zero = false;\n          }\n          if (!zero)\n            break;\n          k++;\n          i--;\n        }\n        if (i >= 0)\n          k++;\n        acc = acc.dblp(k);\n        if (i < 0)\n          break;\n        for (j = 0; j < len; j++) {\n          var z = tmp[j];\n          p;\n          if (z === 0)\n            continue;\n          else if (z > 0)\n            p = wnd[j][z - 1 >> 1];\n          else if (z < 0)\n            p = wnd[j][-z - 1 >> 1].neg();\n          if (p.type === \"affine\")\n            acc = acc.mixedAdd(p);\n          else\n            acc = acc.add(p);\n        }\n      }\n      for (i = 0; i < len; i++)\n        wnd[i] = null;\n      if (jacobianResult)\n        return acc;\n      else\n        return acc.toP();\n    };\n    function BasePoint(curve, type) {\n      this.curve = curve;\n      this.type = type;\n      this.precomputed = null;\n    }\n    BaseCurve.BasePoint = BasePoint;\n    BasePoint.prototype.eq = function eq() {\n      throw new Error(\"Not implemented\");\n    };\n    BasePoint.prototype.validate = function validate() {\n      return this.curve.validate(this);\n    };\n    BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n      bytes = utils.toArray(bytes, enc);\n      var len = this.p.byteLength();\n      if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) {\n        if (bytes[0] === 6)\n          assert(bytes[bytes.length - 1] % 2 === 0);\n        else if (bytes[0] === 7)\n          assert(bytes[bytes.length - 1] % 2 === 1);\n        var res = this.point(\n          bytes.slice(1, 1 + len),\n          bytes.slice(1 + len, 1 + 2 * len)\n        );\n        return res;\n      } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) {\n        return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3);\n      }\n      throw new Error(\"Unknown point format\");\n    };\n    BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {\n      return this.encode(enc, true);\n    };\n    BasePoint.prototype._encode = function _encode(compact) {\n      var len = this.curve.p.byteLength();\n      var x = this.getX().toArray(\"be\", len);\n      if (compact)\n        return [this.getY().isEven() ? 2 : 3].concat(x);\n      return [4].concat(x, this.getY().toArray(\"be\", len));\n    };\n    BasePoint.prototype.encode = function encode(enc, compact) {\n      return utils.encode(this._encode(compact), enc);\n    };\n    BasePoint.prototype.precompute = function precompute(power) {\n      if (this.precomputed)\n        return this;\n      var precomputed = {\n        doubles: null,\n        naf: null,\n        beta: null\n      };\n      precomputed.naf = this._getNAFPoints(8);\n      precomputed.doubles = this._getDoubles(4, power);\n      precomputed.beta = this._getBeta();\n      this.precomputed = precomputed;\n      return this;\n    };\n    BasePoint.prototype._hasDoubles = function _hasDoubles(k) {\n      if (!this.precomputed)\n        return false;\n      var doubles = this.precomputed.doubles;\n      if (!doubles)\n        return false;\n      return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);\n    };\n    BasePoint.prototype._getDoubles = function _getDoubles(step, power) {\n      if (this.precomputed && this.precomputed.doubles)\n        return this.precomputed.doubles;\n      var doubles = [this];\n      var acc = this;\n      for (var i = 0; i < power; i += step) {\n        for (var j = 0; j < step; j++)\n          acc = acc.dbl();\n        doubles.push(acc);\n      }\n      return {\n        step,\n        points: doubles\n      };\n    };\n    BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {\n      if (this.precomputed && this.precomputed.naf)\n        return this.precomputed.naf;\n      var res = [this];\n      var max = (1 << wnd) - 1;\n      var dbl = max === 1 ? null : this.dbl();\n      for (var i = 1; i < max; i++)\n        res[i] = res[i - 1].add(dbl);\n      return {\n        wnd,\n        points: res\n      };\n    };\n    BasePoint.prototype._getBeta = function _getBeta() {\n      return null;\n    };\n    BasePoint.prototype.dblp = function dblp(k) {\n      var r = this;\n      for (var i = 0; i < k; i++)\n        r = r.dbl();\n      return r;\n    };\n  }\n});\n\n// node_modules/inherits/inherits_browser.js\nvar require_inherits_browser = __commonJS({\n  \"node_modules/inherits/inherits_browser.js\"(exports2, module2) {\n    if (typeof Object.create === \"function\") {\n      module2.exports = function inherits(ctor, superCtor) {\n        if (superCtor) {\n          ctor.super_ = superCtor;\n          ctor.prototype = Object.create(superCtor.prototype, {\n            constructor: {\n              value: ctor,\n              enumerable: false,\n              writable: true,\n              configurable: true\n            }\n          });\n        }\n      };\n    } else {\n      module2.exports = function inherits(ctor, superCtor) {\n        if (superCtor) {\n          ctor.super_ = superCtor;\n          var TempCtor = function() {\n          };\n          TempCtor.prototype = superCtor.prototype;\n          ctor.prototype = new TempCtor();\n          ctor.prototype.constructor = ctor;\n        }\n      };\n    }\n  }\n});\n\n// node_modules/inherits/inherits.js\nvar require_inherits = __commonJS({\n  \"node_modules/inherits/inherits.js\"(exports2, module2) {\n    try {\n      util = require(\"util\");\n      if (typeof util.inherits !== \"function\") throw \"\";\n      module2.exports = util.inherits;\n    } catch (e) {\n      module2.exports = require_inherits_browser();\n    }\n    var util;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/short.js\nvar require_short = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/short.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var assert = utils.assert;\n    function ShortCurve(conf) {\n      Base.call(this, \"short\", conf);\n      this.a = new BN(conf.a, 16).toRed(this.red);\n      this.b = new BN(conf.b, 16).toRed(this.red);\n      this.tinv = this.two.redInvm();\n      this.zeroA = this.a.fromRed().cmpn(0) === 0;\n      this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;\n      this.endo = this._getEndomorphism(conf);\n      this._endoWnafT1 = new Array(4);\n      this._endoWnafT2 = new Array(4);\n    }\n    inherits(ShortCurve, Base);\n    module2.exports = ShortCurve;\n    ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {\n      if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)\n        return;\n      var beta;\n      var lambda;\n      if (conf.beta) {\n        beta = new BN(conf.beta, 16).toRed(this.red);\n      } else {\n        var betas = this._getEndoRoots(this.p);\n        beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];\n        beta = beta.toRed(this.red);\n      }\n      if (conf.lambda) {\n        lambda = new BN(conf.lambda, 16);\n      } else {\n        var lambdas = this._getEndoRoots(this.n);\n        if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {\n          lambda = lambdas[0];\n        } else {\n          lambda = lambdas[1];\n          assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);\n        }\n      }\n      var basis;\n      if (conf.basis) {\n        basis = conf.basis.map(function(vec) {\n          return {\n            a: new BN(vec.a, 16),\n            b: new BN(vec.b, 16)\n          };\n        });\n      } else {\n        basis = this._getEndoBasis(lambda);\n      }\n      return {\n        beta,\n        lambda,\n        basis\n      };\n    };\n    ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {\n      var red = num === this.p ? this.red : BN.mont(num);\n      var tinv = new BN(2).toRed(red).redInvm();\n      var ntinv = tinv.redNeg();\n      var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);\n      var l1 = ntinv.redAdd(s).fromRed();\n      var l2 = ntinv.redSub(s).fromRed();\n      return [l1, l2];\n    };\n    ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {\n      var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));\n      var u = lambda;\n      var v = this.n.clone();\n      var x1 = new BN(1);\n      var y1 = new BN(0);\n      var x2 = new BN(0);\n      var y2 = new BN(1);\n      var a0;\n      var b0;\n      var a1;\n      var b1;\n      var a2;\n      var b2;\n      var prevR;\n      var i = 0;\n      var r;\n      var x;\n      while (u.cmpn(0) !== 0) {\n        var q = v.div(u);\n        r = v.sub(q.mul(u));\n        x = x2.sub(q.mul(x1));\n        var y = y2.sub(q.mul(y1));\n        if (!a1 && r.cmp(aprxSqrt) < 0) {\n          a0 = prevR.neg();\n          b0 = x1;\n          a1 = r.neg();\n          b1 = x;\n        } else if (a1 && ++i === 2) {\n          break;\n        }\n        prevR = r;\n        v = u;\n        u = r;\n        x2 = x1;\n        x1 = x;\n        y2 = y1;\n        y1 = y;\n      }\n      a2 = r.neg();\n      b2 = x;\n      var len1 = a1.sqr().add(b1.sqr());\n      var len2 = a2.sqr().add(b2.sqr());\n      if (len2.cmp(len1) >= 0) {\n        a2 = a0;\n        b2 = b0;\n      }\n      if (a1.negative) {\n        a1 = a1.neg();\n        b1 = b1.neg();\n      }\n      if (a2.negative) {\n        a2 = a2.neg();\n        b2 = b2.neg();\n      }\n      return [\n        { a: a1, b: b1 },\n        { a: a2, b: b2 }\n      ];\n    };\n    ShortCurve.prototype._endoSplit = function _endoSplit(k) {\n      var basis = this.endo.basis;\n      var v1 = basis[0];\n      var v2 = basis[1];\n      var c1 = v2.b.mul(k).divRound(this.n);\n      var c2 = v1.b.neg().mul(k).divRound(this.n);\n      var p1 = c1.mul(v1.a);\n      var p2 = c2.mul(v2.a);\n      var q1 = c1.mul(v1.b);\n      var q2 = c2.mul(v2.b);\n      var k1 = k.sub(p1).sub(p2);\n      var k2 = q1.add(q2).neg();\n      return { k1, k2 };\n    };\n    ShortCurve.prototype.pointFromX = function pointFromX(x, odd) {\n      x = new BN(x, 16);\n      if (!x.red)\n        x = x.toRed(this.red);\n      var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);\n      var y = y2.redSqrt();\n      if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      var isOdd = y.fromRed().isOdd();\n      if (odd && !isOdd || !odd && isOdd)\n        y = y.redNeg();\n      return this.point(x, y);\n    };\n    ShortCurve.prototype.validate = function validate(point) {\n      if (point.inf)\n        return true;\n      var x = point.x;\n      var y = point.y;\n      var ax = this.a.redMul(x);\n      var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);\n      return y.redSqr().redISub(rhs).cmpn(0) === 0;\n    };\n    ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) {\n      var npoints = this._endoWnafT1;\n      var ncoeffs = this._endoWnafT2;\n      for (var i = 0; i < points.length; i++) {\n        var split = this._endoSplit(coeffs[i]);\n        var p = points[i];\n        var beta = p._getBeta();\n        if (split.k1.negative) {\n          split.k1.ineg();\n          p = p.neg(true);\n        }\n        if (split.k2.negative) {\n          split.k2.ineg();\n          beta = beta.neg(true);\n        }\n        npoints[i * 2] = p;\n        npoints[i * 2 + 1] = beta;\n        ncoeffs[i * 2] = split.k1;\n        ncoeffs[i * 2 + 1] = split.k2;\n      }\n      var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);\n      for (var j = 0; j < i * 2; j++) {\n        npoints[j] = null;\n        ncoeffs[j] = null;\n      }\n      return res;\n    };\n    function Point(curve, x, y, isRed) {\n      Base.BasePoint.call(this, curve, \"affine\");\n      if (x === null && y === null) {\n        this.x = null;\n        this.y = null;\n        this.inf = true;\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        if (isRed) {\n          this.x.forceRed(this.curve.red);\n          this.y.forceRed(this.curve.red);\n        }\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.y.red)\n          this.y = this.y.toRed(this.curve.red);\n        this.inf = false;\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    ShortCurve.prototype.point = function point(x, y, isRed) {\n      return new Point(this, x, y, isRed);\n    };\n    ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {\n      return Point.fromJSON(this, obj, red);\n    };\n    Point.prototype._getBeta = function _getBeta() {\n      if (!this.curve.endo)\n        return;\n      var pre = this.precomputed;\n      if (pre && pre.beta)\n        return pre.beta;\n      var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);\n      if (pre) {\n        var curve = this.curve;\n        var endoMul = function(p) {\n          return curve.point(p.x.redMul(curve.endo.beta), p.y);\n        };\n        pre.beta = beta;\n        beta.precomputed = {\n          beta: null,\n          naf: pre.naf && {\n            wnd: pre.naf.wnd,\n            points: pre.naf.points.map(endoMul)\n          },\n          doubles: pre.doubles && {\n            step: pre.doubles.step,\n            points: pre.doubles.points.map(endoMul)\n          }\n        };\n      }\n      return beta;\n    };\n    Point.prototype.toJSON = function toJSON() {\n      if (!this.precomputed)\n        return [this.x, this.y];\n      return [this.x, this.y, this.precomputed && {\n        doubles: this.precomputed.doubles && {\n          step: this.precomputed.doubles.step,\n          points: this.precomputed.doubles.points.slice(1)\n        },\n        naf: this.precomputed.naf && {\n          wnd: this.precomputed.naf.wnd,\n          points: this.precomputed.naf.points.slice(1)\n        }\n      }];\n    };\n    Point.fromJSON = function fromJSON(curve, obj, red) {\n      if (typeof obj === \"string\")\n        obj = JSON.parse(obj);\n      var res = curve.point(obj[0], obj[1], red);\n      if (!obj[2])\n        return res;\n      function obj2point(obj2) {\n        return curve.point(obj2[0], obj2[1], red);\n      }\n      var pre = obj[2];\n      res.precomputed = {\n        beta: null,\n        doubles: pre.doubles && {\n          step: pre.doubles.step,\n          points: [res].concat(pre.doubles.points.map(obj2point))\n        },\n        naf: pre.naf && {\n          wnd: pre.naf.wnd,\n          points: [res].concat(pre.naf.points.map(obj2point))\n        }\n      };\n      return res;\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" y: \" + this.y.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.inf;\n    };\n    Point.prototype.add = function add(p) {\n      if (this.inf)\n        return p;\n      if (p.inf)\n        return this;\n      if (this.eq(p))\n        return this.dbl();\n      if (this.neg().eq(p))\n        return this.curve.point(null, null);\n      if (this.x.cmp(p.x) === 0)\n        return this.curve.point(null, null);\n      var c = this.y.redSub(p.y);\n      if (c.cmpn(0) !== 0)\n        c = c.redMul(this.x.redSub(p.x).redInvm());\n      var nx = c.redSqr().redISub(this.x).redISub(p.x);\n      var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n      return this.curve.point(nx, ny);\n    };\n    Point.prototype.dbl = function dbl() {\n      if (this.inf)\n        return this;\n      var ys1 = this.y.redAdd(this.y);\n      if (ys1.cmpn(0) === 0)\n        return this.curve.point(null, null);\n      var a = this.curve.a;\n      var x2 = this.x.redSqr();\n      var dyinv = ys1.redInvm();\n      var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);\n      var nx = c.redSqr().redISub(this.x.redAdd(this.x));\n      var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n      return this.curve.point(nx, ny);\n    };\n    Point.prototype.getX = function getX() {\n      return this.x.fromRed();\n    };\n    Point.prototype.getY = function getY() {\n      return this.y.fromRed();\n    };\n    Point.prototype.mul = function mul(k) {\n      k = new BN(k, 16);\n      if (this.isInfinity())\n        return this;\n      else if (this._hasDoubles(k))\n        return this.curve._fixedNafMul(this, k);\n      else if (this.curve.endo)\n        return this.curve._endoWnafMulAdd([this], [k]);\n      else\n        return this.curve._wnafMul(this, k);\n    };\n    Point.prototype.mulAdd = function mulAdd(k1, p2, k2) {\n      var points = [this, p2];\n      var coeffs = [k1, k2];\n      if (this.curve.endo)\n        return this.curve._endoWnafMulAdd(points, coeffs);\n      else\n        return this.curve._wnafMulAdd(1, points, coeffs, 2);\n    };\n    Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {\n      var points = [this, p2];\n      var coeffs = [k1, k2];\n      if (this.curve.endo)\n        return this.curve._endoWnafMulAdd(points, coeffs, true);\n      else\n        return this.curve._wnafMulAdd(1, points, coeffs, 2, true);\n    };\n    Point.prototype.eq = function eq(p) {\n      return this === p || this.inf === p.inf && (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);\n    };\n    Point.prototype.neg = function neg(_precompute) {\n      if (this.inf)\n        return this;\n      var res = this.curve.point(this.x, this.y.redNeg());\n      if (_precompute && this.precomputed) {\n        var pre = this.precomputed;\n        var negate = function(p) {\n          return p.neg();\n        };\n        res.precomputed = {\n          naf: pre.naf && {\n            wnd: pre.naf.wnd,\n            points: pre.naf.points.map(negate)\n          },\n          doubles: pre.doubles && {\n            step: pre.doubles.step,\n            points: pre.doubles.points.map(negate)\n          }\n        };\n      }\n      return res;\n    };\n    Point.prototype.toJ = function toJ() {\n      if (this.inf)\n        return this.curve.jpoint(null, null, null);\n      var res = this.curve.jpoint(this.x, this.y, this.curve.one);\n      return res;\n    };\n    function JPoint(curve, x, y, z) {\n      Base.BasePoint.call(this, curve, \"jacobian\");\n      if (x === null && y === null && z === null) {\n        this.x = this.curve.one;\n        this.y = this.curve.one;\n        this.z = new BN(0);\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        this.z = new BN(z, 16);\n      }\n      if (!this.x.red)\n        this.x = this.x.toRed(this.curve.red);\n      if (!this.y.red)\n        this.y = this.y.toRed(this.curve.red);\n      if (!this.z.red)\n        this.z = this.z.toRed(this.curve.red);\n      this.zOne = this.z === this.curve.one;\n    }\n    inherits(JPoint, Base.BasePoint);\n    ShortCurve.prototype.jpoint = function jpoint(x, y, z) {\n      return new JPoint(this, x, y, z);\n    };\n    JPoint.prototype.toP = function toP() {\n      if (this.isInfinity())\n        return this.curve.point(null, null);\n      var zinv = this.z.redInvm();\n      var zinv2 = zinv.redSqr();\n      var ax = this.x.redMul(zinv2);\n      var ay = this.y.redMul(zinv2).redMul(zinv);\n      return this.curve.point(ax, ay);\n    };\n    JPoint.prototype.neg = function neg() {\n      return this.curve.jpoint(this.x, this.y.redNeg(), this.z);\n    };\n    JPoint.prototype.add = function add(p) {\n      if (this.isInfinity())\n        return p;\n      if (p.isInfinity())\n        return this;\n      var pz2 = p.z.redSqr();\n      var z2 = this.z.redSqr();\n      var u1 = this.x.redMul(pz2);\n      var u2 = p.x.redMul(z2);\n      var s1 = this.y.redMul(pz2.redMul(p.z));\n      var s2 = p.y.redMul(z2.redMul(this.z));\n      var h = u1.redSub(u2);\n      var r = s1.redSub(s2);\n      if (h.cmpn(0) === 0) {\n        if (r.cmpn(0) !== 0)\n          return this.curve.jpoint(null, null, null);\n        else\n          return this.dbl();\n      }\n      var h2 = h.redSqr();\n      var h3 = h2.redMul(h);\n      var v = u1.redMul(h2);\n      var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n      var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n      var nz = this.z.redMul(p.z).redMul(h);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.mixedAdd = function mixedAdd(p) {\n      if (this.isInfinity())\n        return p.toJ();\n      if (p.isInfinity())\n        return this;\n      var z2 = this.z.redSqr();\n      var u1 = this.x;\n      var u2 = p.x.redMul(z2);\n      var s1 = this.y;\n      var s2 = p.y.redMul(z2).redMul(this.z);\n      var h = u1.redSub(u2);\n      var r = s1.redSub(s2);\n      if (h.cmpn(0) === 0) {\n        if (r.cmpn(0) !== 0)\n          return this.curve.jpoint(null, null, null);\n        else\n          return this.dbl();\n      }\n      var h2 = h.redSqr();\n      var h3 = h2.redMul(h);\n      var v = u1.redMul(h2);\n      var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n      var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n      var nz = this.z.redMul(h);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.dblp = function dblp(pow) {\n      if (pow === 0)\n        return this;\n      if (this.isInfinity())\n        return this;\n      if (!pow)\n        return this.dbl();\n      var i;\n      if (this.curve.zeroA || this.curve.threeA) {\n        var r = this;\n        for (i = 0; i < pow; i++)\n          r = r.dbl();\n        return r;\n      }\n      var a = this.curve.a;\n      var tinv = this.curve.tinv;\n      var jx = this.x;\n      var jy = this.y;\n      var jz = this.z;\n      var jz4 = jz.redSqr().redSqr();\n      var jyd = jy.redAdd(jy);\n      for (i = 0; i < pow; i++) {\n        var jx2 = jx.redSqr();\n        var jyd2 = jyd.redSqr();\n        var jyd4 = jyd2.redSqr();\n        var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n        var t1 = jx.redMul(jyd2);\n        var nx = c.redSqr().redISub(t1.redAdd(t1));\n        var t2 = t1.redISub(nx);\n        var dny = c.redMul(t2);\n        dny = dny.redIAdd(dny).redISub(jyd4);\n        var nz = jyd.redMul(jz);\n        if (i + 1 < pow)\n          jz4 = jz4.redMul(jyd4);\n        jx = nx;\n        jz = nz;\n        jyd = dny;\n      }\n      return this.curve.jpoint(jx, jyd.redMul(tinv), jz);\n    };\n    JPoint.prototype.dbl = function dbl() {\n      if (this.isInfinity())\n        return this;\n      if (this.curve.zeroA)\n        return this._zeroDbl();\n      else if (this.curve.threeA)\n        return this._threeDbl();\n      else\n        return this._dbl();\n    };\n    JPoint.prototype._zeroDbl = function _zeroDbl() {\n      var nx;\n      var ny;\n      var nz;\n      if (this.zOne) {\n        var xx = this.x.redSqr();\n        var yy = this.y.redSqr();\n        var yyyy = yy.redSqr();\n        var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n        s = s.redIAdd(s);\n        var m = xx.redAdd(xx).redIAdd(xx);\n        var t = m.redSqr().redISub(s).redISub(s);\n        var yyyy8 = yyyy.redIAdd(yyyy);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        nx = t;\n        ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n        nz = this.y.redAdd(this.y);\n      } else {\n        var a = this.x.redSqr();\n        var b = this.y.redSqr();\n        var c = b.redSqr();\n        var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);\n        d = d.redIAdd(d);\n        var e = a.redAdd(a).redIAdd(a);\n        var f = e.redSqr();\n        var c8 = c.redIAdd(c);\n        c8 = c8.redIAdd(c8);\n        c8 = c8.redIAdd(c8);\n        nx = f.redISub(d).redISub(d);\n        ny = e.redMul(d.redISub(nx)).redISub(c8);\n        nz = this.y.redMul(this.z);\n        nz = nz.redIAdd(nz);\n      }\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype._threeDbl = function _threeDbl() {\n      var nx;\n      var ny;\n      var nz;\n      if (this.zOne) {\n        var xx = this.x.redSqr();\n        var yy = this.y.redSqr();\n        var yyyy = yy.redSqr();\n        var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n        s = s.redIAdd(s);\n        var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);\n        var t = m.redSqr().redISub(s).redISub(s);\n        nx = t;\n        var yyyy8 = yyyy.redIAdd(yyyy);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        yyyy8 = yyyy8.redIAdd(yyyy8);\n        ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n        nz = this.y.redAdd(this.y);\n      } else {\n        var delta = this.z.redSqr();\n        var gamma = this.y.redSqr();\n        var beta = this.x.redMul(gamma);\n        var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));\n        alpha = alpha.redAdd(alpha).redIAdd(alpha);\n        var beta4 = beta.redIAdd(beta);\n        beta4 = beta4.redIAdd(beta4);\n        var beta8 = beta4.redAdd(beta4);\n        nx = alpha.redSqr().redISub(beta8);\n        nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);\n        var ggamma8 = gamma.redSqr();\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ggamma8 = ggamma8.redIAdd(ggamma8);\n        ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);\n      }\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype._dbl = function _dbl() {\n      var a = this.curve.a;\n      var jx = this.x;\n      var jy = this.y;\n      var jz = this.z;\n      var jz4 = jz.redSqr().redSqr();\n      var jx2 = jx.redSqr();\n      var jy2 = jy.redSqr();\n      var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n      var jxd4 = jx.redAdd(jx);\n      jxd4 = jxd4.redIAdd(jxd4);\n      var t1 = jxd4.redMul(jy2);\n      var nx = c.redSqr().redISub(t1.redAdd(t1));\n      var t2 = t1.redISub(nx);\n      var jyd8 = jy2.redSqr();\n      jyd8 = jyd8.redIAdd(jyd8);\n      jyd8 = jyd8.redIAdd(jyd8);\n      jyd8 = jyd8.redIAdd(jyd8);\n      var ny = c.redMul(t2).redISub(jyd8);\n      var nz = jy.redAdd(jy).redMul(jz);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.trpl = function trpl() {\n      if (!this.curve.zeroA)\n        return this.dbl().add(this);\n      var xx = this.x.redSqr();\n      var yy = this.y.redSqr();\n      var zz = this.z.redSqr();\n      var yyyy = yy.redSqr();\n      var m = xx.redAdd(xx).redIAdd(xx);\n      var mm = m.redSqr();\n      var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n      e = e.redIAdd(e);\n      e = e.redAdd(e).redIAdd(e);\n      e = e.redISub(mm);\n      var ee = e.redSqr();\n      var t = yyyy.redIAdd(yyyy);\n      t = t.redIAdd(t);\n      t = t.redIAdd(t);\n      t = t.redIAdd(t);\n      var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);\n      var yyu4 = yy.redMul(u);\n      yyu4 = yyu4.redIAdd(yyu4);\n      yyu4 = yyu4.redIAdd(yyu4);\n      var nx = this.x.redMul(ee).redISub(yyu4);\n      nx = nx.redIAdd(nx);\n      nx = nx.redIAdd(nx);\n      var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));\n      ny = ny.redIAdd(ny);\n      ny = ny.redIAdd(ny);\n      ny = ny.redIAdd(ny);\n      var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);\n      return this.curve.jpoint(nx, ny, nz);\n    };\n    JPoint.prototype.mul = function mul(k, kbase) {\n      k = new BN(k, kbase);\n      return this.curve._wnafMul(this, k);\n    };\n    JPoint.prototype.eq = function eq(p) {\n      if (p.type === \"affine\")\n        return this.eq(p.toJ());\n      if (this === p)\n        return true;\n      var z2 = this.z.redSqr();\n      var pz2 = p.z.redSqr();\n      if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)\n        return false;\n      var z3 = z2.redMul(this.z);\n      var pz3 = pz2.redMul(p.z);\n      return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;\n    };\n    JPoint.prototype.eqXToP = function eqXToP(x) {\n      var zs = this.z.redSqr();\n      var rx = x.toRed(this.curve.red).redMul(zs);\n      if (this.x.cmp(rx) === 0)\n        return true;\n      var xc = x.clone();\n      var t = this.curve.redN.redMul(zs);\n      for (; ; ) {\n        xc.iadd(this.curve.n);\n        if (xc.cmp(this.curve.p) >= 0)\n          return false;\n        rx.redIAdd(t);\n        if (this.x.cmp(rx) === 0)\n          return true;\n      }\n    };\n    JPoint.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC JPoint Infinity>\";\n      return \"<EC JPoint x: \" + this.x.toString(16, 2) + \" y: \" + this.y.toString(16, 2) + \" z: \" + this.z.toString(16, 2) + \">\";\n    };\n    JPoint.prototype.isInfinity = function isInfinity() {\n      return this.z.cmpn(0) === 0;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/mont.js\nvar require_mont = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/mont.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var utils = require_utils2();\n    function MontCurve(conf) {\n      Base.call(this, \"mont\", conf);\n      this.a = new BN(conf.a, 16).toRed(this.red);\n      this.b = new BN(conf.b, 16).toRed(this.red);\n      this.i4 = new BN(4).toRed(this.red).redInvm();\n      this.two = new BN(2).toRed(this.red);\n      this.a24 = this.i4.redMul(this.a.redAdd(this.two));\n    }\n    inherits(MontCurve, Base);\n    module2.exports = MontCurve;\n    MontCurve.prototype.validate = function validate(point) {\n      var x = point.normalize().x;\n      var x2 = x.redSqr();\n      var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);\n      var y = rhs.redSqrt();\n      return y.redSqr().cmp(rhs) === 0;\n    };\n    function Point(curve, x, z) {\n      Base.BasePoint.call(this, curve, \"projective\");\n      if (x === null && z === null) {\n        this.x = this.curve.one;\n        this.z = this.curve.zero;\n      } else {\n        this.x = new BN(x, 16);\n        this.z = new BN(z, 16);\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.z.red)\n          this.z = this.z.toRed(this.curve.red);\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n      return this.point(utils.toArray(bytes, enc), 1);\n    };\n    MontCurve.prototype.point = function point(x, z) {\n      return new Point(this, x, z);\n    };\n    MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n      return Point.fromJSON(this, obj);\n    };\n    Point.prototype.precompute = function precompute() {\n    };\n    Point.prototype._encode = function _encode() {\n      return this.getX().toArray(\"be\", this.curve.p.byteLength());\n    };\n    Point.fromJSON = function fromJSON(curve, obj) {\n      return new Point(curve, obj[0], obj[1] || curve.one);\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" z: \" + this.z.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.z.cmpn(0) === 0;\n    };\n    Point.prototype.dbl = function dbl() {\n      var a = this.x.redAdd(this.z);\n      var aa = a.redSqr();\n      var b = this.x.redSub(this.z);\n      var bb = b.redSqr();\n      var c = aa.redSub(bb);\n      var nx = aa.redMul(bb);\n      var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));\n      return this.curve.point(nx, nz);\n    };\n    Point.prototype.add = function add() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.diffAdd = function diffAdd(p, diff) {\n      var a = this.x.redAdd(this.z);\n      var b = this.x.redSub(this.z);\n      var c = p.x.redAdd(p.z);\n      var d = p.x.redSub(p.z);\n      var da = d.redMul(a);\n      var cb = c.redMul(b);\n      var nx = diff.z.redMul(da.redAdd(cb).redSqr());\n      var nz = diff.x.redMul(da.redISub(cb).redSqr());\n      return this.curve.point(nx, nz);\n    };\n    Point.prototype.mul = function mul(k) {\n      var t = k.clone();\n      var a = this;\n      var b = this.curve.point(null, null);\n      var c = this;\n      for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1))\n        bits.push(t.andln(1));\n      for (var i = bits.length - 1; i >= 0; i--) {\n        if (bits[i] === 0) {\n          a = a.diffAdd(b, c);\n          b = b.dbl();\n        } else {\n          b = a.diffAdd(b, c);\n          a = a.dbl();\n        }\n      }\n      return b;\n    };\n    Point.prototype.mulAdd = function mulAdd() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.jumlAdd = function jumlAdd() {\n      throw new Error(\"Not supported on Montgomery curve\");\n    };\n    Point.prototype.eq = function eq(other) {\n      return this.getX().cmp(other.getX()) === 0;\n    };\n    Point.prototype.normalize = function normalize() {\n      this.x = this.x.redMul(this.z.redInvm());\n      this.z = this.curve.one;\n      return this;\n    };\n    Point.prototype.getX = function getX() {\n      this.normalize();\n      return this.x.fromRed();\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/edwards.js\nvar require_edwards = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/edwards.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var BN = require_bn();\n    var inherits = require_inherits();\n    var Base = require_base();\n    var assert = utils.assert;\n    function EdwardsCurve(conf) {\n      this.twisted = (conf.a | 0) !== 1;\n      this.mOneA = this.twisted && (conf.a | 0) === -1;\n      this.extended = this.mOneA;\n      Base.call(this, \"edwards\", conf);\n      this.a = new BN(conf.a, 16).umod(this.red.m);\n      this.a = this.a.toRed(this.red);\n      this.c = new BN(conf.c, 16).toRed(this.red);\n      this.c2 = this.c.redSqr();\n      this.d = new BN(conf.d, 16).toRed(this.red);\n      this.dd = this.d.redAdd(this.d);\n      assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);\n      this.oneC = (conf.c | 0) === 1;\n    }\n    inherits(EdwardsCurve, Base);\n    module2.exports = EdwardsCurve;\n    EdwardsCurve.prototype._mulA = function _mulA(num) {\n      if (this.mOneA)\n        return num.redNeg();\n      else\n        return this.a.redMul(num);\n    };\n    EdwardsCurve.prototype._mulC = function _mulC(num) {\n      if (this.oneC)\n        return num;\n      else\n        return this.c.redMul(num);\n    };\n    EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {\n      return this.point(x, y, z, t);\n    };\n    EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {\n      x = new BN(x, 16);\n      if (!x.red)\n        x = x.toRed(this.red);\n      var x2 = x.redSqr();\n      var rhs = this.c2.redSub(this.a.redMul(x2));\n      var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));\n      var y2 = rhs.redMul(lhs.redInvm());\n      var y = y2.redSqrt();\n      if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      var isOdd = y.fromRed().isOdd();\n      if (odd && !isOdd || !odd && isOdd)\n        y = y.redNeg();\n      return this.point(x, y);\n    };\n    EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {\n      y = new BN(y, 16);\n      if (!y.red)\n        y = y.toRed(this.red);\n      var y2 = y.redSqr();\n      var lhs = y2.redSub(this.c2);\n      var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);\n      var x2 = lhs.redMul(rhs.redInvm());\n      if (x2.cmp(this.zero) === 0) {\n        if (odd)\n          throw new Error(\"invalid point\");\n        else\n          return this.point(this.zero, y);\n      }\n      var x = x2.redSqrt();\n      if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)\n        throw new Error(\"invalid point\");\n      if (x.fromRed().isOdd() !== odd)\n        x = x.redNeg();\n      return this.point(x, y);\n    };\n    EdwardsCurve.prototype.validate = function validate(point) {\n      if (point.isInfinity())\n        return true;\n      point.normalize();\n      var x2 = point.x.redSqr();\n      var y2 = point.y.redSqr();\n      var lhs = x2.redMul(this.a).redAdd(y2);\n      var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));\n      return lhs.cmp(rhs) === 0;\n    };\n    function Point(curve, x, y, z, t) {\n      Base.BasePoint.call(this, curve, \"projective\");\n      if (x === null && y === null && z === null) {\n        this.x = this.curve.zero;\n        this.y = this.curve.one;\n        this.z = this.curve.one;\n        this.t = this.curve.zero;\n        this.zOne = true;\n      } else {\n        this.x = new BN(x, 16);\n        this.y = new BN(y, 16);\n        this.z = z ? new BN(z, 16) : this.curve.one;\n        this.t = t && new BN(t, 16);\n        if (!this.x.red)\n          this.x = this.x.toRed(this.curve.red);\n        if (!this.y.red)\n          this.y = this.y.toRed(this.curve.red);\n        if (!this.z.red)\n          this.z = this.z.toRed(this.curve.red);\n        if (this.t && !this.t.red)\n          this.t = this.t.toRed(this.curve.red);\n        this.zOne = this.z === this.curve.one;\n        if (this.curve.extended && !this.t) {\n          this.t = this.x.redMul(this.y);\n          if (!this.zOne)\n            this.t = this.t.redMul(this.z.redInvm());\n        }\n      }\n    }\n    inherits(Point, Base.BasePoint);\n    EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n      return Point.fromJSON(this, obj);\n    };\n    EdwardsCurve.prototype.point = function point(x, y, z, t) {\n      return new Point(this, x, y, z, t);\n    };\n    Point.fromJSON = function fromJSON(curve, obj) {\n      return new Point(curve, obj[0], obj[1], obj[2]);\n    };\n    Point.prototype.inspect = function inspect() {\n      if (this.isInfinity())\n        return \"<EC Point Infinity>\";\n      return \"<EC Point x: \" + this.x.fromRed().toString(16, 2) + \" y: \" + this.y.fromRed().toString(16, 2) + \" z: \" + this.z.fromRed().toString(16, 2) + \">\";\n    };\n    Point.prototype.isInfinity = function isInfinity() {\n      return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || this.zOne && this.y.cmp(this.curve.c) === 0);\n    };\n    Point.prototype._extDbl = function _extDbl() {\n      var a = this.x.redSqr();\n      var b = this.y.redSqr();\n      var c = this.z.redSqr();\n      c = c.redIAdd(c);\n      var d = this.curve._mulA(a);\n      var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);\n      var g = d.redAdd(b);\n      var f = g.redSub(c);\n      var h = d.redSub(b);\n      var nx = e.redMul(f);\n      var ny = g.redMul(h);\n      var nt = e.redMul(h);\n      var nz = f.redMul(g);\n      return this.curve.point(nx, ny, nz, nt);\n    };\n    Point.prototype._projDbl = function _projDbl() {\n      var b = this.x.redAdd(this.y).redSqr();\n      var c = this.x.redSqr();\n      var d = this.y.redSqr();\n      var nx;\n      var ny;\n      var nz;\n      var e;\n      var h;\n      var j;\n      if (this.curve.twisted) {\n        e = this.curve._mulA(c);\n        var f = e.redAdd(d);\n        if (this.zOne) {\n          nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));\n          ny = f.redMul(e.redSub(d));\n          nz = f.redSqr().redSub(f).redSub(f);\n        } else {\n          h = this.z.redSqr();\n          j = f.redSub(h).redISub(h);\n          nx = b.redSub(c).redISub(d).redMul(j);\n          ny = f.redMul(e.redSub(d));\n          nz = f.redMul(j);\n        }\n      } else {\n        e = c.redAdd(d);\n        h = this.curve._mulC(this.z).redSqr();\n        j = e.redSub(h).redSub(h);\n        nx = this.curve._mulC(b.redISub(e)).redMul(j);\n        ny = this.curve._mulC(e).redMul(c.redISub(d));\n        nz = e.redMul(j);\n      }\n      return this.curve.point(nx, ny, nz);\n    };\n    Point.prototype.dbl = function dbl() {\n      if (this.isInfinity())\n        return this;\n      if (this.curve.extended)\n        return this._extDbl();\n      else\n        return this._projDbl();\n    };\n    Point.prototype._extAdd = function _extAdd(p) {\n      var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));\n      var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));\n      var c = this.t.redMul(this.curve.dd).redMul(p.t);\n      var d = this.z.redMul(p.z.redAdd(p.z));\n      var e = b.redSub(a);\n      var f = d.redSub(c);\n      var g = d.redAdd(c);\n      var h = b.redAdd(a);\n      var nx = e.redMul(f);\n      var ny = g.redMul(h);\n      var nt = e.redMul(h);\n      var nz = f.redMul(g);\n      return this.curve.point(nx, ny, nz, nt);\n    };\n    Point.prototype._projAdd = function _projAdd(p) {\n      var a = this.z.redMul(p.z);\n      var b = a.redSqr();\n      var c = this.x.redMul(p.x);\n      var d = this.y.redMul(p.y);\n      var e = this.curve.d.redMul(c).redMul(d);\n      var f = b.redSub(e);\n      var g = b.redAdd(e);\n      var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);\n      var nx = a.redMul(f).redMul(tmp);\n      var ny;\n      var nz;\n      if (this.curve.twisted) {\n        ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));\n        nz = f.redMul(g);\n      } else {\n        ny = a.redMul(g).redMul(d.redSub(c));\n        nz = this.curve._mulC(f).redMul(g);\n      }\n      return this.curve.point(nx, ny, nz);\n    };\n    Point.prototype.add = function add(p) {\n      if (this.isInfinity())\n        return p;\n      if (p.isInfinity())\n        return this;\n      if (this.curve.extended)\n        return this._extAdd(p);\n      else\n        return this._projAdd(p);\n    };\n    Point.prototype.mul = function mul(k) {\n      if (this._hasDoubles(k))\n        return this.curve._fixedNafMul(this, k);\n      else\n        return this.curve._wnafMul(this, k);\n    };\n    Point.prototype.mulAdd = function mulAdd(k1, p, k2) {\n      return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false);\n    };\n    Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) {\n      return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true);\n    };\n    Point.prototype.normalize = function normalize() {\n      if (this.zOne)\n        return this;\n      var zi = this.z.redInvm();\n      this.x = this.x.redMul(zi);\n      this.y = this.y.redMul(zi);\n      if (this.t)\n        this.t = this.t.redMul(zi);\n      this.z = this.curve.one;\n      this.zOne = true;\n      return this;\n    };\n    Point.prototype.neg = function neg() {\n      return this.curve.point(\n        this.x.redNeg(),\n        this.y,\n        this.z,\n        this.t && this.t.redNeg()\n      );\n    };\n    Point.prototype.getX = function getX() {\n      this.normalize();\n      return this.x.fromRed();\n    };\n    Point.prototype.getY = function getY() {\n      this.normalize();\n      return this.y.fromRed();\n    };\n    Point.prototype.eq = function eq(other) {\n      return this === other || this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0;\n    };\n    Point.prototype.eqXToP = function eqXToP(x) {\n      var rx = x.toRed(this.curve.red).redMul(this.z);\n      if (this.x.cmp(rx) === 0)\n        return true;\n      var xc = x.clone();\n      var t = this.curve.redN.redMul(this.z);\n      for (; ; ) {\n        xc.iadd(this.curve.n);\n        if (xc.cmp(this.curve.p) >= 0)\n          return false;\n        rx.redIAdd(t);\n        if (this.x.cmp(rx) === 0)\n          return true;\n      }\n    };\n    Point.prototype.toP = Point.prototype.normalize;\n    Point.prototype.mixedAdd = Point.prototype.add;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curve/index.js\nvar require_curve = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curve/index.js\"(exports2) {\n    \"use strict\";\n    var curve = exports2;\n    curve.base = require_base();\n    curve.short = require_short();\n    curve.mont = require_mont();\n    curve.edwards = require_edwards();\n  }\n});\n\n// node_modules/hash.js/lib/hash/utils.js\nvar require_utils3 = __commonJS({\n  \"node_modules/hash.js/lib/hash/utils.js\"(exports2) {\n    \"use strict\";\n    var assert = require_minimalistic_assert();\n    var inherits = require_inherits();\n    exports2.inherits = inherits;\n    function isSurrogatePair(msg, i) {\n      if ((msg.charCodeAt(i) & 64512) !== 55296) {\n        return false;\n      }\n      if (i < 0 || i + 1 >= msg.length) {\n        return false;\n      }\n      return (msg.charCodeAt(i + 1) & 64512) === 56320;\n    }\n    function toArray(msg, enc) {\n      if (Array.isArray(msg))\n        return msg.slice();\n      if (!msg)\n        return [];\n      var res = [];\n      if (typeof msg === \"string\") {\n        if (!enc) {\n          var p = 0;\n          for (var i = 0; i < msg.length; i++) {\n            var c = msg.charCodeAt(i);\n            if (c < 128) {\n              res[p++] = c;\n            } else if (c < 2048) {\n              res[p++] = c >> 6 | 192;\n              res[p++] = c & 63 | 128;\n            } else if (isSurrogatePair(msg, i)) {\n              c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023);\n              res[p++] = c >> 18 | 240;\n              res[p++] = c >> 12 & 63 | 128;\n              res[p++] = c >> 6 & 63 | 128;\n              res[p++] = c & 63 | 128;\n            } else {\n              res[p++] = c >> 12 | 224;\n              res[p++] = c >> 6 & 63 | 128;\n              res[p++] = c & 63 | 128;\n            }\n          }\n        } else if (enc === \"hex\") {\n          msg = msg.replace(/[^a-z0-9]+/ig, \"\");\n          if (msg.length % 2 !== 0)\n            msg = \"0\" + msg;\n          for (i = 0; i < msg.length; i += 2)\n            res.push(parseInt(msg[i] + msg[i + 1], 16));\n        }\n      } else {\n        for (i = 0; i < msg.length; i++)\n          res[i] = msg[i] | 0;\n      }\n      return res;\n    }\n    exports2.toArray = toArray;\n    function toHex(msg) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++)\n        res += zero2(msg[i].toString(16));\n      return res;\n    }\n    exports2.toHex = toHex;\n    function htonl(w) {\n      var res = w >>> 24 | w >>> 8 & 65280 | w << 8 & 16711680 | (w & 255) << 24;\n      return res >>> 0;\n    }\n    exports2.htonl = htonl;\n    function toHex32(msg, endian) {\n      var res = \"\";\n      for (var i = 0; i < msg.length; i++) {\n        var w = msg[i];\n        if (endian === \"little\")\n          w = htonl(w);\n        res += zero8(w.toString(16));\n      }\n      return res;\n    }\n    exports2.toHex32 = toHex32;\n    function zero2(word) {\n      if (word.length === 1)\n        return \"0\" + word;\n      else\n        return word;\n    }\n    exports2.zero2 = zero2;\n    function zero8(word) {\n      if (word.length === 7)\n        return \"0\" + word;\n      else if (word.length === 6)\n        return \"00\" + word;\n      else if (word.length === 5)\n        return \"000\" + word;\n      else if (word.length === 4)\n        return \"0000\" + word;\n      else if (word.length === 3)\n        return \"00000\" + word;\n      else if (word.length === 2)\n        return \"000000\" + word;\n      else if (word.length === 1)\n        return \"0000000\" + word;\n      else\n        return word;\n    }\n    exports2.zero8 = zero8;\n    function join32(msg, start, end, endian) {\n      var len = end - start;\n      assert(len % 4 === 0);\n      var res = new Array(len / 4);\n      for (var i = 0, k = start; i < res.length; i++, k += 4) {\n        var w;\n        if (endian === \"big\")\n          w = msg[k] << 24 | msg[k + 1] << 16 | msg[k + 2] << 8 | msg[k + 3];\n        else\n          w = msg[k + 3] << 24 | msg[k + 2] << 16 | msg[k + 1] << 8 | msg[k];\n        res[i] = w >>> 0;\n      }\n      return res;\n    }\n    exports2.join32 = join32;\n    function split32(msg, endian) {\n      var res = new Array(msg.length * 4);\n      for (var i = 0, k = 0; i < msg.length; i++, k += 4) {\n        var m = msg[i];\n        if (endian === \"big\") {\n          res[k] = m >>> 24;\n          res[k + 1] = m >>> 16 & 255;\n          res[k + 2] = m >>> 8 & 255;\n          res[k + 3] = m & 255;\n        } else {\n          res[k + 3] = m >>> 24;\n          res[k + 2] = m >>> 16 & 255;\n          res[k + 1] = m >>> 8 & 255;\n          res[k] = m & 255;\n        }\n      }\n      return res;\n    }\n    exports2.split32 = split32;\n    function rotr32(w, b) {\n      return w >>> b | w << 32 - b;\n    }\n    exports2.rotr32 = rotr32;\n    function rotl32(w, b) {\n      return w << b | w >>> 32 - b;\n    }\n    exports2.rotl32 = rotl32;\n    function sum32(a, b) {\n      return a + b >>> 0;\n    }\n    exports2.sum32 = sum32;\n    function sum32_3(a, b, c) {\n      return a + b + c >>> 0;\n    }\n    exports2.sum32_3 = sum32_3;\n    function sum32_4(a, b, c, d) {\n      return a + b + c + d >>> 0;\n    }\n    exports2.sum32_4 = sum32_4;\n    function sum32_5(a, b, c, d, e) {\n      return a + b + c + d + e >>> 0;\n    }\n    exports2.sum32_5 = sum32_5;\n    function sum64(buf, pos, ah, al) {\n      var bh = buf[pos];\n      var bl = buf[pos + 1];\n      var lo = al + bl >>> 0;\n      var hi = (lo < al ? 1 : 0) + ah + bh;\n      buf[pos] = hi >>> 0;\n      buf[pos + 1] = lo;\n    }\n    exports2.sum64 = sum64;\n    function sum64_hi(ah, al, bh, bl) {\n      var lo = al + bl >>> 0;\n      var hi = (lo < al ? 1 : 0) + ah + bh;\n      return hi >>> 0;\n    }\n    exports2.sum64_hi = sum64_hi;\n    function sum64_lo(ah, al, bh, bl) {\n      var lo = al + bl;\n      return lo >>> 0;\n    }\n    exports2.sum64_lo = sum64_lo;\n    function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {\n      var carry = 0;\n      var lo = al;\n      lo = lo + bl >>> 0;\n      carry += lo < al ? 1 : 0;\n      lo = lo + cl >>> 0;\n      carry += lo < cl ? 1 : 0;\n      lo = lo + dl >>> 0;\n      carry += lo < dl ? 1 : 0;\n      var hi = ah + bh + ch + dh + carry;\n      return hi >>> 0;\n    }\n    exports2.sum64_4_hi = sum64_4_hi;\n    function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {\n      var lo = al + bl + cl + dl;\n      return lo >>> 0;\n    }\n    exports2.sum64_4_lo = sum64_4_lo;\n    function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n      var carry = 0;\n      var lo = al;\n      lo = lo + bl >>> 0;\n      carry += lo < al ? 1 : 0;\n      lo = lo + cl >>> 0;\n      carry += lo < cl ? 1 : 0;\n      lo = lo + dl >>> 0;\n      carry += lo < dl ? 1 : 0;\n      lo = lo + el >>> 0;\n      carry += lo < el ? 1 : 0;\n      var hi = ah + bh + ch + dh + eh + carry;\n      return hi >>> 0;\n    }\n    exports2.sum64_5_hi = sum64_5_hi;\n    function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n      var lo = al + bl + cl + dl + el;\n      return lo >>> 0;\n    }\n    exports2.sum64_5_lo = sum64_5_lo;\n    function rotr64_hi(ah, al, num) {\n      var r = al << 32 - num | ah >>> num;\n      return r >>> 0;\n    }\n    exports2.rotr64_hi = rotr64_hi;\n    function rotr64_lo(ah, al, num) {\n      var r = ah << 32 - num | al >>> num;\n      return r >>> 0;\n    }\n    exports2.rotr64_lo = rotr64_lo;\n    function shr64_hi(ah, al, num) {\n      return ah >>> num;\n    }\n    exports2.shr64_hi = shr64_hi;\n    function shr64_lo(ah, al, num) {\n      var r = ah << 32 - num | al >>> num;\n      return r >>> 0;\n    }\n    exports2.shr64_lo = shr64_lo;\n  }\n});\n\n// node_modules/hash.js/lib/hash/common.js\nvar require_common = __commonJS({\n  \"node_modules/hash.js/lib/hash/common.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var assert = require_minimalistic_assert();\n    function BlockHash() {\n      this.pending = null;\n      this.pendingTotal = 0;\n      this.blockSize = this.constructor.blockSize;\n      this.outSize = this.constructor.outSize;\n      this.hmacStrength = this.constructor.hmacStrength;\n      this.padLength = this.constructor.padLength / 8;\n      this.endian = \"big\";\n      this._delta8 = this.blockSize / 8;\n      this._delta32 = this.blockSize / 32;\n    }\n    exports2.BlockHash = BlockHash;\n    BlockHash.prototype.update = function update(msg, enc) {\n      msg = utils.toArray(msg, enc);\n      if (!this.pending)\n        this.pending = msg;\n      else\n        this.pending = this.pending.concat(msg);\n      this.pendingTotal += msg.length;\n      if (this.pending.length >= this._delta8) {\n        msg = this.pending;\n        var r = msg.length % this._delta8;\n        this.pending = msg.slice(msg.length - r, msg.length);\n        if (this.pending.length === 0)\n          this.pending = null;\n        msg = utils.join32(msg, 0, msg.length - r, this.endian);\n        for (var i = 0; i < msg.length; i += this._delta32)\n          this._update(msg, i, i + this._delta32);\n      }\n      return this;\n    };\n    BlockHash.prototype.digest = function digest(enc) {\n      this.update(this._pad());\n      assert(this.pending === null);\n      return this._digest(enc);\n    };\n    BlockHash.prototype._pad = function pad() {\n      var len = this.pendingTotal;\n      var bytes = this._delta8;\n      var k = bytes - (len + this.padLength) % bytes;\n      var res = new Array(k + this.padLength);\n      res[0] = 128;\n      for (var i = 1; i < k; i++)\n        res[i] = 0;\n      len <<= 3;\n      if (this.endian === \"big\") {\n        for (var t = 8; t < this.padLength; t++)\n          res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = len >>> 24 & 255;\n        res[i++] = len >>> 16 & 255;\n        res[i++] = len >>> 8 & 255;\n        res[i++] = len & 255;\n      } else {\n        res[i++] = len & 255;\n        res[i++] = len >>> 8 & 255;\n        res[i++] = len >>> 16 & 255;\n        res[i++] = len >>> 24 & 255;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        res[i++] = 0;\n        for (t = 8; t < this.padLength; t++)\n          res[i++] = 0;\n      }\n      return res;\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/common.js\nvar require_common2 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/common.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var rotr32 = utils.rotr32;\n    function ft_1(s, x, y, z) {\n      if (s === 0)\n        return ch32(x, y, z);\n      if (s === 1 || s === 3)\n        return p32(x, y, z);\n      if (s === 2)\n        return maj32(x, y, z);\n    }\n    exports2.ft_1 = ft_1;\n    function ch32(x, y, z) {\n      return x & y ^ ~x & z;\n    }\n    exports2.ch32 = ch32;\n    function maj32(x, y, z) {\n      return x & y ^ x & z ^ y & z;\n    }\n    exports2.maj32 = maj32;\n    function p32(x, y, z) {\n      return x ^ y ^ z;\n    }\n    exports2.p32 = p32;\n    function s0_256(x) {\n      return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);\n    }\n    exports2.s0_256 = s0_256;\n    function s1_256(x) {\n      return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);\n    }\n    exports2.s1_256 = s1_256;\n    function g0_256(x) {\n      return rotr32(x, 7) ^ rotr32(x, 18) ^ x >>> 3;\n    }\n    exports2.g0_256 = g0_256;\n    function g1_256(x) {\n      return rotr32(x, 17) ^ rotr32(x, 19) ^ x >>> 10;\n    }\n    exports2.g1_256 = g1_256;\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/1.js\nvar require__ = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/1.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var shaCommon = require_common2();\n    var rotl32 = utils.rotl32;\n    var sum32 = utils.sum32;\n    var sum32_5 = utils.sum32_5;\n    var ft_1 = shaCommon.ft_1;\n    var BlockHash = common.BlockHash;\n    var sha1_K = [\n      1518500249,\n      1859775393,\n      2400959708,\n      3395469782\n    ];\n    function SHA1() {\n      if (!(this instanceof SHA1))\n        return new SHA1();\n      BlockHash.call(this);\n      this.h = [\n        1732584193,\n        4023233417,\n        2562383102,\n        271733878,\n        3285377520\n      ];\n      this.W = new Array(80);\n    }\n    utils.inherits(SHA1, BlockHash);\n    module2.exports = SHA1;\n    SHA1.blockSize = 512;\n    SHA1.outSize = 160;\n    SHA1.hmacStrength = 80;\n    SHA1.padLength = 64;\n    SHA1.prototype._update = function _update(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 16; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i++)\n        W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);\n      var a = this.h[0];\n      var b = this.h[1];\n      var c = this.h[2];\n      var d = this.h[3];\n      var e = this.h[4];\n      for (i = 0; i < W.length; i++) {\n        var s = ~~(i / 20);\n        var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);\n        e = d;\n        d = c;\n        c = rotl32(b, 30);\n        b = a;\n        a = t;\n      }\n      this.h[0] = sum32(this.h[0], a);\n      this.h[1] = sum32(this.h[1], b);\n      this.h[2] = sum32(this.h[2], c);\n      this.h[3] = sum32(this.h[3], d);\n      this.h[4] = sum32(this.h[4], e);\n    };\n    SHA1.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/256.js\nvar require__2 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/256.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var shaCommon = require_common2();\n    var assert = require_minimalistic_assert();\n    var sum32 = utils.sum32;\n    var sum32_4 = utils.sum32_4;\n    var sum32_5 = utils.sum32_5;\n    var ch32 = shaCommon.ch32;\n    var maj32 = shaCommon.maj32;\n    var s0_256 = shaCommon.s0_256;\n    var s1_256 = shaCommon.s1_256;\n    var g0_256 = shaCommon.g0_256;\n    var g1_256 = shaCommon.g1_256;\n    var BlockHash = common.BlockHash;\n    var sha256_K = [\n      1116352408,\n      1899447441,\n      3049323471,\n      3921009573,\n      961987163,\n      1508970993,\n      2453635748,\n      2870763221,\n      3624381080,\n      310598401,\n      607225278,\n      1426881987,\n      1925078388,\n      2162078206,\n      2614888103,\n      3248222580,\n      3835390401,\n      4022224774,\n      264347078,\n      604807628,\n      770255983,\n      1249150122,\n      1555081692,\n      1996064986,\n      2554220882,\n      2821834349,\n      2952996808,\n      3210313671,\n      3336571891,\n      3584528711,\n      113926993,\n      338241895,\n      666307205,\n      773529912,\n      1294757372,\n      1396182291,\n      1695183700,\n      1986661051,\n      2177026350,\n      2456956037,\n      2730485921,\n      2820302411,\n      3259730800,\n      3345764771,\n      3516065817,\n      3600352804,\n      4094571909,\n      275423344,\n      430227734,\n      506948616,\n      659060556,\n      883997877,\n      958139571,\n      1322822218,\n      1537002063,\n      1747873779,\n      1955562222,\n      2024104815,\n      2227730452,\n      2361852424,\n      2428436474,\n      2756734187,\n      3204031479,\n      3329325298\n    ];\n    function SHA256() {\n      if (!(this instanceof SHA256))\n        return new SHA256();\n      BlockHash.call(this);\n      this.h = [\n        1779033703,\n        3144134277,\n        1013904242,\n        2773480762,\n        1359893119,\n        2600822924,\n        528734635,\n        1541459225\n      ];\n      this.k = sha256_K;\n      this.W = new Array(64);\n    }\n    utils.inherits(SHA256, BlockHash);\n    module2.exports = SHA256;\n    SHA256.blockSize = 512;\n    SHA256.outSize = 256;\n    SHA256.hmacStrength = 192;\n    SHA256.padLength = 64;\n    SHA256.prototype._update = function _update(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 16; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i++)\n        W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);\n      var a = this.h[0];\n      var b = this.h[1];\n      var c = this.h[2];\n      var d = this.h[3];\n      var e = this.h[4];\n      var f = this.h[5];\n      var g = this.h[6];\n      var h = this.h[7];\n      assert(this.k.length === W.length);\n      for (i = 0; i < W.length; i++) {\n        var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);\n        var T2 = sum32(s0_256(a), maj32(a, b, c));\n        h = g;\n        g = f;\n        f = e;\n        e = sum32(d, T1);\n        d = c;\n        c = b;\n        b = a;\n        a = sum32(T1, T2);\n      }\n      this.h[0] = sum32(this.h[0], a);\n      this.h[1] = sum32(this.h[1], b);\n      this.h[2] = sum32(this.h[2], c);\n      this.h[3] = sum32(this.h[3], d);\n      this.h[4] = sum32(this.h[4], e);\n      this.h[5] = sum32(this.h[5], f);\n      this.h[6] = sum32(this.h[6], g);\n      this.h[7] = sum32(this.h[7], h);\n    };\n    SHA256.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/224.js\nvar require__3 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/224.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var SHA256 = require__2();\n    function SHA224() {\n      if (!(this instanceof SHA224))\n        return new SHA224();\n      SHA256.call(this);\n      this.h = [\n        3238371032,\n        914150663,\n        812702999,\n        4144912697,\n        4290775857,\n        1750603025,\n        1694076839,\n        3204075428\n      ];\n    }\n    utils.inherits(SHA224, SHA256);\n    module2.exports = SHA224;\n    SHA224.blockSize = 512;\n    SHA224.outSize = 224;\n    SHA224.hmacStrength = 192;\n    SHA224.padLength = 64;\n    SHA224.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h.slice(0, 7), \"big\");\n      else\n        return utils.split32(this.h.slice(0, 7), \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/512.js\nvar require__4 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/512.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var assert = require_minimalistic_assert();\n    var rotr64_hi = utils.rotr64_hi;\n    var rotr64_lo = utils.rotr64_lo;\n    var shr64_hi = utils.shr64_hi;\n    var shr64_lo = utils.shr64_lo;\n    var sum64 = utils.sum64;\n    var sum64_hi = utils.sum64_hi;\n    var sum64_lo = utils.sum64_lo;\n    var sum64_4_hi = utils.sum64_4_hi;\n    var sum64_4_lo = utils.sum64_4_lo;\n    var sum64_5_hi = utils.sum64_5_hi;\n    var sum64_5_lo = utils.sum64_5_lo;\n    var BlockHash = common.BlockHash;\n    var sha512_K = [\n      1116352408,\n      3609767458,\n      1899447441,\n      602891725,\n      3049323471,\n      3964484399,\n      3921009573,\n      2173295548,\n      961987163,\n      4081628472,\n      1508970993,\n      3053834265,\n      2453635748,\n      2937671579,\n      2870763221,\n      3664609560,\n      3624381080,\n      2734883394,\n      310598401,\n      1164996542,\n      607225278,\n      1323610764,\n      1426881987,\n      3590304994,\n      1925078388,\n      4068182383,\n      2162078206,\n      991336113,\n      2614888103,\n      633803317,\n      3248222580,\n      3479774868,\n      3835390401,\n      2666613458,\n      4022224774,\n      944711139,\n      264347078,\n      2341262773,\n      604807628,\n      2007800933,\n      770255983,\n      1495990901,\n      1249150122,\n      1856431235,\n      1555081692,\n      3175218132,\n      1996064986,\n      2198950837,\n      2554220882,\n      3999719339,\n      2821834349,\n      766784016,\n      2952996808,\n      2566594879,\n      3210313671,\n      3203337956,\n      3336571891,\n      1034457026,\n      3584528711,\n      2466948901,\n      113926993,\n      3758326383,\n      338241895,\n      168717936,\n      666307205,\n      1188179964,\n      773529912,\n      1546045734,\n      1294757372,\n      1522805485,\n      1396182291,\n      2643833823,\n      1695183700,\n      2343527390,\n      1986661051,\n      1014477480,\n      2177026350,\n      1206759142,\n      2456956037,\n      344077627,\n      2730485921,\n      1290863460,\n      2820302411,\n      3158454273,\n      3259730800,\n      3505952657,\n      3345764771,\n      106217008,\n      3516065817,\n      3606008344,\n      3600352804,\n      1432725776,\n      4094571909,\n      1467031594,\n      275423344,\n      851169720,\n      430227734,\n      3100823752,\n      506948616,\n      1363258195,\n      659060556,\n      3750685593,\n      883997877,\n      3785050280,\n      958139571,\n      3318307427,\n      1322822218,\n      3812723403,\n      1537002063,\n      2003034995,\n      1747873779,\n      3602036899,\n      1955562222,\n      1575990012,\n      2024104815,\n      1125592928,\n      2227730452,\n      2716904306,\n      2361852424,\n      442776044,\n      2428436474,\n      593698344,\n      2756734187,\n      3733110249,\n      3204031479,\n      2999351573,\n      3329325298,\n      3815920427,\n      3391569614,\n      3928383900,\n      3515267271,\n      566280711,\n      3940187606,\n      3454069534,\n      4118630271,\n      4000239992,\n      116418474,\n      1914138554,\n      174292421,\n      2731055270,\n      289380356,\n      3203993006,\n      460393269,\n      320620315,\n      685471733,\n      587496836,\n      852142971,\n      1086792851,\n      1017036298,\n      365543100,\n      1126000580,\n      2618297676,\n      1288033470,\n      3409855158,\n      1501505948,\n      4234509866,\n      1607167915,\n      987167468,\n      1816402316,\n      1246189591\n    ];\n    function SHA512() {\n      if (!(this instanceof SHA512))\n        return new SHA512();\n      BlockHash.call(this);\n      this.h = [\n        1779033703,\n        4089235720,\n        3144134277,\n        2227873595,\n        1013904242,\n        4271175723,\n        2773480762,\n        1595750129,\n        1359893119,\n        2917565137,\n        2600822924,\n        725511199,\n        528734635,\n        4215389547,\n        1541459225,\n        327033209\n      ];\n      this.k = sha512_K;\n      this.W = new Array(160);\n    }\n    utils.inherits(SHA512, BlockHash);\n    module2.exports = SHA512;\n    SHA512.blockSize = 1024;\n    SHA512.outSize = 512;\n    SHA512.hmacStrength = 192;\n    SHA512.padLength = 128;\n    SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {\n      var W = this.W;\n      for (var i = 0; i < 32; i++)\n        W[i] = msg[start + i];\n      for (; i < W.length; i += 2) {\n        var c0_hi = g1_512_hi(W[i - 4], W[i - 3]);\n        var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);\n        var c1_hi = W[i - 14];\n        var c1_lo = W[i - 13];\n        var c2_hi = g0_512_hi(W[i - 30], W[i - 29]);\n        var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);\n        var c3_hi = W[i - 32];\n        var c3_lo = W[i - 31];\n        W[i] = sum64_4_hi(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo\n        );\n        W[i + 1] = sum64_4_lo(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo\n        );\n      }\n    };\n    SHA512.prototype._update = function _update(msg, start) {\n      this._prepareBlock(msg, start);\n      var W = this.W;\n      var ah = this.h[0];\n      var al = this.h[1];\n      var bh = this.h[2];\n      var bl = this.h[3];\n      var ch = this.h[4];\n      var cl = this.h[5];\n      var dh = this.h[6];\n      var dl = this.h[7];\n      var eh = this.h[8];\n      var el = this.h[9];\n      var fh = this.h[10];\n      var fl = this.h[11];\n      var gh = this.h[12];\n      var gl = this.h[13];\n      var hh = this.h[14];\n      var hl = this.h[15];\n      assert(this.k.length === W.length);\n      for (var i = 0; i < W.length; i += 2) {\n        var c0_hi = hh;\n        var c0_lo = hl;\n        var c1_hi = s1_512_hi(eh, el);\n        var c1_lo = s1_512_lo(eh, el);\n        var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);\n        var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);\n        var c3_hi = this.k[i];\n        var c3_lo = this.k[i + 1];\n        var c4_hi = W[i];\n        var c4_lo = W[i + 1];\n        var T1_hi = sum64_5_hi(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo,\n          c4_hi,\n          c4_lo\n        );\n        var T1_lo = sum64_5_lo(\n          c0_hi,\n          c0_lo,\n          c1_hi,\n          c1_lo,\n          c2_hi,\n          c2_lo,\n          c3_hi,\n          c3_lo,\n          c4_hi,\n          c4_lo\n        );\n        c0_hi = s0_512_hi(ah, al);\n        c0_lo = s0_512_lo(ah, al);\n        c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);\n        c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);\n        var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);\n        var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);\n        hh = gh;\n        hl = gl;\n        gh = fh;\n        gl = fl;\n        fh = eh;\n        fl = el;\n        eh = sum64_hi(dh, dl, T1_hi, T1_lo);\n        el = sum64_lo(dl, dl, T1_hi, T1_lo);\n        dh = ch;\n        dl = cl;\n        ch = bh;\n        cl = bl;\n        bh = ah;\n        bl = al;\n        ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);\n        al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);\n      }\n      sum64(this.h, 0, ah, al);\n      sum64(this.h, 2, bh, bl);\n      sum64(this.h, 4, ch, cl);\n      sum64(this.h, 6, dh, dl);\n      sum64(this.h, 8, eh, el);\n      sum64(this.h, 10, fh, fl);\n      sum64(this.h, 12, gh, gl);\n      sum64(this.h, 14, hh, hl);\n    };\n    SHA512.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"big\");\n      else\n        return utils.split32(this.h, \"big\");\n    };\n    function ch64_hi(xh, xl, yh, yl, zh) {\n      var r = xh & yh ^ ~xh & zh;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function ch64_lo(xh, xl, yh, yl, zh, zl) {\n      var r = xl & yl ^ ~xl & zl;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function maj64_hi(xh, xl, yh, yl, zh) {\n      var r = xh & yh ^ xh & zh ^ yh & zh;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function maj64_lo(xh, xl, yh, yl, zh, zl) {\n      var r = xl & yl ^ xl & zl ^ yl & zl;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s0_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 28);\n      var c1_hi = rotr64_hi(xl, xh, 2);\n      var c2_hi = rotr64_hi(xl, xh, 7);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s0_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 28);\n      var c1_lo = rotr64_lo(xl, xh, 2);\n      var c2_lo = rotr64_lo(xl, xh, 7);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s1_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 14);\n      var c1_hi = rotr64_hi(xh, xl, 18);\n      var c2_hi = rotr64_hi(xl, xh, 9);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function s1_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 14);\n      var c1_lo = rotr64_lo(xh, xl, 18);\n      var c2_lo = rotr64_lo(xl, xh, 9);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g0_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 1);\n      var c1_hi = rotr64_hi(xh, xl, 8);\n      var c2_hi = shr64_hi(xh, xl, 7);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g0_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 1);\n      var c1_lo = rotr64_lo(xh, xl, 8);\n      var c2_lo = shr64_lo(xh, xl, 7);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g1_512_hi(xh, xl) {\n      var c0_hi = rotr64_hi(xh, xl, 19);\n      var c1_hi = rotr64_hi(xl, xh, 29);\n      var c2_hi = shr64_hi(xh, xl, 6);\n      var r = c0_hi ^ c1_hi ^ c2_hi;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n    function g1_512_lo(xh, xl) {\n      var c0_lo = rotr64_lo(xh, xl, 19);\n      var c1_lo = rotr64_lo(xl, xh, 29);\n      var c2_lo = shr64_lo(xh, xl, 6);\n      var r = c0_lo ^ c1_lo ^ c2_lo;\n      if (r < 0)\n        r += 4294967296;\n      return r;\n    }\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha/384.js\nvar require__5 = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha/384.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var SHA512 = require__4();\n    function SHA384() {\n      if (!(this instanceof SHA384))\n        return new SHA384();\n      SHA512.call(this);\n      this.h = [\n        3418070365,\n        3238371032,\n        1654270250,\n        914150663,\n        2438529370,\n        812702999,\n        355462360,\n        4144912697,\n        1731405415,\n        4290775857,\n        2394180231,\n        1750603025,\n        3675008525,\n        1694076839,\n        1203062813,\n        3204075428\n      ];\n    }\n    utils.inherits(SHA384, SHA512);\n    module2.exports = SHA384;\n    SHA384.blockSize = 1024;\n    SHA384.outSize = 384;\n    SHA384.hmacStrength = 192;\n    SHA384.padLength = 128;\n    SHA384.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h.slice(0, 12), \"big\");\n      else\n        return utils.split32(this.h.slice(0, 12), \"big\");\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash/sha.js\nvar require_sha = __commonJS({\n  \"node_modules/hash.js/lib/hash/sha.js\"(exports2) {\n    \"use strict\";\n    exports2.sha1 = require__();\n    exports2.sha224 = require__3();\n    exports2.sha256 = require__2();\n    exports2.sha384 = require__5();\n    exports2.sha512 = require__4();\n  }\n});\n\n// node_modules/hash.js/lib/hash/ripemd.js\nvar require_ripemd = __commonJS({\n  \"node_modules/hash.js/lib/hash/ripemd.js\"(exports2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var common = require_common();\n    var rotl32 = utils.rotl32;\n    var sum32 = utils.sum32;\n    var sum32_3 = utils.sum32_3;\n    var sum32_4 = utils.sum32_4;\n    var BlockHash = common.BlockHash;\n    function RIPEMD160() {\n      if (!(this instanceof RIPEMD160))\n        return new RIPEMD160();\n      BlockHash.call(this);\n      this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];\n      this.endian = \"little\";\n    }\n    utils.inherits(RIPEMD160, BlockHash);\n    exports2.ripemd160 = RIPEMD160;\n    RIPEMD160.blockSize = 512;\n    RIPEMD160.outSize = 160;\n    RIPEMD160.hmacStrength = 192;\n    RIPEMD160.padLength = 64;\n    RIPEMD160.prototype._update = function update(msg, start) {\n      var A = this.h[0];\n      var B = this.h[1];\n      var C = this.h[2];\n      var D = this.h[3];\n      var E = this.h[4];\n      var Ah = A;\n      var Bh = B;\n      var Ch = C;\n      var Dh = D;\n      var Eh = E;\n      for (var j = 0; j < 80; j++) {\n        var T = sum32(\n          rotl32(\n            sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),\n            s[j]\n          ),\n          E\n        );\n        A = E;\n        E = D;\n        D = rotl32(C, 10);\n        C = B;\n        B = T;\n        T = sum32(\n          rotl32(\n            sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),\n            sh[j]\n          ),\n          Eh\n        );\n        Ah = Eh;\n        Eh = Dh;\n        Dh = rotl32(Ch, 10);\n        Ch = Bh;\n        Bh = T;\n      }\n      T = sum32_3(this.h[1], C, Dh);\n      this.h[1] = sum32_3(this.h[2], D, Eh);\n      this.h[2] = sum32_3(this.h[3], E, Ah);\n      this.h[3] = sum32_3(this.h[4], A, Bh);\n      this.h[4] = sum32_3(this.h[0], B, Ch);\n      this.h[0] = T;\n    };\n    RIPEMD160.prototype._digest = function digest(enc) {\n      if (enc === \"hex\")\n        return utils.toHex32(this.h, \"little\");\n      else\n        return utils.split32(this.h, \"little\");\n    };\n    function f(j, x, y, z) {\n      if (j <= 15)\n        return x ^ y ^ z;\n      else if (j <= 31)\n        return x & y | ~x & z;\n      else if (j <= 47)\n        return (x | ~y) ^ z;\n      else if (j <= 63)\n        return x & z | y & ~z;\n      else\n        return x ^ (y | ~z);\n    }\n    function K(j) {\n      if (j <= 15)\n        return 0;\n      else if (j <= 31)\n        return 1518500249;\n      else if (j <= 47)\n        return 1859775393;\n      else if (j <= 63)\n        return 2400959708;\n      else\n        return 2840853838;\n    }\n    function Kh(j) {\n      if (j <= 15)\n        return 1352829926;\n      else if (j <= 31)\n        return 1548603684;\n      else if (j <= 47)\n        return 1836072691;\n      else if (j <= 63)\n        return 2053994217;\n      else\n        return 0;\n    }\n    var r = [\n      0,\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14,\n      15,\n      7,\n      4,\n      13,\n      1,\n      10,\n      6,\n      15,\n      3,\n      12,\n      0,\n      9,\n      5,\n      2,\n      14,\n      11,\n      8,\n      3,\n      10,\n      14,\n      4,\n      9,\n      15,\n      8,\n      1,\n      2,\n      7,\n      0,\n      6,\n      13,\n      11,\n      5,\n      12,\n      1,\n      9,\n      11,\n      10,\n      0,\n      8,\n      12,\n      4,\n      13,\n      3,\n      7,\n      15,\n      14,\n      5,\n      6,\n      2,\n      4,\n      0,\n      5,\n      9,\n      7,\n      12,\n      2,\n      10,\n      14,\n      1,\n      3,\n      8,\n      11,\n      6,\n      15,\n      13\n    ];\n    var rh = [\n      5,\n      14,\n      7,\n      0,\n      9,\n      2,\n      11,\n      4,\n      13,\n      6,\n      15,\n      8,\n      1,\n      10,\n      3,\n      12,\n      6,\n      11,\n      3,\n      7,\n      0,\n      13,\n      5,\n      10,\n      14,\n      15,\n      8,\n      12,\n      4,\n      9,\n      1,\n      2,\n      15,\n      5,\n      1,\n      3,\n      7,\n      14,\n      6,\n      9,\n      11,\n      8,\n      12,\n      2,\n      10,\n      0,\n      4,\n      13,\n      8,\n      6,\n      4,\n      1,\n      3,\n      11,\n      15,\n      0,\n      5,\n      12,\n      2,\n      13,\n      9,\n      7,\n      10,\n      14,\n      12,\n      15,\n      10,\n      4,\n      1,\n      5,\n      8,\n      7,\n      6,\n      2,\n      13,\n      14,\n      0,\n      3,\n      9,\n      11\n    ];\n    var s = [\n      11,\n      14,\n      15,\n      12,\n      5,\n      8,\n      7,\n      9,\n      11,\n      13,\n      14,\n      15,\n      6,\n      7,\n      9,\n      8,\n      7,\n      6,\n      8,\n      13,\n      11,\n      9,\n      7,\n      15,\n      7,\n      12,\n      15,\n      9,\n      11,\n      7,\n      13,\n      12,\n      11,\n      13,\n      6,\n      7,\n      14,\n      9,\n      13,\n      15,\n      14,\n      8,\n      13,\n      6,\n      5,\n      12,\n      7,\n      5,\n      11,\n      12,\n      14,\n      15,\n      14,\n      15,\n      9,\n      8,\n      9,\n      14,\n      5,\n      6,\n      8,\n      6,\n      5,\n      12,\n      9,\n      15,\n      5,\n      11,\n      6,\n      8,\n      13,\n      12,\n      5,\n      12,\n      13,\n      14,\n      11,\n      8,\n      5,\n      6\n    ];\n    var sh = [\n      8,\n      9,\n      9,\n      11,\n      13,\n      15,\n      15,\n      5,\n      7,\n      7,\n      8,\n      11,\n      14,\n      14,\n      12,\n      6,\n      9,\n      13,\n      15,\n      7,\n      12,\n      8,\n      9,\n      11,\n      7,\n      7,\n      12,\n      7,\n      6,\n      15,\n      13,\n      11,\n      9,\n      7,\n      15,\n      11,\n      8,\n      6,\n      6,\n      14,\n      12,\n      13,\n      5,\n      14,\n      13,\n      13,\n      7,\n      5,\n      15,\n      5,\n      8,\n      11,\n      14,\n      14,\n      6,\n      14,\n      6,\n      9,\n      12,\n      9,\n      12,\n      5,\n      15,\n      8,\n      8,\n      5,\n      12,\n      9,\n      12,\n      5,\n      14,\n      6,\n      8,\n      13,\n      6,\n      5,\n      15,\n      13,\n      11,\n      11\n    ];\n  }\n});\n\n// node_modules/hash.js/lib/hash/hmac.js\nvar require_hmac = __commonJS({\n  \"node_modules/hash.js/lib/hash/hmac.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils3();\n    var assert = require_minimalistic_assert();\n    function Hmac(hash, key, enc) {\n      if (!(this instanceof Hmac))\n        return new Hmac(hash, key, enc);\n      this.Hash = hash;\n      this.blockSize = hash.blockSize / 8;\n      this.outSize = hash.outSize / 8;\n      this.inner = null;\n      this.outer = null;\n      this._init(utils.toArray(key, enc));\n    }\n    module2.exports = Hmac;\n    Hmac.prototype._init = function init(key) {\n      if (key.length > this.blockSize)\n        key = new this.Hash().update(key).digest();\n      assert(key.length <= this.blockSize);\n      for (var i = key.length; i < this.blockSize; i++)\n        key.push(0);\n      for (i = 0; i < key.length; i++)\n        key[i] ^= 54;\n      this.inner = new this.Hash().update(key);\n      for (i = 0; i < key.length; i++)\n        key[i] ^= 106;\n      this.outer = new this.Hash().update(key);\n    };\n    Hmac.prototype.update = function update(msg, enc) {\n      this.inner.update(msg, enc);\n      return this;\n    };\n    Hmac.prototype.digest = function digest(enc) {\n      this.outer.update(this.inner.digest());\n      return this.outer.digest(enc);\n    };\n  }\n});\n\n// node_modules/hash.js/lib/hash.js\nvar require_hash = __commonJS({\n  \"node_modules/hash.js/lib/hash.js\"(exports2) {\n    var hash = exports2;\n    hash.utils = require_utils3();\n    hash.common = require_common();\n    hash.sha = require_sha();\n    hash.ripemd = require_ripemd();\n    hash.hmac = require_hmac();\n    hash.sha1 = hash.sha.sha1;\n    hash.sha256 = hash.sha.sha256;\n    hash.sha224 = hash.sha.sha224;\n    hash.sha384 = hash.sha.sha384;\n    hash.sha512 = hash.sha.sha512;\n    hash.ripemd160 = hash.ripemd.ripemd160;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js\nvar require_secp256k1 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js\"(exports2, module2) {\n    module2.exports = {\n      doubles: {\n        step: 4,\n        points: [\n          [\n            \"e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a\",\n            \"f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821\"\n          ],\n          [\n            \"8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508\",\n            \"11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf\"\n          ],\n          [\n            \"175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739\",\n            \"d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695\"\n          ],\n          [\n            \"363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640\",\n            \"4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9\"\n          ],\n          [\n            \"8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c\",\n            \"4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36\"\n          ],\n          [\n            \"723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda\",\n            \"96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f\"\n          ],\n          [\n            \"eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa\",\n            \"5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999\"\n          ],\n          [\n            \"100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0\",\n            \"cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09\"\n          ],\n          [\n            \"e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d\",\n            \"9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d\"\n          ],\n          [\n            \"feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d\",\n            \"e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088\"\n          ],\n          [\n            \"da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1\",\n            \"9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d\"\n          ],\n          [\n            \"53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0\",\n            \"5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8\"\n          ],\n          [\n            \"8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047\",\n            \"10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a\"\n          ],\n          [\n            \"385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862\",\n            \"283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453\"\n          ],\n          [\n            \"6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7\",\n            \"7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160\"\n          ],\n          [\n            \"3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd\",\n            \"56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0\"\n          ],\n          [\n            \"85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83\",\n            \"7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6\"\n          ],\n          [\n            \"948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a\",\n            \"53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589\"\n          ],\n          [\n            \"6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8\",\n            \"bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17\"\n          ],\n          [\n            \"e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d\",\n            \"4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda\"\n          ],\n          [\n            \"e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725\",\n            \"7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd\"\n          ],\n          [\n            \"213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754\",\n            \"4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2\"\n          ],\n          [\n            \"4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c\",\n            \"17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6\"\n          ],\n          [\n            \"fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6\",\n            \"6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f\"\n          ],\n          [\n            \"76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39\",\n            \"c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01\"\n          ],\n          [\n            \"c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891\",\n            \"893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3\"\n          ],\n          [\n            \"d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b\",\n            \"febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f\"\n          ],\n          [\n            \"b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03\",\n            \"2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7\"\n          ],\n          [\n            \"e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d\",\n            \"eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78\"\n          ],\n          [\n            \"a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070\",\n            \"7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1\"\n          ],\n          [\n            \"90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4\",\n            \"e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150\"\n          ],\n          [\n            \"8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da\",\n            \"662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82\"\n          ],\n          [\n            \"e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11\",\n            \"1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc\"\n          ],\n          [\n            \"8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e\",\n            \"efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b\"\n          ],\n          [\n            \"e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41\",\n            \"2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51\"\n          ],\n          [\n            \"b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef\",\n            \"67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45\"\n          ],\n          [\n            \"d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8\",\n            \"db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120\"\n          ],\n          [\n            \"324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d\",\n            \"648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84\"\n          ],\n          [\n            \"4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96\",\n            \"35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d\"\n          ],\n          [\n            \"9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd\",\n            \"ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d\"\n          ],\n          [\n            \"6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5\",\n            \"9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8\"\n          ],\n          [\n            \"a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266\",\n            \"40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8\"\n          ],\n          [\n            \"7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71\",\n            \"34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac\"\n          ],\n          [\n            \"928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac\",\n            \"c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f\"\n          ],\n          [\n            \"85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751\",\n            \"1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962\"\n          ],\n          [\n            \"ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e\",\n            \"493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907\"\n          ],\n          [\n            \"827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241\",\n            \"c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec\"\n          ],\n          [\n            \"eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3\",\n            \"be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d\"\n          ],\n          [\n            \"e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f\",\n            \"4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414\"\n          ],\n          [\n            \"1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19\",\n            \"aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd\"\n          ],\n          [\n            \"146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be\",\n            \"b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0\"\n          ],\n          [\n            \"fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9\",\n            \"6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811\"\n          ],\n          [\n            \"da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2\",\n            \"8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1\"\n          ],\n          [\n            \"a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13\",\n            \"7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c\"\n          ],\n          [\n            \"174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c\",\n            \"ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73\"\n          ],\n          [\n            \"959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba\",\n            \"2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd\"\n          ],\n          [\n            \"d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151\",\n            \"e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405\"\n          ],\n          [\n            \"64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073\",\n            \"d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589\"\n          ],\n          [\n            \"8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458\",\n            \"38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e\"\n          ],\n          [\n            \"13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b\",\n            \"69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27\"\n          ],\n          [\n            \"bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366\",\n            \"d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1\"\n          ],\n          [\n            \"8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa\",\n            \"40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482\"\n          ],\n          [\n            \"8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0\",\n            \"620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945\"\n          ],\n          [\n            \"dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787\",\n            \"7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573\"\n          ],\n          [\n            \"f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e\",\n            \"ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82\"\n          ]\n        ]\n      },\n      naf: {\n        wnd: 7,\n        points: [\n          [\n            \"f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9\",\n            \"388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672\"\n          ],\n          [\n            \"2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4\",\n            \"d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6\"\n          ],\n          [\n            \"5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc\",\n            \"6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da\"\n          ],\n          [\n            \"acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe\",\n            \"cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37\"\n          ],\n          [\n            \"774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb\",\n            \"d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b\"\n          ],\n          [\n            \"f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8\",\n            \"ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81\"\n          ],\n          [\n            \"d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e\",\n            \"581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58\"\n          ],\n          [\n            \"defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34\",\n            \"4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77\"\n          ],\n          [\n            \"2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c\",\n            \"85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a\"\n          ],\n          [\n            \"352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5\",\n            \"321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c\"\n          ],\n          [\n            \"2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f\",\n            \"2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67\"\n          ],\n          [\n            \"9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714\",\n            \"73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402\"\n          ],\n          [\n            \"daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729\",\n            \"a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55\"\n          ],\n          [\n            \"c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db\",\n            \"2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482\"\n          ],\n          [\n            \"6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4\",\n            \"e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82\"\n          ],\n          [\n            \"1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5\",\n            \"b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396\"\n          ],\n          [\n            \"605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479\",\n            \"2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49\"\n          ],\n          [\n            \"62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d\",\n            \"80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf\"\n          ],\n          [\n            \"80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f\",\n            \"1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a\"\n          ],\n          [\n            \"7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb\",\n            \"d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7\"\n          ],\n          [\n            \"d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9\",\n            \"eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933\"\n          ],\n          [\n            \"49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963\",\n            \"758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a\"\n          ],\n          [\n            \"77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74\",\n            \"958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6\"\n          ],\n          [\n            \"f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530\",\n            \"e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37\"\n          ],\n          [\n            \"463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b\",\n            \"5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e\"\n          ],\n          [\n            \"f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247\",\n            \"cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6\"\n          ],\n          [\n            \"caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1\",\n            \"cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476\"\n          ],\n          [\n            \"2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120\",\n            \"4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40\"\n          ],\n          [\n            \"7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435\",\n            \"91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61\"\n          ],\n          [\n            \"754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18\",\n            \"673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683\"\n          ],\n          [\n            \"e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8\",\n            \"59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5\"\n          ],\n          [\n            \"186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb\",\n            \"3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b\"\n          ],\n          [\n            \"df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f\",\n            \"55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417\"\n          ],\n          [\n            \"5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143\",\n            \"efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868\"\n          ],\n          [\n            \"290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba\",\n            \"e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a\"\n          ],\n          [\n            \"af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45\",\n            \"f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6\"\n          ],\n          [\n            \"766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a\",\n            \"744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996\"\n          ],\n          [\n            \"59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e\",\n            \"c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e\"\n          ],\n          [\n            \"f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8\",\n            \"e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d\"\n          ],\n          [\n            \"7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c\",\n            \"30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2\"\n          ],\n          [\n            \"948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519\",\n            \"e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e\"\n          ],\n          [\n            \"7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab\",\n            \"100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437\"\n          ],\n          [\n            \"3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca\",\n            \"ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311\"\n          ],\n          [\n            \"d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf\",\n            \"8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4\"\n          ],\n          [\n            \"1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610\",\n            \"68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575\"\n          ],\n          [\n            \"733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4\",\n            \"f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d\"\n          ],\n          [\n            \"15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c\",\n            \"d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d\"\n          ],\n          [\n            \"a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940\",\n            \"edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629\"\n          ],\n          [\n            \"e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980\",\n            \"a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06\"\n          ],\n          [\n            \"311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3\",\n            \"66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374\"\n          ],\n          [\n            \"34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf\",\n            \"9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee\"\n          ],\n          [\n            \"f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63\",\n            \"4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1\"\n          ],\n          [\n            \"d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448\",\n            \"fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b\"\n          ],\n          [\n            \"32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf\",\n            \"5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661\"\n          ],\n          [\n            \"7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5\",\n            \"8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6\"\n          ],\n          [\n            \"ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6\",\n            \"8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e\"\n          ],\n          [\n            \"16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5\",\n            \"5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d\"\n          ],\n          [\n            \"eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99\",\n            \"f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc\"\n          ],\n          [\n            \"78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51\",\n            \"f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4\"\n          ],\n          [\n            \"494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5\",\n            \"42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c\"\n          ],\n          [\n            \"a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5\",\n            \"204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b\"\n          ],\n          [\n            \"c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997\",\n            \"4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913\"\n          ],\n          [\n            \"841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881\",\n            \"73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154\"\n          ],\n          [\n            \"5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5\",\n            \"39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865\"\n          ],\n          [\n            \"36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66\",\n            \"d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc\"\n          ],\n          [\n            \"336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726\",\n            \"ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224\"\n          ],\n          [\n            \"8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede\",\n            \"6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e\"\n          ],\n          [\n            \"1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94\",\n            \"60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6\"\n          ],\n          [\n            \"85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31\",\n            \"3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511\"\n          ],\n          [\n            \"29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51\",\n            \"b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b\"\n          ],\n          [\n            \"a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252\",\n            \"ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2\"\n          ],\n          [\n            \"4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5\",\n            \"cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c\"\n          ],\n          [\n            \"d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b\",\n            \"6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3\"\n          ],\n          [\n            \"ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4\",\n            \"322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d\"\n          ],\n          [\n            \"af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f\",\n            \"6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700\"\n          ],\n          [\n            \"e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889\",\n            \"2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4\"\n          ],\n          [\n            \"591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246\",\n            \"b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196\"\n          ],\n          [\n            \"11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984\",\n            \"998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4\"\n          ],\n          [\n            \"3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a\",\n            \"b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257\"\n          ],\n          [\n            \"cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030\",\n            \"bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13\"\n          ],\n          [\n            \"c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197\",\n            \"6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096\"\n          ],\n          [\n            \"c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593\",\n            \"c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38\"\n          ],\n          [\n            \"a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef\",\n            \"21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f\"\n          ],\n          [\n            \"347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38\",\n            \"60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448\"\n          ],\n          [\n            \"da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a\",\n            \"49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a\"\n          ],\n          [\n            \"c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111\",\n            \"5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4\"\n          ],\n          [\n            \"4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502\",\n            \"7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437\"\n          ],\n          [\n            \"3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea\",\n            \"be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7\"\n          ],\n          [\n            \"cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26\",\n            \"8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d\"\n          ],\n          [\n            \"b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986\",\n            \"39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a\"\n          ],\n          [\n            \"d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e\",\n            \"62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54\"\n          ],\n          [\n            \"48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4\",\n            \"25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77\"\n          ],\n          [\n            \"dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda\",\n            \"ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517\"\n          ],\n          [\n            \"6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859\",\n            \"cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10\"\n          ],\n          [\n            \"e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f\",\n            \"f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125\"\n          ],\n          [\n            \"eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c\",\n            \"6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e\"\n          ],\n          [\n            \"13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942\",\n            \"fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1\"\n          ],\n          [\n            \"ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a\",\n            \"1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2\"\n          ],\n          [\n            \"b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80\",\n            \"5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423\"\n          ],\n          [\n            \"ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d\",\n            \"438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8\"\n          ],\n          [\n            \"8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1\",\n            \"cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758\"\n          ],\n          [\n            \"52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63\",\n            \"c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375\"\n          ],\n          [\n            \"e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352\",\n            \"6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d\"\n          ],\n          [\n            \"7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193\",\n            \"ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec\"\n          ],\n          [\n            \"5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00\",\n            \"9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0\"\n          ],\n          [\n            \"32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58\",\n            \"ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c\"\n          ],\n          [\n            \"e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7\",\n            \"d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4\"\n          ],\n          [\n            \"8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8\",\n            \"c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f\"\n          ],\n          [\n            \"4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e\",\n            \"67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649\"\n          ],\n          [\n            \"3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d\",\n            \"cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826\"\n          ],\n          [\n            \"674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b\",\n            \"299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5\"\n          ],\n          [\n            \"d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f\",\n            \"f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87\"\n          ],\n          [\n            \"30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6\",\n            \"462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b\"\n          ],\n          [\n            \"be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297\",\n            \"62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc\"\n          ],\n          [\n            \"93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a\",\n            \"7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c\"\n          ],\n          [\n            \"b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c\",\n            \"ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f\"\n          ],\n          [\n            \"d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52\",\n            \"4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a\"\n          ],\n          [\n            \"d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb\",\n            \"bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46\"\n          ],\n          [\n            \"463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065\",\n            \"bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f\"\n          ],\n          [\n            \"7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917\",\n            \"603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03\"\n          ],\n          [\n            \"74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9\",\n            \"cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08\"\n          ],\n          [\n            \"30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3\",\n            \"553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8\"\n          ],\n          [\n            \"9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57\",\n            \"712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373\"\n          ],\n          [\n            \"176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66\",\n            \"ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3\"\n          ],\n          [\n            \"75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8\",\n            \"9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8\"\n          ],\n          [\n            \"809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721\",\n            \"9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1\"\n          ],\n          [\n            \"1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180\",\n            \"4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9\"\n          ]\n        ]\n      }\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/curves.js\nvar require_curves = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/curves.js\"(exports2) {\n    \"use strict\";\n    var curves = exports2;\n    var hash = require_hash();\n    var curve = require_curve();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function PresetCurve(options) {\n      if (options.type === \"short\")\n        this.curve = new curve.short(options);\n      else if (options.type === \"edwards\")\n        this.curve = new curve.edwards(options);\n      else\n        this.curve = new curve.mont(options);\n      this.g = this.curve.g;\n      this.n = this.curve.n;\n      this.hash = options.hash;\n      assert(this.g.validate(), \"Invalid curve\");\n      assert(this.g.mul(this.n).isInfinity(), \"Invalid curve, G*N != O\");\n    }\n    curves.PresetCurve = PresetCurve;\n    function defineCurve(name2, options) {\n      Object.defineProperty(curves, name2, {\n        configurable: true,\n        enumerable: true,\n        get: function() {\n          var curve2 = new PresetCurve(options);\n          Object.defineProperty(curves, name2, {\n            configurable: true,\n            enumerable: true,\n            value: curve2\n          });\n          return curve2;\n        }\n      });\n    }\n    defineCurve(\"p192\", {\n      type: \"short\",\n      prime: \"p192\",\n      p: \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\",\n      a: \"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc\",\n      b: \"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1\",\n      n: \"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012\",\n        \"07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811\"\n      ]\n    });\n    defineCurve(\"p224\", {\n      type: \"short\",\n      prime: \"p224\",\n      p: \"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\",\n      a: \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe\",\n      b: \"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4\",\n      n: \"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21\",\n        \"bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34\"\n      ]\n    });\n    defineCurve(\"p256\", {\n      type: \"short\",\n      prime: null,\n      p: \"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff\",\n      a: \"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc\",\n      b: \"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b\",\n      n: \"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296\",\n        \"4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5\"\n      ]\n    });\n    defineCurve(\"p384\", {\n      type: \"short\",\n      prime: null,\n      p: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff\",\n      a: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc\",\n      b: \"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef\",\n      n: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973\",\n      hash: hash.sha384,\n      gRed: false,\n      g: [\n        \"aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7\",\n        \"3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f\"\n      ]\n    });\n    defineCurve(\"p521\", {\n      type: \"short\",\n      prime: null,\n      p: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff\",\n      a: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc\",\n      b: \"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00\",\n      n: \"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409\",\n      hash: hash.sha512,\n      gRed: false,\n      g: [\n        \"000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66\",\n        \"00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650\"\n      ]\n    });\n    defineCurve(\"curve25519\", {\n      type: \"mont\",\n      prime: \"p25519\",\n      p: \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",\n      a: \"76d06\",\n      b: \"1\",\n      n: \"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"9\"\n      ]\n    });\n    defineCurve(\"ed25519\", {\n      type: \"edwards\",\n      prime: \"p25519\",\n      p: \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\",\n      a: \"-1\",\n      c: \"1\",\n      // -121665 * (121666^(-1)) (mod P)\n      d: \"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3\",\n      n: \"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed\",\n      hash: hash.sha256,\n      gRed: false,\n      g: [\n        \"216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a\",\n        // 4/5\n        \"6666666666666666666666666666666666666666666666666666666666666658\"\n      ]\n    });\n    var pre;\n    try {\n      pre = require_secp256k1();\n    } catch (e) {\n      pre = void 0;\n    }\n    defineCurve(\"secp256k1\", {\n      type: \"short\",\n      prime: \"k256\",\n      p: \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\",\n      a: \"0\",\n      b: \"7\",\n      n: \"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141\",\n      h: \"1\",\n      hash: hash.sha256,\n      // Precomputed endomorphism\n      beta: \"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee\",\n      lambda: \"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72\",\n      basis: [\n        {\n          a: \"3086d221a7d46bcde86c90e49284eb15\",\n          b: \"-e4437ed6010e88286f547fa90abfe4c3\"\n        },\n        {\n          a: \"114ca50f7a8e2f3f657c1108d9d44cfd8\",\n          b: \"3086d221a7d46bcde86c90e49284eb15\"\n        }\n      ],\n      gRed: false,\n      g: [\n        \"79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\",\n        \"483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\",\n        pre\n      ]\n    });\n  }\n});\n\n// node_modules/hmac-drbg/lib/hmac-drbg.js\nvar require_hmac_drbg = __commonJS({\n  \"node_modules/hmac-drbg/lib/hmac-drbg.js\"(exports2, module2) {\n    \"use strict\";\n    var hash = require_hash();\n    var utils = require_utils();\n    var assert = require_minimalistic_assert();\n    function HmacDRBG(options) {\n      if (!(this instanceof HmacDRBG))\n        return new HmacDRBG(options);\n      this.hash = options.hash;\n      this.predResist = !!options.predResist;\n      this.outLen = this.hash.outSize;\n      this.minEntropy = options.minEntropy || this.hash.hmacStrength;\n      this._reseed = null;\n      this.reseedInterval = null;\n      this.K = null;\n      this.V = null;\n      var entropy = utils.toArray(options.entropy, options.entropyEnc || \"hex\");\n      var nonce = utils.toArray(options.nonce, options.nonceEnc || \"hex\");\n      var pers = utils.toArray(options.pers, options.persEnc || \"hex\");\n      assert(\n        entropy.length >= this.minEntropy / 8,\n        \"Not enough entropy. Minimum is: \" + this.minEntropy + \" bits\"\n      );\n      this._init(entropy, nonce, pers);\n    }\n    module2.exports = HmacDRBG;\n    HmacDRBG.prototype._init = function init(entropy, nonce, pers) {\n      var seed = entropy.concat(nonce).concat(pers);\n      this.K = new Array(this.outLen / 8);\n      this.V = new Array(this.outLen / 8);\n      for (var i = 0; i < this.V.length; i++) {\n        this.K[i] = 0;\n        this.V[i] = 1;\n      }\n      this._update(seed);\n      this._reseed = 1;\n      this.reseedInterval = 281474976710656;\n    };\n    HmacDRBG.prototype._hmac = function hmac() {\n      return new hash.hmac(this.hash, this.K);\n    };\n    HmacDRBG.prototype._update = function update(seed) {\n      var kmac = this._hmac().update(this.V).update([0]);\n      if (seed)\n        kmac = kmac.update(seed);\n      this.K = kmac.digest();\n      this.V = this._hmac().update(this.V).digest();\n      if (!seed)\n        return;\n      this.K = this._hmac().update(this.V).update([1]).update(seed).digest();\n      this.V = this._hmac().update(this.V).digest();\n    };\n    HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {\n      if (typeof entropyEnc !== \"string\") {\n        addEnc = add;\n        add = entropyEnc;\n        entropyEnc = null;\n      }\n      entropy = utils.toArray(entropy, entropyEnc);\n      add = utils.toArray(add, addEnc);\n      assert(\n        entropy.length >= this.minEntropy / 8,\n        \"Not enough entropy. Minimum is: \" + this.minEntropy + \" bits\"\n      );\n      this._update(entropy.concat(add || []));\n      this._reseed = 1;\n    };\n    HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {\n      if (this._reseed > this.reseedInterval)\n        throw new Error(\"Reseed is required\");\n      if (typeof enc !== \"string\") {\n        addEnc = add;\n        add = enc;\n        enc = null;\n      }\n      if (add) {\n        add = utils.toArray(add, addEnc || \"hex\");\n        this._update(add);\n      }\n      var temp = [];\n      while (temp.length < len) {\n        this.V = this._hmac().update(this.V).digest();\n        temp = temp.concat(this.V);\n      }\n      var res = temp.slice(0, len);\n      this._update(add);\n      this._reseed++;\n      return utils.encode(res, enc);\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/key.js\nvar require_key = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/key.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function KeyPair(ec, options) {\n      this.ec = ec;\n      this.priv = null;\n      this.pub = null;\n      if (options.priv)\n        this._importPrivate(options.priv, options.privEnc);\n      if (options.pub)\n        this._importPublic(options.pub, options.pubEnc);\n    }\n    module2.exports = KeyPair;\n    KeyPair.fromPublic = function fromPublic(ec, pub, enc) {\n      if (pub instanceof KeyPair)\n        return pub;\n      return new KeyPair(ec, {\n        pub,\n        pubEnc: enc\n      });\n    };\n    KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {\n      if (priv instanceof KeyPair)\n        return priv;\n      return new KeyPair(ec, {\n        priv,\n        privEnc: enc\n      });\n    };\n    KeyPair.prototype.validate = function validate() {\n      var pub = this.getPublic();\n      if (pub.isInfinity())\n        return { result: false, reason: \"Invalid public key\" };\n      if (!pub.validate())\n        return { result: false, reason: \"Public key is not a point\" };\n      if (!pub.mul(this.ec.curve.n).isInfinity())\n        return { result: false, reason: \"Public key * N != O\" };\n      return { result: true, reason: null };\n    };\n    KeyPair.prototype.getPublic = function getPublic(compact, enc) {\n      if (typeof compact === \"string\") {\n        enc = compact;\n        compact = null;\n      }\n      if (!this.pub)\n        this.pub = this.ec.g.mul(this.priv);\n      if (!enc)\n        return this.pub;\n      return this.pub.encode(enc, compact);\n    };\n    KeyPair.prototype.getPrivate = function getPrivate(enc) {\n      if (enc === \"hex\")\n        return this.priv.toString(16, 2);\n      else\n        return this.priv;\n    };\n    KeyPair.prototype._importPrivate = function _importPrivate(key, enc) {\n      this.priv = new BN(key, enc || 16);\n      this.priv = this.priv.umod(this.ec.curve.n);\n    };\n    KeyPair.prototype._importPublic = function _importPublic(key, enc) {\n      if (key.x || key.y) {\n        if (this.ec.curve.type === \"mont\") {\n          assert(key.x, \"Need x coordinate\");\n        } else if (this.ec.curve.type === \"short\" || this.ec.curve.type === \"edwards\") {\n          assert(key.x && key.y, \"Need both x and y coordinate\");\n        }\n        this.pub = this.ec.curve.point(key.x, key.y);\n        return;\n      }\n      this.pub = this.ec.curve.decodePoint(key, enc);\n    };\n    KeyPair.prototype.derive = function derive(pub) {\n      if (!pub.validate()) {\n        assert(pub.validate(), \"public point not validated\");\n      }\n      return pub.mul(this.priv).getX();\n    };\n    KeyPair.prototype.sign = function sign(msg, enc, options) {\n      return this.ec.sign(msg, this, enc, options);\n    };\n    KeyPair.prototype.verify = function verify(msg, signature) {\n      return this.ec.verify(msg, signature, this);\n    };\n    KeyPair.prototype.inspect = function inspect() {\n      return \"<Key priv: \" + (this.priv && this.priv.toString(16, 2)) + \" pub: \" + (this.pub && this.pub.inspect()) + \" >\";\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/signature.js\nvar require_signature = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/signature.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    function Signature(options, enc) {\n      if (options instanceof Signature)\n        return options;\n      if (this._importDER(options, enc))\n        return;\n      assert(options.r && options.s, \"Signature without r or s\");\n      this.r = new BN(options.r, 16);\n      this.s = new BN(options.s, 16);\n      if (options.recoveryParam === void 0)\n        this.recoveryParam = null;\n      else\n        this.recoveryParam = options.recoveryParam;\n    }\n    module2.exports = Signature;\n    function Position() {\n      this.place = 0;\n    }\n    function getLength(buf, p) {\n      var initial = buf[p.place++];\n      if (!(initial & 128)) {\n        return initial;\n      }\n      var octetLen = initial & 15;\n      if (octetLen === 0 || octetLen > 4) {\n        return false;\n      }\n      var val = 0;\n      for (var i = 0, off = p.place; i < octetLen; i++, off++) {\n        val <<= 8;\n        val |= buf[off];\n        val >>>= 0;\n      }\n      if (val <= 127) {\n        return false;\n      }\n      p.place = off;\n      return val;\n    }\n    function rmPadding(buf) {\n      var i = 0;\n      var len = buf.length - 1;\n      while (!buf[i] && !(buf[i + 1] & 128) && i < len) {\n        i++;\n      }\n      if (i === 0) {\n        return buf;\n      }\n      return buf.slice(i);\n    }\n    Signature.prototype._importDER = function _importDER(data, enc) {\n      data = utils.toArray(data, enc);\n      var p = new Position();\n      if (data[p.place++] !== 48) {\n        return false;\n      }\n      var len = getLength(data, p);\n      if (len === false) {\n        return false;\n      }\n      if (len + p.place !== data.length) {\n        return false;\n      }\n      if (data[p.place++] !== 2) {\n        return false;\n      }\n      var rlen = getLength(data, p);\n      if (rlen === false) {\n        return false;\n      }\n      var r = data.slice(p.place, rlen + p.place);\n      p.place += rlen;\n      if (data[p.place++] !== 2) {\n        return false;\n      }\n      var slen = getLength(data, p);\n      if (slen === false) {\n        return false;\n      }\n      if (data.length !== slen + p.place) {\n        return false;\n      }\n      var s = data.slice(p.place, slen + p.place);\n      if (r[0] === 0) {\n        if (r[1] & 128) {\n          r = r.slice(1);\n        } else {\n          return false;\n        }\n      }\n      if (s[0] === 0) {\n        if (s[1] & 128) {\n          s = s.slice(1);\n        } else {\n          return false;\n        }\n      }\n      this.r = new BN(r);\n      this.s = new BN(s);\n      this.recoveryParam = null;\n      return true;\n    };\n    function constructLength(arr, len) {\n      if (len < 128) {\n        arr.push(len);\n        return;\n      }\n      var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);\n      arr.push(octets | 128);\n      while (--octets) {\n        arr.push(len >>> (octets << 3) & 255);\n      }\n      arr.push(len);\n    }\n    Signature.prototype.toDER = function toDER(enc) {\n      var r = this.r.toArray();\n      var s = this.s.toArray();\n      if (r[0] & 128)\n        r = [0].concat(r);\n      if (s[0] & 128)\n        s = [0].concat(s);\n      r = rmPadding(r);\n      s = rmPadding(s);\n      while (!s[0] && !(s[1] & 128)) {\n        s = s.slice(1);\n      }\n      var arr = [2];\n      constructLength(arr, r.length);\n      arr = arr.concat(r);\n      arr.push(2);\n      constructLength(arr, s.length);\n      var backHalf = arr.concat(s);\n      var res = [48];\n      constructLength(res, backHalf.length);\n      res = res.concat(backHalf);\n      return utils.encode(res, enc);\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/ec/index.js\nvar require_ec = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/ec/index.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var HmacDRBG = require_hmac_drbg();\n    var utils = require_utils2();\n    var curves = require_curves();\n    var rand = require_brorand();\n    var assert = utils.assert;\n    var KeyPair = require_key();\n    var Signature = require_signature();\n    function EC(options) {\n      if (!(this instanceof EC))\n        return new EC(options);\n      if (typeof options === \"string\") {\n        assert(\n          Object.prototype.hasOwnProperty.call(curves, options),\n          \"Unknown curve \" + options\n        );\n        options = curves[options];\n      }\n      if (options instanceof curves.PresetCurve)\n        options = { curve: options };\n      this.curve = options.curve.curve;\n      this.n = this.curve.n;\n      this.nh = this.n.ushrn(1);\n      this.g = this.curve.g;\n      this.g = options.curve.g;\n      this.g.precompute(options.curve.n.bitLength() + 1);\n      this.hash = options.hash || options.curve.hash;\n    }\n    module2.exports = EC;\n    EC.prototype.keyPair = function keyPair(options) {\n      return new KeyPair(this, options);\n    };\n    EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {\n      return KeyPair.fromPrivate(this, priv, enc);\n    };\n    EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {\n      return KeyPair.fromPublic(this, pub, enc);\n    };\n    EC.prototype.genKeyPair = function genKeyPair(options) {\n      if (!options)\n        options = {};\n      var drbg = new HmacDRBG({\n        hash: this.hash,\n        pers: options.pers,\n        persEnc: options.persEnc || \"utf8\",\n        entropy: options.entropy || rand(this.hash.hmacStrength),\n        entropyEnc: options.entropy && options.entropyEnc || \"utf8\",\n        nonce: this.n.toArray()\n      });\n      var bytes = this.n.byteLength();\n      var ns2 = this.n.sub(new BN(2));\n      for (; ; ) {\n        var priv = new BN(drbg.generate(bytes));\n        if (priv.cmp(ns2) > 0)\n          continue;\n        priv.iaddn(1);\n        return this.keyFromPrivate(priv);\n      }\n    };\n    EC.prototype._truncateToN = function _truncateToN(msg, truncOnly) {\n      var delta = msg.byteLength() * 8 - this.n.bitLength();\n      if (delta > 0)\n        msg = msg.ushrn(delta);\n      if (!truncOnly && msg.cmp(this.n) >= 0)\n        return msg.sub(this.n);\n      else\n        return msg;\n    };\n    EC.prototype.sign = function sign(msg, key, enc, options) {\n      if (typeof enc === \"object\") {\n        options = enc;\n        enc = null;\n      }\n      if (!options)\n        options = {};\n      key = this.keyFromPrivate(key, enc);\n      msg = this._truncateToN(new BN(msg, 16));\n      var bytes = this.n.byteLength();\n      var bkey = key.getPrivate().toArray(\"be\", bytes);\n      var nonce = msg.toArray(\"be\", bytes);\n      var drbg = new HmacDRBG({\n        hash: this.hash,\n        entropy: bkey,\n        nonce,\n        pers: options.pers,\n        persEnc: options.persEnc || \"utf8\"\n      });\n      var ns1 = this.n.sub(new BN(1));\n      for (var iter = 0; ; iter++) {\n        var k = options.k ? options.k(iter) : new BN(drbg.generate(this.n.byteLength()));\n        k = this._truncateToN(k, true);\n        if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)\n          continue;\n        var kp = this.g.mul(k);\n        if (kp.isInfinity())\n          continue;\n        var kpX = kp.getX();\n        var r = kpX.umod(this.n);\n        if (r.cmpn(0) === 0)\n          continue;\n        var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));\n        s = s.umod(this.n);\n        if (s.cmpn(0) === 0)\n          continue;\n        var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0);\n        if (options.canonical && s.cmp(this.nh) > 0) {\n          s = this.n.sub(s);\n          recoveryParam ^= 1;\n        }\n        return new Signature({ r, s, recoveryParam });\n      }\n    };\n    EC.prototype.verify = function verify(msg, signature, key, enc) {\n      msg = this._truncateToN(new BN(msg, 16));\n      key = this.keyFromPublic(key, enc);\n      signature = new Signature(signature, \"hex\");\n      var r = signature.r;\n      var s = signature.s;\n      if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)\n        return false;\n      if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)\n        return false;\n      var sinv = s.invm(this.n);\n      var u1 = sinv.mul(msg).umod(this.n);\n      var u2 = sinv.mul(r).umod(this.n);\n      var p;\n      if (!this.curve._maxwellTrick) {\n        p = this.g.mulAdd(u1, key.getPublic(), u2);\n        if (p.isInfinity())\n          return false;\n        return p.getX().umod(this.n).cmp(r) === 0;\n      }\n      p = this.g.jmulAdd(u1, key.getPublic(), u2);\n      if (p.isInfinity())\n        return false;\n      return p.eqXToP(r);\n    };\n    EC.prototype.recoverPubKey = function(msg, signature, j, enc) {\n      assert((3 & j) === j, \"The recovery param is more than two bits\");\n      signature = new Signature(signature, enc);\n      var n = this.n;\n      var e = new BN(msg);\n      var r = signature.r;\n      var s = signature.s;\n      var isYOdd = j & 1;\n      var isSecondKey = j >> 1;\n      if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)\n        throw new Error(\"Unable to find sencond key candinate\");\n      if (isSecondKey)\n        r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);\n      else\n        r = this.curve.pointFromX(r, isYOdd);\n      var rInv = signature.r.invm(n);\n      var s1 = n.sub(e).mul(rInv).umod(n);\n      var s2 = s.mul(rInv).umod(n);\n      return this.g.mulAdd(s1, r, s2);\n    };\n    EC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {\n      signature = new Signature(signature, enc);\n      if (signature.recoveryParam !== null)\n        return signature.recoveryParam;\n      for (var i = 0; i < 4; i++) {\n        var Qprime;\n        try {\n          Qprime = this.recoverPubKey(e, signature, i);\n        } catch (e2) {\n          continue;\n        }\n        if (Qprime.eq(Q))\n          return i;\n      }\n      throw new Error(\"Unable to find valid recovery factor\");\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/key.js\nvar require_key2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/key.js\"(exports2, module2) {\n    \"use strict\";\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var parseBytes = utils.parseBytes;\n    var cachedProperty = utils.cachedProperty;\n    function KeyPair(eddsa, params) {\n      this.eddsa = eddsa;\n      this._secret = parseBytes(params.secret);\n      if (eddsa.isPoint(params.pub))\n        this._pub = params.pub;\n      else\n        this._pubBytes = parseBytes(params.pub);\n    }\n    KeyPair.fromPublic = function fromPublic(eddsa, pub) {\n      if (pub instanceof KeyPair)\n        return pub;\n      return new KeyPair(eddsa, { pub });\n    };\n    KeyPair.fromSecret = function fromSecret(eddsa, secret) {\n      if (secret instanceof KeyPair)\n        return secret;\n      return new KeyPair(eddsa, { secret });\n    };\n    KeyPair.prototype.secret = function secret() {\n      return this._secret;\n    };\n    cachedProperty(KeyPair, \"pubBytes\", function pubBytes() {\n      return this.eddsa.encodePoint(this.pub());\n    });\n    cachedProperty(KeyPair, \"pub\", function pub() {\n      if (this._pubBytes)\n        return this.eddsa.decodePoint(this._pubBytes);\n      return this.eddsa.g.mul(this.priv());\n    });\n    cachedProperty(KeyPair, \"privBytes\", function privBytes() {\n      var eddsa = this.eddsa;\n      var hash = this.hash();\n      var lastIx = eddsa.encodingLength - 1;\n      var a = hash.slice(0, eddsa.encodingLength);\n      a[0] &= 248;\n      a[lastIx] &= 127;\n      a[lastIx] |= 64;\n      return a;\n    });\n    cachedProperty(KeyPair, \"priv\", function priv() {\n      return this.eddsa.decodeInt(this.privBytes());\n    });\n    cachedProperty(KeyPair, \"hash\", function hash() {\n      return this.eddsa.hash().update(this.secret()).digest();\n    });\n    cachedProperty(KeyPair, \"messagePrefix\", function messagePrefix() {\n      return this.hash().slice(this.eddsa.encodingLength);\n    });\n    KeyPair.prototype.sign = function sign(message) {\n      assert(this._secret, \"KeyPair can only verify\");\n      return this.eddsa.sign(message, this);\n    };\n    KeyPair.prototype.verify = function verify(message, sig) {\n      return this.eddsa.verify(message, sig, this);\n    };\n    KeyPair.prototype.getSecret = function getSecret(enc) {\n      assert(this._secret, \"KeyPair is public only\");\n      return utils.encode(this.secret(), enc);\n    };\n    KeyPair.prototype.getPublic = function getPublic(enc) {\n      return utils.encode(this.pubBytes(), enc);\n    };\n    module2.exports = KeyPair;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/signature.js\nvar require_signature2 = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/signature.js\"(exports2, module2) {\n    \"use strict\";\n    var BN = require_bn();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var cachedProperty = utils.cachedProperty;\n    var parseBytes = utils.parseBytes;\n    function Signature(eddsa, sig) {\n      this.eddsa = eddsa;\n      if (typeof sig !== \"object\")\n        sig = parseBytes(sig);\n      if (Array.isArray(sig)) {\n        sig = {\n          R: sig.slice(0, eddsa.encodingLength),\n          S: sig.slice(eddsa.encodingLength)\n        };\n      }\n      assert(sig.R && sig.S, \"Signature without R or S\");\n      if (eddsa.isPoint(sig.R))\n        this._R = sig.R;\n      if (sig.S instanceof BN)\n        this._S = sig.S;\n      this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;\n      this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;\n    }\n    cachedProperty(Signature, \"S\", function S() {\n      return this.eddsa.decodeInt(this.Sencoded());\n    });\n    cachedProperty(Signature, \"R\", function R() {\n      return this.eddsa.decodePoint(this.Rencoded());\n    });\n    cachedProperty(Signature, \"Rencoded\", function Rencoded() {\n      return this.eddsa.encodePoint(this.R());\n    });\n    cachedProperty(Signature, \"Sencoded\", function Sencoded() {\n      return this.eddsa.encodeInt(this.S());\n    });\n    Signature.prototype.toBytes = function toBytes() {\n      return this.Rencoded().concat(this.Sencoded());\n    };\n    Signature.prototype.toHex = function toHex() {\n      return utils.encode(this.toBytes(), \"hex\").toUpperCase();\n    };\n    module2.exports = Signature;\n  }\n});\n\n// node_modules/elliptic/lib/elliptic/eddsa/index.js\nvar require_eddsa = __commonJS({\n  \"node_modules/elliptic/lib/elliptic/eddsa/index.js\"(exports2, module2) {\n    \"use strict\";\n    var hash = require_hash();\n    var curves = require_curves();\n    var utils = require_utils2();\n    var assert = utils.assert;\n    var parseBytes = utils.parseBytes;\n    var KeyPair = require_key2();\n    var Signature = require_signature2();\n    function EDDSA(curve) {\n      assert(curve === \"ed25519\", \"only tested with ed25519 so far\");\n      if (!(this instanceof EDDSA))\n        return new EDDSA(curve);\n      curve = curves[curve].curve;\n      this.curve = curve;\n      this.g = curve.g;\n      this.g.precompute(curve.n.bitLength() + 1);\n      this.pointClass = curve.point().constructor;\n      this.encodingLength = Math.ceil(curve.n.bitLength() / 8);\n      this.hash = hash.sha512;\n    }\n    module2.exports = EDDSA;\n    EDDSA.prototype.sign = function sign(message, secret) {\n      message = parseBytes(message);\n      var key = this.keyFromSecret(secret);\n      var r = this.hashInt(key.messagePrefix(), message);\n      var R = this.g.mul(r);\n      var Rencoded = this.encodePoint(R);\n      var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv());\n      var S = r.add(s_).umod(this.curve.n);\n      return this.makeSignature({ R, S, Rencoded });\n    };\n    EDDSA.prototype.verify = function verify(message, sig, pub) {\n      message = parseBytes(message);\n      sig = this.makeSignature(sig);\n      var key = this.keyFromPublic(pub);\n      var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);\n      var SG = this.g.mul(sig.S());\n      var RplusAh = sig.R().add(key.pub().mul(h));\n      return RplusAh.eq(SG);\n    };\n    EDDSA.prototype.hashInt = function hashInt() {\n      var hash2 = this.hash();\n      for (var i = 0; i < arguments.length; i++)\n        hash2.update(arguments[i]);\n      return utils.intFromLE(hash2.digest()).umod(this.curve.n);\n    };\n    EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {\n      return KeyPair.fromPublic(this, pub);\n    };\n    EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {\n      return KeyPair.fromSecret(this, secret);\n    };\n    EDDSA.prototype.makeSignature = function makeSignature(sig) {\n      if (sig instanceof Signature)\n        return sig;\n      return new Signature(this, sig);\n    };\n    EDDSA.prototype.encodePoint = function encodePoint(point) {\n      var enc = point.getY().toArray(\"le\", this.encodingLength);\n      enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0;\n      return enc;\n    };\n    EDDSA.prototype.decodePoint = function decodePoint(bytes) {\n      bytes = utils.parseBytes(bytes);\n      var lastIx = bytes.length - 1;\n      var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128);\n      var xIsOdd = (bytes[lastIx] & 128) !== 0;\n      var y = utils.intFromLE(normed);\n      return this.curve.pointFromY(y, xIsOdd);\n    };\n    EDDSA.prototype.encodeInt = function encodeInt(num) {\n      return num.toArray(\"le\", this.encodingLength);\n    };\n    EDDSA.prototype.decodeInt = function decodeInt(bytes) {\n      return utils.intFromLE(bytes);\n    };\n    EDDSA.prototype.isPoint = function isPoint(val) {\n      return val instanceof this.pointClass;\n    };\n  }\n});\n\n// node_modules/elliptic/lib/elliptic.js\nvar require_elliptic = __commonJS({\n  \"node_modules/elliptic/lib/elliptic.js\"(exports2) {\n    \"use strict\";\n    var elliptic = exports2;\n    elliptic.version = require_package().version;\n    elliptic.utils = require_utils2();\n    elliptic.rand = require_brorand();\n    elliptic.curve = require_curve();\n    elliptic.curves = require_curves();\n    elliptic.ec = require_ec();\n    elliptic.eddsa = require_eddsa();\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/elliptic.js\nvar require_elliptic2 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/elliptic.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EC = void 0;\n    var elliptic_1 = __importDefault(require_elliptic());\n    var EC = elliptic_1.default.ec;\n    exports2.EC = EC;\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/_version.js\nvar require_version12 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"signing-key/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/signing-key/lib/index.js\nvar require_lib14 = __commonJS({\n  \"node_modules/@ethersproject/signing-key/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.computePublicKey = exports2.recoverPublicKey = exports2.SigningKey = void 0;\n    var elliptic_1 = require_elliptic2();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version12();\n    var logger = new logger_1.Logger(_version_1.version);\n    var _curve = null;\n    function getCurve() {\n      if (!_curve) {\n        _curve = new elliptic_1.EC(\"secp256k1\");\n      }\n      return _curve;\n    }\n    var SigningKey = (\n      /** @class */\n      function() {\n        function SigningKey2(privateKey) {\n          (0, properties_1.defineReadOnly)(this, \"curve\", \"secp256k1\");\n          (0, properties_1.defineReadOnly)(this, \"privateKey\", (0, bytes_1.hexlify)(privateKey));\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          (0, properties_1.defineReadOnly)(this, \"publicKey\", \"0x\" + keyPair.getPublic(false, \"hex\"));\n          (0, properties_1.defineReadOnly)(this, \"compressedPublicKey\", \"0x\" + keyPair.getPublic(true, \"hex\"));\n          (0, properties_1.defineReadOnly)(this, \"_isSigningKey\", true);\n        }\n        SigningKey2.prototype._addPoint = function(other) {\n          var p0 = getCurve().keyFromPublic((0, bytes_1.arrayify)(this.publicKey));\n          var p1 = getCurve().keyFromPublic((0, bytes_1.arrayify)(other));\n          return \"0x\" + p0.pub.add(p1.pub).encodeCompressed(\"hex\");\n        };\n        SigningKey2.prototype.signDigest = function(digest) {\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          var digestBytes = (0, bytes_1.arrayify)(digest);\n          if (digestBytes.length !== 32) {\n            logger.throwArgumentError(\"bad digest length\", \"digest\", digest);\n          }\n          var signature = keyPair.sign(digestBytes, { canonical: true });\n          return (0, bytes_1.splitSignature)({\n            recoveryParam: signature.recoveryParam,\n            r: (0, bytes_1.hexZeroPad)(\"0x\" + signature.r.toString(16), 32),\n            s: (0, bytes_1.hexZeroPad)(\"0x\" + signature.s.toString(16), 32)\n          });\n        };\n        SigningKey2.prototype.computeSharedSecret = function(otherKey) {\n          var keyPair = getCurve().keyFromPrivate((0, bytes_1.arrayify)(this.privateKey));\n          var otherKeyPair = getCurve().keyFromPublic((0, bytes_1.arrayify)(computePublicKey(otherKey)));\n          return (0, bytes_1.hexZeroPad)(\"0x\" + keyPair.derive(otherKeyPair.getPublic()).toString(16), 32);\n        };\n        SigningKey2.isSigningKey = function(value) {\n          return !!(value && value._isSigningKey);\n        };\n        return SigningKey2;\n      }()\n    );\n    exports2.SigningKey = SigningKey;\n    function recoverPublicKey(digest, signature) {\n      var sig = (0, bytes_1.splitSignature)(signature);\n      var rs = { r: (0, bytes_1.arrayify)(sig.r), s: (0, bytes_1.arrayify)(sig.s) };\n      return \"0x\" + getCurve().recoverPubKey((0, bytes_1.arrayify)(digest), rs, sig.recoveryParam).encode(\"hex\", false);\n    }\n    exports2.recoverPublicKey = recoverPublicKey;\n    function computePublicKey(key, compressed) {\n      var bytes = (0, bytes_1.arrayify)(key);\n      if (bytes.length === 32) {\n        var signingKey = new SigningKey(bytes);\n        if (compressed) {\n          return \"0x\" + getCurve().keyFromPrivate(bytes).getPublic(true, \"hex\");\n        }\n        return signingKey.publicKey;\n      } else if (bytes.length === 33) {\n        if (compressed) {\n          return (0, bytes_1.hexlify)(bytes);\n        }\n        return \"0x\" + getCurve().keyFromPublic(bytes).getPublic(false, \"hex\");\n      } else if (bytes.length === 65) {\n        if (!compressed) {\n          return (0, bytes_1.hexlify)(bytes);\n        }\n        return \"0x\" + getCurve().keyFromPublic(bytes).getPublic(true, \"hex\");\n      }\n      return logger.throwArgumentError(\"invalid public or private key\", \"key\", \"[REDACTED]\");\n    }\n    exports2.computePublicKey = computePublicKey;\n  }\n});\n\n// node_modules/@ethersproject/transactions/lib/_version.js\nvar require_version13 = __commonJS({\n  \"node_modules/@ethersproject/transactions/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"transactions/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/transactions/lib/index.js\nvar require_lib15 = __commonJS({\n  \"node_modules/@ethersproject/transactions/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n      }\n      __setModuleDefault(result, mod);\n      return result;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parse = exports2.serialize = exports2.accessListify = exports2.recoverAddress = exports2.computeAddress = exports2.TransactionTypes = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var RLP = __importStar(require_lib6());\n    var signing_key_1 = require_lib14();\n    var logger_1 = require_lib();\n    var _version_1 = require_version13();\n    var logger = new logger_1.Logger(_version_1.version);\n    var TransactionTypes;\n    (function(TransactionTypes2) {\n      TransactionTypes2[TransactionTypes2[\"legacy\"] = 0] = \"legacy\";\n      TransactionTypes2[TransactionTypes2[\"eip2930\"] = 1] = \"eip2930\";\n      TransactionTypes2[TransactionTypes2[\"eip1559\"] = 2] = \"eip1559\";\n    })(TransactionTypes = exports2.TransactionTypes || (exports2.TransactionTypes = {}));\n    function handleAddress(value) {\n      if (value === \"0x\") {\n        return null;\n      }\n      return (0, address_1.getAddress)(value);\n    }\n    function handleNumber(value) {\n      if (value === \"0x\") {\n        return constants_1.Zero;\n      }\n      return bignumber_1.BigNumber.from(value);\n    }\n    var transactionFields = [\n      { name: \"nonce\", maxLength: 32, numeric: true },\n      { name: \"gasPrice\", maxLength: 32, numeric: true },\n      { name: \"gasLimit\", maxLength: 32, numeric: true },\n      { name: \"to\", length: 20 },\n      { name: \"value\", maxLength: 32, numeric: true },\n      { name: \"data\" }\n    ];\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      type: true,\n      value: true\n    };\n    function computeAddress(key) {\n      var publicKey = (0, signing_key_1.computePublicKey)(key);\n      return (0, address_1.getAddress)((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.hexDataSlice)(publicKey, 1)), 12));\n    }\n    exports2.computeAddress = computeAddress;\n    function recoverAddress(digest, signature) {\n      return computeAddress((0, signing_key_1.recoverPublicKey)((0, bytes_1.arrayify)(digest), signature));\n    }\n    exports2.recoverAddress = recoverAddress;\n    function formatNumber(value, name2) {\n      var result = (0, bytes_1.stripZeros)(bignumber_1.BigNumber.from(value).toHexString());\n      if (result.length > 32) {\n        logger.throwArgumentError(\"invalid length for \" + name2, \"transaction:\" + name2, value);\n      }\n      return result;\n    }\n    function accessSetify(addr, storageKeys) {\n      return {\n        address: (0, address_1.getAddress)(addr),\n        storageKeys: (storageKeys || []).map(function(storageKey, index) {\n          if ((0, bytes_1.hexDataLength)(storageKey) !== 32) {\n            logger.throwArgumentError(\"invalid access list storageKey\", \"accessList[\" + addr + \":\" + index + \"]\", storageKey);\n          }\n          return storageKey.toLowerCase();\n        })\n      };\n    }\n    function accessListify(value) {\n      if (Array.isArray(value)) {\n        return value.map(function(set, index) {\n          if (Array.isArray(set)) {\n            if (set.length > 2) {\n              logger.throwArgumentError(\"access list expected to be [ address, storageKeys[] ]\", \"value[\" + index + \"]\", set);\n            }\n            return accessSetify(set[0], set[1]);\n          }\n          return accessSetify(set.address, set.storageKeys);\n        });\n      }\n      var result = Object.keys(value).map(function(addr) {\n        var storageKeys = value[addr].reduce(function(accum, storageKey) {\n          accum[storageKey] = true;\n          return accum;\n        }, {});\n        return accessSetify(addr, Object.keys(storageKeys).sort());\n      });\n      result.sort(function(a, b) {\n        return a.address.localeCompare(b.address);\n      });\n      return result;\n    }\n    exports2.accessListify = accessListify;\n    function formatAccessList(value) {\n      return accessListify(value).map(function(set) {\n        return [set.address, set.storageKeys];\n      });\n    }\n    function _serializeEip1559(transaction, signature) {\n      if (transaction.gasPrice != null) {\n        var gasPrice = bignumber_1.BigNumber.from(transaction.gasPrice);\n        var maxFeePerGas = bignumber_1.BigNumber.from(transaction.maxFeePerGas || 0);\n        if (!gasPrice.eq(maxFeePerGas)) {\n          logger.throwArgumentError(\"mismatch EIP-1559 gasPrice != maxFeePerGas\", \"tx\", {\n            gasPrice,\n            maxFeePerGas\n          });\n        }\n      }\n      var fields = [\n        formatNumber(transaction.chainId || 0, \"chainId\"),\n        formatNumber(transaction.nonce || 0, \"nonce\"),\n        formatNumber(transaction.maxPriorityFeePerGas || 0, \"maxPriorityFeePerGas\"),\n        formatNumber(transaction.maxFeePerGas || 0, \"maxFeePerGas\"),\n        formatNumber(transaction.gasLimit || 0, \"gasLimit\"),\n        transaction.to != null ? (0, address_1.getAddress)(transaction.to) : \"0x\",\n        formatNumber(transaction.value || 0, \"value\"),\n        transaction.data || \"0x\",\n        formatAccessList(transaction.accessList || [])\n      ];\n      if (signature) {\n        var sig = (0, bytes_1.splitSignature)(signature);\n        fields.push(formatNumber(sig.recoveryParam, \"recoveryParam\"));\n        fields.push((0, bytes_1.stripZeros)(sig.r));\n        fields.push((0, bytes_1.stripZeros)(sig.s));\n      }\n      return (0, bytes_1.hexConcat)([\"0x02\", RLP.encode(fields)]);\n    }\n    function _serializeEip2930(transaction, signature) {\n      var fields = [\n        formatNumber(transaction.chainId || 0, \"chainId\"),\n        formatNumber(transaction.nonce || 0, \"nonce\"),\n        formatNumber(transaction.gasPrice || 0, \"gasPrice\"),\n        formatNumber(transaction.gasLimit || 0, \"gasLimit\"),\n        transaction.to != null ? (0, address_1.getAddress)(transaction.to) : \"0x\",\n        formatNumber(transaction.value || 0, \"value\"),\n        transaction.data || \"0x\",\n        formatAccessList(transaction.accessList || [])\n      ];\n      if (signature) {\n        var sig = (0, bytes_1.splitSignature)(signature);\n        fields.push(formatNumber(sig.recoveryParam, \"recoveryParam\"));\n        fields.push((0, bytes_1.stripZeros)(sig.r));\n        fields.push((0, bytes_1.stripZeros)(sig.s));\n      }\n      return (0, bytes_1.hexConcat)([\"0x01\", RLP.encode(fields)]);\n    }\n    function _serialize(transaction, signature) {\n      (0, properties_1.checkProperties)(transaction, allowedTransactionKeys);\n      var raw = [];\n      transactionFields.forEach(function(fieldInfo) {\n        var value = transaction[fieldInfo.name] || [];\n        var options = {};\n        if (fieldInfo.numeric) {\n          options.hexPad = \"left\";\n        }\n        value = (0, bytes_1.arrayify)((0, bytes_1.hexlify)(value, options));\n        if (fieldInfo.length && value.length !== fieldInfo.length && value.length > 0) {\n          logger.throwArgumentError(\"invalid length for \" + fieldInfo.name, \"transaction:\" + fieldInfo.name, value);\n        }\n        if (fieldInfo.maxLength) {\n          value = (0, bytes_1.stripZeros)(value);\n          if (value.length > fieldInfo.maxLength) {\n            logger.throwArgumentError(\"invalid length for \" + fieldInfo.name, \"transaction:\" + fieldInfo.name, value);\n          }\n        }\n        raw.push((0, bytes_1.hexlify)(value));\n      });\n      var chainId = 0;\n      if (transaction.chainId != null) {\n        chainId = transaction.chainId;\n        if (typeof chainId !== \"number\") {\n          logger.throwArgumentError(\"invalid transaction.chainId\", \"transaction\", transaction);\n        }\n      } else if (signature && !(0, bytes_1.isBytesLike)(signature) && signature.v > 28) {\n        chainId = Math.floor((signature.v - 35) / 2);\n      }\n      if (chainId !== 0) {\n        raw.push((0, bytes_1.hexlify)(chainId));\n        raw.push(\"0x\");\n        raw.push(\"0x\");\n      }\n      if (!signature) {\n        return RLP.encode(raw);\n      }\n      var sig = (0, bytes_1.splitSignature)(signature);\n      var v = 27 + sig.recoveryParam;\n      if (chainId !== 0) {\n        raw.pop();\n        raw.pop();\n        raw.pop();\n        v += chainId * 2 + 8;\n        if (sig.v > 28 && sig.v !== v) {\n          logger.throwArgumentError(\"transaction.chainId/signature.v mismatch\", \"signature\", signature);\n        }\n      } else if (sig.v !== v) {\n        logger.throwArgumentError(\"transaction.chainId/signature.v mismatch\", \"signature\", signature);\n      }\n      raw.push((0, bytes_1.hexlify)(v));\n      raw.push((0, bytes_1.stripZeros)((0, bytes_1.arrayify)(sig.r)));\n      raw.push((0, bytes_1.stripZeros)((0, bytes_1.arrayify)(sig.s)));\n      return RLP.encode(raw);\n    }\n    function serialize(transaction, signature) {\n      if (transaction.type == null || transaction.type === 0) {\n        if (transaction.accessList != null) {\n          logger.throwArgumentError(\"untyped transactions do not support accessList; include type: 1\", \"transaction\", transaction);\n        }\n        return _serialize(transaction, signature);\n      }\n      switch (transaction.type) {\n        case 1:\n          return _serializeEip2930(transaction, signature);\n        case 2:\n          return _serializeEip1559(transaction, signature);\n        default:\n          break;\n      }\n      return logger.throwError(\"unsupported transaction type: \" + transaction.type, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n        operation: \"serializeTransaction\",\n        transactionType: transaction.type\n      });\n    }\n    exports2.serialize = serialize;\n    function _parseEipSignature(tx, fields, serialize2) {\n      try {\n        var recid = handleNumber(fields[0]).toNumber();\n        if (recid !== 0 && recid !== 1) {\n          throw new Error(\"bad recid\");\n        }\n        tx.v = recid;\n      } catch (error) {\n        logger.throwArgumentError(\"invalid v for transaction type: 1\", \"v\", fields[0]);\n      }\n      tx.r = (0, bytes_1.hexZeroPad)(fields[1], 32);\n      tx.s = (0, bytes_1.hexZeroPad)(fields[2], 32);\n      try {\n        var digest = (0, keccak256_1.keccak256)(serialize2(tx));\n        tx.from = recoverAddress(digest, { r: tx.r, s: tx.s, recoveryParam: tx.v });\n      } catch (error) {\n        console.log(error);\n      }\n    }\n    function _parseEip1559(payload) {\n      var transaction = RLP.decode(payload.slice(1));\n      if (transaction.length !== 9 && transaction.length !== 12) {\n        logger.throwArgumentError(\"invalid component count for transaction type: 2\", \"payload\", (0, bytes_1.hexlify)(payload));\n      }\n      var maxPriorityFeePerGas = handleNumber(transaction[2]);\n      var maxFeePerGas = handleNumber(transaction[3]);\n      var tx = {\n        type: 2,\n        chainId: handleNumber(transaction[0]).toNumber(),\n        nonce: handleNumber(transaction[1]).toNumber(),\n        maxPriorityFeePerGas,\n        maxFeePerGas,\n        gasPrice: null,\n        gasLimit: handleNumber(transaction[4]),\n        to: handleAddress(transaction[5]),\n        value: handleNumber(transaction[6]),\n        data: transaction[7],\n        accessList: accessListify(transaction[8])\n      };\n      if (transaction.length === 9) {\n        return tx;\n      }\n      tx.hash = (0, keccak256_1.keccak256)(payload);\n      _parseEipSignature(tx, transaction.slice(9), _serializeEip1559);\n      return tx;\n    }\n    function _parseEip2930(payload) {\n      var transaction = RLP.decode(payload.slice(1));\n      if (transaction.length !== 8 && transaction.length !== 11) {\n        logger.throwArgumentError(\"invalid component count for transaction type: 1\", \"payload\", (0, bytes_1.hexlify)(payload));\n      }\n      var tx = {\n        type: 1,\n        chainId: handleNumber(transaction[0]).toNumber(),\n        nonce: handleNumber(transaction[1]).toNumber(),\n        gasPrice: handleNumber(transaction[2]),\n        gasLimit: handleNumber(transaction[3]),\n        to: handleAddress(transaction[4]),\n        value: handleNumber(transaction[5]),\n        data: transaction[6],\n        accessList: accessListify(transaction[7])\n      };\n      if (transaction.length === 8) {\n        return tx;\n      }\n      tx.hash = (0, keccak256_1.keccak256)(payload);\n      _parseEipSignature(tx, transaction.slice(8), _serializeEip2930);\n      return tx;\n    }\n    function _parse(rawTransaction) {\n      var transaction = RLP.decode(rawTransaction);\n      if (transaction.length !== 9 && transaction.length !== 6) {\n        logger.throwArgumentError(\"invalid raw transaction\", \"rawTransaction\", rawTransaction);\n      }\n      var tx = {\n        nonce: handleNumber(transaction[0]).toNumber(),\n        gasPrice: handleNumber(transaction[1]),\n        gasLimit: handleNumber(transaction[2]),\n        to: handleAddress(transaction[3]),\n        value: handleNumber(transaction[4]),\n        data: transaction[5],\n        chainId: 0\n      };\n      if (transaction.length === 6) {\n        return tx;\n      }\n      try {\n        tx.v = bignumber_1.BigNumber.from(transaction[6]).toNumber();\n      } catch (error) {\n        console.log(error);\n        return tx;\n      }\n      tx.r = (0, bytes_1.hexZeroPad)(transaction[7], 32);\n      tx.s = (0, bytes_1.hexZeroPad)(transaction[8], 32);\n      if (bignumber_1.BigNumber.from(tx.r).isZero() && bignumber_1.BigNumber.from(tx.s).isZero()) {\n        tx.chainId = tx.v;\n        tx.v = 0;\n      } else {\n        tx.chainId = Math.floor((tx.v - 35) / 2);\n        if (tx.chainId < 0) {\n          tx.chainId = 0;\n        }\n        var recoveryParam = tx.v - 27;\n        var raw = transaction.slice(0, 6);\n        if (tx.chainId !== 0) {\n          raw.push((0, bytes_1.hexlify)(tx.chainId));\n          raw.push(\"0x\");\n          raw.push(\"0x\");\n          recoveryParam -= tx.chainId * 2 + 8;\n        }\n        var digest = (0, keccak256_1.keccak256)(RLP.encode(raw));\n        try {\n          tx.from = recoverAddress(digest, { r: (0, bytes_1.hexlify)(tx.r), s: (0, bytes_1.hexlify)(tx.s), recoveryParam });\n        } catch (error) {\n          console.log(error);\n        }\n        tx.hash = (0, keccak256_1.keccak256)(rawTransaction);\n      }\n      tx.type = null;\n      return tx;\n    }\n    function parse(rawTransaction) {\n      var payload = (0, bytes_1.arrayify)(rawTransaction);\n      if (payload[0] > 127) {\n        return _parse(payload);\n      }\n      switch (payload[0]) {\n        case 1:\n          return _parseEip2930(payload);\n        case 2:\n          return _parseEip1559(payload);\n        default:\n          break;\n      }\n      return logger.throwError(\"unsupported transaction type: \" + payload[0], logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n        operation: \"parseTransaction\",\n        transactionType: payload[0]\n      });\n    }\n    exports2.parse = parse;\n  }\n});\n\n// node_modules/@ethersproject/contracts/lib/_version.js\nvar require_version14 = __commonJS({\n  \"node_modules/@ethersproject/contracts/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"contracts/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/contracts/lib/index.js\nvar require_lib16 = __commonJS({\n  \"node_modules/@ethersproject/contracts/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __spreadArray = exports2 && exports2.__spreadArray || function(to, from, pack) {\n      if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n        }\n      }\n      return to.concat(ar || Array.prototype.slice.call(from));\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.ContractFactory = exports2.Contract = exports2.BaseContract = void 0;\n    var abi_1 = require_lib11();\n    var abstract_provider_1 = require_lib12();\n    var abstract_signer_1 = require_lib13();\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version14();\n    var logger = new logger_1.Logger(_version_1.version);\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      from: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      value: true,\n      type: true,\n      accessList: true,\n      maxFeePerGas: true,\n      maxPriorityFeePerGas: true,\n      customData: true\n    };\n    function resolveName(resolver, nameOrPromise) {\n      return __awaiter(this, void 0, void 0, function() {\n        var name2, address;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              return [4, nameOrPromise];\n            case 1:\n              name2 = _a.sent();\n              if (typeof name2 !== \"string\") {\n                logger.throwArgumentError(\"invalid address or ENS name\", \"name\", name2);\n              }\n              try {\n                return [2, (0, address_1.getAddress)(name2)];\n              } catch (error) {\n              }\n              if (!resolver) {\n                logger.throwError(\"a provider or signer is needed to resolve ENS names\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                  operation: \"resolveName\"\n                });\n              }\n              return [4, resolver.resolveName(name2)];\n            case 2:\n              address = _a.sent();\n              if (address == null) {\n                logger.throwArgumentError(\"resolver or addr is not configured for ENS name\", \"name\", name2);\n              }\n              return [2, address];\n          }\n        });\n      });\n    }\n    function resolveAddresses(resolver, value, paramType) {\n      return __awaiter(this, void 0, void 0, function() {\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              if (!Array.isArray(paramType)) return [3, 2];\n              return [4, Promise.all(paramType.map(function(paramType2, index) {\n                return resolveAddresses(resolver, Array.isArray(value) ? value[index] : value[paramType2.name], paramType2);\n              }))];\n            case 1:\n              return [2, _a.sent()];\n            case 2:\n              if (!(paramType.type === \"address\")) return [3, 4];\n              return [4, resolveName(resolver, value)];\n            case 3:\n              return [2, _a.sent()];\n            case 4:\n              if (!(paramType.type === \"tuple\")) return [3, 6];\n              return [4, resolveAddresses(resolver, value, paramType.components)];\n            case 5:\n              return [2, _a.sent()];\n            case 6:\n              if (!(paramType.baseType === \"array\")) return [3, 8];\n              if (!Array.isArray(value)) {\n                return [2, Promise.reject(logger.makeError(\"invalid value for array\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                  argument: \"value\",\n                  value\n                }))];\n              }\n              return [4, Promise.all(value.map(function(v) {\n                return resolveAddresses(resolver, v, paramType.arrayChildren);\n              }))];\n            case 7:\n              return [2, _a.sent()];\n            case 8:\n              return [2, value];\n          }\n        });\n      });\n    }\n    function populateTransaction(contract, fragment, args) {\n      return __awaiter(this, void 0, void 0, function() {\n        var overrides, resolved, data, tx, ro, intrinsic, bytes, i, roValue, leftovers;\n        var _this = this;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              overrides = {};\n              if (args.length === fragment.inputs.length + 1 && typeof args[args.length - 1] === \"object\") {\n                overrides = (0, properties_1.shallowCopy)(args.pop());\n              }\n              logger.checkArgumentCount(args.length, fragment.inputs.length, \"passed to contract\");\n              if (contract.signer) {\n                if (overrides.from) {\n                  overrides.from = (0, properties_1.resolveProperties)({\n                    override: resolveName(contract.signer, overrides.from),\n                    signer: contract.signer.getAddress()\n                  }).then(function(check) {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      return __generator(this, function(_a2) {\n                        if ((0, address_1.getAddress)(check.signer) !== check.override) {\n                          logger.throwError(\"Contract with a Signer cannot override from\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                            operation: \"overrides.from\"\n                          });\n                        }\n                        return [2, check.override];\n                      });\n                    });\n                  });\n                } else {\n                  overrides.from = contract.signer.getAddress();\n                }\n              } else if (overrides.from) {\n                overrides.from = resolveName(contract.provider, overrides.from);\n              }\n              return [4, (0, properties_1.resolveProperties)({\n                args: resolveAddresses(contract.signer || contract.provider, args, fragment.inputs),\n                address: contract.resolvedAddress,\n                overrides: (0, properties_1.resolveProperties)(overrides) || {}\n              })];\n            case 1:\n              resolved = _a.sent();\n              data = contract.interface.encodeFunctionData(fragment, resolved.args);\n              tx = {\n                data,\n                to: resolved.address\n              };\n              ro = resolved.overrides;\n              if (ro.nonce != null) {\n                tx.nonce = bignumber_1.BigNumber.from(ro.nonce).toNumber();\n              }\n              if (ro.gasLimit != null) {\n                tx.gasLimit = bignumber_1.BigNumber.from(ro.gasLimit);\n              }\n              if (ro.gasPrice != null) {\n                tx.gasPrice = bignumber_1.BigNumber.from(ro.gasPrice);\n              }\n              if (ro.maxFeePerGas != null) {\n                tx.maxFeePerGas = bignumber_1.BigNumber.from(ro.maxFeePerGas);\n              }\n              if (ro.maxPriorityFeePerGas != null) {\n                tx.maxPriorityFeePerGas = bignumber_1.BigNumber.from(ro.maxPriorityFeePerGas);\n              }\n              if (ro.from != null) {\n                tx.from = ro.from;\n              }\n              if (ro.type != null) {\n                tx.type = ro.type;\n              }\n              if (ro.accessList != null) {\n                tx.accessList = (0, transactions_1.accessListify)(ro.accessList);\n              }\n              if (tx.gasLimit == null && fragment.gas != null) {\n                intrinsic = 21e3;\n                bytes = (0, bytes_1.arrayify)(data);\n                for (i = 0; i < bytes.length; i++) {\n                  intrinsic += 4;\n                  if (bytes[i]) {\n                    intrinsic += 64;\n                  }\n                }\n                tx.gasLimit = bignumber_1.BigNumber.from(fragment.gas).add(intrinsic);\n              }\n              if (ro.value) {\n                roValue = bignumber_1.BigNumber.from(ro.value);\n                if (!roValue.isZero() && !fragment.payable) {\n                  logger.throwError(\"non-payable method cannot override value\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"overrides.value\",\n                    value: overrides.value\n                  });\n                }\n                tx.value = roValue;\n              }\n              if (ro.customData) {\n                tx.customData = (0, properties_1.shallowCopy)(ro.customData);\n              }\n              delete overrides.nonce;\n              delete overrides.gasLimit;\n              delete overrides.gasPrice;\n              delete overrides.from;\n              delete overrides.value;\n              delete overrides.type;\n              delete overrides.accessList;\n              delete overrides.maxFeePerGas;\n              delete overrides.maxPriorityFeePerGas;\n              delete overrides.customData;\n              leftovers = Object.keys(overrides).filter(function(key) {\n                return overrides[key] != null;\n              });\n              if (leftovers.length) {\n                logger.throwError(\"cannot override \" + leftovers.map(function(l) {\n                  return JSON.stringify(l);\n                }).join(\",\"), logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                  operation: \"overrides\",\n                  overrides: leftovers\n                });\n              }\n              return [2, tx];\n          }\n        });\n      });\n    }\n    function buildPopulate(contract, fragment) {\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return populateTransaction(contract, fragment, args);\n      };\n    }\n    function buildEstimate(contract, fragment) {\n      var signerOrProvider = contract.signer || contract.provider;\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var tx;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                if (!signerOrProvider) {\n                  logger.throwError(\"estimate require a provider or signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"estimateGas\"\n                  });\n                }\n                return [4, populateTransaction(contract, fragment, args)];\n              case 1:\n                tx = _a.sent();\n                return [4, signerOrProvider.estimateGas(tx)];\n              case 2:\n                return [2, _a.sent()];\n            }\n          });\n        });\n      };\n    }\n    function addContractWait(contract, tx) {\n      var wait = tx.wait.bind(tx);\n      tx.wait = function(confirmations) {\n        return wait(confirmations).then(function(receipt) {\n          receipt.events = receipt.logs.map(function(log) {\n            var event = (0, properties_1.deepCopy)(log);\n            var parsed = null;\n            try {\n              parsed = contract.interface.parseLog(log);\n            } catch (e) {\n            }\n            if (parsed) {\n              event.args = parsed.args;\n              event.decode = function(data, topics) {\n                return contract.interface.decodeEventLog(parsed.eventFragment, data, topics);\n              };\n              event.event = parsed.name;\n              event.eventSignature = parsed.signature;\n            }\n            event.removeListener = function() {\n              return contract.provider;\n            };\n            event.getBlock = function() {\n              return contract.provider.getBlock(receipt.blockHash);\n            };\n            event.getTransaction = function() {\n              return contract.provider.getTransaction(receipt.transactionHash);\n            };\n            event.getTransactionReceipt = function() {\n              return Promise.resolve(receipt);\n            };\n            return event;\n          });\n          return receipt;\n        });\n      };\n    }\n    function buildCall(contract, fragment, collapseSimple) {\n      var signerOrProvider = contract.signer || contract.provider;\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var blockTag, overrides, tx, result, value;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                blockTag = void 0;\n                if (!(args.length === fragment.inputs.length + 1 && typeof args[args.length - 1] === \"object\")) return [3, 3];\n                overrides = (0, properties_1.shallowCopy)(args.pop());\n                if (!(overrides.blockTag != null)) return [3, 2];\n                return [4, overrides.blockTag];\n              case 1:\n                blockTag = _a.sent();\n                _a.label = 2;\n              case 2:\n                delete overrides.blockTag;\n                args.push(overrides);\n                _a.label = 3;\n              case 3:\n                if (!(contract.deployTransaction != null)) return [3, 5];\n                return [4, contract._deployed(blockTag)];\n              case 4:\n                _a.sent();\n                _a.label = 5;\n              case 5:\n                return [4, populateTransaction(contract, fragment, args)];\n              case 6:\n                tx = _a.sent();\n                return [4, signerOrProvider.call(tx, blockTag)];\n              case 7:\n                result = _a.sent();\n                try {\n                  value = contract.interface.decodeFunctionResult(fragment, result);\n                  if (collapseSimple && fragment.outputs.length === 1) {\n                    value = value[0];\n                  }\n                  return [2, value];\n                } catch (error) {\n                  if (error.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    error.address = contract.address;\n                    error.args = args;\n                    error.transaction = tx;\n                  }\n                  throw error;\n                }\n                return [\n                  2\n                  /*return*/\n                ];\n            }\n          });\n        });\n      };\n    }\n    function buildSend(contract, fragment) {\n      return function() {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n          args[_i] = arguments[_i];\n        }\n        return __awaiter(this, void 0, void 0, function() {\n          var txRequest, tx;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                if (!contract.signer) {\n                  logger.throwError(\"sending a transaction requires a signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"sendTransaction\"\n                  });\n                }\n                if (!(contract.deployTransaction != null)) return [3, 2];\n                return [4, contract._deployed()];\n              case 1:\n                _a.sent();\n                _a.label = 2;\n              case 2:\n                return [4, populateTransaction(contract, fragment, args)];\n              case 3:\n                txRequest = _a.sent();\n                return [4, contract.signer.sendTransaction(txRequest)];\n              case 4:\n                tx = _a.sent();\n                addContractWait(contract, tx);\n                return [2, tx];\n            }\n          });\n        });\n      };\n    }\n    function buildDefault(contract, fragment, collapseSimple) {\n      if (fragment.constant) {\n        return buildCall(contract, fragment, collapseSimple);\n      }\n      return buildSend(contract, fragment);\n    }\n    function getEventTag(filter) {\n      if (filter.address && (filter.topics == null || filter.topics.length === 0)) {\n        return \"*\";\n      }\n      return (filter.address || \"*\") + \"@\" + (filter.topics ? filter.topics.map(function(topic) {\n        if (Array.isArray(topic)) {\n          return topic.join(\"|\");\n        }\n        return topic;\n      }).join(\":\") : \"\");\n    }\n    var RunningEvent = (\n      /** @class */\n      function() {\n        function RunningEvent2(tag, filter) {\n          (0, properties_1.defineReadOnly)(this, \"tag\", tag);\n          (0, properties_1.defineReadOnly)(this, \"filter\", filter);\n          this._listeners = [];\n        }\n        RunningEvent2.prototype.addListener = function(listener, once) {\n          this._listeners.push({ listener, once });\n        };\n        RunningEvent2.prototype.removeListener = function(listener) {\n          var done = false;\n          this._listeners = this._listeners.filter(function(item) {\n            if (done || item.listener !== listener) {\n              return true;\n            }\n            done = true;\n            return false;\n          });\n        };\n        RunningEvent2.prototype.removeAllListeners = function() {\n          this._listeners = [];\n        };\n        RunningEvent2.prototype.listeners = function() {\n          return this._listeners.map(function(i) {\n            return i.listener;\n          });\n        };\n        RunningEvent2.prototype.listenerCount = function() {\n          return this._listeners.length;\n        };\n        RunningEvent2.prototype.run = function(args) {\n          var _this = this;\n          var listenerCount = this.listenerCount();\n          this._listeners = this._listeners.filter(function(item) {\n            var argsCopy = args.slice();\n            setTimeout(function() {\n              item.listener.apply(_this, argsCopy);\n            }, 0);\n            return !item.once;\n          });\n          return listenerCount;\n        };\n        RunningEvent2.prototype.prepareEvent = function(event) {\n        };\n        RunningEvent2.prototype.getEmit = function(event) {\n          return [event];\n        };\n        return RunningEvent2;\n      }()\n    );\n    var ErrorRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(ErrorRunningEvent2, _super);\n        function ErrorRunningEvent2() {\n          return _super.call(this, \"error\", null) || this;\n        }\n        return ErrorRunningEvent2;\n      }(RunningEvent)\n    );\n    var FragmentRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(FragmentRunningEvent2, _super);\n        function FragmentRunningEvent2(address, contractInterface, fragment, topics) {\n          var _this = this;\n          var filter = {\n            address\n          };\n          var topic = contractInterface.getEventTopic(fragment);\n          if (topics) {\n            if (topic !== topics[0]) {\n              logger.throwArgumentError(\"topic mismatch\", \"topics\", topics);\n            }\n            filter.topics = topics.slice();\n          } else {\n            filter.topics = [topic];\n          }\n          _this = _super.call(this, getEventTag(filter), filter) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"interface\", contractInterface);\n          (0, properties_1.defineReadOnly)(_this, \"fragment\", fragment);\n          return _this;\n        }\n        FragmentRunningEvent2.prototype.prepareEvent = function(event) {\n          var _this = this;\n          _super.prototype.prepareEvent.call(this, event);\n          event.event = this.fragment.name;\n          event.eventSignature = this.fragment.format();\n          event.decode = function(data, topics) {\n            return _this.interface.decodeEventLog(_this.fragment, data, topics);\n          };\n          try {\n            event.args = this.interface.decodeEventLog(this.fragment, event.data, event.topics);\n          } catch (error) {\n            event.args = null;\n            event.decodeError = error;\n          }\n        };\n        FragmentRunningEvent2.prototype.getEmit = function(event) {\n          var errors = (0, abi_1.checkResultErrors)(event.args);\n          if (errors.length) {\n            throw errors[0].error;\n          }\n          var args = (event.args || []).slice();\n          args.push(event);\n          return args;\n        };\n        return FragmentRunningEvent2;\n      }(RunningEvent)\n    );\n    var WildcardRunningEvent = (\n      /** @class */\n      function(_super) {\n        __extends(WildcardRunningEvent2, _super);\n        function WildcardRunningEvent2(address, contractInterface) {\n          var _this = _super.call(this, \"*\", { address }) || this;\n          (0, properties_1.defineReadOnly)(_this, \"address\", address);\n          (0, properties_1.defineReadOnly)(_this, \"interface\", contractInterface);\n          return _this;\n        }\n        WildcardRunningEvent2.prototype.prepareEvent = function(event) {\n          var _this = this;\n          _super.prototype.prepareEvent.call(this, event);\n          try {\n            var parsed_1 = this.interface.parseLog(event);\n            event.event = parsed_1.name;\n            event.eventSignature = parsed_1.signature;\n            event.decode = function(data, topics) {\n              return _this.interface.decodeEventLog(parsed_1.eventFragment, data, topics);\n            };\n            event.args = parsed_1.args;\n          } catch (error) {\n          }\n        };\n        return WildcardRunningEvent2;\n      }(RunningEvent)\n    );\n    var BaseContract = (\n      /** @class */\n      function() {\n        function BaseContract2(addressOrName, contractInterface, signerOrProvider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Contract);\n          (0, properties_1.defineReadOnly)(this, \"interface\", (0, properties_1.getStatic)(_newTarget, \"getInterface\")(contractInterface));\n          if (signerOrProvider == null) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", null);\n            (0, properties_1.defineReadOnly)(this, \"signer\", null);\n          } else if (abstract_signer_1.Signer.isSigner(signerOrProvider)) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", signerOrProvider.provider || null);\n            (0, properties_1.defineReadOnly)(this, \"signer\", signerOrProvider);\n          } else if (abstract_provider_1.Provider.isProvider(signerOrProvider)) {\n            (0, properties_1.defineReadOnly)(this, \"provider\", signerOrProvider);\n            (0, properties_1.defineReadOnly)(this, \"signer\", null);\n          } else {\n            logger.throwArgumentError(\"invalid signer or provider\", \"signerOrProvider\", signerOrProvider);\n          }\n          (0, properties_1.defineReadOnly)(this, \"callStatic\", {});\n          (0, properties_1.defineReadOnly)(this, \"estimateGas\", {});\n          (0, properties_1.defineReadOnly)(this, \"functions\", {});\n          (0, properties_1.defineReadOnly)(this, \"populateTransaction\", {});\n          (0, properties_1.defineReadOnly)(this, \"filters\", {});\n          {\n            var uniqueFilters_1 = {};\n            Object.keys(this.interface.events).forEach(function(eventSignature) {\n              var event = _this.interface.events[eventSignature];\n              (0, properties_1.defineReadOnly)(_this.filters, eventSignature, function() {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                  args[_i] = arguments[_i];\n                }\n                return {\n                  address: _this.address,\n                  topics: _this.interface.encodeFilterTopics(event, args)\n                };\n              });\n              if (!uniqueFilters_1[event.name]) {\n                uniqueFilters_1[event.name] = [];\n              }\n              uniqueFilters_1[event.name].push(eventSignature);\n            });\n            Object.keys(uniqueFilters_1).forEach(function(name2) {\n              var filters = uniqueFilters_1[name2];\n              if (filters.length === 1) {\n                (0, properties_1.defineReadOnly)(_this.filters, name2, _this.filters[filters[0]]);\n              } else {\n                logger.warn(\"Duplicate definition of \" + name2 + \" (\" + filters.join(\", \") + \")\");\n              }\n            });\n          }\n          (0, properties_1.defineReadOnly)(this, \"_runningEvents\", {});\n          (0, properties_1.defineReadOnly)(this, \"_wrappedEmits\", {});\n          if (addressOrName == null) {\n            logger.throwArgumentError(\"invalid contract address or ENS name\", \"addressOrName\", addressOrName);\n          }\n          (0, properties_1.defineReadOnly)(this, \"address\", addressOrName);\n          if (this.provider) {\n            (0, properties_1.defineReadOnly)(this, \"resolvedAddress\", resolveName(this.provider, addressOrName));\n          } else {\n            try {\n              (0, properties_1.defineReadOnly)(this, \"resolvedAddress\", Promise.resolve((0, address_1.getAddress)(addressOrName)));\n            } catch (error) {\n              logger.throwError(\"provider is required to use ENS name as contract address\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"new Contract\"\n              });\n            }\n          }\n          var uniqueNames = {};\n          var uniqueSignatures = {};\n          Object.keys(this.interface.functions).forEach(function(signature) {\n            var fragment = _this.interface.functions[signature];\n            if (uniqueSignatures[signature]) {\n              logger.warn(\"Duplicate ABI entry for \" + JSON.stringify(signature));\n              return;\n            }\n            uniqueSignatures[signature] = true;\n            {\n              var name_1 = fragment.name;\n              if (!uniqueNames[\"%\" + name_1]) {\n                uniqueNames[\"%\" + name_1] = [];\n              }\n              uniqueNames[\"%\" + name_1].push(signature);\n            }\n            if (_this[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this, signature, buildDefault(_this, fragment, true));\n            }\n            if (_this.functions[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.functions, signature, buildDefault(_this, fragment, false));\n            }\n            if (_this.callStatic[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.callStatic, signature, buildCall(_this, fragment, true));\n            }\n            if (_this.populateTransaction[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.populateTransaction, signature, buildPopulate(_this, fragment));\n            }\n            if (_this.estimateGas[signature] == null) {\n              (0, properties_1.defineReadOnly)(_this.estimateGas, signature, buildEstimate(_this, fragment));\n            }\n          });\n          Object.keys(uniqueNames).forEach(function(name2) {\n            var signatures = uniqueNames[name2];\n            if (signatures.length > 1) {\n              return;\n            }\n            name2 = name2.substring(1);\n            var signature = signatures[0];\n            try {\n              if (_this[name2] == null) {\n                (0, properties_1.defineReadOnly)(_this, name2, _this[signature]);\n              }\n            } catch (e) {\n            }\n            if (_this.functions[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.functions, name2, _this.functions[signature]);\n            }\n            if (_this.callStatic[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.callStatic, name2, _this.callStatic[signature]);\n            }\n            if (_this.populateTransaction[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.populateTransaction, name2, _this.populateTransaction[signature]);\n            }\n            if (_this.estimateGas[name2] == null) {\n              (0, properties_1.defineReadOnly)(_this.estimateGas, name2, _this.estimateGas[signature]);\n            }\n          });\n        }\n        BaseContract2.getContractAddress = function(transaction) {\n          return (0, address_1.getContractAddress)(transaction);\n        };\n        BaseContract2.getInterface = function(contractInterface) {\n          if (abi_1.Interface.isInterface(contractInterface)) {\n            return contractInterface;\n          }\n          return new abi_1.Interface(contractInterface);\n        };\n        BaseContract2.prototype.deployed = function() {\n          return this._deployed();\n        };\n        BaseContract2.prototype._deployed = function(blockTag) {\n          var _this = this;\n          if (!this._deployedPromise) {\n            if (this.deployTransaction) {\n              this._deployedPromise = this.deployTransaction.wait().then(function() {\n                return _this;\n              });\n            } else {\n              this._deployedPromise = this.provider.getCode(this.address, blockTag).then(function(code) {\n                if (code === \"0x\") {\n                  logger.throwError(\"contract not deployed\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    contractAddress: _this.address,\n                    operation: \"getDeployed\"\n                  });\n                }\n                return _this;\n              });\n            }\n          }\n          return this._deployedPromise;\n        };\n        BaseContract2.prototype.fallback = function(overrides) {\n          var _this = this;\n          if (!this.signer) {\n            logger.throwError(\"sending a transactions require a signer\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"sendTransaction(fallback)\" });\n          }\n          var tx = (0, properties_1.shallowCopy)(overrides || {});\n          [\"from\", \"to\"].forEach(function(key) {\n            if (tx[key] == null) {\n              return;\n            }\n            logger.throwError(\"cannot override \" + key, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: key });\n          });\n          tx.to = this.resolvedAddress;\n          return this.deployed().then(function() {\n            return _this.signer.sendTransaction(tx);\n          });\n        };\n        BaseContract2.prototype.connect = function(signerOrProvider) {\n          if (typeof signerOrProvider === \"string\") {\n            signerOrProvider = new abstract_signer_1.VoidSigner(signerOrProvider, this.provider);\n          }\n          var contract = new this.constructor(this.address, this.interface, signerOrProvider);\n          if (this.deployTransaction) {\n            (0, properties_1.defineReadOnly)(contract, \"deployTransaction\", this.deployTransaction);\n          }\n          return contract;\n        };\n        BaseContract2.prototype.attach = function(addressOrName) {\n          return new this.constructor(addressOrName, this.interface, this.signer || this.provider);\n        };\n        BaseContract2.isIndexed = function(value) {\n          return abi_1.Indexed.isIndexed(value);\n        };\n        BaseContract2.prototype._normalizeRunningEvent = function(runningEvent) {\n          if (this._runningEvents[runningEvent.tag]) {\n            return this._runningEvents[runningEvent.tag];\n          }\n          return runningEvent;\n        };\n        BaseContract2.prototype._getRunningEvent = function(eventName) {\n          if (typeof eventName === \"string\") {\n            if (eventName === \"error\") {\n              return this._normalizeRunningEvent(new ErrorRunningEvent());\n            }\n            if (eventName === \"event\") {\n              return this._normalizeRunningEvent(new RunningEvent(\"event\", null));\n            }\n            if (eventName === \"*\") {\n              return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface));\n            }\n            var fragment = this.interface.getEvent(eventName);\n            return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment));\n          }\n          if (eventName.topics && eventName.topics.length > 0) {\n            try {\n              var topic = eventName.topics[0];\n              if (typeof topic !== \"string\") {\n                throw new Error(\"invalid topic\");\n              }\n              var fragment = this.interface.getEvent(topic);\n              return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment, eventName.topics));\n            } catch (error) {\n            }\n            var filter = {\n              address: this.address,\n              topics: eventName.topics\n            };\n            return this._normalizeRunningEvent(new RunningEvent(getEventTag(filter), filter));\n          }\n          return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface));\n        };\n        BaseContract2.prototype._checkRunningEvents = function(runningEvent) {\n          if (runningEvent.listenerCount() === 0) {\n            delete this._runningEvents[runningEvent.tag];\n            var emit = this._wrappedEmits[runningEvent.tag];\n            if (emit && runningEvent.filter) {\n              this.provider.off(runningEvent.filter, emit);\n              delete this._wrappedEmits[runningEvent.tag];\n            }\n          }\n        };\n        BaseContract2.prototype._wrapEvent = function(runningEvent, log, listener) {\n          var _this = this;\n          var event = (0, properties_1.deepCopy)(log);\n          event.removeListener = function() {\n            if (!listener) {\n              return;\n            }\n            runningEvent.removeListener(listener);\n            _this._checkRunningEvents(runningEvent);\n          };\n          event.getBlock = function() {\n            return _this.provider.getBlock(log.blockHash);\n          };\n          event.getTransaction = function() {\n            return _this.provider.getTransaction(log.transactionHash);\n          };\n          event.getTransactionReceipt = function() {\n            return _this.provider.getTransactionReceipt(log.transactionHash);\n          };\n          runningEvent.prepareEvent(event);\n          return event;\n        };\n        BaseContract2.prototype._addEventListener = function(runningEvent, listener, once) {\n          var _this = this;\n          if (!this.provider) {\n            logger.throwError(\"events require a provider or a signer with a provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"once\" });\n          }\n          runningEvent.addListener(listener, once);\n          this._runningEvents[runningEvent.tag] = runningEvent;\n          if (!this._wrappedEmits[runningEvent.tag]) {\n            var wrappedEmit = function(log) {\n              var event = _this._wrapEvent(runningEvent, log, listener);\n              if (event.decodeError == null) {\n                try {\n                  var args = runningEvent.getEmit(event);\n                  _this.emit.apply(_this, __spreadArray([runningEvent.filter], args, false));\n                } catch (error) {\n                  event.decodeError = error.error;\n                }\n              }\n              if (runningEvent.filter != null) {\n                _this.emit(\"event\", event);\n              }\n              if (event.decodeError != null) {\n                _this.emit(\"error\", event.decodeError, event);\n              }\n            };\n            this._wrappedEmits[runningEvent.tag] = wrappedEmit;\n            if (runningEvent.filter != null) {\n              this.provider.on(runningEvent.filter, wrappedEmit);\n            }\n          }\n        };\n        BaseContract2.prototype.queryFilter = function(event, fromBlockOrBlockhash, toBlock) {\n          var _this = this;\n          var runningEvent = this._getRunningEvent(event);\n          var filter = (0, properties_1.shallowCopy)(runningEvent.filter);\n          if (typeof fromBlockOrBlockhash === \"string\" && (0, bytes_1.isHexString)(fromBlockOrBlockhash, 32)) {\n            if (toBlock != null) {\n              logger.throwArgumentError(\"cannot specify toBlock with blockhash\", \"toBlock\", toBlock);\n            }\n            filter.blockHash = fromBlockOrBlockhash;\n          } else {\n            filter.fromBlock = fromBlockOrBlockhash != null ? fromBlockOrBlockhash : 0;\n            filter.toBlock = toBlock != null ? toBlock : \"latest\";\n          }\n          return this.provider.getLogs(filter).then(function(logs) {\n            return logs.map(function(log) {\n              return _this._wrapEvent(runningEvent, log, null);\n            });\n          });\n        };\n        BaseContract2.prototype.on = function(event, listener) {\n          this._addEventListener(this._getRunningEvent(event), listener, false);\n          return this;\n        };\n        BaseContract2.prototype.once = function(event, listener) {\n          this._addEventListener(this._getRunningEvent(event), listener, true);\n          return this;\n        };\n        BaseContract2.prototype.emit = function(eventName) {\n          var args = [];\n          for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n          }\n          if (!this.provider) {\n            return false;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          var result = runningEvent.run(args) > 0;\n          this._checkRunningEvents(runningEvent);\n          return result;\n        };\n        BaseContract2.prototype.listenerCount = function(eventName) {\n          var _this = this;\n          if (!this.provider) {\n            return 0;\n          }\n          if (eventName == null) {\n            return Object.keys(this._runningEvents).reduce(function(accum, key) {\n              return accum + _this._runningEvents[key].listenerCount();\n            }, 0);\n          }\n          return this._getRunningEvent(eventName).listenerCount();\n        };\n        BaseContract2.prototype.listeners = function(eventName) {\n          if (!this.provider) {\n            return [];\n          }\n          if (eventName == null) {\n            var result_1 = [];\n            for (var tag in this._runningEvents) {\n              this._runningEvents[tag].listeners().forEach(function(listener) {\n                result_1.push(listener);\n              });\n            }\n            return result_1;\n          }\n          return this._getRunningEvent(eventName).listeners();\n        };\n        BaseContract2.prototype.removeAllListeners = function(eventName) {\n          if (!this.provider) {\n            return this;\n          }\n          if (eventName == null) {\n            for (var tag in this._runningEvents) {\n              var runningEvent_1 = this._runningEvents[tag];\n              runningEvent_1.removeAllListeners();\n              this._checkRunningEvents(runningEvent_1);\n            }\n            return this;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          runningEvent.removeAllListeners();\n          this._checkRunningEvents(runningEvent);\n          return this;\n        };\n        BaseContract2.prototype.off = function(eventName, listener) {\n          if (!this.provider) {\n            return this;\n          }\n          var runningEvent = this._getRunningEvent(eventName);\n          runningEvent.removeListener(listener);\n          this._checkRunningEvents(runningEvent);\n          return this;\n        };\n        BaseContract2.prototype.removeListener = function(eventName, listener) {\n          return this.off(eventName, listener);\n        };\n        return BaseContract2;\n      }()\n    );\n    exports2.BaseContract = BaseContract;\n    var Contract = (\n      /** @class */\n      function(_super) {\n        __extends(Contract2, _super);\n        function Contract2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        return Contract2;\n      }(BaseContract)\n    );\n    exports2.Contract = Contract;\n    var ContractFactory = (\n      /** @class */\n      function() {\n        function ContractFactory2(contractInterface, bytecode, signer) {\n          var _newTarget = this.constructor;\n          var bytecodeHex = null;\n          if (typeof bytecode === \"string\") {\n            bytecodeHex = bytecode;\n          } else if ((0, bytes_1.isBytes)(bytecode)) {\n            bytecodeHex = (0, bytes_1.hexlify)(bytecode);\n          } else if (bytecode && typeof bytecode.object === \"string\") {\n            bytecodeHex = bytecode.object;\n          } else {\n            bytecodeHex = \"!\";\n          }\n          if (bytecodeHex.substring(0, 2) !== \"0x\") {\n            bytecodeHex = \"0x\" + bytecodeHex;\n          }\n          if (!(0, bytes_1.isHexString)(bytecodeHex) || bytecodeHex.length % 2) {\n            logger.throwArgumentError(\"invalid bytecode\", \"bytecode\", bytecode);\n          }\n          if (signer && !abstract_signer_1.Signer.isSigner(signer)) {\n            logger.throwArgumentError(\"invalid signer\", \"signer\", signer);\n          }\n          (0, properties_1.defineReadOnly)(this, \"bytecode\", bytecodeHex);\n          (0, properties_1.defineReadOnly)(this, \"interface\", (0, properties_1.getStatic)(_newTarget, \"getInterface\")(contractInterface));\n          (0, properties_1.defineReadOnly)(this, \"signer\", signer || null);\n        }\n        ContractFactory2.prototype.getDeployTransaction = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          var tx = {};\n          if (args.length === this.interface.deploy.inputs.length + 1 && typeof args[args.length - 1] === \"object\") {\n            tx = (0, properties_1.shallowCopy)(args.pop());\n            for (var key in tx) {\n              if (!allowedTransactionKeys[key]) {\n                throw new Error(\"unknown transaction override \" + key);\n              }\n            }\n          }\n          [\"data\", \"from\", \"to\"].forEach(function(key2) {\n            if (tx[key2] == null) {\n              return;\n            }\n            logger.throwError(\"cannot override \" + key2, logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: key2 });\n          });\n          if (tx.value) {\n            var value = bignumber_1.BigNumber.from(tx.value);\n            if (!value.isZero() && !this.interface.deploy.payable) {\n              logger.throwError(\"non-payable constructor cannot override value\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"overrides.value\",\n                value: tx.value\n              });\n            }\n          }\n          logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, \" in Contract constructor\");\n          tx.data = (0, bytes_1.hexlify)((0, bytes_1.concat)([\n            this.bytecode,\n            this.interface.encodeDeploy(args)\n          ]));\n          return tx;\n        };\n        ContractFactory2.prototype.deploy = function() {\n          var args = [];\n          for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n          }\n          return __awaiter(this, void 0, void 0, function() {\n            var overrides, params, unsignedTx, tx, address, contract;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  overrides = {};\n                  if (args.length === this.interface.deploy.inputs.length + 1) {\n                    overrides = args.pop();\n                  }\n                  logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, \" in Contract constructor\");\n                  return [4, resolveAddresses(this.signer, args, this.interface.deploy.inputs)];\n                case 1:\n                  params = _a.sent();\n                  params.push(overrides);\n                  unsignedTx = this.getDeployTransaction.apply(this, params);\n                  return [4, this.signer.sendTransaction(unsignedTx)];\n                case 2:\n                  tx = _a.sent();\n                  address = (0, properties_1.getStatic)(this.constructor, \"getContractAddress\")(tx);\n                  contract = (0, properties_1.getStatic)(this.constructor, \"getContract\")(address, this.interface, this.signer);\n                  addContractWait(contract, tx);\n                  (0, properties_1.defineReadOnly)(contract, \"deployTransaction\", tx);\n                  return [2, contract];\n              }\n            });\n          });\n        };\n        ContractFactory2.prototype.attach = function(address) {\n          return this.constructor.getContract(address, this.interface, this.signer);\n        };\n        ContractFactory2.prototype.connect = function(signer) {\n          return new this.constructor(this.interface, this.bytecode, signer);\n        };\n        ContractFactory2.fromSolidity = function(compilerOutput, signer) {\n          if (compilerOutput == null) {\n            logger.throwError(\"missing compiler output\", logger_1.Logger.errors.MISSING_ARGUMENT, { argument: \"compilerOutput\" });\n          }\n          if (typeof compilerOutput === \"string\") {\n            compilerOutput = JSON.parse(compilerOutput);\n          }\n          var abi = compilerOutput.abi;\n          var bytecode = null;\n          if (compilerOutput.bytecode) {\n            bytecode = compilerOutput.bytecode;\n          } else if (compilerOutput.evm && compilerOutput.evm.bytecode) {\n            bytecode = compilerOutput.evm.bytecode;\n          }\n          return new this(abi, bytecode, signer);\n        };\n        ContractFactory2.getInterface = function(contractInterface) {\n          return Contract.getInterface(contractInterface);\n        };\n        ContractFactory2.getContractAddress = function(tx) {\n          return (0, address_1.getContractAddress)(tx);\n        };\n        ContractFactory2.getContract = function(address, contractInterface, signer) {\n          return new Contract(address, contractInterface, signer);\n        };\n        return ContractFactory2;\n      }()\n    );\n    exports2.ContractFactory = ContractFactory;\n  }\n});\n\n// node_modules/@ethersproject/basex/lib/index.js\nvar require_lib17 = __commonJS({\n  \"node_modules/@ethersproject/basex/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Base58 = exports2.Base32 = exports2.BaseX = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var BaseX = (\n      /** @class */\n      function() {\n        function BaseX2(alphabet) {\n          (0, properties_1.defineReadOnly)(this, \"alphabet\", alphabet);\n          (0, properties_1.defineReadOnly)(this, \"base\", alphabet.length);\n          (0, properties_1.defineReadOnly)(this, \"_alphabetMap\", {});\n          (0, properties_1.defineReadOnly)(this, \"_leader\", alphabet.charAt(0));\n          for (var i = 0; i < alphabet.length; i++) {\n            this._alphabetMap[alphabet.charAt(i)] = i;\n          }\n        }\n        BaseX2.prototype.encode = function(value) {\n          var source = (0, bytes_1.arrayify)(value);\n          if (source.length === 0) {\n            return \"\";\n          }\n          var digits = [0];\n          for (var i = 0; i < source.length; ++i) {\n            var carry = source[i];\n            for (var j = 0; j < digits.length; ++j) {\n              carry += digits[j] << 8;\n              digits[j] = carry % this.base;\n              carry = carry / this.base | 0;\n            }\n            while (carry > 0) {\n              digits.push(carry % this.base);\n              carry = carry / this.base | 0;\n            }\n          }\n          var string = \"\";\n          for (var k = 0; source[k] === 0 && k < source.length - 1; ++k) {\n            string += this._leader;\n          }\n          for (var q = digits.length - 1; q >= 0; --q) {\n            string += this.alphabet[digits[q]];\n          }\n          return string;\n        };\n        BaseX2.prototype.decode = function(value) {\n          if (typeof value !== \"string\") {\n            throw new TypeError(\"Expected String\");\n          }\n          var bytes = [];\n          if (value.length === 0) {\n            return new Uint8Array(bytes);\n          }\n          bytes.push(0);\n          for (var i = 0; i < value.length; i++) {\n            var byte = this._alphabetMap[value[i]];\n            if (byte === void 0) {\n              throw new Error(\"Non-base\" + this.base + \" character\");\n            }\n            var carry = byte;\n            for (var j = 0; j < bytes.length; ++j) {\n              carry += bytes[j] * this.base;\n              bytes[j] = carry & 255;\n              carry >>= 8;\n            }\n            while (carry > 0) {\n              bytes.push(carry & 255);\n              carry >>= 8;\n            }\n          }\n          for (var k = 0; value[k] === this._leader && k < value.length - 1; ++k) {\n            bytes.push(0);\n          }\n          return (0, bytes_1.arrayify)(new Uint8Array(bytes.reverse()));\n        };\n        return BaseX2;\n      }()\n    );\n    exports2.BaseX = BaseX;\n    var Base32 = new BaseX(\"abcdefghijklmnopqrstuvwxyz234567\");\n    exports2.Base32 = Base32;\n    var Base58 = new BaseX(\"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\");\n    exports2.Base58 = Base58;\n  }\n});\n\n// node_modules/@ethersproject/pbkdf2/lib/pbkdf2.js\nvar require_pbkdf2 = __commonJS({\n  \"node_modules/@ethersproject/pbkdf2/lib/pbkdf2.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.pbkdf2 = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    function bufferify(value) {\n      return Buffer.from((0, bytes_1.arrayify)(value));\n    }\n    function pbkdf2(password, salt, iterations, keylen, hashAlgorithm) {\n      return (0, bytes_1.hexlify)((0, crypto_1.pbkdf2Sync)(bufferify(password), bufferify(salt), iterations, keylen, hashAlgorithm));\n    }\n    exports2.pbkdf2 = pbkdf2;\n  }\n});\n\n// node_modules/@ethersproject/pbkdf2/lib/index.js\nvar require_lib18 = __commonJS({\n  \"node_modules/@ethersproject/pbkdf2/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.pbkdf2 = void 0;\n    var pbkdf2_1 = require_pbkdf2();\n    Object.defineProperty(exports2, \"pbkdf2\", { enumerable: true, get: function() {\n      return pbkdf2_1.pbkdf2;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/types.js\nvar require_types = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/types.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.SupportedAlgorithm = void 0;\n    var SupportedAlgorithm;\n    (function(SupportedAlgorithm2) {\n      SupportedAlgorithm2[\"sha256\"] = \"sha256\";\n      SupportedAlgorithm2[\"sha512\"] = \"sha512\";\n    })(SupportedAlgorithm = exports2.SupportedAlgorithm || (exports2.SupportedAlgorithm = {}));\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/_version.js\nvar require_version15 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"sha2/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/sha2.js\nvar require_sha2 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/sha2.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.computeHmac = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    var types_1 = require_types();\n    var logger_1 = require_lib();\n    var _version_1 = require_version15();\n    var logger = new logger_1.Logger(_version_1.version);\n    function ripemd160(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"ripemd160\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.ripemd160 = ripemd160;\n    function sha256(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"sha256\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.sha256 = sha256;\n    function sha512(data) {\n      return \"0x\" + (0, crypto_1.createHash)(\"sha512\").update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.sha512 = sha512;\n    function computeHmac(algorithm, key, data) {\n      if (!types_1.SupportedAlgorithm[algorithm]) {\n        logger.throwError(\"unsupported algorithm - \" + algorithm, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          operation: \"computeHmac\",\n          algorithm\n        });\n      }\n      return \"0x\" + (0, crypto_1.createHmac)(algorithm, Buffer.from((0, bytes_1.arrayify)(key))).update(Buffer.from((0, bytes_1.arrayify)(data))).digest(\"hex\");\n    }\n    exports2.computeHmac = computeHmac;\n  }\n});\n\n// node_modules/@ethersproject/sha2/lib/index.js\nvar require_lib19 = __commonJS({\n  \"node_modules/@ethersproject/sha2/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.SupportedAlgorithm = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = exports2.computeHmac = void 0;\n    var sha2_1 = require_sha2();\n    Object.defineProperty(exports2, \"computeHmac\", { enumerable: true, get: function() {\n      return sha2_1.computeHmac;\n    } });\n    Object.defineProperty(exports2, \"ripemd160\", { enumerable: true, get: function() {\n      return sha2_1.ripemd160;\n    } });\n    Object.defineProperty(exports2, \"sha256\", { enumerable: true, get: function() {\n      return sha2_1.sha256;\n    } });\n    Object.defineProperty(exports2, \"sha512\", { enumerable: true, get: function() {\n      return sha2_1.sha512;\n    } });\n    var types_1 = require_types();\n    Object.defineProperty(exports2, \"SupportedAlgorithm\", { enumerable: true, get: function() {\n      return types_1.SupportedAlgorithm;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/_version.js\nvar require_version16 = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"wordlists/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/wordlist.js\nvar require_wordlist = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/wordlist.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.logger = void 0;\n    var exportWordlist = false;\n    var hash_1 = require_lib10();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version16();\n    exports2.logger = new logger_1.Logger(_version_1.version);\n    var Wordlist = (\n      /** @class */\n      function() {\n        function Wordlist2(locale) {\n          var _newTarget = this.constructor;\n          exports2.logger.checkAbstract(_newTarget, Wordlist2);\n          (0, properties_1.defineReadOnly)(this, \"locale\", locale);\n        }\n        Wordlist2.prototype.split = function(mnemonic) {\n          return mnemonic.toLowerCase().split(/ +/g);\n        };\n        Wordlist2.prototype.join = function(words) {\n          return words.join(\" \");\n        };\n        Wordlist2.check = function(wordlist) {\n          var words = [];\n          for (var i = 0; i < 2048; i++) {\n            var word = wordlist.getWord(i);\n            if (i !== wordlist.getWordIndex(word)) {\n              return \"0x\";\n            }\n            words.push(word);\n          }\n          return (0, hash_1.id)(words.join(\"\\n\") + \"\\n\");\n        };\n        Wordlist2.register = function(lang, name2) {\n          if (!name2) {\n            name2 = lang.locale;\n          }\n          if (exportWordlist) {\n            try {\n              var anyGlobal = window;\n              if (anyGlobal._ethers && anyGlobal._ethers.wordlists) {\n                if (!anyGlobal._ethers.wordlists[name2]) {\n                  (0, properties_1.defineReadOnly)(anyGlobal._ethers.wordlists, name2, lang);\n                }\n              }\n            } catch (error) {\n            }\n          }\n        };\n        return Wordlist2;\n      }()\n    );\n    exports2.Wordlist = Wordlist;\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-cz.js\nvar require_lang_cz = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-cz.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langCz = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbdikaceAbecedaAdresaAgreseAkceAktovkaAlejAlkoholAmputaceAnanasAndulkaAnekdotaAnketaAntikaAnulovatArchaAroganceAsfaltAsistentAspiraceAstmaAstronomAtlasAtletikaAtolAutobusAzylBabkaBachorBacilBaculkaBadatelBagetaBagrBahnoBakterieBaladaBaletkaBalkonBalonekBalvanBalzaBambusBankomatBarbarBaretBarmanBarokoBarvaBaterkaBatohBavlnaBazalkaBazilikaBazukaBednaBeranBesedaBestieBetonBezinkaBezmocBeztakBicyklBidloBiftekBikinyBilanceBiografBiologBitvaBizonBlahobytBlatouchBlechaBleduleBleskBlikatBliznaBlokovatBlouditBludBobekBobrBodlinaBodnoutBohatostBojkotBojovatBokorysBolestBorecBoroviceBotaBoubelBouchatBoudaBouleBouratBoxerBradavkaBramboraBrankaBratrBreptaBriketaBrkoBrlohBronzBroskevBrunetkaBrusinkaBrzdaBrzyBublinaBubnovatBuchtaBuditelBudkaBudovaBufetBujarostBukviceBuldokBulvaBundaBunkrBurzaButikBuvolBuzolaBydletBylinaBytovkaBzukotCapartCarevnaCedrCeduleCejchCejnCelaCelerCelkemCelniceCeninaCennostCenovkaCentrumCenzorCestopisCetkaChalupaChapadloCharitaChataChechtatChemieChichotChirurgChladChlebaChlubitChmelChmuraChobotChocholChodbaCholeraChomoutChopitChorobaChovChrapotChrlitChrtChrupChtivostChudinaChutnatChvatChvilkaChvostChybaChystatChytitCibuleCigaretaCihelnaCihlaCinkotCirkusCisternaCitaceCitrusCizinecCizostClonaCokolivCouvatCtitelCtnostCudnostCuketaCukrCupotCvaknoutCvalCvikCvrkotCyklistaDalekoDarebaDatelDatumDceraDebataDechovkaDecibelDeficitDeflaceDeklDekretDemokratDepreseDerbyDeskaDetektivDikobrazDiktovatDiodaDiplomDiskDisplejDivadloDivochDlahaDlouhoDluhopisDnesDobroDobytekDocentDochutitDodnesDohledDohodaDohraDojemDojniceDokladDokolaDoktorDokumentDolarDolevaDolinaDomaDominantDomluvitDomovDonutitDopadDopisDoplnitDoposudDoprovodDopustitDorazitDorostDortDosahDoslovDostatekDosudDosytaDotazDotekDotknoutDoufatDoutnatDovozceDozaduDoznatDozorceDrahotaDrakDramatikDravecDrazeDrdolDrobnostDrogerieDrozdDrsnostDrtitDrzostDubenDuchovnoDudekDuhaDuhovkaDusitDusnoDutostDvojiceDvorecDynamitEkologEkonomieElektronElipsaEmailEmiseEmoceEmpatieEpizodaEpochaEpopejEposEsejEsenceEskortaEskymoEtiketaEuforieEvoluceExekuceExkurzeExpediceExplozeExportExtraktFackaFajfkaFakultaFanatikFantazieFarmacieFavoritFazoleFederaceFejetonFenkaFialkaFigurantFilozofFiltrFinanceFintaFixaceFjordFlanelFlirtFlotilaFondFosforFotbalFotkaFotonFrakceFreskaFrontaFukarFunkceFyzikaGalejeGarantGenetikaGeologGilotinaGlazuraGlejtGolemGolfistaGotikaGrafGramofonGranuleGrepGrilGrogGroteskaGumaHadiceHadrHalaHalenkaHanbaHanopisHarfaHarpunaHavranHebkostHejkalHejnoHejtmanHektarHelmaHematomHerecHernaHesloHezkyHistorikHladovkaHlasivkyHlavaHledatHlenHlodavecHlohHloupostHltatHlubinaHluchotaHmatHmotaHmyzHnisHnojivoHnoutHoblinaHobojHochHodinyHodlatHodnotaHodovatHojnostHokejHolinkaHolkaHolubHomoleHonitbaHonoraceHoralHordaHorizontHorkoHorlivecHormonHorninaHoroskopHorstvoHospodaHostinaHotovostHoubaHoufHoupatHouskaHovorHradbaHraniceHravostHrazdaHrbolekHrdinaHrdloHrdostHrnekHrobkaHromadaHrotHroudaHrozenHrstkaHrubostHryzatHubenostHubnoutHudbaHukotHumrHusitaHustotaHvozdHybnostHydrantHygienaHymnaHysterikIdylkaIhnedIkonaIluzeImunitaInfekceInflaceInkasoInovaceInspekceInternetInvalidaInvestorInzerceIronieJablkoJachtaJahodaJakmileJakostJalovecJantarJarmarkJaroJasanJasnoJatkaJavorJazykJedinecJedleJednatelJehlanJekotJelenJelitoJemnostJenomJepiceJeseterJevitJezdecJezeroJinakJindyJinochJiskraJistotaJitrniceJizvaJmenovatJogurtJurtaKabaretKabelKabinetKachnaKadetKadidloKahanKajakKajutaKakaoKaktusKalamitaKalhotyKalibrKalnostKameraKamkolivKamnaKanibalKanoeKantorKapalinaKapelaKapitolaKapkaKapleKapotaKaprKapustaKapybaraKaramelKarotkaKartonKasaKatalogKatedraKauceKauzaKavalecKazajkaKazetaKazivostKdekolivKdesiKedlubenKempKeramikaKinoKlacekKladivoKlamKlapotKlasikaKlaunKlecKlenbaKlepatKlesnoutKlidKlimaKlisnaKloboukKlokanKlopaKloubKlubovnaKlusatKluzkostKmenKmitatKmotrKnihaKnotKoaliceKoberecKobkaKoblihaKobylaKocourKohoutKojenecKokosKoktejlKolapsKoledaKolizeKoloKomandoKometaKomikKomnataKomoraKompasKomunitaKonatKonceptKondiceKonecKonfeseKongresKoninaKonkursKontaktKonzervaKopanecKopieKopnoutKoprovkaKorbelKorektorKormidloKoroptevKorpusKorunaKorytoKorzetKosatecKostkaKotelKotletaKotoulKoukatKoupelnaKousekKouzloKovbojKozaKozorohKrabiceKrachKrajinaKralovatKrasopisKravataKreditKrejcarKresbaKrevetaKriketKritikKrizeKrkavecKrmelecKrmivoKrocanKrokKronikaKropitKroupaKrovkaKrtekKruhadloKrupiceKrutostKrvinkaKrychleKryptaKrystalKrytKudlankaKufrKujnostKuklaKulajdaKulichKulkaKulometKulturaKunaKupodivuKurtKurzorKutilKvalitaKvasinkaKvestorKynologKyselinaKytaraKyticeKytkaKytovecKyvadloLabradorLachtanLadnostLaikLakomecLamelaLampaLanovkaLasiceLasoLasturaLatinkaLavinaLebkaLeckdyLedenLedniceLedovkaLedvinaLegendaLegieLegraceLehceLehkostLehnoutLektvarLenochodLentilkaLepenkaLepidloLetadloLetecLetmoLetokruhLevhartLevitaceLevobokLibraLichotkaLidojedLidskostLihovinaLijavecLilekLimetkaLinieLinkaLinoleumListopadLitinaLitovatLobistaLodivodLogikaLogopedLokalitaLoketLomcovatLopataLopuchLordLososLotrLoudalLouhLoukaLouskatLovecLstivostLucernaLuciferLumpLuskLustraceLviceLyraLyrikaLysinaMadamMadloMagistrMahagonMajetekMajitelMajoritaMakakMakoviceMakrelaMalbaMalinaMalovatMalviceMaminkaMandleMankoMarnostMasakrMaskotMasopustMaticeMatrikaMaturitaMazanecMazivoMazlitMazurkaMdlobaMechanikMeditaceMedovinaMelasaMelounMentolkaMetlaMetodaMetrMezeraMigraceMihnoutMihuleMikinaMikrofonMilenecMilimetrMilostMimikaMincovnaMinibarMinometMinulostMiskaMistrMixovatMladostMlhaMlhovinaMlokMlsatMluvitMnichMnohemMobilMocnostModelkaModlitbaMohylaMokroMolekulaMomentkaMonarchaMonoklMonstrumMontovatMonzunMosazMoskytMostMotivaceMotorkaMotykaMouchaMoudrostMozaikaMozekMozolMramorMravenecMrkevMrtvolaMrzetMrzutostMstitelMudrcMuflonMulatMumieMuniceMusetMutaceMuzeumMuzikantMyslivecMzdaNabouratNachytatNadaceNadbytekNadhozNadobroNadpisNahlasNahnatNahodileNahraditNaivitaNajednouNajistoNajmoutNaklonitNakonecNakrmitNalevoNamazatNamluvitNanometrNaokoNaopakNaostroNapadatNapevnoNaplnitNapnoutNaposledNaprostoNaroditNarubyNarychloNasaditNasekatNaslepoNastatNatolikNavenekNavrchNavzdoryNazvatNebeNechatNeckyNedalekoNedbatNeduhNegaceNehetNehodaNejenNejprveNeklidNelibostNemilostNemocNeochotaNeonkaNepokojNerostNervNesmyslNesouladNetvorNeuronNevinaNezvykleNicotaNijakNikamNikdyNiklNikterakNitroNoclehNohaviceNominaceNoraNorekNositelNosnostNouzeNovinyNovotaNozdraNudaNudleNugetNutitNutnostNutrieNymfaObalObarvitObavaObdivObecObehnatObejmoutObezitaObhajobaObilniceObjasnitObjektObklopitOblastOblekOblibaOblohaObludaObnosObohatitObojekOboutObrazecObrnaObrubaObrysObsahObsluhaObstaratObuvObvazObvinitObvodObvykleObyvatelObzorOcasOcelOcenitOchladitOchotaOchranaOcitnoutOdbojOdbytOdchodOdcizitOdebratOdeslatOdevzdatOdezvaOdhadceOdhoditOdjetOdjinudOdkazOdkoupitOdlivOdlukaOdmlkaOdolnostOdpadOdpisOdploutOdporOdpustitOdpykatOdrazkaOdsouditOdstupOdsunOdtokOdtudOdvahaOdvetaOdvolatOdvracetOdznakOfinaOfsajdOhlasOhniskoOhradaOhrozitOhryzekOkapOkeniceOklikaOknoOkouzlitOkovyOkrasaOkresOkrsekOkruhOkupantOkurkaOkusitOlejninaOlizovatOmakOmeletaOmezitOmladinaOmlouvatOmluvaOmylOnehdyOpakovatOpasekOperaceOpiceOpilostOpisovatOporaOpoziceOpravduOprotiOrbitalOrchestrOrgieOrliceOrlojOrtelOsadaOschnoutOsikaOsivoOslavaOslepitOslnitOslovitOsnovaOsobaOsolitOspalecOstenOstrahaOstudaOstychOsvojitOteplitOtiskOtopOtrhatOtrlostOtrokOtrubyOtvorOvanoutOvarOvesOvlivnitOvoceOxidOzdobaPachatelPacientPadouchPahorekPaktPalandaPalecPalivoPalubaPamfletPamlsekPanenkaPanikaPannaPanovatPanstvoPantoflePaprikaParketaParodiePartaParukaParybaPasekaPasivitaPastelkaPatentPatronaPavoukPaznehtPazourekPeckaPedagogPejsekPekloPelotonPenaltaPendrekPenzePeriskopPeroPestrostPetardaPeticePetrolejPevninaPexesoPianistaPihaPijavicePiklePiknikPilinaPilnostPilulkaPinzetaPipetaPisatelPistolePitevnaPivnicePivovarPlacentaPlakatPlamenPlanetaPlastikaPlatitPlavidloPlazPlechPlemenoPlentaPlesPletivoPlevelPlivatPlnitPlnoPlochaPlodinaPlombaPloutPlukPlynPobavitPobytPochodPocitPoctivecPodatPodcenitPodepsatPodhledPodivitPodkladPodmanitPodnikPodobaPodporaPodrazPodstataPodvodPodzimPoeziePohankaPohnutkaPohovorPohromaPohybPointaPojistkaPojmoutPokazitPoklesPokojPokrokPokutaPokynPolednePolibekPolknoutPolohaPolynomPomaluPominoutPomlkaPomocPomstaPomysletPonechatPonorkaPonurostPopadatPopelPopisekPoplachPoprositPopsatPopudPoradcePorcePorodPoruchaPoryvPosaditPosedPosilaPoskokPoslanecPosouditPospoluPostavaPosudekPosypPotahPotkanPotleskPotomekPotravaPotupaPotvoraPoukazPoutoPouzdroPovahaPovidlaPovlakPovozPovrchPovstatPovykPovzdechPozdravPozemekPoznatekPozorPozvatPracovatPrahoryPraktikaPralesPraotecPraporekPrasePravdaPrincipPrknoProbuditProcentoProdejProfeseProhraProjektProlomitPromilePronikatPropadProrokProsbaProtonProutekProvazPrskavkaPrstenPrudkostPrutPrvekPrvohoryPsanecPsovodPstruhPtactvoPubertaPuchPudlPukavecPuklinaPukrlePultPumpaPuncPupenPusaPusinkaPustinaPutovatPutykaPyramidaPyskPytelRacekRachotRadiaceRadniceRadonRaftRagbyRaketaRakovinaRamenoRampouchRandeRarachRaritaRasovnaRastrRatolestRazanceRazidloReagovatReakceReceptRedaktorReferentReflexRejnokReklamaRekordRekrutRektorReputaceRevizeRevmaRevolverRezervaRiskovatRizikoRobotikaRodokmenRohovkaRokleRokokoRomanetoRopovodRopuchaRorejsRosolRostlinaRotmistrRotopedRotundaRoubenkaRouchoRoupRouraRovinaRovniceRozborRozchodRozdatRozeznatRozhodceRozinkaRozjezdRozkazRozlohaRozmarRozpadRozruchRozsahRoztokRozumRozvodRubrikaRuchadloRukaviceRukopisRybaRybolovRychlostRydloRypadloRytinaRyzostSadistaSahatSakoSamecSamizdatSamotaSanitkaSardinkaSasankaSatelitSazbaSazeniceSborSchovatSebrankaSeceseSedadloSedimentSedloSehnatSejmoutSekeraSektaSekundaSekvojeSemenoSenoServisSesaditSeshoraSeskokSeslatSestraSesuvSesypatSetbaSetinaSetkatSetnoutSetrvatSeverSeznamShodaShrnoutSifonSilniceSirkaSirotekSirupSituaceSkafandrSkaliskoSkanzenSkautSkeptikSkicaSkladbaSkleniceSkloSkluzSkobaSkokanSkoroSkriptaSkrzSkupinaSkvostSkvrnaSlabikaSladidloSlaninaSlastSlavnostSledovatSlepecSlevaSlezinaSlibSlinaSlizniceSlonSloupekSlovoSluchSluhaSlunceSlupkaSlzaSmaragdSmetanaSmilstvoSmlouvaSmogSmradSmrkSmrtkaSmutekSmyslSnadSnahaSnobSobotaSochaSodovkaSokolSopkaSotvaSoubojSoucitSoudceSouhlasSouladSoumrakSoupravaSousedSoutokSouvisetSpalovnaSpasitelSpisSplavSpodekSpojenecSpoluSponzorSpornostSpoustaSprchaSpustitSrandaSrazSrdceSrnaSrnecSrovnatSrpenSrstSrubStaniceStarostaStatikaStavbaStehnoStezkaStodolaStolekStopaStornoStoupatStrachStresStrhnoutStromStrunaStudnaStupniceStvolStykSubjektSubtropySucharSudostSuknoSundatSunoutSurikataSurovinaSvahSvalstvoSvetrSvatbaSvazekSvisleSvitekSvobodaSvodidloSvorkaSvrabSykavkaSykotSynekSynovecSypatSypkostSyrovostSyselSytostTabletkaTabuleTahounTajemnoTajfunTajgaTajitTajnostTaktikaTamhleTamponTancovatTanecTankerTapetaTaveninaTazatelTechnikaTehdyTekutinaTelefonTemnotaTendenceTenistaTenorTeplotaTepnaTeprveTerapieTermoskaTextilTichoTiskopisTitulekTkadlecTkaninaTlapkaTleskatTlukotTlupaTmelToaletaTopinkaTopolTorzoTouhaToulecTradiceTraktorTrampTrasaTraverzaTrefitTrestTrezorTrhavinaTrhlinaTrochuTrojiceTroskaTroubaTrpceTrpitelTrpkostTrubecTruchlitTruhliceTrusTrvatTudyTuhnoutTuhostTundraTuristaTurnajTuzemskoTvarohTvorbaTvrdostTvrzTygrTykevUbohostUbozeUbratUbrousekUbrusUbytovnaUchoUctivostUdivitUhraditUjednatUjistitUjmoutUkazatelUklidnitUklonitUkotvitUkrojitUliceUlitaUlovitUmyvadloUnavitUniformaUniknoutUpadnoutUplatnitUplynoutUpoutatUpravitUranUrazitUsednoutUsilovatUsmrtitUsnadnitUsnoutUsouditUstlatUstrnoutUtahovatUtkatUtlumitUtonoutUtopenecUtrousitUvalitUvolnitUvozovkaUzdravitUzelUzeninaUzlinaUznatVagonValchaValounVanaVandalVanilkaVaranVarhanyVarovatVcelkuVchodVdovaVedroVegetaceVejceVelbloudVeletrhVelitelVelmocVelrybaVenkovVerandaVerzeVeselkaVeskrzeVesniceVespoduVestaVeterinaVeverkaVibraceVichrVideohraVidinaVidleVilaViniceVisetVitalitaVizeVizitkaVjezdVkladVkusVlajkaVlakVlasecVlevoVlhkostVlivVlnovkaVloupatVnucovatVnukVodaVodivostVodoznakVodstvoVojenskyVojnaVojskoVolantVolbaVolitVolnoVoskovkaVozidloVozovnaVpravoVrabecVracetVrahVrataVrbaVrcholekVrhatVrstvaVrtuleVsaditVstoupitVstupVtipVybavitVybratVychovatVydatVydraVyfotitVyhledatVyhnoutVyhoditVyhraditVyhubitVyjasnitVyjetVyjmoutVyklopitVykonatVylekatVymazatVymezitVymizetVymysletVynechatVynikatVynutitVypadatVyplatitVypravitVypustitVyrazitVyrovnatVyrvatVyslovitVysokoVystavitVysunoutVysypatVytasitVytesatVytratitVyvinoutVyvolatVyvrhelVyzdobitVyznatVzaduVzbuditVzchopitVzdorVzduchVzdychatVzestupVzhledemVzkazVzlykatVznikVzorekVzpouraVztahVztekXylofonZabratZabydletZachovatZadarmoZadusitZafoukatZahltitZahoditZahradaZahynoutZajatecZajetZajistitZaklepatZakoupitZalepitZamezitZamotatZamysletZanechatZanikatZaplatitZapojitZapsatZarazitZastavitZasunoutZatajitZatemnitZatknoutZaujmoutZavalitZaveletZavinitZavolatZavrtatZazvonitZbavitZbrusuZbudovatZbytekZdalekaZdarmaZdatnostZdivoZdobitZdrojZdvihZdymadloZeleninaZemanZeminaZeptatZezaduZezdolaZhatitZhltnoutZhlubokaZhotovitZhrubaZimaZimniceZjemnitZklamatZkoumatZkratkaZkumavkaZlatoZlehkaZlobaZlomZlostZlozvykZmapovatZmarZmatekZmijeZmizetZmocnitZmodratZmrzlinaZmutovatZnakZnalostZnamenatZnovuZobrazitZotavitZoubekZoufaleZploditZpomalitZpravaZprostitZprudkaZprvuZradaZranitZrcadloZrnitostZrnoZrovnaZrychlitZrzavostZtichaZtratitZubovinaZubrZvednoutZvenkuZveselaZvonZvratZvukovodZvyk\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x25f44555f4af25b51a711136e1c7d6e50ce9f8917d39d6b1f076b2bb4d2fac1a\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for en (English) FAILED\");\n      }\n    }\n    var LangCz = (\n      /** @class */\n      function(_super) {\n        __extends(LangCz2, _super);\n        function LangCz2() {\n          return _super.call(this, \"cz\") || this;\n        }\n        LangCz2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangCz2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangCz2;\n      }(wordlist_1.Wordlist)\n    );\n    var langCz = new LangCz();\n    exports2.langCz = langCz;\n    wordlist_1.Wordlist.register(langCz);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-en.js\nvar require_lang_en = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-en.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langEn = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbandonAbilityAbleAboutAboveAbsentAbsorbAbstractAbsurdAbuseAccessAccidentAccountAccuseAchieveAcidAcousticAcquireAcrossActActionActorActressActualAdaptAddAddictAddressAdjustAdmitAdultAdvanceAdviceAerobicAffairAffordAfraidAgainAgeAgentAgreeAheadAimAirAirportAisleAlarmAlbumAlcoholAlertAlienAllAlleyAllowAlmostAloneAlphaAlreadyAlsoAlterAlwaysAmateurAmazingAmongAmountAmusedAnalystAnchorAncientAngerAngleAngryAnimalAnkleAnnounceAnnualAnotherAnswerAntennaAntiqueAnxietyAnyApartApologyAppearAppleApproveAprilArchArcticAreaArenaArgueArmArmedArmorArmyAroundArrangeArrestArriveArrowArtArtefactArtistArtworkAskAspectAssaultAssetAssistAssumeAsthmaAthleteAtomAttackAttendAttitudeAttractAuctionAuditAugustAuntAuthorAutoAutumnAverageAvocadoAvoidAwakeAwareAwayAwesomeAwfulAwkwardAxisBabyBachelorBaconBadgeBagBalanceBalconyBallBambooBananaBannerBarBarelyBargainBarrelBaseBasicBasketBattleBeachBeanBeautyBecauseBecomeBeefBeforeBeginBehaveBehindBelieveBelowBeltBenchBenefitBestBetrayBetterBetweenBeyondBicycleBidBikeBindBiologyBirdBirthBitterBlackBladeBlameBlanketBlastBleakBlessBlindBloodBlossomBlouseBlueBlurBlushBoardBoatBodyBoilBombBoneBonusBookBoostBorderBoringBorrowBossBottomBounceBoxBoyBracketBrainBrandBrassBraveBreadBreezeBrickBridgeBriefBrightBringBriskBroccoliBrokenBronzeBroomBrotherBrownBrushBubbleBuddyBudgetBuffaloBuildBulbBulkBulletBundleBunkerBurdenBurgerBurstBusBusinessBusyButterBuyerBuzzCabbageCabinCableCactusCageCakeCallCalmCameraCampCanCanalCancelCandyCannonCanoeCanvasCanyonCapableCapitalCaptainCarCarbonCardCargoCarpetCarryCartCaseCashCasinoCastleCasualCatCatalogCatchCategoryCattleCaughtCauseCautionCaveCeilingCeleryCementCensusCenturyCerealCertainChairChalkChampionChangeChaosChapterChargeChaseChatCheapCheckCheeseChefCherryChestChickenChiefChildChimneyChoiceChooseChronicChuckleChunkChurnCigarCinnamonCircleCitizenCityCivilClaimClapClarifyClawClayCleanClerkCleverClickClientCliffClimbClinicClipClockClogCloseClothCloudClownClubClumpClusterClutchCoachCoastCoconutCodeCoffeeCoilCoinCollectColorColumnCombineComeComfortComicCommonCompanyConcertConductConfirmCongressConnectConsiderControlConvinceCookCoolCopperCopyCoralCoreCornCorrectCostCottonCouchCountryCoupleCourseCousinCoverCoyoteCrackCradleCraftCramCraneCrashCraterCrawlCrazyCreamCreditCreekCrewCricketCrimeCrispCriticCropCrossCrouchCrowdCrucialCruelCruiseCrumbleCrunchCrushCryCrystalCubeCultureCupCupboardCuriousCurrentCurtainCurveCushionCustomCuteCycleDadDamageDampDanceDangerDaringDashDaughterDawnDayDealDebateDebrisDecadeDecemberDecideDeclineDecorateDecreaseDeerDefenseDefineDefyDegreeDelayDeliverDemandDemiseDenialDentistDenyDepartDependDepositDepthDeputyDeriveDescribeDesertDesignDeskDespairDestroyDetailDetectDevelopDeviceDevoteDiagramDialDiamondDiaryDiceDieselDietDifferDigitalDignityDilemmaDinnerDinosaurDirectDirtDisagreeDiscoverDiseaseDishDismissDisorderDisplayDistanceDivertDivideDivorceDizzyDoctorDocumentDogDollDolphinDomainDonateDonkeyDonorDoorDoseDoubleDoveDraftDragonDramaDrasticDrawDreamDressDriftDrillDrinkDripDriveDropDrumDryDuckDumbDuneDuringDustDutchDutyDwarfDynamicEagerEagleEarlyEarnEarthEasilyEastEasyEchoEcologyEconomyEdgeEditEducateEffortEggEightEitherElbowElderElectricElegantElementElephantElevatorEliteElseEmbarkEmbodyEmbraceEmergeEmotionEmployEmpowerEmptyEnableEnactEndEndlessEndorseEnemyEnergyEnforceEngageEngineEnhanceEnjoyEnlistEnoughEnrichEnrollEnsureEnterEntireEntryEnvelopeEpisodeEqualEquipEraEraseErodeErosionErrorEruptEscapeEssayEssenceEstateEternalEthicsEvidenceEvilEvokeEvolveExactExampleExcessExchangeExciteExcludeExcuseExecuteExerciseExhaustExhibitExileExistExitExoticExpandExpectExpireExplainExposeExpressExtendExtraEyeEyebrowFabricFaceFacultyFadeFaintFaithFallFalseFameFamilyFamousFanFancyFantasyFarmFashionFatFatalFatherFatigueFaultFavoriteFeatureFebruaryFederalFeeFeedFeelFemaleFenceFestivalFetchFeverFewFiberFictionFieldFigureFileFilmFilterFinalFindFineFingerFinishFireFirmFirstFiscalFishFitFitnessFixFlagFlameFlashFlatFlavorFleeFlightFlipFloatFlockFloorFlowerFluidFlushFlyFoamFocusFogFoilFoldFollowFoodFootForceForestForgetForkFortuneForumForwardFossilFosterFoundFoxFragileFrameFrequentFreshFriendFringeFrogFrontFrostFrownFrozenFruitFuelFunFunnyFurnaceFuryFutureGadgetGainGalaxyGalleryGameGapGarageGarbageGardenGarlicGarmentGasGaspGateGatherGaugeGazeGeneralGeniusGenreGentleGenuineGestureGhostGiantGiftGiggleGingerGiraffeGirlGiveGladGlanceGlareGlassGlideGlimpseGlobeGloomGloryGloveGlowGlueGoatGoddessGoldGoodGooseGorillaGospelGossipGovernGownGrabGraceGrainGrantGrapeGrassGravityGreatGreenGridGriefGritGroceryGroupGrowGruntGuardGuessGuideGuiltGuitarGunGymHabitHairHalfHammerHamsterHandHappyHarborHardHarshHarvestHatHaveHawkHazardHeadHealthHeartHeavyHedgehogHeightHelloHelmetHelpHenHeroHiddenHighHillHintHipHireHistoryHobbyHockeyHoldHoleHolidayHollowHomeHoneyHoodHopeHornHorrorHorseHospitalHostHotelHourHoverHubHugeHumanHumbleHumorHundredHungryHuntHurdleHurryHurtHusbandHybridIceIconIdeaIdentifyIdleIgnoreIllIllegalIllnessImageImitateImmenseImmuneImpactImposeImproveImpulseInchIncludeIncomeIncreaseIndexIndicateIndoorIndustryInfantInflictInformInhaleInheritInitialInjectInjuryInmateInnerInnocentInputInquiryInsaneInsectInsideInspireInstallIntactInterestIntoInvestInviteInvolveIronIslandIsolateIssueItemIvoryJacketJaguarJarJazzJealousJeansJellyJewelJobJoinJokeJourneyJoyJudgeJuiceJumpJungleJuniorJunkJustKangarooKeenKeepKetchupKeyKickKidKidneyKindKingdomKissKitKitchenKiteKittenKiwiKneeKnifeKnockKnowLabLabelLaborLadderLadyLakeLampLanguageLaptopLargeLaterLatinLaughLaundryLavaLawLawnLawsuitLayerLazyLeaderLeafLearnLeaveLectureLeftLegLegalLegendLeisureLemonLendLengthLensLeopardLessonLetterLevelLiarLibertyLibraryLicenseLifeLiftLightLikeLimbLimitLinkLionLiquidListLittleLiveLizardLoadLoanLobsterLocalLockLogicLonelyLongLoopLotteryLoudLoungeLoveLoyalLuckyLuggageLumberLunarLunchLuxuryLyricsMachineMadMagicMagnetMaidMailMainMajorMakeMammalManManageMandateMangoMansionManualMapleMarbleMarchMarginMarineMarketMarriageMaskMassMasterMatchMaterialMathMatrixMatterMaximumMazeMeadowMeanMeasureMeatMechanicMedalMediaMelodyMeltMemberMemoryMentionMenuMercyMergeMeritMerryMeshMessageMetalMethodMiddleMidnightMilkMillionMimicMindMinimumMinorMinuteMiracleMirrorMiseryMissMistakeMixMixedMixtureMobileModelModifyMomMomentMonitorMonkeyMonsterMonthMoonMoralMoreMorningMosquitoMotherMotionMotorMountainMouseMoveMovieMuchMuffinMuleMultiplyMuscleMuseumMushroomMusicMustMutualMyselfMysteryMythNaiveNameNapkinNarrowNastyNationNatureNearNeckNeedNegativeNeglectNeitherNephewNerveNestNetNetworkNeutralNeverNewsNextNiceNightNobleNoiseNomineeNoodleNormalNorthNoseNotableNoteNothingNoticeNovelNowNuclearNumberNurseNutOakObeyObjectObligeObscureObserveObtainObviousOccurOceanOctoberOdorOffOfferOfficeOftenOilOkayOldOliveOlympicOmitOnceOneOnionOnlineOnlyOpenOperaOpinionOpposeOptionOrangeOrbitOrchardOrderOrdinaryOrganOrientOriginalOrphanOstrichOtherOutdoorOuterOutputOutsideOvalOvenOverOwnOwnerOxygenOysterOzonePactPaddlePagePairPalacePalmPandaPanelPanicPantherPaperParadeParentParkParrotPartyPassPatchPathPatientPatrolPatternPausePavePaymentPeacePeanutPearPeasantPelicanPenPenaltyPencilPeoplePepperPerfectPermitPersonPetPhonePhotoPhrasePhysicalPianoPicnicPicturePiecePigPigeonPillPilotPinkPioneerPipePistolPitchPizzaPlacePlanetPlasticPlatePlayPleasePledgePluckPlugPlungePoemPoetPointPolarPolePolicePondPonyPoolPopularPortionPositionPossiblePostPotatoPotteryPovertyPowderPowerPracticePraisePredictPreferPreparePresentPrettyPreventPricePridePrimaryPrintPriorityPrisonPrivatePrizeProblemProcessProduceProfitProgramProjectPromoteProofPropertyProsperProtectProudProvidePublicPuddingPullPulpPulsePumpkinPunchPupilPuppyPurchasePurityPurposePursePushPutPuzzlePyramidQualityQuantumQuarterQuestionQuickQuitQuizQuoteRabbitRaccoonRaceRackRadarRadioRailRainRaiseRallyRampRanchRandomRangeRapidRareRateRatherRavenRawRazorReadyRealReasonRebelRebuildRecallReceiveRecipeRecordRecycleReduceReflectReformRefuseRegionRegretRegularRejectRelaxReleaseReliefRelyRemainRememberRemindRemoveRenderRenewRentReopenRepairRepeatReplaceReportRequireRescueResembleResistResourceResponseResultRetireRetreatReturnReunionRevealReviewRewardRhythmRibRibbonRiceRichRideRidgeRifleRightRigidRingRiotRippleRiskRitualRivalRiverRoadRoastRobotRobustRocketRomanceRoofRookieRoomRoseRotateRoughRoundRouteRoyalRubberRudeRugRuleRunRunwayRuralSadSaddleSadnessSafeSailSaladSalmonSalonSaltSaluteSameSampleSandSatisfySatoshiSauceSausageSaveSayScaleScanScareScatterSceneSchemeSchoolScienceScissorsScorpionScoutScrapScreenScriptScrubSeaSearchSeasonSeatSecondSecretSectionSecuritySeedSeekSegmentSelectSellSeminarSeniorSenseSentenceSeriesServiceSessionSettleSetupSevenShadowShaftShallowShareShedShellSheriffShieldShiftShineShipShiverShockShoeShootShopShortShoulderShoveShrimpShrugShuffleShySiblingSickSideSiegeSightSignSilentSilkSillySilverSimilarSimpleSinceSingSirenSisterSituateSixSizeSkateSketchSkiSkillSkinSkirtSkullSlabSlamSleepSlenderSliceSlideSlightSlimSloganSlotSlowSlushSmallSmartSmileSmokeSmoothSnackSnakeSnapSniffSnowSoapSoccerSocialSockSodaSoftSolarSoldierSolidSolutionSolveSomeoneSongSoonSorrySortSoulSoundSoupSourceSouthSpaceSpareSpatialSpawnSpeakSpecialSpeedSpellSpendSphereSpiceSpiderSpikeSpinSpiritSplitSpoilSponsorSpoonSportSpotSpraySpreadSpringSpySquareSqueezeSquirrelStableStadiumStaffStageStairsStampStandStartStateStaySteakSteelStemStepStereoStickStillStingStockStomachStoneStoolStoryStoveStrategyStreetStrikeStrongStruggleStudentStuffStumbleStyleSubjectSubmitSubwaySuccessSuchSuddenSufferSugarSuggestSuitSummerSunSunnySunsetSuperSupplySupremeSureSurfaceSurgeSurpriseSurroundSurveySuspectSustainSwallowSwampSwapSwarmSwearSweetSwiftSwimSwingSwitchSwordSymbolSymptomSyrupSystemTableTackleTagTailTalentTalkTankTapeTargetTaskTasteTattooTaxiTeachTeamTellTenTenantTennisTentTermTestTextThankThatThemeThenTheoryThereTheyThingThisThoughtThreeThriveThrowThumbThunderTicketTideTigerTiltTimberTimeTinyTipTiredTissueTitleToastTobaccoTodayToddlerToeTogetherToiletTokenTomatoTomorrowToneTongueTonightToolToothTopTopicToppleTorchTornadoTortoiseTossTotalTouristTowardTowerTownToyTrackTradeTrafficTragicTrainTransferTrapTrashTravelTrayTreatTreeTrendTrialTribeTrickTriggerTrimTripTrophyTroubleTruckTrueTrulyTrumpetTrustTruthTryTubeTuitionTumbleTunaTunnelTurkeyTurnTurtleTwelveTwentyTwiceTwinTwistTwoTypeTypicalUglyUmbrellaUnableUnawareUncleUncoverUnderUndoUnfairUnfoldUnhappyUniformUniqueUnitUniverseUnknownUnlockUntilUnusualUnveilUpdateUpgradeUpholdUponUpperUpsetUrbanUrgeUsageUseUsedUsefulUselessUsualUtilityVacantVacuumVagueValidValleyValveVanVanishVaporVariousVastVaultVehicleVelvetVendorVentureVenueVerbVerifyVersionVeryVesselVeteranViableVibrantViciousVictoryVideoViewVillageVintageViolinVirtualVirusVisaVisitVisualVitalVividVocalVoiceVoidVolcanoVolumeVoteVoyageWageWagonWaitWalkWallWalnutWantWarfareWarmWarriorWashWaspWasteWaterWaveWayWealthWeaponWearWeaselWeatherWebWeddingWeekendWeirdWelcomeWestWetWhaleWhatWheatWheelWhenWhereWhipWhisperWideWidthWifeWildWillWinWindowWineWingWinkWinnerWinterWireWisdomWiseWishWitnessWolfWomanWonderWoodWoolWordWorkWorldWorryWorthWrapWreckWrestleWristWriteWrongYardYearYellowYouYoungYouthZebraZeroZoneZoo\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x3c8acc1e7b08d8e76f9fda015ef48dc8c710a73cb7e0f77b2c18a9b5a7adde60\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for en (English) FAILED\");\n      }\n    }\n    var LangEn = (\n      /** @class */\n      function(_super) {\n        __extends(LangEn2, _super);\n        function LangEn2() {\n          return _super.call(this, \"en\") || this;\n        }\n        LangEn2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangEn2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangEn2;\n      }(wordlist_1.Wordlist)\n    );\n    var langEn = new LangEn();\n    exports2.langEn = langEn;\n    wordlist_1.Wordlist.register(langEn);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-es.js\nvar require_lang_es = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-es.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langEs = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var words = \"A/bacoAbdomenAbejaAbiertoAbogadoAbonoAbortoAbrazoAbrirAbueloAbusoAcabarAcademiaAccesoAccio/nAceiteAcelgaAcentoAceptarA/cidoAclararAcne/AcogerAcosoActivoActoActrizActuarAcudirAcuerdoAcusarAdictoAdmitirAdoptarAdornoAduanaAdultoAe/reoAfectarAficio/nAfinarAfirmarA/gilAgitarAgoni/aAgostoAgotarAgregarAgrioAguaAgudoA/guilaAgujaAhogoAhorroAireAislarAjedrezAjenoAjusteAlacra/nAlambreAlarmaAlbaA/lbumAlcaldeAldeaAlegreAlejarAlertaAletaAlfilerAlgaAlgodo/nAliadoAlientoAlivioAlmaAlmejaAlmi/barAltarAltezaAltivoAltoAlturaAlumnoAlzarAmableAmanteAmapolaAmargoAmasarA/mbarA/mbitoAmenoAmigoAmistadAmorAmparoAmplioAnchoAncianoAnclaAndarAnde/nAnemiaA/nguloAnilloA/nimoAni/sAnotarAntenaAntiguoAntojoAnualAnularAnuncioA~adirA~ejoA~oApagarAparatoApetitoApioAplicarApodoAporteApoyoAprenderAprobarApuestaApuroAradoAra~aArarA/rbitroA/rbolArbustoArchivoArcoArderArdillaArduoA/reaA/ridoAriesArmoni/aArne/sAromaArpaArpo/nArregloArrozArrugaArteArtistaAsaAsadoAsaltoAscensoAsegurarAseoAsesorAsientoAsiloAsistirAsnoAsombroA/speroAstillaAstroAstutoAsumirAsuntoAtajoAtaqueAtarAtentoAteoA/ticoAtletaA/tomoAtraerAtrozAtu/nAudazAudioAugeAulaAumentoAusenteAutorAvalAvanceAvaroAveAvellanaAvenaAvestruzAvio/nAvisoAyerAyudaAyunoAzafra/nAzarAzoteAzu/carAzufreAzulBabaBaborBacheBahi/aBaileBajarBalanzaBalco/nBaldeBambu/BancoBandaBa~oBarbaBarcoBarnizBarroBa/sculaBasto/nBasuraBatallaBateri/aBatirBatutaBau/lBazarBebe/BebidaBelloBesarBesoBestiaBichoBienBingoBlancoBloqueBlusaBoaBobinaBoboBocaBocinaBodaBodegaBoinaBolaBoleroBolsaBombaBondadBonitoBonoBonsa/iBordeBorrarBosqueBoteBoti/nBo/vedaBozalBravoBrazoBrechaBreveBrilloBrincoBrisaBrocaBromaBronceBroteBrujaBruscoBrutoBuceoBucleBuenoBueyBufandaBufo/nBu/hoBuitreBultoBurbujaBurlaBurroBuscarButacaBuzo/nCaballoCabezaCabinaCabraCacaoCada/verCadenaCaerCafe/Cai/daCaima/nCajaCajo/nCalCalamarCalcioCaldoCalidadCalleCalmaCalorCalvoCamaCambioCamelloCaminoCampoCa/ncerCandilCanelaCanguroCanicaCantoCa~aCa~o/nCaobaCaosCapazCapita/nCapoteCaptarCapuchaCaraCarbo/nCa/rcelCaretaCargaCari~oCarneCarpetaCarroCartaCasaCascoCaseroCaspaCastorCatorceCatreCaudalCausaCazoCebollaCederCedroCeldaCe/lebreCelosoCe/lulaCementoCenizaCentroCercaCerdoCerezaCeroCerrarCertezaCe/spedCetroChacalChalecoChampu/ChanclaChapaCharlaChicoChisteChivoChoqueChozaChuletaChuparCiclo/nCiegoCieloCienCiertoCifraCigarroCimaCincoCineCintaCipre/sCircoCiruelaCisneCitaCiudadClamorClanClaroClaseClaveClienteClimaCli/nicaCobreCoccio/nCochinoCocinaCocoCo/digoCodoCofreCogerCoheteCoji/nCojoColaColchaColegioColgarColinaCollarColmoColumnaCombateComerComidaCo/modoCompraCondeConejoCongaConocerConsejoContarCopaCopiaCorazo/nCorbataCorchoCordo/nCoronaCorrerCoserCosmosCostaCra/neoCra/terCrearCrecerCrei/doCremaCri/aCrimenCriptaCrisisCromoCro/nicaCroquetaCrudoCruzCuadroCuartoCuatroCuboCubrirCucharaCuelloCuentoCuerdaCuestaCuevaCuidarCulebraCulpaCultoCumbreCumplirCunaCunetaCuotaCupo/nCu/pulaCurarCuriosoCursoCurvaCutisDamaDanzaDarDardoDa/tilDeberDe/bilDe/cadaDecirDedoDefensaDefinirDejarDelfi/nDelgadoDelitoDemoraDensoDentalDeporteDerechoDerrotaDesayunoDeseoDesfileDesnudoDestinoDesvi/oDetalleDetenerDeudaDi/aDiabloDiademaDiamanteDianaDiarioDibujoDictarDienteDietaDiezDifi/cilDignoDilemaDiluirDineroDirectoDirigirDiscoDise~oDisfrazDivaDivinoDobleDoceDolorDomingoDonDonarDoradoDormirDorsoDosDosisDrago/nDrogaDuchaDudaDueloDue~oDulceDu/oDuqueDurarDurezaDuroE/banoEbrioEcharEcoEcuadorEdadEdicio/nEdificioEditorEducarEfectoEficazEjeEjemploElefanteElegirElementoElevarElipseE/liteElixirElogioEludirEmbudoEmitirEmocio/nEmpateEmpe~oEmpleoEmpresaEnanoEncargoEnchufeEnci/aEnemigoEneroEnfadoEnfermoEnga~oEnigmaEnlaceEnormeEnredoEnsayoEnse~arEnteroEntrarEnvaseEnvi/oE/pocaEquipoErizoEscalaEscenaEscolarEscribirEscudoEsenciaEsferaEsfuerzoEspadaEspejoEspi/aEsposaEspumaEsqui/EstarEsteEstiloEstufaEtapaEternoE/ticaEtniaEvadirEvaluarEventoEvitarExactoExamenExcesoExcusaExentoExigirExilioExistirE/xitoExpertoExplicarExponerExtremoFa/bricaFa/bulaFachadaFa/cilFactorFaenaFajaFaldaFalloFalsoFaltarFamaFamiliaFamosoFarao/nFarmaciaFarolFarsaFaseFatigaFaunaFavorFaxFebreroFechaFelizFeoFeriaFerozFe/rtilFervorFesti/nFiableFianzaFiarFibraFiccio/nFichaFideoFiebreFielFieraFiestaFiguraFijarFijoFilaFileteFilialFiltroFinFincaFingirFinitoFirmaFlacoFlautaFlechaFlorFlotaFluirFlujoFlu/orFobiaFocaFogataFogo/nFolioFolletoFondoFormaForroFortunaForzarFosaFotoFracasoFra/gilFranjaFraseFraudeFrei/rFrenoFresaFri/oFritoFrutaFuegoFuenteFuerzaFugaFumarFuncio/nFundaFurgo/nFuriaFusilFu/tbolFuturoGacelaGafasGaitaGajoGalaGaleri/aGalloGambaGanarGanchoGangaGansoGarajeGarzaGasolinaGastarGatoGavila/nGemeloGemirGenGe/neroGenioGenteGeranioGerenteGermenGestoGiganteGimnasioGirarGiroGlaciarGloboGloriaGolGolfoGolosoGolpeGomaGordoGorilaGorraGotaGoteoGozarGradaGra/ficoGranoGrasaGratisGraveGrietaGrilloGripeGrisGritoGrosorGru/aGruesoGrumoGrupoGuanteGuapoGuardiaGuerraGui/aGui~oGuionGuisoGuitarraGusanoGustarHaberHa/bilHablarHacerHachaHadaHallarHamacaHarinaHazHaza~aHebillaHebraHechoHeladoHelioHembraHerirHermanoHe/roeHervirHieloHierroHi/gadoHigieneHijoHimnoHistoriaHocicoHogarHogueraHojaHombreHongoHonorHonraHoraHormigaHornoHostilHoyoHuecoHuelgaHuertaHuesoHuevoHuidaHuirHumanoHu/medoHumildeHumoHundirHuraca/nHurtoIconoIdealIdiomaI/doloIglesiaIglu/IgualIlegalIlusio/nImagenIma/nImitarImparImperioImponerImpulsoIncapazI/ndiceInerteInfielInformeIngenioInicioInmensoInmuneInnatoInsectoInstanteIntere/sI/ntimoIntuirInu/tilInviernoIraIrisIroni/aIslaIsloteJabali/Jabo/nJamo/nJarabeJardi/nJarraJaulaJazmi/nJefeJeringaJineteJornadaJorobaJovenJoyaJuergaJuevesJuezJugadorJugoJugueteJuicioJuncoJunglaJunioJuntarJu/piterJurarJustoJuvenilJuzgarKiloKoalaLabioLacioLacraLadoLadro/nLagartoLa/grimaLagunaLaicoLamerLa/minaLa/mparaLanaLanchaLangostaLanzaLa/pizLargoLarvaLa/stimaLataLa/texLatirLaurelLavarLazoLealLeccio/nLecheLectorLeerLegio/nLegumbreLejanoLenguaLentoLe~aLeo/nLeopardoLesio/nLetalLetraLeveLeyendaLibertadLibroLicorLi/derLidiarLienzoLigaLigeroLimaLi/miteLimo/nLimpioLinceLindoLi/neaLingoteLinoLinternaLi/quidoLisoListaLiteraLitioLitroLlagaLlamaLlantoLlaveLlegarLlenarLlevarLlorarLloverLluviaLoboLocio/nLocoLocuraLo/gicaLogroLombrizLomoLonjaLoteLuchaLucirLugarLujoLunaLunesLupaLustroLutoLuzMacetaMachoMaderaMadreMaduroMaestroMafiaMagiaMagoMai/zMaldadMaletaMallaMaloMama/MamboMamutMancoMandoManejarMangaManiqui/ManjarManoMansoMantaMa~anaMapaMa/quinaMarMarcoMareaMarfilMargenMaridoMa/rmolMarro/nMartesMarzoMasaMa/scaraMasivoMatarMateriaMatizMatrizMa/ximoMayorMazorcaMechaMedallaMedioMe/dulaMejillaMejorMelenaMelo/nMemoriaMenorMensajeMenteMenu/MercadoMerengueMe/ritoMesMeso/nMetaMeterMe/todoMetroMezclaMiedoMielMiembroMigaMilMilagroMilitarMillo/nMimoMinaMineroMi/nimoMinutoMiopeMirarMisaMiseriaMisilMismoMitadMitoMochilaMocio/nModaModeloMohoMojarMoldeMolerMolinoMomentoMomiaMonarcaMonedaMonjaMontoMo~oMoradaMorderMorenoMorirMorroMorsaMortalMoscaMostrarMotivoMoverMo/vilMozoMuchoMudarMuebleMuelaMuerteMuestraMugreMujerMulaMuletaMultaMundoMu~ecaMuralMuroMu/sculoMuseoMusgoMu/sicaMusloNa/carNacio/nNadarNaipeNaranjaNarizNarrarNasalNatalNativoNaturalNa/useaNavalNaveNavidadNecioNe/ctarNegarNegocioNegroNeo/nNervioNetoNeutroNevarNeveraNichoNidoNieblaNietoNi~ezNi~oNi/tidoNivelNoblezaNocheNo/minaNoriaNormaNorteNotaNoticiaNovatoNovelaNovioNubeNucaNu/cleoNudilloNudoNueraNueveNuezNuloNu/meroNutriaOasisObesoObispoObjetoObraObreroObservarObtenerObvioOcaOcasoOce/anoOchentaOchoOcioOcreOctavoOctubreOcultoOcuparOcurrirOdiarOdioOdiseaOesteOfensaOfertaOficioOfrecerOgroOi/doOi/rOjoOlaOleadaOlfatoOlivoOllaOlmoOlorOlvidoOmbligoOndaOnzaOpacoOpcio/nO/peraOpinarOponerOptarO/pticaOpuestoOracio/nOradorOralO/rbitaOrcaOrdenOrejaO/rganoOrgi/aOrgulloOrienteOrigenOrillaOroOrquestaOrugaOsadi/aOscuroOseznoOsoOstraOto~oOtroOvejaO/vuloO/xidoOxi/genoOyenteOzonoPactoPadrePaellaPa/ginaPagoPai/sPa/jaroPalabraPalcoPaletaPa/lidoPalmaPalomaPalparPanPanalPa/nicoPanteraPa~ueloPapa/PapelPapillaPaquetePararParcelaParedParirParoPa/rpadoParquePa/rrafoPartePasarPaseoPasio/nPasoPastaPataPatioPatriaPausaPautaPavoPayasoPeato/nPecadoPeceraPechoPedalPedirPegarPeinePelarPelda~oPeleaPeligroPellejoPeloPelucaPenaPensarPe~o/nPeo/nPeorPepinoPeque~oPeraPerchaPerderPerezaPerfilPericoPerlaPermisoPerroPersonaPesaPescaPe/simoPesta~aPe/taloPetro/leoPezPezu~aPicarPicho/nPiePiedraPiernaPiezaPijamaPilarPilotoPimientaPinoPintorPinzaPi~aPiojoPipaPirataPisarPiscinaPisoPistaPito/nPizcaPlacaPlanPlataPlayaPlazaPleitoPlenoPlomoPlumaPluralPobrePocoPoderPodioPoemaPoesi/aPoetaPolenPolici/aPolloPolvoPomadaPomeloPomoPompaPonerPorcio/nPortalPosadaPoseerPosiblePostePotenciaPotroPozoPradoPrecozPreguntaPremioPrensaPresoPrevioPrimoPri/ncipePrisio/nPrivarProaProbarProcesoProductoProezaProfesorProgramaProlePromesaProntoPropioPro/ximoPruebaPu/blicoPucheroPudorPuebloPuertaPuestoPulgaPulirPulmo/nPulpoPulsoPumaPuntoPu~alPu~oPupaPupilaPure/QuedarQuejaQuemarQuererQuesoQuietoQui/micaQuinceQuitarRa/banoRabiaRaboRacio/nRadicalRai/zRamaRampaRanchoRangoRapazRa/pidoRaptoRasgoRaspaRatoRayoRazaRazo/nReaccio/nRealidadReba~oReboteRecaerRecetaRechazoRecogerRecreoRectoRecursoRedRedondoReducirReflejoReformaRefra/nRefugioRegaloRegirReglaRegresoRehe/nReinoRei/rRejaRelatoRelevoRelieveRellenoRelojRemarRemedioRemoRencorRendirRentaRepartoRepetirReposoReptilResRescateResinaRespetoRestoResumenRetiroRetornoRetratoReunirReve/sRevistaReyRezarRicoRiegoRiendaRiesgoRifaRi/gidoRigorRinco/nRi~o/nRi/oRiquezaRisaRitmoRitoRizoRobleRoceRociarRodarRodeoRodillaRoerRojizoRojoRomeroRomperRonRoncoRondaRopaRoperoRosaRoscaRostroRotarRubi/RuborRudoRuedaRugirRuidoRuinaRuletaRuloRumboRumorRupturaRutaRutinaSa/badoSaberSabioSableSacarSagazSagradoSalaSaldoSaleroSalirSalmo/nSalo/nSalsaSaltoSaludSalvarSambaSancio/nSandi/aSanearSangreSanidadSanoSantoSapoSaqueSardinaSarte/nSastreSata/nSaunaSaxofo/nSeccio/nSecoSecretoSectaSedSeguirSeisSelloSelvaSemanaSemillaSendaSensorSe~alSe~orSepararSepiaSequi/aSerSerieSermo/nServirSesentaSesio/nSetaSetentaSeveroSexoSextoSidraSiestaSieteSigloSignoSi/labaSilbarSilencioSillaSi/mboloSimioSirenaSistemaSitioSituarSobreSocioSodioSolSolapaSoldadoSoledadSo/lidoSoltarSolucio/nSombraSondeoSonidoSonoroSonrisaSopaSoplarSoporteSordoSorpresaSorteoSoste/nSo/tanoSuaveSubirSucesoSudorSuegraSueloSue~oSuerteSufrirSujetoSulta/nSumarSuperarSuplirSuponerSupremoSurSurcoSure~oSurgirSustoSutilTabacoTabiqueTablaTabu/TacoTactoTajoTalarTalcoTalentoTallaTalo/nTama~oTamborTangoTanqueTapaTapeteTapiaTapo/nTaquillaTardeTareaTarifaTarjetaTarotTarroTartaTatuajeTauroTazaTazo/nTeatroTechoTeclaTe/cnicaTejadoTejerTejidoTelaTele/fonoTemaTemorTemploTenazTenderTenerTenisTensoTeori/aTerapiaTercoTe/rminoTernuraTerrorTesisTesoroTestigoTeteraTextoTezTibioTiburo/nTiempoTiendaTierraTiesoTigreTijeraTildeTimbreTi/midoTimoTintaTi/oTi/picoTipoTiraTiro/nTita/nTi/tereTi/tuloTizaToallaTobilloTocarTocinoTodoTogaToldoTomarTonoTontoToparTopeToqueTo/raxToreroTormentaTorneoToroTorpedoTorreTorsoTortugaTosToscoToserTo/xicoTrabajoTractorTraerTra/ficoTragoTrajeTramoTranceTratoTraumaTrazarTre/bolTreguaTreintaTrenTreparTresTribuTrigoTripaTristeTriunfoTrofeoTrompaTroncoTropaTroteTrozoTrucoTruenoTrufaTuberi/aTuboTuertoTumbaTumorTu/nelTu/nicaTurbinaTurismoTurnoTutorUbicarU/lceraUmbralUnidadUnirUniversoUnoUntarU~aUrbanoUrbeUrgenteUrnaUsarUsuarioU/tilUtopi/aUvaVacaVaci/oVacunaVagarVagoVainaVajillaValeVa/lidoValleValorVa/lvulaVampiroVaraVariarVaro/nVasoVecinoVectorVehi/culoVeinteVejezVelaVeleroVelozVenaVencerVendaVenenoVengarVenirVentaVenusVerVeranoVerboVerdeVeredaVerjaVersoVerterVi/aViajeVibrarVicioVi/ctimaVidaVi/deoVidrioViejoViernesVigorVilVillaVinagreVinoVi~edoVioli/nViralVirgoVirtudVisorVi/speraVistaVitaminaViudoVivazViveroVivirVivoVolca/nVolumenVolverVorazVotarVotoVozVueloVulgarYacerYateYeguaYemaYernoYesoYodoYogaYogurZafiroZanjaZapatoZarzaZonaZorroZumoZurdo\";\n    var lookup = {};\n    var wordlist = null;\n    function dropDiacritic(word) {\n      wordlist_1.logger.checkNormalize();\n      return (0, strings_1.toUtf8String)(Array.prototype.filter.call((0, strings_1.toUtf8Bytes)(word.normalize(\"NFD\").toLowerCase()), function(c) {\n        return c >= 65 && c <= 90 || c >= 97 && c <= 123;\n      }));\n    }\n    function expand(word) {\n      var output = [];\n      Array.prototype.forEach.call((0, strings_1.toUtf8Bytes)(word), function(c) {\n        if (c === 47) {\n          output.push(204);\n          output.push(129);\n        } else if (c === 126) {\n          output.push(110);\n          output.push(204);\n          output.push(131);\n        } else {\n          output.push(c);\n        }\n      });\n      return (0, strings_1.toUtf8String)(output);\n    }\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \").map(function(w) {\n        return expand(w);\n      });\n      wordlist.forEach(function(word, index) {\n        lookup[dropDiacritic(word)] = index;\n      });\n      if (wordlist_1.Wordlist.check(lang) !== \"0xf74fb7092aeacdfbf8959557de22098da512207fb9f109cb526994938cf40300\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for es (Spanish) FAILED\");\n      }\n    }\n    var LangEs = (\n      /** @class */\n      function(_super) {\n        __extends(LangEs2, _super);\n        function LangEs2() {\n          return _super.call(this, \"es\") || this;\n        }\n        LangEs2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangEs2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return lookup[dropDiacritic(word)];\n        };\n        return LangEs2;\n      }(wordlist_1.Wordlist)\n    );\n    var langEs = new LangEs();\n    exports2.langEs = langEs;\n    wordlist_1.Wordlist.register(langEs);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-fr.js\nvar require_lang_fr = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-fr.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langFr = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var words = \"AbaisserAbandonAbdiquerAbeilleAbolirAborderAboutirAboyerAbrasifAbreuverAbriterAbrogerAbruptAbsenceAbsoluAbsurdeAbusifAbyssalAcade/mieAcajouAcarienAccablerAccepterAcclamerAccoladeAccrocheAccuserAcerbeAchatAcheterAcidulerAcierAcompteAcque/rirAcronymeActeurActifActuelAdepteAde/quatAdhe/sifAdjectifAdjugerAdmettreAdmirerAdopterAdorerAdoucirAdresseAdroitAdulteAdverbeAe/rerAe/ronefAffaireAffecterAfficheAffreuxAffublerAgacerAgencerAgileAgiterAgraferAgre/ableAgrumeAiderAiguilleAilierAimableAisanceAjouterAjusterAlarmerAlchimieAlerteAlge-breAlgueAlie/nerAlimentAlle/gerAlliageAllouerAllumerAlourdirAlpagaAltesseAlve/oleAmateurAmbiguAmbreAme/nagerAmertumeAmidonAmiralAmorcerAmourAmovibleAmphibieAmpleurAmusantAnalyseAnaphoreAnarchieAnatomieAncienAne/antirAngleAngoisseAnguleuxAnimalAnnexerAnnonceAnnuelAnodinAnomalieAnonymeAnormalAntenneAntidoteAnxieuxApaiserApe/ritifAplanirApologieAppareilAppelerApporterAppuyerAquariumAqueducArbitreArbusteArdeurArdoiseArgentArlequinArmatureArmementArmoireArmureArpenterArracherArriverArroserArsenicArte/rielArticleAspectAsphalteAspirerAssautAsservirAssietteAssocierAssurerAsticotAstreAstuceAtelierAtomeAtriumAtroceAttaqueAttentifAttirerAttraperAubaineAubergeAudaceAudibleAugurerAuroreAutomneAutrucheAvalerAvancerAvariceAvenirAverseAveugleAviateurAvideAvionAviserAvoineAvouerAvrilAxialAxiomeBadgeBafouerBagageBaguetteBaignadeBalancerBalconBaleineBalisageBambinBancaireBandageBanlieueBannie-reBanquierBarbierBarilBaronBarqueBarrageBassinBastionBatailleBateauBatterieBaudrierBavarderBeletteBe/lierBeloteBe/ne/ficeBerceauBergerBerlineBermudaBesaceBesogneBe/tailBeurreBiberonBicycleBiduleBijouBilanBilingueBillardBinaireBiologieBiopsieBiotypeBiscuitBisonBistouriBitumeBizarreBlafardBlagueBlanchirBlessantBlinderBlondBloquerBlousonBobardBobineBoireBoiserBolideBonbonBondirBonheurBonifierBonusBordureBorneBotteBoucleBoueuxBougieBoulonBouquinBourseBoussoleBoutiqueBoxeurBrancheBrasierBraveBrebisBre-cheBreuvageBricolerBrigadeBrillantBriocheBriqueBrochureBroderBronzerBrousseBroyeurBrumeBrusqueBrutalBruyantBuffleBuissonBulletinBureauBurinBustierButinerButoirBuvableBuvetteCabanonCabineCachetteCadeauCadreCafe/ineCaillouCaissonCalculerCalepinCalibreCalmerCalomnieCalvaireCamaradeCame/raCamionCampagneCanalCanetonCanonCantineCanularCapableCaporalCapriceCapsuleCapterCapucheCarabineCarboneCaresserCaribouCarnageCarotteCarreauCartonCascadeCasierCasqueCassureCauserCautionCavalierCaverneCaviarCe/dilleCeintureCe/lesteCelluleCendrierCensurerCentralCercleCe/re/bralCeriseCernerCerveauCesserChagrinChaiseChaleurChambreChanceChapitreCharbonChasseurChatonChaussonChavirerChemiseChenilleChe/quierChercherChevalChienChiffreChignonChime-reChiotChlorureChocolatChoisirChoseChouetteChromeChuteCigareCigogneCimenterCine/maCintrerCirculerCirerCirqueCiterneCitoyenCitronCivilClaironClameurClaquerClasseClavierClientClignerClimatClivageClocheClonageCloporteCobaltCobraCocasseCocotierCoderCodifierCoffreCognerCohe/sionCoifferCoincerCole-reColibriCollineColmaterColonelCombatCome/dieCommandeCompactConcertConduireConfierCongelerConnoterConsonneContactConvexeCopainCopieCorailCorbeauCordageCornicheCorpusCorrectCorte-geCosmiqueCostumeCotonCoudeCoupureCourageCouteauCouvrirCoyoteCrabeCrainteCravateCrayonCre/atureCre/diterCre/meuxCreuserCrevetteCriblerCrierCristalCrite-reCroireCroquerCrotaleCrucialCruelCrypterCubiqueCueillirCuille-reCuisineCuivreCulminerCultiverCumulerCupideCuratifCurseurCyanureCycleCylindreCyniqueDaignerDamierDangerDanseurDauphinDe/battreDe/biterDe/borderDe/briderDe/butantDe/calerDe/cembreDe/chirerDe/ciderDe/clarerDe/corerDe/crireDe/cuplerDe/daleDe/ductifDe/esseDe/fensifDe/filerDe/frayerDe/gagerDe/givrerDe/glutirDe/graferDe/jeunerDe/liceDe/logerDemanderDemeurerDe/molirDe/nicherDe/nouerDentelleDe/nuderDe/partDe/penserDe/phaserDe/placerDe/poserDe/rangerDe/roberDe/sastreDescenteDe/sertDe/signerDe/sobe/irDessinerDestrierDe/tacherDe/testerDe/tourerDe/tresseDevancerDevenirDevinerDevoirDiableDialogueDiamantDicterDiffe/rerDige/rerDigitalDigneDiluerDimancheDiminuerDioxydeDirectifDirigerDiscuterDisposerDissiperDistanceDivertirDiviserDocileDocteurDogmeDoigtDomaineDomicileDompterDonateurDonjonDonnerDopamineDortoirDorureDosageDoseurDossierDotationDouanierDoubleDouceurDouterDoyenDragonDraperDresserDribblerDroitureDuperieDuplexeDurableDurcirDynastieE/blouirE/carterE/charpeE/chelleE/clairerE/clipseE/cloreE/cluseE/coleE/conomieE/corceE/couterE/craserE/cre/merE/crivainE/crouE/cumeE/cureuilE/difierE/duquerEffacerEffectifEffigieEffortEffrayerEffusionE/galiserE/garerE/jecterE/laborerE/largirE/lectronE/le/gantE/le/phantE/le-veE/ligibleE/litismeE/logeE/luciderE/luderEmballerEmbellirEmbryonE/meraudeE/missionEmmenerE/motionE/mouvoirEmpereurEmployerEmporterEmpriseE/mulsionEncadrerEnche-reEnclaveEncocheEndiguerEndosserEndroitEnduireE/nergieEnfanceEnfermerEnfouirEngagerEnginEngloberE/nigmeEnjamberEnjeuEnleverEnnemiEnnuyeuxEnrichirEnrobageEnseigneEntasserEntendreEntierEntourerEntraverE/nume/rerEnvahirEnviableEnvoyerEnzymeE/olienE/paissirE/pargneE/patantE/pauleE/picerieE/pide/mieE/pierE/pilogueE/pineE/pisodeE/pitapheE/poqueE/preuveE/prouverE/puisantE/querreE/quipeE/rigerE/rosionErreurE/ruptionEscalierEspadonEspe-ceEspie-gleEspoirEspritEsquiverEssayerEssenceEssieuEssorerEstimeEstomacEstradeE/tage-reE/talerE/tancheE/tatiqueE/teindreE/tendoirE/ternelE/thanolE/thiqueEthnieE/tirerE/tofferE/toileE/tonnantE/tourdirE/trangeE/troitE/tudeEuphorieE/valuerE/vasionE/ventailE/videnceE/viterE/volutifE/voquerExactExage/rerExaucerExcellerExcitantExclusifExcuseExe/cuterExempleExercerExhalerExhorterExigenceExilerExisterExotiqueExpe/dierExplorerExposerExprimerExquisExtensifExtraireExulterFableFabuleuxFacetteFacileFactureFaiblirFalaiseFameuxFamilleFarceurFarfeluFarineFaroucheFascinerFatalFatigueFauconFautifFaveurFavoriFe/brileFe/conderFe/de/rerFe/linFemmeFe/murFendoirFe/odalFermerFe/roceFerveurFestivalFeuilleFeutreFe/vrierFiascoFicelerFictifFide-leFigureFilatureFiletageFilie-reFilleulFilmerFilouFiltrerFinancerFinirFioleFirmeFissureFixerFlairerFlammeFlasqueFlatteurFle/auFle-cheFleurFlexionFloconFloreFluctuerFluideFluvialFolieFonderieFongibleFontaineForcerForgeronFormulerFortuneFossileFoudreFouge-reFouillerFoulureFourmiFragileFraiseFranchirFrapperFrayeurFre/gateFreinerFrelonFre/mirFre/ne/sieFre-reFriableFrictionFrissonFrivoleFroidFromageFrontalFrotterFruitFugitifFuiteFureurFurieuxFurtifFusionFuturGagnerGalaxieGalerieGambaderGarantirGardienGarnirGarrigueGazelleGazonGe/antGe/latineGe/luleGendarmeGe/ne/ralGe/nieGenouGentilGe/ologieGe/ome-treGe/raniumGermeGestuelGeyserGibierGiclerGirafeGivreGlaceGlaiveGlisserGlobeGloireGlorieuxGolfeurGommeGonflerGorgeGorilleGoudronGouffreGoulotGoupilleGourmandGoutteGraduelGraffitiGraineGrandGrappinGratuitGravirGrenatGriffureGrillerGrimperGrognerGronderGrotteGroupeGrugerGrutierGruye-reGue/pardGuerrierGuideGuimauveGuitareGustatifGymnasteGyrostatHabitudeHachoirHalteHameauHangarHannetonHaricotHarmonieHarponHasardHe/liumHe/matomeHerbeHe/rissonHermineHe/ronHe/siterHeureuxHibernerHibouHilarantHistoireHiverHomardHommageHomoge-neHonneurHonorerHonteuxHordeHorizonHorlogeHormoneHorribleHouleuxHousseHublotHuileuxHumainHumbleHumideHumourHurlerHydromelHygie-neHymneHypnoseIdylleIgnorerIguaneIlliciteIllusionImageImbiberImiterImmenseImmobileImmuableImpactImpe/rialImplorerImposerImprimerImputerIncarnerIncendieIncidentInclinerIncoloreIndexerIndiceInductifIne/ditIneptieInexactInfiniInfligerInformerInfusionInge/rerInhalerInhiberInjecterInjureInnocentInoculerInonderInscrireInsecteInsigneInsoliteInspirerInstinctInsulterIntactIntenseIntimeIntrigueIntuitifInutileInvasionInventerInviterInvoquerIroniqueIrradierIrre/elIrriterIsolerIvoireIvresseJaguarJaillirJambeJanvierJardinJaugerJauneJavelotJetableJetonJeudiJeunesseJoindreJoncherJonglerJoueurJouissifJournalJovialJoyauJoyeuxJubilerJugementJuniorJuponJuristeJusticeJuteuxJuve/nileKayakKimonoKiosqueLabelLabialLabourerLace/rerLactoseLaguneLaineLaisserLaitierLambeauLamelleLampeLanceurLangageLanterneLapinLargeurLarmeLaurierLavaboLavoirLectureLe/galLe/gerLe/gumeLessiveLettreLevierLexiqueLe/zardLiasseLibe/rerLibreLicenceLicorneLie-geLie-vreLigatureLigoterLigueLimerLimiteLimonadeLimpideLine/aireLingotLionceauLiquideLisie-reListerLithiumLitigeLittoralLivreurLogiqueLointainLoisirLombricLoterieLouerLourdLoutreLouveLoyalLubieLucideLucratifLueurLugubreLuisantLumie-reLunaireLundiLuronLutterLuxueuxMachineMagasinMagentaMagiqueMaigreMaillonMaintienMairieMaisonMajorerMalaxerMale/ficeMalheurMaliceMalletteMammouthMandaterManiableManquantManteauManuelMarathonMarbreMarchandMardiMaritimeMarqueurMarronMartelerMascotteMassifMate/rielMatie-reMatraqueMaudireMaussadeMauveMaximalMe/chantMe/connuMe/dailleMe/decinMe/diterMe/duseMeilleurMe/langeMe/lodieMembreMe/moireMenacerMenerMenhirMensongeMentorMercrediMe/riteMerleMessagerMesureMe/talMe/te/oreMe/thodeMe/tierMeubleMiaulerMicrobeMietteMignonMigrerMilieuMillionMimiqueMinceMine/ralMinimalMinorerMinuteMiracleMiroiterMissileMixteMobileModerneMoelleuxMondialMoniteurMonnaieMonotoneMonstreMontagneMonumentMoqueurMorceauMorsureMortierMoteurMotifMoucheMoufleMoulinMoussonMoutonMouvantMultipleMunitionMurailleMure-neMurmureMuscleMuse/umMusicienMutationMuterMutuelMyriadeMyrtilleMyste-reMythiqueNageurNappeNarquoisNarrerNatationNationNatureNaufrageNautiqueNavireNe/buleuxNectarNe/fasteNe/gationNe/gligerNe/gocierNeigeNerveuxNettoyerNeuroneNeutronNeveuNicheNickelNitrateNiveauNobleNocifNocturneNoirceurNoisetteNomadeNombreuxNommerNormatifNotableNotifierNotoireNourrirNouveauNovateurNovembreNoviceNuageNuancerNuireNuisibleNume/roNuptialNuqueNutritifObe/irObjectifObligerObscurObserverObstacleObtenirObturerOccasionOccuperOce/anOctobreOctroyerOctuplerOculaireOdeurOdorantOffenserOfficierOffrirOgiveOiseauOisillonOlfactifOlivierOmbrageOmettreOnctueuxOndulerOne/reuxOniriqueOpaleOpaqueOpe/rerOpinionOpportunOpprimerOpterOptiqueOrageuxOrangeOrbiteOrdonnerOreilleOrganeOrgueilOrificeOrnementOrqueOrtieOscillerOsmoseOssatureOtarieOuraganOursonOutilOutragerOuvrageOvationOxydeOxyge-neOzonePaisiblePalacePalmare-sPalourdePalperPanachePandaPangolinPaniquerPanneauPanoramaPantalonPapayePapierPapoterPapyrusParadoxeParcelleParesseParfumerParlerParoleParrainParsemerPartagerParureParvenirPassionPaste-quePaternelPatiencePatronPavillonPavoiserPayerPaysagePeignePeintrePelagePe/licanPellePelousePeluchePendulePe/ne/trerPe/niblePensifPe/nuriePe/pitePe/plumPerdrixPerforerPe/riodePermuterPerplexePersilPertePeserPe/talePetitPe/trirPeuplePharaonPhobiePhoquePhotonPhrasePhysiquePianoPicturalPie-cePierrePieuvrePilotePinceauPipettePiquerPiroguePiscinePistonPivoterPixelPizzaPlacardPlafondPlaisirPlanerPlaquePlastronPlateauPleurerPlexusPliagePlombPlongerPluiePlumagePochettePoe/siePoe-tePointePoirierPoissonPoivrePolairePolicierPollenPolygonePommadePompierPonctuelPonde/rerPoneyPortiquePositionPosse/derPosturePotagerPoteauPotionPoucePoulainPoumonPourprePoussinPouvoirPrairiePratiquePre/cieuxPre/direPre/fixePre/ludePre/nomPre/sencePre/textePre/voirPrimitifPrincePrisonPriverProble-meProce/derProdigeProfondProgre-sProieProjeterProloguePromenerPropreProspe-reProte/gerProuesseProverbePrudencePruneauPsychosePublicPuceronPuiserPulpePulsarPunaisePunitifPupitrePurifierPuzzlePyramideQuasarQuerelleQuestionQuie/tudeQuitterQuotientRacineRaconterRadieuxRagondinRaideurRaisinRalentirRallongeRamasserRapideRasageRatisserRavagerRavinRayonnerRe/actifRe/agirRe/aliserRe/animerRecevoirRe/citerRe/clamerRe/colterRecruterReculerRecyclerRe/digerRedouterRefaireRe/flexeRe/formerRefrainRefugeRe/galienRe/gionRe/glageRe/gulierRe/ite/rerRejeterRejouerRelatifReleverReliefRemarqueReme-deRemiseRemonterRemplirRemuerRenardRenfortReniflerRenoncerRentrerRenvoiReplierReporterRepriseReptileRequinRe/serveRe/sineuxRe/soudreRespectResterRe/sultatRe/tablirRetenirRe/ticuleRetomberRetracerRe/unionRe/ussirRevancheRevivreRe/volteRe/vulsifRichesseRideauRieurRigideRigolerRincerRiposterRisibleRisqueRituelRivalRivie-reRocheuxRomanceRompreRonceRondinRoseauRosierRotatifRotorRotuleRougeRouilleRouleauRoutineRoyaumeRubanRubisRucheRuelleRugueuxRuinerRuisseauRuserRustiqueRythmeSablerSaboterSabreSacocheSafariSagesseSaisirSaladeSaliveSalonSaluerSamediSanctionSanglierSarcasmeSardineSaturerSaugrenuSaumonSauterSauvageSavantSavonnerScalpelScandaleSce/le/ratSce/narioSceptreSche/maScienceScinderScoreScrutinSculpterSe/anceSe/cableSe/cherSecouerSe/cre/terSe/datifSe/duireSeigneurSe/jourSe/lectifSemaineSemblerSemenceSe/minalSe/nateurSensibleSentenceSe/parerSe/quenceSereinSergentSe/rieuxSerrureSe/rumServiceSe/sameSe/virSevrageSextupleSide/ralSie-cleSie/gerSifflerSigleSignalSilenceSiliciumSimpleSince-reSinistreSiphonSiropSismiqueSituerSkierSocialSocleSodiumSoigneuxSoldatSoleilSolitudeSolubleSombreSommeilSomnolerSondeSongeurSonnetteSonoreSorcierSortirSosieSottiseSoucieuxSoudureSouffleSouleverSoupapeSourceSoutirerSouvenirSpacieuxSpatialSpe/cialSphe-reSpiralStableStationSternumStimulusStipulerStrictStudieuxStupeurStylisteSublimeSubstratSubtilSubvenirSucce-sSucreSuffixeSugge/rerSuiveurSulfateSuperbeSupplierSurfaceSuricateSurmenerSurpriseSursautSurvieSuspectSyllabeSymboleSyme/trieSynapseSyntaxeSyste-meTabacTablierTactileTaillerTalentTalismanTalonnerTambourTamiserTangibleTapisTaquinerTarderTarifTartineTasseTatamiTatouageTaupeTaureauTaxerTe/moinTemporelTenailleTendreTeneurTenirTensionTerminerTerneTerribleTe/tineTexteThe-meThe/orieThe/rapieThoraxTibiaTie-deTimideTirelireTiroirTissuTitaneTitreTituberTobogganTole/rantTomateToniqueTonneauToponymeTorcheTordreTornadeTorpilleTorrentTorseTortueTotemToucherTournageTousserToxineTractionTraficTragiqueTrahirTrainTrancherTravailTre-fleTremperTre/sorTreuilTriageTribunalTricoterTrilogieTriompheTriplerTriturerTrivialTromboneTroncTropicalTroupeauTuileTulipeTumulteTunnelTurbineTuteurTutoyerTuyauTympanTyphonTypiqueTyranUbuesqueUltimeUltrasonUnanimeUnifierUnionUniqueUnitaireUniversUraniumUrbainUrticantUsageUsineUsuelUsureUtileUtopieVacarmeVaccinVagabondVagueVaillantVaincreVaisseauValableValiseVallonValveVampireVanilleVapeurVarierVaseuxVassalVasteVecteurVedetteVe/ge/talVe/hiculeVeinardVe/loceVendrediVe/ne/rerVengerVenimeuxVentouseVerdureVe/rinVernirVerrouVerserVertuVestonVe/te/ranVe/tusteVexantVexerViaducViandeVictoireVidangeVide/oVignetteVigueurVilainVillageVinaigreViolonVipe-reVirementVirtuoseVirusVisageViseurVisionVisqueuxVisuelVitalVitesseViticoleVitrineVivaceVivipareVocationVoguerVoileVoisinVoitureVolailleVolcanVoltigerVolumeVoraceVortexVoterVouloirVoyageVoyelleWagonXe/nonYachtZe-breZe/nithZesteZoologie\";\n    var wordlist = null;\n    var lookup = {};\n    function dropDiacritic(word) {\n      wordlist_1.logger.checkNormalize();\n      return (0, strings_1.toUtf8String)(Array.prototype.filter.call((0, strings_1.toUtf8Bytes)(word.normalize(\"NFD\").toLowerCase()), function(c) {\n        return c >= 65 && c <= 90 || c >= 97 && c <= 123;\n      }));\n    }\n    function expand(word) {\n      var output = [];\n      Array.prototype.forEach.call((0, strings_1.toUtf8Bytes)(word), function(c) {\n        if (c === 47) {\n          output.push(204);\n          output.push(129);\n        } else if (c === 45) {\n          output.push(204);\n          output.push(128);\n        } else {\n          output.push(c);\n        }\n      });\n      return (0, strings_1.toUtf8String)(output);\n    }\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \").map(function(w) {\n        return expand(w);\n      });\n      wordlist.forEach(function(word, index) {\n        lookup[dropDiacritic(word)] = index;\n      });\n      if (wordlist_1.Wordlist.check(lang) !== \"0x51deb7ae009149dc61a6bd18a918eb7ac78d2775726c68e598b92d002519b045\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for fr (French) FAILED\");\n      }\n    }\n    var LangFr = (\n      /** @class */\n      function(_super) {\n        __extends(LangFr2, _super);\n        function LangFr2() {\n          return _super.call(this, \"fr\") || this;\n        }\n        LangFr2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangFr2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return lookup[dropDiacritic(word)];\n        };\n        return LangFr2;\n      }(wordlist_1.Wordlist)\n    );\n    var langFr = new LangFr();\n    exports2.langFr = langFr;\n    wordlist_1.Wordlist.register(langFr);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-ja.js\nvar require_lang_ja = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-ja.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langJa = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = [\n      // 4-kana words\n      \"AQRASRAGBAGUAIRAHBAghAURAdBAdcAnoAMEAFBAFCBKFBQRBSFBCXBCDBCHBGFBEQBpBBpQBIkBHNBeOBgFBVCBhBBhNBmOBmRBiHBiFBUFBZDBvFBsXBkFBlcBjYBwDBMBBTBBTRBWBBWXXaQXaRXQWXSRXCFXYBXpHXOQXHRXhRXuRXmXXbRXlXXwDXTRXrCXWQXWGaBWaKcaYgasFadQalmaMBacAKaRKKBKKXKKjKQRKDRKCYKCRKIDKeVKHcKlXKjHKrYNAHNBWNaRNKcNIBNIONmXNsXNdXNnBNMBNRBNrXNWDNWMNFOQABQAHQBrQXBQXFQaRQKXQKDQKOQKFQNBQNDQQgQCXQCDQGBQGDQGdQYXQpBQpQQpHQLXQHuQgBQhBQhCQuFQmXQiDQUFQZDQsFQdRQkHQbRQlOQlmQPDQjDQwXQMBQMDQcFQTBQTHQrDDXQDNFDGBDGQDGRDpFDhFDmXDZXDbRDMYDRdDTRDrXSAhSBCSBrSGQSEQSHBSVRShYShkSyQSuFSiBSdcSoESocSlmSMBSFBSFKSFNSFdSFcCByCaRCKcCSBCSRCCrCGbCEHCYXCpBCpQCIBCIHCeNCgBCgFCVECVcCmkCmwCZXCZFCdRClOClmClFCjDCjdCnXCwBCwXCcRCFQCFjGXhGNhGDEGDMGCDGCHGIFGgBGVXGVEGVRGmXGsXGdYGoSGbRGnXGwXGwDGWRGFNGFLGFOGFdGFkEABEBDEBFEXOEaBEKSENBENDEYXEIgEIkEgBEgQEgHEhFEudEuFEiBEiHEiFEZDEvBEsXEsFEdXEdREkFEbBEbRElFEPCEfkEFNYAEYAhYBNYQdYDXYSRYCEYYoYgQYgRYuRYmCYZTYdBYbEYlXYjQYRbYWRpKXpQopQnpSFpCXpIBpISphNpdBpdRpbRpcZpFBpFNpFDpFopFrLADLBuLXQLXcLaFLCXLEhLpBLpFLHXLeVLhILdHLdRLoDLbRLrXIABIBQIBCIBsIBoIBMIBRIXaIaRIKYIKRINBINuICDIGBIIDIIkIgRIxFIyQIiHIdRIbYIbRIlHIwRIMYIcRIRVITRIFBIFNIFQOABOAFOBQOaFONBONMOQFOSFOCDOGBOEQOpBOLXOIBOIFOgQOgFOyQOycOmXOsXOdIOkHOMEOMkOWWHBNHXNHXWHNXHDuHDRHSuHSRHHoHhkHmRHdRHkQHlcHlRHwBHWcgAEgAggAkgBNgBQgBEgXOgYcgLXgHjgyQgiBgsFgdagMYgWSgFQgFEVBTVXEVKBVKNVKDVKYVKRVNBVNYVDBVDxVSBVSRVCjVGNVLXVIFVhBVhcVsXVdRVbRVlRhBYhKYhDYhGShxWhmNhdahdkhbRhjohMXhTRxAXxXSxKBxNBxEQxeNxeQxhXxsFxdbxlHxjcxFBxFNxFQxFOxFoyNYyYoybcyMYuBQuBRuBruDMuCouHBudQukkuoBulVuMXuFEmCYmCRmpRmeDmiMmjdmTFmFQiADiBOiaRiKRiNBiNRiSFiGkiGFiERipRiLFiIFihYibHijBijEiMXiWBiFBiFCUBQUXFUaRUNDUNcUNRUNFUDBUSHUCDUGBUGFUEqULNULoUIRUeEUeYUgBUhFUuRUiFUsXUdFUkHUbBUjSUjYUwXUMDUcHURdUTBUrBUrXUrQZAFZXZZaRZKFZNBZQFZCXZGBZYdZpBZLDZIFZHXZHNZeQZVRZVFZmXZiBZvFZdFZkFZbHZbFZwXZcCZcRZRBvBQvBGvBLvBWvCovMYsAFsBDsaRsKFsNFsDrsSHsSFsCXsCRsEBsEHsEfspBsLBsLDsIgsIRseGsbRsFBsFQsFSdNBdSRdCVdGHdYDdHcdVbdySduDdsXdlRdwXdWYdWcdWRkBMkXOkaRkNIkNFkSFkCFkYBkpRkeNkgBkhVkmXksFklVkMBkWDkFNoBNoaQoaFoNBoNXoNaoNEoSRoEroYXoYCoYbopRopFomXojkowXorFbBEbEIbdBbjYlaRlDElMXlFDjKjjSRjGBjYBjYkjpRjLXjIBjOFjeVjbRjwBnXQnSHnpFnLXnINnMBnTRwXBwXNwXYwNFwQFwSBwGFwLXwLDweNwgBwuHwjDwnXMBXMpFMIBMeNMTHcaQcNBcDHcSFcCXcpBcLXcLDcgFcuFcnXcwXccDcTQcrFTQErXNrCHrpFrgFrbFrTHrFcWNYWNbWEHWMXWTR\",\n      // 5-kana words\n      \"ABGHABIJAEAVAYJQALZJAIaRAHNXAHdcAHbRAZJMAZJRAZTRAdVJAklmAbcNAjdRAMnRAMWYAWpRAWgRAFgBAFhBAFdcBNJBBNJDBQKBBQhcBQlmBDEJBYJkBYJTBpNBBpJFBIJBBIJDBIcABOKXBOEJBOVJBOiJBOZJBepBBeLXBeIFBegBBgGJBVJXBuocBiJRBUJQBlXVBlITBwNFBMYVBcqXBTlmBWNFBWiJBWnRBFGHBFwXXKGJXNJBXNZJXDTTXSHSXSVRXSlHXCJDXGQJXEhXXYQJXYbRXOfXXeNcXVJFXhQJXhEJXdTRXjdXXMhBXcQTXRGBXTEBXTnQXFCXXFOFXFgFaBaFaBNJaBCJaBpBaBwXaNJKaNJDaQIBaDpRaEPDaHMFamDJalEJaMZJaFaFaFNBaFQJaFLDaFVHKBCYKBEBKBHDKXaFKXGdKXEJKXpHKXIBKXZDKXwXKKwLKNacKNYJKNJoKNWcKDGdKDTRKChXKGaRKGhBKGbRKEBTKEaRKEPTKLMDKLWRKOHDKVJcKdBcKlIBKlOPKFSBKFEPKFpFNBNJNJBQNBGHNBEPNBHXNBgFNBVXNBZDNBsXNBwXNNaRNNJDNNJENNJkNDCJNDVDNGJRNJiDNZJNNsCJNJFNNFSBNFCXNFEPNFLXNFIFQJBFQCaRQJEQQLJDQLJFQIaRQOqXQHaFQHHQQVJXQVJDQhNJQmEIQZJFQsJXQJrFQWbRDJABDBYJDXNFDXCXDXLXDXZDDXsJDQqXDSJFDJCXDEPkDEqXDYmQDpSJDOCkDOGQDHEIDVJDDuDuDWEBDJFgSBNDSBSFSBGHSBIBSBTQSKVYSJQNSJQiSJCXSEqXSJYVSIiJSOMYSHAHSHaQSeCFSepQSegBSHdHSHrFShSJSJuHSJUFSkNRSrSrSWEBSFaHSJFQSFCXSFGDSFYXSFODSFgBSFVXSFhBSFxFSFkFSFbBSFMFCADdCJXBCXaFCXKFCXNFCXCXCXGBCXEJCXYBCXLDCXIBCXOPCXHXCXgBCXhBCXiBCXlDCXcHCJNBCJNFCDCJCDGBCDVXCDhBCDiDCDJdCCmNCpJFCIaRCOqXCHCHCHZJCViJCuCuCmddCJiFCdNBCdHhClEJCnUJCreSCWlgCWTRCFBFCFNBCFYBCFVFCFhFCFdSCFTBCFWDGBNBGBQFGJBCGBEqGBpBGBgQGNBEGNJYGNkOGNJRGDUFGJpQGHaBGJeNGJeEGVBlGVKjGiJDGvJHGsVJGkEBGMIJGWjNGFBFGFCXGFGBGFYXGFpBGFMFEASJEAWpEJNFECJVEIXSEIQJEOqXEOcFEeNcEHEJEHlFEJgFEhlmEmDJEmZJEiMBEUqXEoSREPBFEPXFEPKFEPSFEPEFEPpFEPLXEPIBEJPdEPcFEPTBEJnXEqlHEMpREFCXEFODEFcFYASJYJAFYBaBYBVXYXpFYDhBYCJBYJGFYYbRYeNcYJeVYiIJYZJcYvJgYvJRYJsXYsJFYMYMYreVpBNHpBEJpBwXpQxFpYEJpeNDpJeDpeSFpeCHpHUJpHbBpHcHpmUJpiiJpUJrpsJuplITpFaBpFQqpFGBpFEfpFYBpFpBpFLJpFIDpFgBpFVXpFyQpFuFpFlFpFjDpFnXpFwXpJFMpFTBLXCJLXEFLXhFLXUJLXbFLalmLNJBLSJQLCLCLGJBLLDJLHaFLeNFLeSHLeCXLepFLhaRLZsJLsJDLsJrLocaLlLlLMdbLFNBLFSBLFEHLFkFIBBFIBXFIBaQIBKXIBSFIBpHIBLXIBgBIBhBIBuHIBmXIBiFIBZXIBvFIBbFIBjQIBwXIBWFIKTRIQUJIDGFICjQIYSRIINXIJeCIVaRImEkIZJFIvJRIsJXIdCJIJoRIbBQIjYBIcqXITFVIreVIFKFIFSFIFCJIFGFIFLDIFIBIJFOIFgBIFVXIJFhIFxFIFmXIFdHIFbBIJFrIJFWOBGBOQfXOOKjOUqXOfXBOqXEOcqXORVJOFIBOFlDHBIOHXiFHNTRHCJXHIaRHHJDHHEJHVbRHZJYHbIBHRsJHRkDHWlmgBKFgBSBgBCDgBGHgBpBgBIBgBVJgBuBgBvFgKDTgQVXgDUJgGSJgOqXgmUMgZIJgTUJgWIEgFBFgFNBgFDJgFSFgFGBgFYXgJFOgFgQgFVXgFhBgFbHgJFWVJABVQKcVDgFVOfXVeDFVhaRVmGdViJYVMaRVFNHhBNDhBCXhBEqhBpFhBLXhNJBhSJRheVXhhKEhxlmhZIJhdBQhkIJhbMNhMUJhMZJxNJgxQUJxDEkxDdFxSJRxplmxeSBxeCXxeGFxeYXxepQxegBxWVcxFEQxFLXxFIBxFgBxFxDxFZtxFdcxFbBxFwXyDJXyDlcuASJuDJpuDIBuCpJuGSJuIJFueEFuZIJusJXudWEuoIBuWGJuFBcuFKEuFNFuFQFuFDJuFGJuFVJuFUtuFdHuFTBmBYJmNJYmQhkmLJDmLJomIdXmiJYmvJRmsJRmklmmMBymMuCmclmmcnQiJABiJBNiJBDiBSFiBCJiBEFiBYBiBpFiBLXiBTHiJNciDEfiCZJiECJiJEqiOkHiHKFieNDiHJQieQcieDHieSFieCXieGFieEFieIHiegFihUJixNoioNXiFaBiFKFiFNDiFEPiFYXitFOitFHiFgBiFVEiFmXiFitiFbBiFMFiFrFUCXQUIoQUIJcUHQJUeCEUHwXUUJDUUqXUdWcUcqXUrnQUFNDUFSHUFCFUFEfUFLXUtFOZBXOZXSBZXpFZXVXZEQJZEJkZpDJZOqXZeNHZeCDZUqXZFBQZFEHZFLXvBAFvBKFvBCXvBEPvBpHvBIDvBgFvBuHvQNJvFNFvFGBvFIBvJFcsXCDsXLXsXsXsXlFsXcHsQqXsJQFsEqXseIFsFEHsFjDdBxOdNpRdNJRdEJbdpJRdhZJdnSJdrjNdFNJdFQHdFhNkNJDkYaRkHNRkHSRkVbRkuMRkjSJkcqDoSJFoEiJoYZJoOfXohEBoMGQocqXbBAFbBXFbBaFbBNDbBGBbBLXbBTBbBWDbGJYbIJHbFQqbFpQlDgQlOrFlVJRjGEBjZJRnXvJnXbBnEfHnOPDngJRnxfXnUJWwXEJwNpJwDpBwEfXwrEBMDCJMDGHMDIJMLJDcQGDcQpHcqXccqNFcqCXcFCJRBSBRBGBRBEJRBpQTBNFTBQJTBpBTBVXTFABTFSBTFCFTFGBTFMDrXCJrXLDrDNJrEfHrFQJrFitWNjdWNTR\",\n      // 6-kana words\n      \"AKLJMANOPFASNJIAEJWXAYJNRAIIbRAIcdaAeEfDAgidRAdjNYAMYEJAMIbRAFNJBAFpJFBBIJYBDZJFBSiJhBGdEBBEJfXBEJqXBEJWRBpaUJBLXrXBIYJMBOcfXBeEfFBestXBjNJRBcDJOBFEqXXNvJRXDMBhXCJNYXOAWpXONJWXHDEBXeIaRXhYJDXZJSJXMDJOXcASJXFVJXaBQqXaBZJFasXdQaFSJQaFEfXaFpJHaFOqXKBNSRKXvJBKQJhXKEJQJKEJGFKINJBKIJjNKgJNSKVElmKVhEBKiJGFKlBgJKjnUJKwsJYKMFIJKFNJDKFIJFKFOfXNJBSFNJBCXNBpJFNJBvQNJBMBNJLJXNJOqXNJeCXNJeGFNdsJCNbTKFNwXUJQNFEPQDiJcQDMSJQSFpBQGMQJQJeOcQyCJEQUJEBQJFBrQFEJqDXDJFDJXpBDJXIMDGiJhDIJGRDJeYcDHrDJDVXgFDkAWpDkIgRDjDEqDMvJRDJFNFDJFIBSKclmSJQOFSJQVHSJQjDSJGJBSJGJFSECJoSHEJqSJHTBSJVJDSViJYSZJNBSJsJDSFSJFSFEfXSJFLXCBUJVCJXSBCJXpBCXVJXCJXsXCJXdFCJNJHCLIJgCHiJFCVNJMChCJhCUHEJCsJTRCJdYcCoQJCCFEfXCFIJgCFUJxCFstFGJBaQGJBIDGQJqXGYJNRGJHKFGeQqDGHEJFGJeLXGHIiJGHdBlGUJEBGkIJTGFQPDGJFEqEAGegEJIJBEJVJXEhQJTEiJNcEJZJFEJoEqEjDEqEPDsXEPGJBEPOqXEPeQFEfDiDEJfEFEfepQEfMiJEqXNBEqDIDEqeSFEqVJXEMvJRYXNJDYXEJHYKVJcYYJEBYJeEcYJUqXYFpJFYFstXpAZJMpBSJFpNBNFpeQPDpHLJDpHIJFpHgJFpeitFpHZJFpJFADpFSJFpJFCJpFOqXpFitBpJFZJLXIJFLIJgRLVNJWLVHJMLwNpJLFGJBLFLJDLFOqXLJFUJIBDJXIBGJBIJBYQIJBIBIBOqXIBcqDIEGJFILNJTIIJEBIOiJhIJeNBIJeIBIhiJIIWoTRIJFAHIJFpBIJFuHIFUtFIJFTHOSBYJOEcqXOHEJqOvBpFOkVJrObBVJOncqDOcNJkHhNJRHuHJuHdMhBgBUqXgBsJXgONJBgHNJDgHHJQgJeitgHsJXgJyNagyDJBgZJDrgsVJQgkEJNgkjSJgJFAHgFCJDgFZtMVJXNFVXQfXVJXDJVXoQJVQVJQVDEfXVDvJHVEqNFVeQfXVHpJFVHxfXVVJSRVVmaRVlIJOhCXVJhHjYkhxCJVhWVUJhWiJcxBNJIxeEqDxfXBFxcFEPxFSJFxFYJXyBDQJydaUJyFOPDuYCJYuLvJRuHLJXuZJLDuFOPDuFZJHuFcqXmKHJdmCQJcmOsVJiJAGFitLCFieOfXiestXiZJMEikNJQirXzFiFQqXiFIJFiFZJFiFvtFUHpJFUteIcUteOcUVCJkUhdHcUbEJEUJqXQUMNJhURjYkUFitFZDGJHZJIxDZJVJXZJFDJZJFpQvBNJBvBSJFvJxBrseQqDsVFVJdFLJDkEJNBkmNJYkFLJDoQJOPoGsJRoEAHBoEJfFbBQqDbBZJHbFVJXlFIJBjYIrXjeitcjjCEBjWMNBwXQfXwXOaFwDsJXwCJTRwrCZJMDNJQcDDJFcqDOPRYiJFTBsJXTQIJBTFEfXTFLJDrXEJFrEJXMrFZJFWEJdEWYTlm\",\n      // 7-kana words\n      \"ABCDEFACNJTRAMBDJdAcNJVXBLNJEBXSIdWRXErNJkXYDJMBXZJCJaXMNJaYKKVJKcKDEJqXKDcNJhKVJrNYKbgJVXKFVJSBNBYBwDNJeQfXNJeEqXNhGJWENJFiJRQlIJbEQJfXxDQqXcfXQFNDEJQFwXUJDYcnUJDJIBgQDIUJTRDJFEqDSJQSJFSJQIJFSOPeZtSJFZJHCJXQfXCTDEqFGJBSJFGJBOfXGJBcqXGJHNJDGJRLiJEJfXEqEJFEJPEFpBEJYJBZJFYBwXUJYiJMEBYJZJyTYTONJXpQMFXFpeGIDdpJFstXpJFcPDLBVSJRLHQJqXLJFZJFIJBNJDIJBUqXIBkFDJIJEJPTIYJGWRIJeQPDIJeEfHIJFsJXOqGDSFHXEJqXgJCsJCgGQJqXgdQYJEgFMFNBgJFcqDVJwXUJVJFZJchIgJCCxOEJqXxOwXUJyDJBVRuscisciJBiJBieUtqXiJFDJkiFsJXQUGEZJcUJFsJXZtXIrXZDZJDrZJFNJDZJFstXvJFQqXvJFCJEsJXQJqkhkNGBbDJdTRbYJMEBlDwXUJMEFiJFcfXNJDRcNJWMTBLJXC\",\n      // 8-kana words\n      \"BraFUtHBFSJFdbNBLJXVJQoYJNEBSJBEJfHSJHwXUJCJdAZJMGjaFVJXEJPNJBlEJfFiJFpFbFEJqIJBVJCrIBdHiJhOPFChvJVJZJNJWxGFNIFLueIBQJqUHEJfUFstOZJDrlXEASJRlXVJXSFwVJNJWD\",\n      // 9-kana words\n      \"QJEJNNJDQJEJIBSFQJEJxegBQJEJfHEPSJBmXEJFSJCDEJqXLXNJFQqXIcQsFNJFIFEJqXUJgFsJXIJBUJEJfHNFvJxEqXNJnXUJFQqD\",\n      // 10-kana words\n      \"IJBEJqXZJ\"\n    ];\n    var mapping = \"~~AzB~X~a~KN~Q~D~S~C~G~E~Y~p~L~I~O~eH~g~V~hxyumi~~U~~Z~~v~~s~~dkoblPjfnqwMcRTr~W~~~F~~~~~Jt\";\n    var wordlist = null;\n    function hex(word) {\n      return (0, bytes_1.hexlify)((0, strings_1.toUtf8Bytes)(word));\n    }\n    var KiYoKu = \"0xe3818de38284e3818f\";\n    var KyoKu = \"0xe3818de38283e3818f\";\n    function loadWords(lang) {\n      if (wordlist !== null) {\n        return;\n      }\n      wordlist = [];\n      var transform = {};\n      transform[(0, strings_1.toUtf8String)([227, 130, 154])] = false;\n      transform[(0, strings_1.toUtf8String)([227, 130, 153])] = false;\n      transform[(0, strings_1.toUtf8String)([227, 130, 133])] = (0, strings_1.toUtf8String)([227, 130, 134]);\n      transform[(0, strings_1.toUtf8String)([227, 129, 163])] = (0, strings_1.toUtf8String)([227, 129, 164]);\n      transform[(0, strings_1.toUtf8String)([227, 130, 131])] = (0, strings_1.toUtf8String)([227, 130, 132]);\n      transform[(0, strings_1.toUtf8String)([227, 130, 135])] = (0, strings_1.toUtf8String)([227, 130, 136]);\n      function normalize(word2) {\n        var result = \"\";\n        for (var i2 = 0; i2 < word2.length; i2++) {\n          var kana = word2[i2];\n          var target = transform[kana];\n          if (target === false) {\n            continue;\n          }\n          if (target) {\n            kana = target;\n          }\n          result += kana;\n        }\n        return result;\n      }\n      function sortJapanese(a, b) {\n        a = normalize(a);\n        b = normalize(b);\n        if (a < b) {\n          return -1;\n        }\n        if (a > b) {\n          return 1;\n        }\n        return 0;\n      }\n      for (var length_1 = 3; length_1 <= 9; length_1++) {\n        var d = data[length_1 - 3];\n        for (var offset = 0; offset < d.length; offset += length_1) {\n          var word = [];\n          for (var i = 0; i < length_1; i++) {\n            var k = mapping.indexOf(d[offset + i]);\n            word.push(227);\n            word.push(k & 64 ? 130 : 129);\n            word.push((k & 63) + 128);\n          }\n          wordlist.push((0, strings_1.toUtf8String)(word));\n        }\n      }\n      wordlist.sort(sortJapanese);\n      if (hex(wordlist[442]) === KiYoKu && hex(wordlist[443]) === KyoKu) {\n        var tmp = wordlist[442];\n        wordlist[442] = wordlist[443];\n        wordlist[443] = tmp;\n      }\n      if (wordlist_1.Wordlist.check(lang) !== \"0xcb36b09e6baa935787fd762ce65e80b0c6a8dabdfbc3a7f86ac0e2c4fd111600\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for ja (Japanese) FAILED\");\n      }\n    }\n    var LangJa = (\n      /** @class */\n      function(_super) {\n        __extends(LangJa2, _super);\n        function LangJa2() {\n          return _super.call(this, \"ja\") || this;\n        }\n        LangJa2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangJa2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        LangJa2.prototype.split = function(mnemonic) {\n          wordlist_1.logger.checkNormalize();\n          return mnemonic.split(/(?:\\u3000| )+/g);\n        };\n        LangJa2.prototype.join = function(words) {\n          return words.join(\"\\u3000\");\n        };\n        return LangJa2;\n      }(wordlist_1.Wordlist)\n    );\n    var langJa = new LangJa();\n    exports2.langJa = langJa;\n    wordlist_1.Wordlist.register(langJa);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-ko.js\nvar require_lang_ko = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-ko.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langKo = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = [\n      \"OYAa\",\n      \"ATAZoATBl3ATCTrATCl8ATDloATGg3ATHT8ATJT8ATJl3ATLlvATLn4ATMT8ATMX8ATMboATMgoAToLbAToMTATrHgATvHnAT3AnAT3JbAT3MTAT8DbAT8JTAT8LmAT8MYAT8MbAT#LnAUHT8AUHZvAUJXrAUJX8AULnrAXJnvAXLUoAXLgvAXMn6AXRg3AXrMbAX3JTAX3QbAYLn3AZLgvAZrSUAZvAcAZ8AaAZ8AbAZ8AnAZ8HnAZ8LgAZ8MYAZ8MgAZ8OnAaAboAaDTrAaFTrAaJTrAaJboAaLVoAaMXvAaOl8AaSeoAbAUoAbAg8AbAl4AbGnrAbMT8AbMXrAbMn4AbQb8AbSV8AbvRlAb8AUAb8AnAb8HgAb8JTAb8NTAb8RbAcGboAcLnvAcMT8AcMX8AcSToAcrAaAcrFnAc8AbAc8MgAfGgrAfHboAfJnvAfLV8AfLkoAfMT8AfMnoAfQb8AfScrAfSgrAgAZ8AgFl3AgGX8AgHZvAgHgrAgJXoAgJX8AgJboAgLZoAgLn4AgOX8AgoATAgoAnAgoCUAgoJgAgoLXAgoMYAgoSeAgrDUAgrJTAhrFnAhrLjAhrQgAjAgoAjJnrAkMX8AkOnoAlCTvAlCV8AlClvAlFg4AlFl6AlFn3AloSnAlrAXAlrAfAlrFUAlrFbAlrGgAlrOXAlvKnAlvMTAl3AbAl3MnAnATrAnAcrAnCZ3AnCl8AnDg8AnFboAnFl3AnHX4AnHbrAnHgrAnIl3AnJgvAnLXoAnLX4AnLbrAnLgrAnLhrAnMXoAnMgrAnOn3AnSbrAnSeoAnvLnAn3OnCTGgvCTSlvCTvAUCTvKnCTvNTCT3CZCT3GUCT3MTCT8HnCUCZrCULf8CULnvCU3HnCU3JUCY6NUCbDb8CbFZoCbLnrCboOTCboScCbrFnCbvLnCb8AgCb8HgCb$LnCkLfoClBn3CloDUDTHT8DTLl3DTSU8DTrAaDTrLXDTrLjDTrOYDTrOgDTvFXDTvFnDT3HUDT3LfDUCT9DUDT4DUFVoDUFV8DUFkoDUGgrDUJnrDULl8DUMT8DUMXrDUMX4DUMg8DUOUoDUOgvDUOg8DUSToDUSZ8DbDXoDbDgoDbGT8DbJn3DbLg3DbLn4DbMXrDbMg8DbOToDboJXGTClvGTDT8GTFZrGTLVoGTLlvGTLl3GTMg8GTOTvGTSlrGToCUGTrDgGTrJYGTrScGTtLnGTvAnGTvQgGUCZrGUDTvGUFZoGUHXrGULnvGUMT8GUoMgGXoLnGXrMXGXrMnGXvFnGYLnvGZOnvGZvOnGZ8LaGZ8LmGbAl3GbDYvGbDlrGbHX3GbJl4GbLV8GbLn3GbMn4GboJTGboRfGbvFUGb3GUGb4JnGgDX3GgFl$GgJlrGgLX6GgLZoGgLf8GgOXoGgrAgGgrJXGgrMYGgrScGgvATGgvOYGnAgoGnJgvGnLZoGnLg3GnLnrGnQn8GnSbrGnrMgHTClvHTDToHTFT3HTQT8HToJTHToJgHTrDUHTrMnHTvFYHTvRfHT8MnHT8SUHUAZ8HUBb4HUDTvHUoMYHXFl6HXJX6HXQlrHXrAUHXrMnHXrSbHXvFYHXvKXHX3LjHX3MeHYvQlHZrScHZvDbHbAcrHbFT3HbFl3HbJT8HbLTrHbMT8HbMXrHbMbrHbQb8HbSX3HboDbHboJTHbrFUHbrHgHbrJTHb8JTHb8MnHb8QgHgAlrHgDT3HgGgrHgHgrHgJTrHgJT8HgLX@HgLnrHgMT8HgMX8HgMboHgOnrHgQToHgRg3HgoHgHgrCbHgrFnHgrLVHgvAcHgvAfHnAloHnCTrHnCnvHnGTrHnGZ8HnGnvHnJT8HnLf8HnLkvHnMg8HnRTrITvFUITvFnJTAXrJTCV8JTFT3JTFT8JTFn4JTGgvJTHT8JTJT8JTJXvJTJl3JTJnvJTLX4JTLf8JTLhvJTMT8JTMXrJTMnrJTObrJTQT8JTSlvJT8DUJT8FkJT8MTJT8OXJT8OgJT8QUJT8RfJUHZoJXFT4JXFlrJXGZ8JXGnrJXLV8JXLgvJXMXoJXMX3JXNboJXPlvJXoJTJXoLkJXrAXJXrHUJXrJgJXvJTJXvOnJX4KnJYAl3JYJT8JYLhvJYQToJYrQXJY6NUJbAl3JbCZrJbDloJbGT8JbGgrJbJXvJbJboJbLf8JbLhrJbLl3JbMnvJbRg8JbSZ8JboDbJbrCZJbrSUJb3KnJb8LnJfRn8JgAXrJgCZrJgDTrJgGZrJgGZ8JgHToJgJT8JgJXoJgJgvJgLX4JgLZ3JgLZ8JgLn4JgMgrJgMn4JgOgvJgPX6JgRnvJgSToJgoCZJgoJbJgoMYJgrJXJgrJgJgrLjJg6MTJlCn3JlGgvJlJl8Jl4AnJl8FnJl8HgJnAToJnATrJnAbvJnDUoJnGnrJnJXrJnJXvJnLhvJnLnrJnLnvJnMToJnMT8JnMXvJnMX3JnMg8JnMlrJnMn4JnOX8JnST4JnSX3JnoAgJnoAnJnoJTJnoObJnrAbJnrAkJnrHnJnrJTJnrJYJnrOYJnrScJnvCUJnvFaJnvJgJnvJnJnvOYJnvQUJnvRUJn3FnJn3JTKnFl3KnLT6LTDlvLTMnoLTOn3LTRl3LTSb4LTSlrLToAnLToJgLTrAULTrAcLTrCULTrHgLTrMgLT3JnLULnrLUMX8LUoJgLVATrLVDTrLVLb8LVoJgLV8MgLV8RTLXDg3LXFlrLXrCnLXrLXLX3GTLX4GgLX4OYLZAXrLZAcrLZAgrLZAhrLZDXyLZDlrLZFbrLZFl3LZJX6LZJX8LZLc8LZLnrLZSU8LZoJTLZoJnLZrAgLZrAnLZrJYLZrLULZrMgLZrSkLZvAnLZvGULZvJeLZvOTLZ3FZLZ4JXLZ8STLZ8ScLaAT3LaAl3LaHT8LaJTrLaJT8LaJXrLaJgvLaJl4LaLVoLaMXrLaMXvLaMX8LbClvLbFToLbHlrLbJn4LbLZ3LbLhvLbMXrLbMnoLbvSULcLnrLc8HnLc8MTLdrMnLeAgoLeOgvLeOn3LfAl3LfLnvLfMl3LfOX8Lf8AnLf8JXLf8LXLgJTrLgJXrLgJl8LgMX8LgRZrLhCToLhrAbLhrFULhrJXLhvJYLjHTrLjHX4LjJX8LjLhrLjSX3LjSZ4LkFX4LkGZ8LkGgvLkJTrLkMXoLkSToLkSU8LkSZ8LkoOYLl3FfLl3MgLmAZrLmCbrLmGgrLmHboLmJnoLmJn3LmLfoLmLhrLmSToLnAX6LnAb6LnCZ3LnCb3LnDTvLnDb8LnFl3LnGnrLnHZvLnHgvLnITvLnJT8LnJX8LnJlvLnLf8LnLg6LnLhvLnLnoLnMXrLnMg8LnQlvLnSbrLnrAgLnrAnLnrDbLnrFkLnrJdLnrMULnrOYLnrSTLnvAnLnvDULnvHgLnvOYLnvOnLn3GgLn4DULn4JTLn4JnMTAZoMTAloMTDb8MTFT8MTJnoMTJnrMTLZrMTLhrMTLkvMTMX8MTRTrMToATMTrDnMTrOnMT3JnMT4MnMT8FUMT8FaMT8FlMT8GTMT8GbMT8GnMT8HnMT8JTMT8JbMT8OTMUCl8MUJTrMUJU8MUMX8MURTrMUSToMXAX6MXAb6MXCZoMXFXrMXHXrMXLgvMXOgoMXrAUMXrAnMXrHgMXrJYMXrJnMXrMTMXrMgMXrOYMXrSZMXrSgMXvDUMXvOTMX3JgMX3OTMX4JnMX8DbMX8FnMX8HbMX8HgMX8HnMX8LbMX8MnMX8OnMYAb8MYGboMYHTvMYHX4MYLTrMYLnvMYMToMYOgvMYRg3MYSTrMbAToMbAXrMbAl3MbAn8MbGZ8MbJT8MbJXrMbMXvMbMX8MbMnoMbrMUMb8AfMb8FbMb8FkMcJXoMeLnrMgFl3MgGTvMgGXoMgGgrMgGnrMgHT8MgHZrMgJnoMgLnrMgLnvMgMT8MgQUoMgrHnMgvAnMg8HgMg8JYMg8LfMloJnMl8ATMl8AXMl8JYMnAToMnAT4MnAZ8MnAl3MnAl4MnCl8MnHT8MnHg8MnJnoMnLZoMnLhrMnMXoMnMX3MnMnrMnOgvMnrFbMnrFfMnrFnMnrNTMnvJXNTMl8OTCT3OTFV8OTFn3OTHZvOTJXrOTOl3OT3ATOT3JUOT3LZOT3LeOT3MbOT8ATOT8AbOT8AgOT8MbOUCXvOUMX3OXHXvOXLl3OXrMUOXvDbOX6NUOX8JbOYFZoOYLbrOYLkoOYMg8OYSX3ObHTrObHT4ObJgrObLhrObMX3ObOX8Ob8FnOeAlrOeJT8OeJXrOeJnrOeLToOeMb8OgJXoOgLXoOgMnrOgOXrOgOloOgoAgOgoJbOgoMYOgoSTOg8AbOjLX4OjMnoOjSV8OnLVoOnrAgOn3DUPXQlrPXvFXPbvFTPdAT3PlFn3PnvFbQTLn4QToAgQToMTQULV8QURg8QUoJnQXCXvQbFbrQb8AaQb8AcQb8FbQb8MYQb8ScQeAlrQeLhrQjAn3QlFXoQloJgQloSnRTLnvRTrGURTrJTRUJZrRUoJlRUrQnRZrLmRZrMnRZrSnRZ8ATRZ8JbRZ8ScRbMT8RbST3RfGZrRfMX8RfMgrRfSZrRnAbrRnGT8RnvJgRnvLfRnvMTRn8AaSTClvSTJgrSTOXrSTRg3STRnvSToAcSToAfSToAnSToHnSToLjSToMTSTrAaSTrEUST3BYST8AgST8LmSUAZvSUAgrSUDT4SUDT8SUGgvSUJXoSUJXvSULTrSU8JTSU8LjSV8AnSV8JgSXFToSXLf8SYvAnSZrDUSZrMUSZrMnSZ8HgSZ8JTSZ8JgSZ8MYSZ8QUSaQUoSbCT3SbHToSbQYvSbSl4SboJnSbvFbSb8HbSb8JgSb8OTScGZrScHgrScJTvScMT8ScSToScoHbScrMTScvAnSeAZrSeAcrSeHboSeJUoSeLhrSeMT8SeMXrSe6JgSgHTrSkJnoSkLnvSk8CUSlFl3SlrSnSl8GnSmAboSmGT8SmJU8\",\n      \"ATLnDlATrAZoATrJX4ATrMT8ATrMX4ATrRTrATvDl8ATvJUoATvMl8AT3AToAT3MX8AT8CT3AT8DT8AT8HZrAT8HgoAUAgFnAUCTFnAXoMX8AXrAT8AXrGgvAXrJXvAXrOgoAXvLl3AZvAgoAZvFbrAZvJXoAZvJl8AZvJn3AZvMX8AZvSbrAZ8FZoAZ8LZ8AZ8MU8AZ8OTvAZ8SV8AZ8SX3AbAgFZAboJnoAbvGboAb8ATrAb8AZoAb8AgrAb8Al4Ab8Db8Ab8JnoAb8LX4Ab8LZrAb8LhrAb8MT8Ab8OUoAb8Qb8Ab8ST8AcrAUoAcrAc8AcrCZ3AcrFT3AcrFZrAcrJl4AcrJn3AcrMX3AcrOTvAc8AZ8Ac8MT8AfAcJXAgoFn4AgoGgvAgoGnrAgoLc8AgoMXoAgrLnrAkrSZ8AlFXCTAloHboAlrHbrAlrLhrAlrLkoAl3CZrAl3LUoAl3LZrAnrAl4AnrMT8An3HT4BT3IToBX4MnvBb!Ln$CTGXMnCToLZ4CTrHT8CT3JTrCT3RZrCT#GTvCU6GgvCU8Db8CU8GZrCU8HT8CboLl3CbrGgrCbrMU8Cb8DT3Cb8GnrCb8LX4Cb8MT8Cb8ObrCgrGgvCgrKX4Cl8FZoDTrAbvDTrDboDTrGT6DTrJgrDTrMX3DTrRZrDTrRg8DTvAVvDTvFZoDT3DT8DT3Ln3DT4HZrDT4MT8DT8AlrDT8MT8DUAkGbDUDbJnDYLnQlDbDUOYDbMTAnDbMXSnDboAT3DboFn4DboLnvDj6JTrGTCgFTGTGgFnGTJTMnGTLnPlGToJT8GTrCT3GTrLVoGTrLnvGTrMX3GTrMboGTvKl3GZClFnGZrDT3GZ8DTrGZ8FZ8GZ8MXvGZ8On8GZ8ST3GbCnQXGbMbFnGboFboGboJg3GboMXoGb3JTvGb3JboGb3Mn6Gb3Qb8GgDXLjGgMnAUGgrDloGgrHX4GgrSToGgvAXrGgvAZvGgvFbrGgvLl3GgvMnvGnDnLXGnrATrGnrMboGnuLl3HTATMnHTAgCnHTCTCTHTrGTvHTrHTvHTrJX8HTrLl8HTrMT8HTrMgoHTrOTrHTuOn3HTvAZrHTvDTvHTvGboHTvJU8HTvLl3HTvMXrHTvQb4HT4GT6HT4JT8HT4Jb#HT8Al3HT8GZrHT8GgrHT8HX4HT8Jb8HT8JnoHT8LTrHT8LgvHT8SToHT8SV8HUoJUoHUoJX8HUoLnrHXrLZoHXvAl3HX3LnrHX4FkvHX4LhrHX4MXoHX4OnoHZrAZ8HZrDb8HZrGZ8HZrJnrHZvGZ8HZvLnvHZ8JnvHZ8LhrHbCXJlHbMTAnHboJl4HbpLl3HbrJX8HbrLnrHbrMnvHbvRYrHgoSTrHgrFV8HgrGZ8HgrJXoHgrRnvHgvBb!HgvGTrHgvHX4HgvHn!HgvLTrHgvSU8HnDnLbHnFbJbHnvDn8Hn6GgvHn!BTvJTCTLnJTQgFnJTrAnvJTrLX4JTrOUoJTvFn3JTvLnrJTvNToJT3AgoJT3Jn4JT3LhvJT3ObrJT8AcrJT8Al3JT8JT8JT8JnoJT8LX4JT8LnrJT8MX3JT8Rg3JT8Sc8JUoBTvJU8AToJU8GZ8JU8GgvJU8JTrJU8JXrJU8JnrJU8LnvJU8ScvJXHnJlJXrGgvJXrJU8JXrLhrJXrMT8JXrMXrJXrQUoJXvCTvJXvGZ8JXvGgrJXvQT8JX8Ab8JX8DT8JX8GZ8JX8HZvJX8LnrJX8MT8JX8MXoJX8MnvJX8ST3JYGnCTJbAkGbJbCTAnJbLTAcJboDT3JboLb6JbrAnvJbrCn3JbrDl8JbrGboJbrIZoJbrJnvJbrMnvJbrQb4Jb8RZrJeAbAnJgJnFbJgScAnJgrATrJgvHZ8JgvMn4JlJlFbJlLiQXJlLjOnJlRbOlJlvNXoJlvRl3Jl4AcrJl8AUoJl8MnrJnFnMlJnHgGbJnoDT8JnoFV8JnoGgvJnoIT8JnoQToJnoRg3JnrCZ3JnrGgrJnrHTvJnrLf8JnrOX8JnvAT3JnvFZoJnvGT8JnvJl4JnvMT8JnvMX8JnvOXrJnvPX6JnvSX3JnvSZrJn3MT8Jn3MX8Jn3RTrLTATKnLTJnLTLTMXKnLTRTQlLToGb8LTrAZ8LTrCZ8LTrDb8LTrHT8LT3PX6LT4FZoLT$CTvLT$GgrLUvHX3LVoATrLVoAgoLVoJboLVoMX3LVoRg3LV8CZ3LV8FZoLV8GTvLXrDXoLXrFbrLXvAgvLXvFlrLXvLl3LXvRn6LX4Mb8LX8GT8LYCXMnLYrMnrLZoSTvLZrAZvLZrAloLZrFToLZrJXvLZrJboLZrJl4LZrLnrLZrMT8LZrOgvLZrRnvLZrST4LZvMX8LZvSlvLZ8AgoLZ8CT3LZ8JT8LZ8LV8LZ8LZoLZ8Lg8LZ8SV8LZ8SbrLZ$HT8LZ$Mn4La6CTvLbFbMnLbRYFTLbSnFZLboJT8LbrAT9LbrGb3LbrQb8LcrJX8LcrMXrLerHTvLerJbrLerNboLgrDb8LgrGZ8LgrHTrLgrMXrLgrSU8LgvJTrLgvLl3Lg6Ll3LhrLnrLhrMT8LhvAl4LiLnQXLkoAgrLkoJT8LkoJn4LlrSU8Ll3FZoLl3HTrLl3JX8Ll3JnoLl3LToLmLeFbLnDUFbLnLVAnLnrATrLnrAZoLnrAb8LnrAlrLnrGgvLnrJU8LnrLZrLnrLhrLnrMb8LnrOXrLnrSZ8LnvAb4LnvDTrLnvDl8LnvHTrLnvHbrLnvJT8LnvJU8LnvJbrLnvLhvLnvMX8LnvMb8LnvNnoLnvSU8Ln3Al3Ln4FZoLn4GT6Ln4JgvLn4LhrLn4MT8Ln4SToMToCZrMToJX8MToLX4MToLf8MToRg3MTrEloMTvGb6MT3BTrMT3Lb6MT8AcrMT8AgrMT8GZrMT8JnoMT8LnrMT8MX3MUOUAnMXAbFnMXoAloMXoJX8MXoLf8MXoLl8MXrAb8MXrDTvMXrGT8MXrGgrMXrHTrMXrLf8MXrMU8MXrOXvMXrQb8MXvGT8MXvHTrMXvLVoMX3AX3MX3Jn3MX3LhrMX3MX3MX4AlrMX4OboMX8GTvMX8GZrMX8GgrMX8JT8MX8JX8MX8LhrMX8MT8MYDUFbMYMgDbMbGnFfMbvLX4MbvLl3Mb8Mb8Mb8ST4MgGXCnMg8ATrMg8AgoMg8CZrMg8DTrMg8DboMg8HTrMg8JgrMg8LT8MloJXoMl8AhrMl8JT8MnLgAUMnoJXrMnoLX4MnoLhrMnoMT8MnrAl4MnrDb8MnrOTvMnrOgvMnrQb8MnrSU8MnvGgrMnvHZ8Mn3MToMn4DTrMn4LTrMn4Mg8NnBXAnOTFTFnOToAToOTrGgvOTrJX8OT3JXoOT6MTrOT8GgrOT8HTpOT8MToOUoHT8OUoJT8OUoLn3OXrAgoOXrDg8OXrMT8OXvSToOX6CTvOX8CZrOX8OgrOb6HgvOb8AToOb8MT8OcvLZ8OgvAlrOgvHTvOgvJTrOgvJnrOgvLZrOgvLn4OgvMT8OgvRTrOg8AZoOg8DbvOnrOXoOnvJn4OnvLhvOnvRTrOn3GgoOn3JnvOn6JbvOn8OTrPTGYFTPbBnFnPbGnDnPgDYQTPlrAnvPlrETvPlrLnvPlrMXvPlvFX4QTMTAnQTrJU8QYCnJlQYJlQlQbGTQbQb8JnrQb8LZoQb8LnvQb8MT8Qb8Ml8Qb8ST4QloAl4QloHZvQloJX8QloMn8QnJZOlRTrAZvRTrDTrRTvJn4RTvLhvRT4Jb8RZrAZrRZ8AkrRZ8JU8RZ8LV8RZ8LnvRbJlQXRg3GboRg3MnvRg8AZ8Rg8JboRg8Jl4RnLTCbRnvFl3RnvQb8SToAl4SToCZrSToFZoSToHXrSToJU8SToJgvSToJl4SToLhrSToMX3STrAlvSTrCT9STrCgrSTrGgrSTrHXrSTrHboSTrJnoSTrNboSTvLnrST4AZoST8Ab8ST8JT8SUoJn3SU6HZ#SU6JTvSU8Db8SU8HboSU8LgrSV8JT8SZrAcrSZrAl3SZrJT8SZrJnvSZrMT8SZvLUoSZ4FZoSZ8JnoSZ8RZrScoLnrScoMT8ScoMX8ScrAT4ScrAZ8ScrLZ8ScrLkvScvDb8ScvLf8ScvNToSgrFZrShvKnrSloHUoSloLnrSlrMXoSl8HgrSmrJUoSn3BX6\",\n      \"ATFlOn3ATLgrDYAT4MTAnAT8LTMnAYJnRTrAbGgJnrAbLV8LnAbvNTAnAeFbLg3AgOYMXoAlQbFboAnDboAfAnJgoJTBToDgAnBUJbAl3BboDUAnCTDlvLnCTFTrSnCYoQTLnDTwAbAnDUDTrSnDUHgHgrDX8LXFnDbJXAcrETvLTLnGTFTQbrGTMnGToGT3DUFbGUJlPX3GbQg8LnGboJbFnGb3GgAYGgAg8ScGgMbAXrGgvAbAnGnJTLnvGnvATFgHTDT6ATHTrDlJnHYLnMn8HZrSbJTHZ8LTFnHbFTJUoHgSeMT8HgrLjAnHgvAbAnHlFUrDlHnDgvAnHnHTFT3HnQTGnrJTAaMXvJTGbCn3JTOgrAnJXvAXMnJbMg8SnJbMnRg3Jb8LTMnJnAl3OnJnGYrQlJnJlQY3LTDlCn3LTJjLg3LTLgvFXLTMg3GTLV8HUOgLXFZLg3LXNXrMnLX8QXFnLX9AlMYLYLXPXrLZAbJU8LZDUJU8LZMXrSnLZ$AgFnLaPXrDULbFYrMnLbMn8LXLboJgJgLeFbLg3LgLZrSnLgOYAgoLhrRnJlLkCTrSnLkOnLhrLnFX%AYLnFZoJXLnHTvJbLnLloAbMTATLf8MTHgJn3MTMXrAXMT3MTFnMUITvFnMXFX%AYMXMXvFbMXrFTDbMYAcMX3MbLf8SnMb8JbFnMgMXrMTMgvAXFnMgvGgCmMnAloSnMnFnJTrOXvMXSnOX8HTMnObJT8ScObLZFl3ObMXCZoPTLgrQXPUFnoQXPU3RXJlPX3RkQXPbrJXQlPlrJbFnQUAhrDbQXGnCXvQYLnHlvQbLfLnvRTOgvJbRXJYrQlRYLnrQlRbLnrQlRlFT8JlRlFnrQXSTClCn3STHTrAnSTLZQlrSTMnGTrSToHgGbSTrGTDnSTvGXCnST3HgFbSU3HXAXSbAnJn3SbFT8LnScLfLnv\",\n      \"AT3JgJX8AT8FZoSnAT8JgFV8AT8LhrDbAZ8JT8DbAb8GgLhrAb8SkLnvAe8MT8SnAlMYJXLVAl3GYDTvAl3LfLnvBUDTvLl3CTOn3HTrCT3DUGgrCU8MT8AbCbFTrJUoCgrDb8MTDTLV8JX8DTLnLXQlDT8LZrSnDUQb8FZ8DUST4JnvDb8ScOUoDj6GbJl4GTLfCYMlGToAXvFnGboAXvLnGgAcrJn3GgvFnSToGnLf8JnvGn#HTDToHTLnFXJlHTvATFToHTvHTDToHTvMTAgoHT3STClvHT4AlFl6HT8HTDToHUoDgJTrHUoScMX3HbRZrMXoHboJg8LTHgDb8JTrHgMToLf8HgvLnLnoHnHn3HT4Hn6MgvAnJTJU8ScvJT3AaQT8JT8HTrAnJXrRg8AnJbAloMXoJbrATFToJbvMnoSnJgDb6GgvJgDb8MXoJgSX3JU8JguATFToJlPYLnQlJlQkDnLbJlQlFYJlJl8Lf8OTJnCTFnLbJnLTHXMnJnLXGXCnJnoFfRg3JnrMYRg3Jn3HgFl3KT8Dg8LnLTRlFnPTLTvPbLbvLVoSbrCZLXMY6HT3LXNU7DlrLXNXDTATLX8DX8LnLZDb8JU8LZMnoLhrLZSToJU8LZrLaLnrLZvJn3SnLZ8LhrSnLaJnoMT8LbFlrHTvLbrFTLnrLbvATLlvLb6OTFn3LcLnJZOlLeAT6Mn4LeJT3ObrLg6LXFlrLhrJg8LnLhvDlPX4LhvLfLnvLj6JTFT3LnFbrMXoLnQluCTvLnrQXCY6LnvLfLnvLnvMgLnvLnvSeLf8MTMbrJn3MT3JgST3MT8AnATrMT8LULnrMUMToCZrMUScvLf8MXoDT8SnMX6ATFToMX8AXMT8MX8FkMT8MX8HTrDUMX8ScoSnMYJT6CTvMgAcrMXoMg8SToAfMlvAXLg3MnFl3AnvOT3AnFl3OUoATHT8OU3RnLXrOXrOXrSnObPbvFn6Og8HgrSnOg8OX8DbPTvAgoJgPU3RYLnrPXrDnJZrPb8CTGgvPlrLTDlvPlvFUJnoQUvFXrQlQeMnoAl3QlrQlrSnRTFTrJUoSTDlLiLXSTFg6HT3STJgoMn4STrFTJTrSTrLZFl3ST4FnMXoSUrDlHUoScvHTvSnSfLkvMXo\",\n      \"AUoAcrMXoAZ8HboAg8AbOg6ATFgAg8AloMXoAl3AT8JTrAl8MX8MXoCT3SToJU8Cl8Db8MXoDT8HgrATrDboOT8MXoGTOTrATMnGT8LhrAZ8GnvFnGnQXHToGgvAcrHTvAXvLl3HbrAZoMXoHgBlFXLg3HgMnFXrSnHgrSb8JUoHn6HT8LgvITvATrJUoJUoLZrRnvJU8HT8Jb8JXvFX8QT8JXvLToJTrJYrQnGnQXJgrJnoATrJnoJU8ScvJnvMnvMXoLTCTLgrJXLTJlRTvQlLbRnJlQYvLbrMb8LnvLbvFn3RnoLdCVSTGZrLeSTvGXCnLg3MnoLn3MToLlrETvMT8SToAl3MbrDU6GTvMb8LX4LhrPlrLXGXCnSToLf8Rg3STrDb8LTrSTvLTHXMnSb3RYLnMnSgOg6ATFg\",\n      \"HUDlGnrQXrJTrHgLnrAcJYMb8DULc8LTvFgGnCk3Mg8JbAnLX4QYvFYHnMXrRUoJnGnvFnRlvFTJlQnoSTrBXHXrLYSUJgLfoMT8Se8DTrHbDb\",\n      \"AbDl8SToJU8An3RbAb8ST8DUSTrGnrAgoLbFU6Db8LTrMg8AaHT8Jb8ObDl8SToJU8Pb3RlvFYoJl\"\n    ];\n    var codes = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*\";\n    function getHangul(code) {\n      if (code >= 40) {\n        code = code + 168 - 40;\n      } else if (code >= 19) {\n        code = code + 97 - 19;\n      }\n      return (0, strings_1.toUtf8String)([225, (code >> 6) + 132, (code & 63) + 128]);\n    }\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = [];\n      data.forEach(function(data2, length) {\n        length += 4;\n        for (var i = 0; i < data2.length; i += length) {\n          var word = \"\";\n          for (var j = 0; j < length; j++) {\n            word += getHangul(codes.indexOf(data2[i + j]));\n          }\n          wordlist.push(word);\n        }\n      });\n      wordlist.sort();\n      if (wordlist_1.Wordlist.check(lang) !== \"0xf9eddeace9c5d3da9c93cf7d3cd38f6a13ed3affb933259ae865714e8a3ae71a\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for ko (Korean) FAILED\");\n      }\n    }\n    var LangKo = (\n      /** @class */\n      function(_super) {\n        __extends(LangKo2, _super);\n        function LangKo2() {\n          return _super.call(this, \"ko\") || this;\n        }\n        LangKo2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangKo2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangKo2;\n      }(wordlist_1.Wordlist)\n    );\n    var langKo = new LangKo();\n    exports2.langKo = langKo;\n    wordlist_1.Wordlist.register(langKo);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-it.js\nvar require_lang_it = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-it.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langIt = void 0;\n    var wordlist_1 = require_wordlist();\n    var words = \"AbacoAbbaglioAbbinatoAbeteAbissoAbolireAbrasivoAbrogatoAccadereAccennoAccusatoAcetoneAchilleAcidoAcquaAcreAcrilicoAcrobataAcutoAdagioAddebitoAddomeAdeguatoAderireAdipeAdottareAdulareAffabileAffettoAffissoAffrantoAforismaAfosoAfricanoAgaveAgenteAgevoleAggancioAgireAgitareAgonismoAgricoloAgrumetoAguzzoAlabardaAlatoAlbatroAlberatoAlboAlbumeAlceAlcolicoAlettoneAlfaAlgebraAlianteAlibiAlimentoAllagatoAllegroAllievoAllodolaAllusivoAlmenoAlogenoAlpacaAlpestreAltalenaAlternoAlticcioAltroveAlunnoAlveoloAlzareAmalgamaAmanitaAmarenaAmbitoAmbratoAmebaAmericaAmetistaAmicoAmmassoAmmendaAmmirareAmmonitoAmoreAmpioAmpliareAmuletoAnacardoAnagrafeAnalistaAnarchiaAnatraAncaAncellaAncoraAndareAndreaAnelloAngeloAngolareAngustoAnimaAnnegareAnnidatoAnnoAnnuncioAnonimoAnticipoAnziApaticoAperturaApodeApparireAppetitoAppoggioApprodoAppuntoAprileArabicaArachideAragostaAraldicaArancioAraturaArazzoArbitroArchivioArditoArenileArgentoArgineArgutoAriaArmoniaArneseArredatoArringaArrostoArsenicoArsoArteficeArzilloAsciuttoAscoltoAsepsiAsetticoAsfaltoAsinoAsolaAspiratoAsproAssaggioAsseAssolutoAssurdoAstaAstenutoAsticeAstrattoAtavicoAteismoAtomicoAtonoAttesaAttivareAttornoAttritoAttualeAusilioAustriaAutistaAutonomoAutunnoAvanzatoAvereAvvenireAvvisoAvvolgereAzioneAzotoAzzimoAzzurroBabeleBaccanoBacinoBacoBadessaBadilataBagnatoBaitaBalconeBaldoBalenaBallataBalzanoBambinoBandireBaraondaBarbaroBarcaBaritonoBarlumeBaroccoBasilicoBassoBatostaBattutoBauleBavaBavosaBeccoBeffaBelgioBelvaBendaBenevoleBenignoBenzinaBereBerlinaBetaBibitaBiciBidoneBifidoBigaBilanciaBimboBinocoloBiologoBipedeBipolareBirbanteBirraBiscottoBisestoBisnonnoBisonteBisturiBizzarroBlandoBlattaBollitoBonificoBordoBoscoBotanicoBottinoBozzoloBraccioBradipoBramaBrancaBravuraBretellaBrevettoBrezzaBrigliaBrillanteBrindareBroccoloBrodoBronzinaBrulloBrunoBubboneBucaBudinoBuffoneBuioBulboBuonoBurloneBurrascaBussolaBustaCadettoCaducoCalamaroCalcoloCalesseCalibroCalmoCaloriaCambusaCamerataCamiciaCamminoCamolaCampaleCanapaCandelaCaneCaninoCanottoCantinaCapaceCapelloCapitoloCapogiroCapperoCapraCapsulaCarapaceCarcassaCardoCarismaCarovanaCarrettoCartolinaCasaccioCascataCasermaCasoCassoneCastelloCasualeCatastaCatenaCatrameCautoCavilloCedibileCedrataCefaloCelebreCellulareCenaCenoneCentesimoCeramicaCercareCertoCerumeCervelloCesoiaCespoCetoChelaChiaroChiccaChiedereChimeraChinaChirurgoChitarraCiaoCiclismoCifrareCignoCilindroCiottoloCircaCirrosiCitricoCittadinoCiuffoCivettaCivileClassicoClinicaCloroCoccoCodardoCodiceCoerenteCognomeCollareColmatoColoreColposoColtivatoColzaComaCometaCommandoComodoComputerComuneConcisoCondurreConfermaCongelareConiugeConnessoConoscereConsumoContinuoConvegnoCopertoCopioneCoppiaCopricapoCorazzaCordataCoricatoCorniceCorollaCorpoCorredoCorsiaCorteseCosmicoCostanteCotturaCovatoCratereCravattaCreatoCredereCremosoCrescitaCretaCricetoCrinaleCrisiCriticoCroceCronacaCrostataCrucialeCruscaCucireCuculoCuginoCullatoCupolaCuratoreCursoreCurvoCuscinoCustodeDadoDainoDalmataDamerinoDanielaDannosoDanzareDatatoDavantiDavveroDebuttoDecennioDecisoDeclinoDecolloDecretoDedicatoDefinitoDeformeDegnoDelegareDelfinoDelirioDeltaDemenzaDenotatoDentroDepositoDerapataDerivareDerogaDescrittoDesertoDesiderioDesumereDetersivoDevotoDiametroDicembreDiedroDifesoDiffusoDigerireDigitaleDiluvioDinamicoDinnanziDipintoDiplomaDipoloDiradareDireDirottoDirupoDisagioDiscretoDisfareDisgeloDispostoDistanzaDisumanoDitoDivanoDiveltoDividereDivoratoDobloneDocenteDoganaleDogmaDolceDomatoDomenicaDominareDondoloDonoDormireDoteDottoreDovutoDozzinaDragoDruidoDubbioDubitareDucaleDunaDuomoDupliceDuraturoEbanoEccessoEccoEclissiEconomiaEderaEdicolaEdileEditoriaEducareEgemoniaEgliEgoismoEgregioElaboratoElargireEleganteElencatoElettoElevareElficoElicaElmoElsaElusoEmanatoEmblemaEmessoEmiroEmotivoEmozioneEmpiricoEmuloEndemicoEnduroEnergiaEnfasiEnotecaEntrareEnzimaEpatiteEpilogoEpisodioEpocaleEppureEquatoreErarioErbaErbosoEredeEremitaErigereErmeticoEroeErosivoErranteEsagonoEsameEsanimeEsaudireEscaEsempioEsercitoEsibitoEsigenteEsistereEsitoEsofagoEsortatoEsosoEspansoEspressoEssenzaEssoEstesoEstimareEstoniaEstrosoEsultareEtilicoEtnicoEtruscoEttoEuclideoEuropaEvasoEvidenzaEvitatoEvolutoEvvivaFabbricaFaccendaFachiroFalcoFamigliaFanaleFanfaraFangoFantasmaFareFarfallaFarinosoFarmacoFasciaFastosoFasulloFaticareFatoFavolosoFebbreFecolaFedeFegatoFelpaFeltroFemminaFendereFenomenoFermentoFerroFertileFessuraFestivoFettaFeudoFiabaFiduciaFifaFiguratoFiloFinanzaFinestraFinireFioreFiscaleFisicoFiumeFlaconeFlamencoFleboFlemmaFloridoFluenteFluoroFobicoFocacciaFocosoFoderatoFoglioFolataFolcloreFolgoreFondenteFoneticoFoniaFontanaForbitoForchettaForestaFormicaFornaioForoFortezzaForzareFosfatoFossoFracassoFranaFrassinoFratelloFreccettaFrenataFrescoFrigoFrollinoFrondeFrugaleFruttaFucilataFucsiaFuggenteFulmineFulvoFumanteFumettoFumosoFuneFunzioneFuocoFurboFurgoneFuroreFusoFutileGabbianoGaffeGalateoGallinaGaloppoGamberoGammaGaranziaGarboGarofanoGarzoneGasdottoGasolioGastricoGattoGaudioGazeboGazzellaGecoGelatinaGelsoGemelloGemmatoGeneGenitoreGennaioGenotipoGergoGhepardoGhiaccioGhisaGialloGildaGineproGiocareGioielloGiornoGioveGiratoGironeGittataGiudizioGiuratoGiustoGlobuloGlutineGnomoGobbaGolfGomitoGommoneGonfioGonnaGovernoGracileGradoGraficoGrammoGrandeGrattareGravosoGraziaGrecaGreggeGrifoneGrigioGrinzaGrottaGruppoGuadagnoGuaioGuantoGuardareGufoGuidareIbernatoIconaIdenticoIdillioIdoloIdraIdricoIdrogenoIgieneIgnaroIgnoratoIlareIllesoIllogicoIlludereImballoImbevutoImboccoImbutoImmaneImmersoImmolatoImpaccoImpetoImpiegoImportoImprontaInalareInarcareInattivoIncantoIncendioInchinoIncisivoInclusoIncontroIncrocioIncuboIndagineIndiaIndoleIneditoInfattiInfilareInflittoIngaggioIngegnoIngleseIngordoIngrossoInnescoInodoreInoltrareInondatoInsanoInsettoInsiemeInsonniaInsulinaIntasatoInteroIntonacoIntuitoInumidireInvalidoInveceInvitoIperboleIpnoticoIpotesiIppicaIrideIrlandaIronicoIrrigatoIrrorareIsolatoIsotopoIstericoIstitutoIstriceItaliaIterareLabbroLabirintoLaccaLaceratoLacrimaLacunaLaddoveLagoLampoLancettaLanternaLardosoLargaLaringeLastraLatenzaLatinoLattugaLavagnaLavoroLegaleLeggeroLemboLentezzaLenzaLeoneLepreLesivoLessatoLestoLetteraleLevaLevigatoLiberoLidoLievitoLillaLimaturaLimitareLimpidoLineareLinguaLiquidoLiraLiricaLiscaLiteLitigioLivreaLocandaLodeLogicaLombareLondraLongevoLoquaceLorenzoLotoLotteriaLuceLucidatoLumacaLuminosoLungoLupoLuppoloLusingaLussoLuttoMacabroMacchinaMaceroMacinatoMadamaMagicoMagliaMagneteMagroMaiolicaMalafedeMalgradoMalintesoMalsanoMaltoMalumoreManaManciaMandorlaMangiareManifestoMannaroManovraMansardaMantideManubrioMappaMaratonaMarcireMarettaMarmoMarsupioMascheraMassaiaMastinoMaterassoMatricolaMattoneMaturoMazurcaMeandroMeccanicoMecenateMedesimoMeditareMegaMelassaMelisMelodiaMeningeMenoMensolaMercurioMerendaMerloMeschinoMeseMessereMestoloMetalloMetodoMettereMiagolareMicaMicelioMicheleMicroboMidolloMieleMiglioreMilanoMiliteMimosaMineraleMiniMinoreMirinoMirtilloMiscelaMissivaMistoMisurareMitezzaMitigareMitraMittenteMnemonicoModelloModificaModuloMoganoMogioMoleMolossoMonasteroMoncoMondinaMonetarioMonileMonotonoMonsoneMontatoMonvisoMoraMordereMorsicatoMostroMotivatoMotosegaMottoMovenzaMovimentoMozzoMuccaMucosaMuffaMughettoMugnaioMulattoMulinelloMultiploMummiaMuntoMuovereMuraleMusaMuscoloMusicaMutevoleMutoNababboNaftaNanometroNarcisoNariceNarratoNascereNastrareNaturaleNauticaNaviglioNebulosaNecrosiNegativoNegozioNemmenoNeofitaNerettoNervoNessunoNettunoNeutraleNeveNevroticoNicchiaNinfaNitidoNobileNocivoNodoNomeNominaNordicoNormaleNorvegeseNostranoNotareNotiziaNotturnoNovellaNucleoNullaNumeroNuovoNutrireNuvolaNuzialeOasiObbedireObbligoObeliscoOblioOboloObsoletoOccasioneOcchioOccidenteOccorrereOccultareOcraOculatoOdiernoOdorareOffertaOffrireOffuscatoOggettoOggiOgnunoOlandeseOlfattoOliatoOlivaOlogrammaOltreOmaggioOmbelicoOmbraOmegaOmissioneOndosoOnereOniceOnnivoroOnorevoleOntaOperatoOpinioneOppostoOracoloOrafoOrdineOrecchinoOreficeOrfanoOrganicoOrigineOrizzonteOrmaOrmeggioOrnativoOrologioOrrendoOrribileOrtensiaOrticaOrzataOrzoOsareOscurareOsmosiOspedaleOspiteOssaOssidareOstacoloOsteOtiteOtreOttagonoOttimoOttobreOvaleOvestOvinoOviparoOvocitoOvunqueOvviareOzioPacchettoPacePacificoPadellaPadronePaesePagaPaginaPalazzinaPalesarePallidoPaloPaludePandoroPannelloPaoloPaonazzoPapricaParabolaParcellaParerePargoloPariParlatoParolaPartireParvenzaParzialePassivoPasticcaPataccaPatologiaPattumePavonePeccatoPedalarePedonalePeggioPelosoPenarePendicePenisolaPennutoPenombraPensarePentolaPepePepitaPerbenePercorsoPerdonatoPerforarePergamenaPeriodoPermessoPernoPerplessoPersuasoPertugioPervasoPesatorePesistaPesoPestiferoPetaloPettinePetulantePezzoPiacerePiantaPiattinoPiccinoPicozzaPiegaPietraPifferoPigiamaPigolioPigroPilaPiliferoPillolaPilotaPimpantePinetaPinnaPinoloPioggiaPiomboPiramidePireticoPiritePirolisiPitonePizzicoPlaceboPlanarePlasmaPlatanoPlenarioPochezzaPoderosoPodismoPoesiaPoggiarePolentaPoligonoPollicePolmonitePolpettaPolsoPoltronaPolverePomicePomodoroPontePopolosoPorfidoPorosoPorporaPorrePortataPosaPositivoPossessoPostulatoPotassioPoterePranzoPrassiPraticaPreclusoPredicaPrefissoPregiatoPrelievoPremerePrenotarePreparatoPresenzaPretestoPrevalsoPrimaPrincipePrivatoProblemaProcuraProdurreProfumoProgettoProlungaPromessaPronomePropostaProrogaProtesoProvaPrudentePrugnaPruritoPsichePubblicoPudicaPugilatoPugnoPulcePulitoPulsantePuntarePupazzoPupillaPuroQuadroQualcosaQuasiQuerelaQuotaRaccoltoRaddoppioRadicaleRadunatoRafficaRagazzoRagioneRagnoRamarroRamingoRamoRandagioRantolareRapatoRapinaRappresoRasaturaRaschiatoRasenteRassegnaRastrelloRataRavvedutoRealeRecepireRecintoReclutaReconditoRecuperoRedditoRedimereRegalatoRegistroRegolaRegressoRelazioneRemareRemotoRennaReplicaReprimereReputareResaResidenteResponsoRestauroReteRetinaRetoricaRettificaRevocatoRiassuntoRibadireRibelleRibrezzoRicaricaRiccoRicevereRiciclatoRicordoRicredutoRidicoloRidurreRifasareRiflessoRiformaRifugioRigareRigettatoRighelloRilassatoRilevatoRimanereRimbalzoRimedioRimorchioRinascitaRincaroRinforzoRinnovoRinomatoRinsavitoRintoccoRinunciaRinvenireRiparatoRipetutoRipienoRiportareRipresaRipulireRisataRischioRiservaRisibileRisoRispettoRistoroRisultatoRisvoltoRitardoRitegnoRitmicoRitrovoRiunioneRivaRiversoRivincitaRivoltoRizomaRobaRoboticoRobustoRocciaRocoRodaggioRodereRoditoreRogitoRollioRomanticoRompereRonzioRosolareRospoRotanteRotondoRotulaRovescioRubizzoRubricaRugaRullinoRumineRumorosoRuoloRupeRussareRusticoSabatoSabbiareSabotatoSagomaSalassoSaldaturaSalgemmaSalivareSalmoneSaloneSaltareSalutoSalvoSapereSapidoSaporitoSaracenoSarcasmoSartoSassosoSatelliteSatiraSatolloSaturnoSavanaSavioSaziatoSbadiglioSbalzoSbancatoSbarraSbattereSbavareSbendareSbirciareSbloccatoSbocciatoSbrinareSbruffoneSbuffareScabrosoScadenzaScalaScambiareScandaloScapolaScarsoScatenareScavatoSceltoScenicoScettroSchedaSchienaSciarpaScienzaScindereScippoSciroppoScivoloSclerareScodellaScolpitoScompartoSconfortoScoprireScortaScossoneScozzeseScribaScrollareScrutinioScuderiaScultoreScuolaScuroScusareSdebitareSdoganareSeccaturaSecondoSedanoSeggiolaSegnalatoSegregatoSeguitoSelciatoSelettivoSellaSelvaggioSemaforoSembrareSemeSeminatoSempreSensoSentireSepoltoSequenzaSerataSerbatoSerenoSerioSerpenteSerraglioServireSestinaSetolaSettimanaSfaceloSfaldareSfamatoSfarzosoSfaticatoSferaSfidaSfilatoSfingeSfocatoSfoderareSfogoSfoltireSforzatoSfrattoSfruttatoSfuggitoSfumareSfusoSgabelloSgarbatoSgonfiareSgorbioSgrassatoSguardoSibiloSiccomeSierraSiglaSignoreSilenzioSillabaSimboloSimpaticoSimulatoSinfoniaSingoloSinistroSinoSintesiSinusoideSiparioSismaSistoleSituatoSlittaSlogaturaSlovenoSmarritoSmemoratoSmentitoSmeraldoSmilzoSmontareSmottatoSmussatoSnellireSnervatoSnodoSobbalzoSobrioSoccorsoSocialeSodaleSoffittoSognoSoldatoSolenneSolidoSollazzoSoloSolubileSolventeSomaticoSommaSondaSonettoSonniferoSopireSoppesoSopraSorgereSorpassoSorrisoSorsoSorteggioSorvolatoSospiroSostaSottileSpadaSpallaSpargereSpatolaSpaventoSpazzolaSpecieSpedireSpegnereSpelaturaSperanzaSpessoreSpettraleSpezzatoSpiaSpigolosoSpillatoSpinosoSpiraleSplendidoSportivoSposoSprangaSprecareSpronatoSpruzzoSpuntinoSquilloSradicareSrotolatoStabileStaccoStaffaStagnareStampatoStantioStarnutoStaseraStatutoSteloSteppaSterzoStilettoStimaStirpeStivaleStizzosoStonatoStoricoStrappoStregatoStriduloStrozzareStruttoStuccareStufoStupendoSubentroSuccosoSudoreSuggeritoSugoSultanoSuonareSuperboSupportoSurgelatoSurrogatoSussurroSuturaSvagareSvedeseSveglioSvelareSvenutoSveziaSviluppoSvistaSvizzeraSvoltaSvuotareTabaccoTabulatoTacciareTaciturnoTaleTalismanoTamponeTanninoTaraTardivoTargatoTariffaTarpareTartarugaTastoTatticoTavernaTavolataTazzaTecaTecnicoTelefonoTemerarioTempoTemutoTendoneTeneroTensioneTentacoloTeoremaTermeTerrazzoTerzettoTesiTesseratoTestatoTetroTettoiaTifareTigellaTimbroTintoTipicoTipografoTiraggioTiroTitanioTitoloTitubanteTizioTizzoneToccareTollerareToltoTombolaTomoTonfoTonsillaTopazioTopologiaToppaTorbaTornareTorroneTortoraToscanoTossireTostaturaTotanoTraboccoTracheaTrafilaTragediaTralcioTramontoTransitoTrapanoTrarreTraslocoTrattatoTraveTrecciaTremolioTrespoloTributoTrichecoTrifoglioTrilloTrinceaTrioTristezzaTrituratoTrivellaTrombaTronoTroppoTrottolaTrovareTruccatoTubaturaTuffatoTulipanoTumultoTunisiaTurbareTurchinoTutaTutelaUbicatoUccelloUccisoreUdireUditivoUffaUfficioUgualeUlisseUltimatoUmanoUmileUmorismoUncinettoUngereUnghereseUnicornoUnificatoUnisonoUnitarioUnteUovoUpupaUraganoUrgenzaUrloUsanzaUsatoUscitoUsignoloUsuraioUtensileUtilizzoUtopiaVacanteVaccinatoVagabondoVagliatoValangaValgoValicoVallettaValorosoValutareValvolaVampataVangareVanitosoVanoVantaggioVanveraVaporeVaranoVarcatoVarianteVascaVedettaVedovaVedutoVegetaleVeicoloVelcroVelinaVellutoVeloceVenatoVendemmiaVentoVeraceVerbaleVergognaVerificaVeroVerrucaVerticaleVescicaVessilloVestaleVeteranoVetrinaVetustoViandanteVibranteVicendaVichingoVicinanzaVidimareVigiliaVignetoVigoreVileVillanoViminiVincitoreViolaViperaVirgolaVirologoVirulentoViscosoVisioneVispoVissutoVisuraVitaVitelloVittimaVivandaVividoViziareVoceVogaVolatileVolereVolpeVoragineVulcanoZampognaZannaZappatoZatteraZavorraZefiroZelanteZeloZenzeroZerbinoZibettoZincoZirconeZittoZollaZoticoZuccheroZufoloZuluZuppa\";\n    var wordlist = null;\n    function loadWords(lang) {\n      if (wordlist != null) {\n        return;\n      }\n      wordlist = words.replace(/([A-Z])/g, \" $1\").toLowerCase().substring(1).split(\" \");\n      if (wordlist_1.Wordlist.check(lang) !== \"0x5c1362d88fd4cf614a96f3234941d29f7d37c08c5292fde03bf62c2db6ff7620\") {\n        wordlist = null;\n        throw new Error(\"BIP39 Wordlist for it (Italian) FAILED\");\n      }\n    }\n    var LangIt = (\n      /** @class */\n      function(_super) {\n        __extends(LangIt2, _super);\n        function LangIt2() {\n          return _super.call(this, \"it\") || this;\n        }\n        LangIt2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[index];\n        };\n        LangIt2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist.indexOf(word);\n        };\n        return LangIt2;\n      }(wordlist_1.Wordlist)\n    );\n    var langIt = new LangIt();\n    exports2.langIt = langIt;\n    wordlist_1.Wordlist.register(langIt);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/lang-zh.js\nvar require_lang_zh = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/lang-zh.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.langZhTw = exports2.langZhCn = void 0;\n    var strings_1 = require_lib9();\n    var wordlist_1 = require_wordlist();\n    var data = \"}aE#4A=Yv&co#4N#6G=cJ&SM#66|/Z#4t&kn~46#4K~4q%b9=IR#7l,mB#7W_X2*dl}Uo~7s}Uf&Iw#9c&cw~6O&H6&wx&IG%v5=IQ~8a&Pv#47$PR&50%Ko&QM&3l#5f,D9#4L|/H&tQ;v0~6n]nN<di,AM=W5%QO&ka&ua,hM^tm=zV=JA=wR&+X]7P&NB#4J#5L|/b[dA}tJ<Do&6m&u2[U1&Kb.HM&mC=w0&MW<rY,Hq#6M}QG,13&wP}Jp]Ow%ue&Kg<HP<D9~4k~9T&I2_c6$9T#9/[C5~7O~4a=cs&O7=KK=An&l9$6U$8A&uD&QI|/Y&bg}Ux&F2#6b}E2&JN&kW&kp=U/&bb=Xl<Cj}k+~5J#6L&5z&9i}b4&Fo,ho(X0_g3~4O$Fz&QE<HN=Ww]6/%GF-Vw=tj&/D&PN#9g=YO}cL&Of&PI~5I&Ip=vU=IW#9G;0o-wU}ss&QR<BT&R9=tk$PY_dh&Pq-yh]7T,nj.Xu=EP&76=cI&Fs*Xg}z7$Gb&+I=DF,AF=cA}rL#7j=Dz&3y<Aa$52=PQ}b0(iY$Fa}oL&xV#6U=ec=WZ,xh%RY<dp#9N&Fl&44=WH*A7=sh&TB&8P=07;u+&PK}uh}J5#72)V/=xC,AB$k0&f6;1E|+5=1B,3v]6n&wR%b+&xx]7f=Ol}fl;+D^wG]7E;nB;uh^Ir&l5=JL,nS=cf=g5;u6|/Q$Gc=MH%Hg#5d%M6^86=U+$Gz,l/,ir^5y&Ba&/F-IY&FI&be%IZ#77&PW_Nu$kE(Yf&NX]7Z,Jy&FJ(Xo&Nz#/d=y7&MX<Ag}Z+;nE]Dt(iG#4D=13&Pj~4c%v8&Zo%OL&/X#4W<HR&ie~6J_1O(Y2=y5=Ad*cv_eB#6k&PX:BU#7A;uk&Ft&Fx_dD=U2;vB=U5=4F}+O&GN.HH:9s=b0%NV(jO&IH=JT}Z9=VZ<Af,Kx^4m&uJ%c6,6r;9m#+L}cf%Kh&F3~4H=vP}bu,Hz|++,1w]nv}k6;uu$jw*Kl*WX&uM[x7&Fr[m7$NO&QN]hu=JN}nR^8g#/h(ps|KC;vd}xz=V0}p6&FD$G1#7K<bG_4p~8g&cf;u4=tl}+k%5/}fz;uw<cA=u1}gU}VM=LJ=eX&+L&Pr#4U}p2:nC,2K]7H:jF&9x}uX#9O=MB<fz~8X~5m&4D&kN&u5%E/(h7(ZF&VG<de(qM|/e-Wt=3x(a+,/R]f/&ND$Ro&nU}0g=KA%kH&NK$Ke<dS}cB&IX~5g$TN]6m=Uv,Is&Py=Ef%Kz#+/%bi&+A<F4$OG&4C&FL#9V<Zk=2I_eE&6c]nw&kq$HG}y+&A8$P3}OH=XP]70%IS(AJ_gH%GZ&tY&AZ=vb~6y&/r=VI=Wv<Zi=fl=xf&eL}c8}OL=MJ=g8$F7=YT}9u=0+^xC}JH&nL^N0~4T]K2,Cy%OC#6s;vG(AC^xe^cG&MF}Br#9P;wD-7h$O/&xA}Fn^PC]6i]7G&8V$Qs;vl(TB~73~4l<mW&6V=2y&uY&+3)aP}XF;LP&kx$wU=t7;uy<FN&lz)7E=Oo*Y+;wI}9q}le;J6&Ri&4t&Qr#8B=cb&vG=J5|Ql(h5<Yy~4+}QD,Lx=wn%K/&RK=dO&Pw,Q9=co%4u;9u}g0@6a^4I%b0=zo|/c&tX=dQ=OS#+b=yz_AB&wB&Pm=W9$HP_gR=62=AO=ti=hI,oA&jr&dH=tm&b6$P2(x8=zi;nG~7F;05]0n[Ix&3m}rg=Xp=cd&uz]7t;97=cN;vV<jf&FF&F1=6Q&Ik*Kk&P4,2z=fQ]7D&3u,H0=d/}Uw<ZN<7R}Kv;0f$H7,MD]7n$F0#88~9Z%da=by;+T#/u=VF&fO&kr^kf<AB]sU,I5$Ng&Pz;0i&QD&vM=Yl:BM;nJ_xJ]U7&Kf&30,3f|Z9*dC)je_jA&Q4&Kp$NH(Yz#6S&Id%Ib=KX,AD=KV%dP}tW&Pk^+E_Ni=cq,3R}VZ(Si=b+}rv;0j}rZ]uA,/w(Sx&Jv$w9&4d&wE,NJ$Gy=J/]Ls#7k<ZQ<Y/&uj]Ov$PM;v3,2F&+u:up=On&3e,Jv;90=J+&Qm]6q}bK#+d~8Y(h2]hA;99&AS=I/}qB&dQ}yJ-VM}Vl&ui,iB&G3|Dc]7d=eQ%dX%JC_1L~4d^NP;vJ&/1)ZI#7N]9X[bQ&PL=0L(UZ,Lm&kc&IR}n7(iR<AQ<dg=33=vN}ft}au]7I,Ba=x9=dR~6R&Tq=Xi,3d$Nr&Bc}DI&ku&vf]Dn,/F&iD,Ll&Nw=0y&I7=Ls=/A&tU=Qe}Ua&uk&+F=g4=gh=Vj#+1&Qn}Uy*44#5F,Pc&Rz*Xn=oh=5W;0n_Nf(iE<Y7=vr=Zu]oz#5Z%mI=kN=Bv_Jp(T2;vt_Ml<FS&uI=L/&6P]64$M7}86<bo%QX(SI%IY&VK=Al&Ux;vv;ut*E/%uh<ZE|O3,M2(yc]yu=Wk&tp:Ex}hr,Cl&WE)+Z=8U}I2_4Q,hA_si=iw=OM=tM=yZ%Ia=U7;wT}b+;uo=Za}yS!5x}HD}fb#5O_dA;Nv%uB(yB;01(Sf}Fk;v7}Pt#8v<mZ#7L,/r&Pl~4w&f5=Ph$Fw_LF&8m,bL=yJ&BH}p/*Jn}tU~5Q;wB(h6]Df]8p^+B;E4&Wc=d+;Ea&bw$8C&FN,DM=Yf}mP~5w=fT#6V=mC=Fi=AV}jB&AN}lW}aH#/D)dZ;hl;vE}/7,CJ;31&w8,hj%u9_Js=jJ&4M~8k=TN&eC}nL&uc-wi&lX}dj=Mv=e2#6u=cr$uq$6G]8W}Jb:nm=Yg<b3(UA;vX&6n&xF=KT,jC,De&R8&oY=Zv&oB]7/=Z2&Oa}bf,hh(4h^tZ&72&Nx;D2&xL~5h~40)ZG)h+=OJ&RA]Bv$yB=Oq=df,AQ%Jn}OJ;11,3z&Tl&tj;v+^Hv,Dh(id=s+]7N&N3)9Q~8f,S4=uW=w4&uX,LX&3d]CJ&yp&8x<b2_do&lP=y/<cy_dG=Oi=7R(VH(lt_1T,Iq_AA;12^6T%k6#8K[B1{oO<AU[Bt;1b$9S&Ps<8T=St{bY,jB(Zp&63&Uv$9V,PM]6v&Af}zW[bW_oq}sm}nB&Kq&gC&ff_eq_2m&5F&TI}rf}Gf;Zr_z9;ER&jk}iz_sn<BN~+n&vo=Vi%97|ZR=Wc,WE&6t]6z%85(ly#84=KY)6m_5/=aX,N3}Tm&he&6K]tR_B2-I3;u/&hU&lH<AP=iB&IA=XL;/5&Nh=wv<BH#79=vS=zl<AA=0X_RG}Bw&9p$NW,AX&kP_Lp&/Z(Tc]Mu}hs#6I}5B&cI<bq&H9#6m=K9}vH(Y1(Y0#4B&w6,/9&gG<bE,/O=zb}I4_l8<B/;wL%Qo<HO[Mq=XX}0v&BP&F4(mG}0i}nm,EC=9u{I3,xG&/9=JY*DK&hR)BX=EI=cx=b/{6k}yX%A+&wa}Xb=la;wi^lL;0t}jo&Qb=xg=XB}iO<qo{bR=NV&8f=a0&Jy;0v=uK)HK;vN#6h&jB(h/%ud&NI%wY.X7=Pt}Cu-uL&Gs_hl%mH,tm]78=Lb^Q0#7Y=1u<Bt&+Q=Co_RH,w3;1e}ux<aU;ui}U3&Q5%bt]63&UQ|0l&uL}O7&3o,AV&dm|Nj(Xt*5+(Uu&Hh(p7(UF=VR=Bp^Jl&Hd[ix)9/=Iq]C8<67]66}mB%6f}bb}JI]8T$HA}db=YM&pa=2J}tS&Y0=PS&y4=cX$6E,hX,XP&nR;04,FQ&l0&Vm_Dv#5Y~8Z=Bi%MA]6x=JO:+p,Az&9q,Hj~6/}SD=K1:EJ}nA;Qo#/E]9R,Ie&6X%W3]61&v4=xX_MC=0q;06(Xq=fs}IG}Dv=0l}o7$iZ;9v&LH&DP-7a&OY,SZ,Kz,Cv&dh=fx|Nh,F/~7q=XF&w+;9n&Gw;0h}Z7<7O&JK(S7&LS<AD<ac=wo<Dt&zw%4B=4v#8P;9o~6p*vV=Tm,Or&I6=1q}nY=P0=gq&Bl&Uu,Ch%yb}UY=zh}dh}rl(T4_xk(YA#8R*xH,IN}Jn]7V}C4&Ty}j3]7p=cL=3h&wW%Qv<Z3=f0&RI&+S(ic_zq}oN&/Y=z1;Td=LW=0e=OI(Vc,+b^ju(UL;0r:Za%8v=Rp=zw&58&73&wK}qX]6y&8E)a2}WR=wP^ur&nQ<cH}Re=Aq&wk}Q0&+q=PP,Gc|/d^k5,Fw]8Y}Pg]p3=ju=ed}r5_yf&Cs]7z$/G<Cm&Jp&54_1G_gP_Ll}JZ;0u]k8_7k(Sg]65{9i=LN&Sx&WK,iW&fD&Lk{9a}Em-9c#8N&io=sy]8d&nT&IK(lx#7/$lW(Td<s8~49,3o<7Y=MW(T+_Jr&Wd,iL}Ct=xh&5V;v4&8n%Kx=iF&l2_0B{B+,If(J0,Lv;u8=Kx-vB=HC&vS=Z6&fU&vE^xK;3D=4h=MR#45:Jw;0d}iw=LU}I5=I0]gB*im,K9}GU,1k_4U&Tt=Vs(iX&lU(TF#7y,ZO}oA&m5#5P}PN}Uz=hM<B1&FB<aG,e6~7T<tP(UQ_ZT=wu&F8)aQ]iN,1r_Lo&/g:CD}84{J1_Ki&Na&3n$jz&FE=dc;uv;va}in}ll=fv(h1&3h}fp=Cy}BM(+E~8m}lo%v7=hC(T6$cj=BQ=Bw(DR,2j=Ks,NS|F+;00=fU=70}Mb(YU;+G&m7&hr=Sk%Co]t+(X5_Jw}0r}gC(AS-IP&QK<Z2#8Q$WC]WX}T2&pG_Ka,HC=R4&/N;Z+;ch(C7,D4$3p_Mk&B2$8D=n9%Ky#5z(CT&QJ#7B]DC]gW}nf~5M;Iw#80}Tc_1F#4Z-aC}Hl=ph=fz,/3=aW}JM}nn;DG;vm}wn,4P}T3;wx&RG$u+}zK=0b;+J_Ek{re<aZ=AS}yY#5D]7q,Cp}xN=VP*2C}GZ}aG~+m_Cs=OY#6r]6g<GS}LC(UB=3A=Bo}Jy<c4}Is;1P<AG}Op<Z1}ld}nS=1Z,yM&95&98=CJ(4t:2L$Hk=Zo}Vc;+I}np&N1}9y=iv}CO*7p=jL)px]tb^zh&GS&Vl%v/;vR=14=zJ&49|/f]hF}WG;03=8P}o/&Gg&rp;DB,Kv}Ji&Pb;aA^ll(4j%yt}+K$Ht#4y&hY]7Y<F1,eN}bG(Uh%6Z]t5%G7;+F_RE;it}tL=LS&Da=Xx(S+(4f=8G=yI}cJ}WP=37=jS}pX}hd)fp<A8=Jt~+o$HJ=M6}iX=g9}CS=dv=Cj(mP%Kd,xq|+9&LD(4/=Xm&QP=Lc}LX&fL;+K=Op(lu=Qs.qC:+e&L+=Jj#8w;SL]7S(b+#4I=c1&nG_Lf&uH;+R)ZV<bV%B/,TE&0H&Jq&Ah%OF&Ss(p2,Wv&I3=Wl}Vq;1L&lJ#9b_1H=8r=b8=JH(SZ=hD=J2#7U,/U#/X~6P,FU<eL=jx,mG=hG=CE&PU=Se(qX&LY=X6=y4&tk&QQ&tf=4g&xI}W+&mZ=Dc#7w}Lg;DA;wQ_Kb(cJ=hR%yX&Yb,hw{bX_4X;EP;1W_2M}Uc=b5(YF,CM&Tp^OJ{DD]6s=vF=Yo~8q}XH}Fu%P5(SJ=Qt;MO]s8<F3&B3&8T(Ul-BS*dw&dR<87}/8]62$PZ]Lx<Au}9Q]7c=ja=KR,Go,Us&v6(qk}pG&G2=ev^GM%w4&H4]7F&dv]J6}Ew:9w=sj-ZL}Ym$+h(Ut(Um~4n=Xs(U7%eE=Qc_JR<CA#6t<Fv|/I,IS,EG<F2(Xy$/n<Fa(h9}+9_2o&N4#7X<Zq|+f_Dp=dt&na,Ca=NJ)jY=8C=YG=s6&Q+<DO}D3=xB&R1(lw;Qn<bF(Cu|/B}HV=SS&n7,10&u0]Dm%A6^4Q=WR(TD=Xo<GH,Rj(l8)bP&n/=LM&CF,F5&ml=PJ;0k=LG=tq,Rh,D6@4i=1p&+9=YC%er_Mh;nI;0q=Fw]80=xq=FM$Gv;v6&nc;wK%H2&Kj;vs,AA=YP,66}bI(qR~5U=6q~4b$Ni=K5.X3$So&Iu(p+]8G=Cf=RY(TS_O3(iH&57=fE=Dg_Do#9z#7H;FK{qd_2k%JR}en&gh_z8;Rx}9p<cN_Ne,DO;LN_7o~/p=NF=5Y}gN<ce<C1,QE]Wv=3u<BC}GK]yq}DY&u/_hj=II(pz&rC,jV&+Z}ut=NQ;Cg-SR_ZS,+o=u/;Oy_RK_QF(Fx&xP}Wr&TA,Uh&g1=yr{ax[VF$Pg(YB;Ox=Vy;+W(Sp}XV%dd&33(l/]l4#4Y}OE=6c=bw(A7&9t%wd&N/&mo,JH&Qe)fm=Ao}fu=tH\";\n    var deltaData = \"FAZDC6BALcLZCA+GBARCW8wNCcDDZ8LVFBOqqDUiou+M42TFAyERXFb7EjhP+vmBFpFrUpfDV2F7eB+eCltCHJFWLFCED+pWTojEIHFXc3aFn4F68zqjEuKidS1QBVPDEhE7NA4mhMF7oThD49ot3FgtzHFCK0acW1x8DH1EmLoIlrWFBLE+y5+NA3Cx65wJHTaEZVaK1mWAmPGxgYCdxwOjTDIt/faOEhTl1vqNsKtJCOhJWuio2g07KLZEQsFBUpNtwEByBgxFslFheFbiEPvi61msDvApxCzB6rBCzox7joYA5UdDc+Cb4FSgIabpXFAj3bjkmFAxCZE+mD/SFf/0ELecYCt3nLoxC6WEZf2tKDB4oZvrEmqFkKk7BwILA7gtYBpsTq//D4jD0F0wEB9pyQ1BD5Ba0oYHDI+sbDFhvrHXdDHfgFEIJLi5r8qercNFBgFLC4bo5ERJtamWBDFy73KCEb6M8VpmEt330ygCTK58EIIFkYgF84gtGA9Uyh3m68iVrFbWFbcbqiCYHZ9J1jeRPbL8yswhMiDbhEhdNoSwFbZrLT740ABEqgCkO8J1BLd1VhKKR4sD1yUo0z+FF59Mvg71CFbyEhbHSFBKEIKyoQNgQppq9T0KAqePu0ZFGrXOHdKJqkoTFhYvpDNyuuznrN84thJbsCoO6Cu6Xlvntvy0QYuAExQEYtTUBf3CoCqwgGFZ4u1HJFzDVwEy3cjcpV4QvsPaBC3rCGyCF23o4K3pp2gberGgFEJEHo4nHICtyKH2ZqyxhN05KBBJIQlKh/Oujv/DH32VrlqFdIFC7Fz9Ct4kaqFME0UETLprnN9kfy+kFmtQBB0+5CFu0N9Ij8l/VvJDh2oq3hT6EzjTHKFN7ZjZwoTsAZ4Exsko6Fpa6WC+sduz8jyrLpegTv2h1EBeYpLpm2czQW0KoCcS0bCVXCmuWJDBjN1nQNLdF58SFJ0h7i3pC3oEOKy/FjBklL70XvBEEIWp2yZ04xObzAWDDJG7f+DbqBEA7LyiR95j7MDVdDViz2RE5vWlBMv5e4+VfhP3aXNPhvLSynb9O2x4uFBV+3jqu6d5pCG28/sETByvmu/+IJ0L3wb4rj9DNOLBF6XPIODr4L19U9RRofAG6Nxydi8Bki8BhGJbBAJKzbJxkZSlF9Q2Cu8oKqggB9hBArwLLqEBWEtFowy8XK8bEyw9snT+BeyFk1ZCSrdmgfEwFePTgCjELBEnIbjaDDPJm36rG9pztcEzT8dGk23SBhXBB1H4z+OWze0ooFzz8pDBYFvp9j9tvFByf9y4EFdVnz026CGR5qMr7fxMHN8UUdlyJAzlTBDRC28k+L4FB8078ljyD91tUj1ocnTs8vdEf7znbzm+GIjEZnoZE5rnLL700Xc7yHfz05nWxy03vBB9YGHYOWxgMQGBCR24CVYNE1hpfKxN0zKnfJDmmMgMmBWqNbjfSyFCBWSCGCgR8yFXiHyEj+VtD1FB3FpC1zI0kFbzifiKTLm9yq5zFmur+q8FHqjoOBWsBPiDbnCC2ErunV6cJ6TygXFYHYp7MKN9RUlSIS8/xBAGYLzeqUnBF4QbsTuUkUqGs6CaiDWKWjQK9EJkjpkTmNCPYXL\";\n    var wordlist = {\n      zh_cn: null,\n      zh_tw: null\n    };\n    var Checks = {\n      zh_cn: \"0x17bcc4d8547e5a7135e365d1ab443aaae95e76d8230c2782c67305d4f21497a1\",\n      zh_tw: \"0x51e720e90c7b87bec1d70eb6e74a21a449bd3ec9c020b01d3a40ed991b60ce5d\"\n    };\n    var codes = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var style = \"~!@#$%^&*_-=[]{}|;:,.()<>?\";\n    function loadWords(lang) {\n      if (wordlist[lang.locale] !== null) {\n        return;\n      }\n      wordlist[lang.locale] = [];\n      var deltaOffset = 0;\n      for (var i = 0; i < 2048; i++) {\n        var s = style.indexOf(data[i * 3]);\n        var bytes = [\n          228 + (s >> 2),\n          128 + codes.indexOf(data[i * 3 + 1]),\n          128 + codes.indexOf(data[i * 3 + 2])\n        ];\n        if (lang.locale === \"zh_tw\") {\n          var common = s % 4;\n          for (var i_1 = common; i_1 < 3; i_1++) {\n            bytes[i_1] = codes.indexOf(deltaData[deltaOffset++]) + (i_1 == 0 ? 228 : 128);\n          }\n        }\n        wordlist[lang.locale].push((0, strings_1.toUtf8String)(bytes));\n      }\n      if (wordlist_1.Wordlist.check(lang) !== Checks[lang.locale]) {\n        wordlist[lang.locale] = null;\n        throw new Error(\"BIP39 Wordlist for \" + lang.locale + \" (Chinese) FAILED\");\n      }\n    }\n    var LangZh = (\n      /** @class */\n      function(_super) {\n        __extends(LangZh2, _super);\n        function LangZh2(country) {\n          return _super.call(this, \"zh_\" + country) || this;\n        }\n        LangZh2.prototype.getWord = function(index) {\n          loadWords(this);\n          return wordlist[this.locale][index];\n        };\n        LangZh2.prototype.getWordIndex = function(word) {\n          loadWords(this);\n          return wordlist[this.locale].indexOf(word);\n        };\n        LangZh2.prototype.split = function(mnemonic) {\n          mnemonic = mnemonic.replace(/(?:\\u3000| )+/g, \"\");\n          return mnemonic.split(\"\");\n        };\n        return LangZh2;\n      }(wordlist_1.Wordlist)\n    );\n    var langZhCn = new LangZh(\"cn\");\n    exports2.langZhCn = langZhCn;\n    wordlist_1.Wordlist.register(langZhCn);\n    wordlist_1.Wordlist.register(langZhCn, \"zh\");\n    var langZhTw = new LangZh(\"tw\");\n    exports2.langZhTw = langZhTw;\n    wordlist_1.Wordlist.register(langZhTw);\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/wordlists.js\nvar require_wordlists = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/wordlists.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.wordlists = void 0;\n    var lang_cz_1 = require_lang_cz();\n    var lang_en_1 = require_lang_en();\n    var lang_es_1 = require_lang_es();\n    var lang_fr_1 = require_lang_fr();\n    var lang_ja_1 = require_lang_ja();\n    var lang_ko_1 = require_lang_ko();\n    var lang_it_1 = require_lang_it();\n    var lang_zh_1 = require_lang_zh();\n    exports2.wordlists = {\n      cz: lang_cz_1.langCz,\n      en: lang_en_1.langEn,\n      es: lang_es_1.langEs,\n      fr: lang_fr_1.langFr,\n      it: lang_it_1.langIt,\n      ja: lang_ja_1.langJa,\n      ko: lang_ko_1.langKo,\n      zh: lang_zh_1.langZhCn,\n      zh_cn: lang_zh_1.langZhCn,\n      zh_tw: lang_zh_1.langZhTw\n    };\n  }\n});\n\n// node_modules/@ethersproject/wordlists/lib/index.js\nvar require_lib20 = __commonJS({\n  \"node_modules/@ethersproject/wordlists/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.wordlists = exports2.Wordlist = exports2.logger = void 0;\n    var wordlist_1 = require_wordlist();\n    Object.defineProperty(exports2, \"logger\", { enumerable: true, get: function() {\n      return wordlist_1.logger;\n    } });\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return wordlist_1.Wordlist;\n    } });\n    var wordlists_1 = require_wordlists();\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return wordlists_1.wordlists;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/hdnode/lib/_version.js\nvar require_version17 = __commonJS({\n  \"node_modules/@ethersproject/hdnode/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"hdnode/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/hdnode/lib/index.js\nvar require_lib21 = __commonJS({\n  \"node_modules/@ethersproject/hdnode/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getAccountPath = exports2.isValidMnemonic = exports2.entropyToMnemonic = exports2.mnemonicToEntropy = exports2.mnemonicToSeed = exports2.HDNode = exports2.defaultPath = void 0;\n    var basex_1 = require_lib17();\n    var bytes_1 = require_lib2();\n    var bignumber_1 = require_lib3();\n    var strings_1 = require_lib9();\n    var pbkdf2_1 = require_lib18();\n    var properties_1 = require_lib4();\n    var signing_key_1 = require_lib14();\n    var sha2_1 = require_lib19();\n    var transactions_1 = require_lib15();\n    var wordlists_1 = require_lib20();\n    var logger_1 = require_lib();\n    var _version_1 = require_version17();\n    var logger = new logger_1.Logger(_version_1.version);\n    var N = bignumber_1.BigNumber.from(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\");\n    var MasterSecret = (0, strings_1.toUtf8Bytes)(\"Bitcoin seed\");\n    var HardenedBit = 2147483648;\n    function getUpperMask(bits) {\n      return (1 << bits) - 1 << 8 - bits;\n    }\n    function getLowerMask(bits) {\n      return (1 << bits) - 1;\n    }\n    function bytes32(value) {\n      return (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(value), 32);\n    }\n    function base58check(data) {\n      return basex_1.Base58.encode((0, bytes_1.concat)([data, (0, bytes_1.hexDataSlice)((0, sha2_1.sha256)((0, sha2_1.sha256)(data)), 0, 4)]));\n    }\n    function getWordlist(wordlist) {\n      if (wordlist == null) {\n        return wordlists_1.wordlists[\"en\"];\n      }\n      if (typeof wordlist === \"string\") {\n        var words = wordlists_1.wordlists[wordlist];\n        if (words == null) {\n          logger.throwArgumentError(\"unknown locale\", \"wordlist\", wordlist);\n        }\n        return words;\n      }\n      return wordlist;\n    }\n    var _constructorGuard = {};\n    exports2.defaultPath = \"m/44'/60'/0'/0/0\";\n    var HDNode = (\n      /** @class */\n      function() {\n        function HDNode2(constructorGuard, privateKey, publicKey, parentFingerprint, chainCode, index, depth, mnemonicOrPath) {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, HDNode2);\n          if (constructorGuard !== _constructorGuard) {\n            throw new Error(\"HDNode constructor cannot be called directly\");\n          }\n          if (privateKey) {\n            var signingKey = new signing_key_1.SigningKey(privateKey);\n            (0, properties_1.defineReadOnly)(this, \"privateKey\", signingKey.privateKey);\n            (0, properties_1.defineReadOnly)(this, \"publicKey\", signingKey.compressedPublicKey);\n          } else {\n            (0, properties_1.defineReadOnly)(this, \"privateKey\", null);\n            (0, properties_1.defineReadOnly)(this, \"publicKey\", (0, bytes_1.hexlify)(publicKey));\n          }\n          (0, properties_1.defineReadOnly)(this, \"parentFingerprint\", parentFingerprint);\n          (0, properties_1.defineReadOnly)(this, \"fingerprint\", (0, bytes_1.hexDataSlice)((0, sha2_1.ripemd160)((0, sha2_1.sha256)(this.publicKey)), 0, 4));\n          (0, properties_1.defineReadOnly)(this, \"address\", (0, transactions_1.computeAddress)(this.publicKey));\n          (0, properties_1.defineReadOnly)(this, \"chainCode\", chainCode);\n          (0, properties_1.defineReadOnly)(this, \"index\", index);\n          (0, properties_1.defineReadOnly)(this, \"depth\", depth);\n          if (mnemonicOrPath == null) {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", null);\n            (0, properties_1.defineReadOnly)(this, \"path\", null);\n          } else if (typeof mnemonicOrPath === \"string\") {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", null);\n            (0, properties_1.defineReadOnly)(this, \"path\", mnemonicOrPath);\n          } else {\n            (0, properties_1.defineReadOnly)(this, \"mnemonic\", mnemonicOrPath);\n            (0, properties_1.defineReadOnly)(this, \"path\", mnemonicOrPath.path);\n          }\n        }\n        Object.defineProperty(HDNode2.prototype, \"extendedKey\", {\n          get: function() {\n            if (this.depth >= 256) {\n              throw new Error(\"Depth too large!\");\n            }\n            return base58check((0, bytes_1.concat)([\n              this.privateKey != null ? \"0x0488ADE4\" : \"0x0488B21E\",\n              (0, bytes_1.hexlify)(this.depth),\n              this.parentFingerprint,\n              (0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(this.index), 4),\n              this.chainCode,\n              this.privateKey != null ? (0, bytes_1.concat)([\"0x00\", this.privateKey]) : this.publicKey\n            ]));\n          },\n          enumerable: false,\n          configurable: true\n        });\n        HDNode2.prototype.neuter = function() {\n          return new HDNode2(_constructorGuard, null, this.publicKey, this.parentFingerprint, this.chainCode, this.index, this.depth, this.path);\n        };\n        HDNode2.prototype._derive = function(index) {\n          if (index > 4294967295) {\n            throw new Error(\"invalid index - \" + String(index));\n          }\n          var path = this.path;\n          if (path) {\n            path += \"/\" + (index & ~HardenedBit);\n          }\n          var data = new Uint8Array(37);\n          if (index & HardenedBit) {\n            if (!this.privateKey) {\n              throw new Error(\"cannot derive child of neutered node\");\n            }\n            data.set((0, bytes_1.arrayify)(this.privateKey), 1);\n            if (path) {\n              path += \"'\";\n            }\n          } else {\n            data.set((0, bytes_1.arrayify)(this.publicKey));\n          }\n          for (var i = 24; i >= 0; i -= 8) {\n            data[33 + (i >> 3)] = index >> 24 - i & 255;\n          }\n          var I = (0, bytes_1.arrayify)((0, sha2_1.computeHmac)(sha2_1.SupportedAlgorithm.sha512, this.chainCode, data));\n          var IL = I.slice(0, 32);\n          var IR = I.slice(32);\n          var ki = null;\n          var Ki = null;\n          if (this.privateKey) {\n            ki = bytes32(bignumber_1.BigNumber.from(IL).add(this.privateKey).mod(N));\n          } else {\n            var ek = new signing_key_1.SigningKey((0, bytes_1.hexlify)(IL));\n            Ki = ek._addPoint(this.publicKey);\n          }\n          var mnemonicOrPath = path;\n          var srcMnemonic = this.mnemonic;\n          if (srcMnemonic) {\n            mnemonicOrPath = Object.freeze({\n              phrase: srcMnemonic.phrase,\n              path,\n              locale: srcMnemonic.locale || \"en\"\n            });\n          }\n          return new HDNode2(_constructorGuard, ki, Ki, this.fingerprint, bytes32(IR), index, this.depth + 1, mnemonicOrPath);\n        };\n        HDNode2.prototype.derivePath = function(path) {\n          var components = path.split(\"/\");\n          if (components.length === 0 || components[0] === \"m\" && this.depth !== 0) {\n            throw new Error(\"invalid path - \" + path);\n          }\n          if (components[0] === \"m\") {\n            components.shift();\n          }\n          var result = this;\n          for (var i = 0; i < components.length; i++) {\n            var component = components[i];\n            if (component.match(/^[0-9]+'$/)) {\n              var index = parseInt(component.substring(0, component.length - 1));\n              if (index >= HardenedBit) {\n                throw new Error(\"invalid path index - \" + component);\n              }\n              result = result._derive(HardenedBit + index);\n            } else if (component.match(/^[0-9]+$/)) {\n              var index = parseInt(component);\n              if (index >= HardenedBit) {\n                throw new Error(\"invalid path index - \" + component);\n              }\n              result = result._derive(index);\n            } else {\n              throw new Error(\"invalid path component - \" + component);\n            }\n          }\n          return result;\n        };\n        HDNode2._fromSeed = function(seed, mnemonic) {\n          var seedArray = (0, bytes_1.arrayify)(seed);\n          if (seedArray.length < 16 || seedArray.length > 64) {\n            throw new Error(\"invalid seed\");\n          }\n          var I = (0, bytes_1.arrayify)((0, sha2_1.computeHmac)(sha2_1.SupportedAlgorithm.sha512, MasterSecret, seedArray));\n          return new HDNode2(_constructorGuard, bytes32(I.slice(0, 32)), null, \"0x00000000\", bytes32(I.slice(32)), 0, 0, mnemonic);\n        };\n        HDNode2.fromMnemonic = function(mnemonic, password, wordlist) {\n          wordlist = getWordlist(wordlist);\n          mnemonic = entropyToMnemonic(mnemonicToEntropy(mnemonic, wordlist), wordlist);\n          return HDNode2._fromSeed(mnemonicToSeed(mnemonic, password), {\n            phrase: mnemonic,\n            path: \"m\",\n            locale: wordlist.locale\n          });\n        };\n        HDNode2.fromSeed = function(seed) {\n          return HDNode2._fromSeed(seed, null);\n        };\n        HDNode2.fromExtendedKey = function(extendedKey) {\n          var bytes = basex_1.Base58.decode(extendedKey);\n          if (bytes.length !== 82 || base58check(bytes.slice(0, 78)) !== extendedKey) {\n            logger.throwArgumentError(\"invalid extended key\", \"extendedKey\", \"[REDACTED]\");\n          }\n          var depth = bytes[4];\n          var parentFingerprint = (0, bytes_1.hexlify)(bytes.slice(5, 9));\n          var index = parseInt((0, bytes_1.hexlify)(bytes.slice(9, 13)).substring(2), 16);\n          var chainCode = (0, bytes_1.hexlify)(bytes.slice(13, 45));\n          var key = bytes.slice(45, 78);\n          switch ((0, bytes_1.hexlify)(bytes.slice(0, 4))) {\n            case \"0x0488b21e\":\n            case \"0x043587cf\":\n              return new HDNode2(_constructorGuard, null, (0, bytes_1.hexlify)(key), parentFingerprint, chainCode, index, depth, null);\n            case \"0x0488ade4\":\n            case \"0x04358394 \":\n              if (key[0] !== 0) {\n                break;\n              }\n              return new HDNode2(_constructorGuard, (0, bytes_1.hexlify)(key.slice(1)), null, parentFingerprint, chainCode, index, depth, null);\n          }\n          return logger.throwArgumentError(\"invalid extended key\", \"extendedKey\", \"[REDACTED]\");\n        };\n        return HDNode2;\n      }()\n    );\n    exports2.HDNode = HDNode;\n    function mnemonicToSeed(mnemonic, password) {\n      if (!password) {\n        password = \"\";\n      }\n      var salt = (0, strings_1.toUtf8Bytes)(\"mnemonic\" + password, strings_1.UnicodeNormalizationForm.NFKD);\n      return (0, pbkdf2_1.pbkdf2)((0, strings_1.toUtf8Bytes)(mnemonic, strings_1.UnicodeNormalizationForm.NFKD), salt, 2048, 64, \"sha512\");\n    }\n    exports2.mnemonicToSeed = mnemonicToSeed;\n    function mnemonicToEntropy(mnemonic, wordlist) {\n      wordlist = getWordlist(wordlist);\n      logger.checkNormalize();\n      var words = wordlist.split(mnemonic);\n      if (words.length % 3 !== 0) {\n        throw new Error(\"invalid mnemonic\");\n      }\n      var entropy = (0, bytes_1.arrayify)(new Uint8Array(Math.ceil(11 * words.length / 8)));\n      var offset = 0;\n      for (var i = 0; i < words.length; i++) {\n        var index = wordlist.getWordIndex(words[i].normalize(\"NFKD\"));\n        if (index === -1) {\n          throw new Error(\"invalid mnemonic\");\n        }\n        for (var bit = 0; bit < 11; bit++) {\n          if (index & 1 << 10 - bit) {\n            entropy[offset >> 3] |= 1 << 7 - offset % 8;\n          }\n          offset++;\n        }\n      }\n      var entropyBits = 32 * words.length / 3;\n      var checksumBits = words.length / 3;\n      var checksumMask = getUpperMask(checksumBits);\n      var checksum = (0, bytes_1.arrayify)((0, sha2_1.sha256)(entropy.slice(0, entropyBits / 8)))[0] & checksumMask;\n      if (checksum !== (entropy[entropy.length - 1] & checksumMask)) {\n        throw new Error(\"invalid checksum\");\n      }\n      return (0, bytes_1.hexlify)(entropy.slice(0, entropyBits / 8));\n    }\n    exports2.mnemonicToEntropy = mnemonicToEntropy;\n    function entropyToMnemonic(entropy, wordlist) {\n      wordlist = getWordlist(wordlist);\n      entropy = (0, bytes_1.arrayify)(entropy);\n      if (entropy.length % 4 !== 0 || entropy.length < 16 || entropy.length > 32) {\n        throw new Error(\"invalid entropy\");\n      }\n      var indices = [0];\n      var remainingBits = 11;\n      for (var i = 0; i < entropy.length; i++) {\n        if (remainingBits > 8) {\n          indices[indices.length - 1] <<= 8;\n          indices[indices.length - 1] |= entropy[i];\n          remainingBits -= 8;\n        } else {\n          indices[indices.length - 1] <<= remainingBits;\n          indices[indices.length - 1] |= entropy[i] >> 8 - remainingBits;\n          indices.push(entropy[i] & getLowerMask(8 - remainingBits));\n          remainingBits += 3;\n        }\n      }\n      var checksumBits = entropy.length / 4;\n      var checksum = (0, bytes_1.arrayify)((0, sha2_1.sha256)(entropy))[0] & getUpperMask(checksumBits);\n      indices[indices.length - 1] <<= checksumBits;\n      indices[indices.length - 1] |= checksum >> 8 - checksumBits;\n      return wordlist.join(indices.map(function(index) {\n        return wordlist.getWord(index);\n      }));\n    }\n    exports2.entropyToMnemonic = entropyToMnemonic;\n    function isValidMnemonic(mnemonic, wordlist) {\n      try {\n        mnemonicToEntropy(mnemonic, wordlist);\n        return true;\n      } catch (error) {\n      }\n      return false;\n    }\n    exports2.isValidMnemonic = isValidMnemonic;\n    function getAccountPath(index) {\n      if (typeof index !== \"number\" || index < 0 || index >= HardenedBit || index % 1) {\n        logger.throwArgumentError(\"invalid account index\", \"index\", index);\n      }\n      return \"m/44'/60'/\" + index + \"'/0/0\";\n    }\n    exports2.getAccountPath = getAccountPath;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/random.js\nvar require_random = __commonJS({\n  \"node_modules/@ethersproject/random/lib/random.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.randomBytes = void 0;\n    var crypto_1 = require(\"crypto\");\n    var bytes_1 = require_lib2();\n    function randomBytes(length) {\n      return (0, bytes_1.arrayify)((0, crypto_1.randomBytes)(length));\n    }\n    exports2.randomBytes = randomBytes;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/shuffle.js\nvar require_shuffle = __commonJS({\n  \"node_modules/@ethersproject/random/lib/shuffle.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.shuffled = void 0;\n    function shuffled(array) {\n      array = array.slice();\n      for (var i = array.length - 1; i > 0; i--) {\n        var j = Math.floor(Math.random() * (i + 1));\n        var tmp = array[i];\n        array[i] = array[j];\n        array[j] = tmp;\n      }\n      return array;\n    }\n    exports2.shuffled = shuffled;\n  }\n});\n\n// node_modules/@ethersproject/random/lib/index.js\nvar require_lib22 = __commonJS({\n  \"node_modules/@ethersproject/random/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.shuffled = exports2.randomBytes = void 0;\n    var random_1 = require_random();\n    Object.defineProperty(exports2, \"randomBytes\", { enumerable: true, get: function() {\n      return random_1.randomBytes;\n    } });\n    var shuffle_1 = require_shuffle();\n    Object.defineProperty(exports2, \"shuffled\", { enumerable: true, get: function() {\n      return shuffle_1.shuffled;\n    } });\n  }\n});\n\n// node_modules/aes-js/index.js\nvar require_aes_js = __commonJS({\n  \"node_modules/aes-js/index.js\"(exports2, module2) {\n    \"use strict\";\n    (function(root) {\n      function checkInt(value) {\n        return parseInt(value) === value;\n      }\n      function checkInts(arrayish) {\n        if (!checkInt(arrayish.length)) {\n          return false;\n        }\n        for (var i = 0; i < arrayish.length; i++) {\n          if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {\n            return false;\n          }\n        }\n        return true;\n      }\n      function coerceArray(arg, copy) {\n        if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === \"Uint8Array\") {\n          if (copy) {\n            if (arg.slice) {\n              arg = arg.slice();\n            } else {\n              arg = Array.prototype.slice.call(arg);\n            }\n          }\n          return arg;\n        }\n        if (Array.isArray(arg)) {\n          if (!checkInts(arg)) {\n            throw new Error(\"Array contains invalid value: \" + arg);\n          }\n          return new Uint8Array(arg);\n        }\n        if (checkInt(arg.length) && checkInts(arg)) {\n          return new Uint8Array(arg);\n        }\n        throw new Error(\"unsupported array-like object\");\n      }\n      function createArray(length) {\n        return new Uint8Array(length);\n      }\n      function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {\n        if (sourceStart != null || sourceEnd != null) {\n          if (sourceArray.slice) {\n            sourceArray = sourceArray.slice(sourceStart, sourceEnd);\n          } else {\n            sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);\n          }\n        }\n        targetArray.set(sourceArray, targetStart);\n      }\n      var convertUtf8 = /* @__PURE__ */ function() {\n        function toBytes(text) {\n          var result = [], i = 0;\n          text = encodeURI(text);\n          while (i < text.length) {\n            var c = text.charCodeAt(i++);\n            if (c === 37) {\n              result.push(parseInt(text.substr(i, 2), 16));\n              i += 2;\n            } else {\n              result.push(c);\n            }\n          }\n          return coerceArray(result);\n        }\n        function fromBytes(bytes) {\n          var result = [], i = 0;\n          while (i < bytes.length) {\n            var c = bytes[i];\n            if (c < 128) {\n              result.push(String.fromCharCode(c));\n              i++;\n            } else if (c > 191 && c < 224) {\n              result.push(String.fromCharCode((c & 31) << 6 | bytes[i + 1] & 63));\n              i += 2;\n            } else {\n              result.push(String.fromCharCode((c & 15) << 12 | (bytes[i + 1] & 63) << 6 | bytes[i + 2] & 63));\n              i += 3;\n            }\n          }\n          return result.join(\"\");\n        }\n        return {\n          toBytes,\n          fromBytes\n        };\n      }();\n      var convertHex = /* @__PURE__ */ function() {\n        function toBytes(text) {\n          var result = [];\n          for (var i = 0; i < text.length; i += 2) {\n            result.push(parseInt(text.substr(i, 2), 16));\n          }\n          return result;\n        }\n        var Hex = \"0123456789abcdef\";\n        function fromBytes(bytes) {\n          var result = [];\n          for (var i = 0; i < bytes.length; i++) {\n            var v = bytes[i];\n            result.push(Hex[(v & 240) >> 4] + Hex[v & 15]);\n          }\n          return result.join(\"\");\n        }\n        return {\n          toBytes,\n          fromBytes\n        };\n      }();\n      var numberOfRounds = { 16: 10, 24: 12, 32: 14 };\n      var rcon = [1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145];\n      var S = [99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22];\n      var Si = [82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, 204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21, 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247, 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, 234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173, 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29, 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75, 198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168, 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81, 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, 224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97, 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12, 125];\n      var T1 = [3328402341, 4168907908, 4000806809, 4135287693, 4294111757, 3597364157, 3731845041, 2445657428, 1613770832, 33620227, 3462883241, 1445669757, 3892248089, 3050821474, 1303096294, 3967186586, 2412431941, 528646813, 2311702848, 4202528135, 4026202645, 2992200171, 2387036105, 4226871307, 1101901292, 3017069671, 1604494077, 1169141738, 597466303, 1403299063, 3832705686, 2613100635, 1974974402, 3791519004, 1033081774, 1277568618, 1815492186, 2118074177, 4126668546, 2211236943, 1748251740, 1369810420, 3521504564, 4193382664, 3799085459, 2883115123, 1647391059, 706024767, 134480908, 2512897874, 1176707941, 2646852446, 806885416, 932615841, 168101135, 798661301, 235341577, 605164086, 461406363, 3756188221, 3454790438, 1311188841, 2142417613, 3933566367, 302582043, 495158174, 1479289972, 874125870, 907746093, 3698224818, 3025820398, 1537253627, 2756858614, 1983593293, 3084310113, 2108928974, 1378429307, 3722699582, 1580150641, 327451799, 2790478837, 3117535592, 0, 3253595436, 1075847264, 3825007647, 2041688520, 3059440621, 3563743934, 2378943302, 1740553945, 1916352843, 2487896798, 2555137236, 2958579944, 2244988746, 3151024235, 3320835882, 1336584933, 3992714006, 2252555205, 2588757463, 1714631509, 293963156, 2319795663, 3925473552, 67240454, 4269768577, 2689618160, 2017213508, 631218106, 1269344483, 2723238387, 1571005438, 2151694528, 93294474, 1066570413, 563977660, 1882732616, 4059428100, 1673313503, 2008463041, 2950355573, 1109467491, 537923632, 3858759450, 4260623118, 3218264685, 2177748300, 403442708, 638784309, 3287084079, 3193921505, 899127202, 2286175436, 773265209, 2479146071, 1437050866, 4236148354, 2050833735, 3362022572, 3126681063, 840505643, 3866325909, 3227541664, 427917720, 2655997905, 2749160575, 1143087718, 1412049534, 999329963, 193497219, 2353415882, 3354324521, 1807268051, 672404540, 2816401017, 3160301282, 369822493, 2916866934, 3688947771, 1681011286, 1949973070, 336202270, 2454276571, 201721354, 1210328172, 3093060836, 2680341085, 3184776046, 1135389935, 3294782118, 965841320, 831886756, 3554993207, 4068047243, 3588745010, 2345191491, 1849112409, 3664604599, 26054028, 2983581028, 2622377682, 1235855840, 3630984372, 2891339514, 4092916743, 3488279077, 3395642799, 4101667470, 1202630377, 268961816, 1874508501, 4034427016, 1243948399, 1546530418, 941366308, 1470539505, 1941222599, 2546386513, 3421038627, 2715671932, 3899946140, 1042226977, 2521517021, 1639824860, 227249030, 260737669, 3765465232, 2084453954, 1907733956, 3429263018, 2420656344, 100860677, 4160157185, 470683154, 3261161891, 1781871967, 2924959737, 1773779408, 394692241, 2579611992, 974986535, 664706745, 3655459128, 3958962195, 731420851, 571543859, 3530123707, 2849626480, 126783113, 865375399, 765172662, 1008606754, 361203602, 3387549984, 2278477385, 2857719295, 1344809080, 2782912378, 59542671, 1503764984, 160008576, 437062935, 1707065306, 3622233649, 2218934982, 3496503480, 2185314755, 697932208, 1512910199, 504303377, 2075177163, 2824099068, 1841019862, 739644986];\n      var T2 = [2781242211, 2230877308, 2582542199, 2381740923, 234877682, 3184946027, 2984144751, 1418839493, 1348481072, 50462977, 2848876391, 2102799147, 434634494, 1656084439, 3863849899, 2599188086, 1167051466, 2636087938, 1082771913, 2281340285, 368048890, 3954334041, 3381544775, 201060592, 3963727277, 1739838676, 4250903202, 3930435503, 3206782108, 4149453988, 2531553906, 1536934080, 3262494647, 484572669, 2923271059, 1783375398, 1517041206, 1098792767, 49674231, 1334037708, 1550332980, 4098991525, 886171109, 150598129, 2481090929, 1940642008, 1398944049, 1059722517, 201851908, 1385547719, 1699095331, 1587397571, 674240536, 2704774806, 252314885, 3039795866, 151914247, 908333586, 2602270848, 1038082786, 651029483, 1766729511, 3447698098, 2682942837, 454166793, 2652734339, 1951935532, 775166490, 758520603, 3000790638, 4004797018, 4217086112, 4137964114, 1299594043, 1639438038, 3464344499, 2068982057, 1054729187, 1901997871, 2534638724, 4121318227, 1757008337, 0, 750906861, 1614815264, 535035132, 3363418545, 3988151131, 3201591914, 1183697867, 3647454910, 1265776953, 3734260298, 3566750796, 3903871064, 1250283471, 1807470800, 717615087, 3847203498, 384695291, 3313910595, 3617213773, 1432761139, 2484176261, 3481945413, 283769337, 100925954, 2180939647, 4037038160, 1148730428, 3123027871, 3813386408, 4087501137, 4267549603, 3229630528, 2315620239, 2906624658, 3156319645, 1215313976, 82966005, 3747855548, 3245848246, 1974459098, 1665278241, 807407632, 451280895, 251524083, 1841287890, 1283575245, 337120268, 891687699, 801369324, 3787349855, 2721421207, 3431482436, 959321879, 1469301956, 4065699751, 2197585534, 1199193405, 2898814052, 3887750493, 724703513, 2514908019, 2696962144, 2551808385, 3516813135, 2141445340, 1715741218, 2119445034, 2872807568, 2198571144, 3398190662, 700968686, 3547052216, 1009259540, 2041044702, 3803995742, 487983883, 1991105499, 1004265696, 1449407026, 1316239930, 504629770, 3683797321, 168560134, 1816667172, 3837287516, 1570751170, 1857934291, 4014189740, 2797888098, 2822345105, 2754712981, 936633572, 2347923833, 852879335, 1133234376, 1500395319, 3084545389, 2348912013, 1689376213, 3533459022, 3762923945, 3034082412, 4205598294, 133428468, 634383082, 2949277029, 2398386810, 3913789102, 403703816, 3580869306, 2297460856, 1867130149, 1918643758, 607656988, 4049053350, 3346248884, 1368901318, 600565992, 2090982877, 2632479860, 557719327, 3717614411, 3697393085, 2249034635, 2232388234, 2430627952, 1115438654, 3295786421, 2865522278, 3633334344, 84280067, 33027830, 303828494, 2747425121, 1600795957, 4188952407, 3496589753, 2434238086, 1486471617, 658119965, 3106381470, 953803233, 334231800, 3005978776, 857870609, 3151128937, 1890179545, 2298973838, 2805175444, 3056442267, 574365214, 2450884487, 550103529, 1233637070, 4289353045, 2018519080, 2057691103, 2399374476, 4166623649, 2148108681, 387583245, 3664101311, 836232934, 3330556482, 3100665960, 3280093505, 2955516313, 2002398509, 287182607, 3413881008, 4238890068, 3597515707, 975967766];\n      var T3 = [1671808611, 2089089148, 2006576759, 2072901243, 4061003762, 1807603307, 1873927791, 3310653893, 810573872, 16974337, 1739181671, 729634347, 4263110654, 3613570519, 2883997099, 1989864566, 3393556426, 2191335298, 3376449993, 2106063485, 4195741690, 1508618841, 1204391495, 4027317232, 2917941677, 3563566036, 2734514082, 2951366063, 2629772188, 2767672228, 1922491506, 3227229120, 3082974647, 4246528509, 2477669779, 644500518, 911895606, 1061256767, 4144166391, 3427763148, 878471220, 2784252325, 3845444069, 4043897329, 1905517169, 3631459288, 827548209, 356461077, 67897348, 3344078279, 593839651, 3277757891, 405286936, 2527147926, 84871685, 2595565466, 118033927, 305538066, 2157648768, 3795705826, 3945188843, 661212711, 2999812018, 1973414517, 152769033, 2208177539, 745822252, 439235610, 455947803, 1857215598, 1525593178, 2700827552, 1391895634, 994932283, 3596728278, 3016654259, 695947817, 3812548067, 795958831, 2224493444, 1408607827, 3513301457, 0, 3979133421, 543178784, 4229948412, 2982705585, 1542305371, 1790891114, 3410398667, 3201918910, 961245753, 1256100938, 1289001036, 1491644504, 3477767631, 3496721360, 4012557807, 2867154858, 4212583931, 1137018435, 1305975373, 861234739, 2241073541, 1171229253, 4178635257, 33948674, 2139225727, 1357946960, 1011120188, 2679776671, 2833468328, 1374921297, 2751356323, 1086357568, 2408187279, 2460827538, 2646352285, 944271416, 4110742005, 3168756668, 3066132406, 3665145818, 560153121, 271589392, 4279952895, 4077846003, 3530407890, 3444343245, 202643468, 322250259, 3962553324, 1608629855, 2543990167, 1154254916, 389623319, 3294073796, 2817676711, 2122513534, 1028094525, 1689045092, 1575467613, 422261273, 1939203699, 1621147744, 2174228865, 1339137615, 3699352540, 577127458, 712922154, 2427141008, 2290289544, 1187679302, 3995715566, 3100863416, 339486740, 3732514782, 1591917662, 186455563, 3681988059, 3762019296, 844522546, 978220090, 169743370, 1239126601, 101321734, 611076132, 1558493276, 3260915650, 3547250131, 2901361580, 1655096418, 2443721105, 2510565781, 3828863972, 2039214713, 3878868455, 3359869896, 928607799, 1840765549, 2374762893, 3580146133, 1322425422, 2850048425, 1823791212, 1459268694, 4094161908, 3928346602, 1706019429, 2056189050, 2934523822, 135794696, 3134549946, 2022240376, 628050469, 779246638, 472135708, 2800834470, 3032970164, 3327236038, 3894660072, 3715932637, 1956440180, 522272287, 1272813131, 3185336765, 2340818315, 2323976074, 1888542832, 1044544574, 3049550261, 1722469478, 1222152264, 50660867, 4127324150, 236067854, 1638122081, 895445557, 1475980887, 3117443513, 2257655686, 3243809217, 489110045, 2662934430, 3778599393, 4162055160, 2561878936, 288563729, 1773916777, 3648039385, 2391345038, 2493985684, 2612407707, 505560094, 2274497927, 3911240169, 3460925390, 1442818645, 678973480, 3749357023, 2358182796, 2717407649, 2306869641, 219617805, 3218761151, 3862026214, 1120306242, 1756942440, 1103331905, 2578459033, 762796589, 252780047, 2966125488, 1425844308, 3151392187, 372911126];\n      var T4 = [1667474886, 2088535288, 2004326894, 2071694838, 4075949567, 1802223062, 1869591006, 3318043793, 808472672, 16843522, 1734846926, 724270422, 4278065639, 3621216949, 2880169549, 1987484396, 3402253711, 2189597983, 3385409673, 2105378810, 4210693615, 1499065266, 1195886990, 4042263547, 2913856577, 3570689971, 2728590687, 2947541573, 2627518243, 2762274643, 1920112356, 3233831835, 3082273397, 4261223649, 2475929149, 640051788, 909531756, 1061110142, 4160160501, 3435941763, 875846760, 2779116625, 3857003729, 4059105529, 1903268834, 3638064043, 825316194, 353713962, 67374088, 3351728789, 589522246, 3284360861, 404236336, 2526454071, 84217610, 2593830191, 117901582, 303183396, 2155911963, 3806477791, 3958056653, 656894286, 2998062463, 1970642922, 151591698, 2206440989, 741110872, 437923380, 454765878, 1852748508, 1515908788, 2694904667, 1381168804, 993742198, 3604373943, 3014905469, 690584402, 3823320797, 791638366, 2223281939, 1398011302, 3520161977, 0, 3991743681, 538992704, 4244381667, 2981218425, 1532751286, 1785380564, 3419096717, 3200178535, 960056178, 1246420628, 1280103576, 1482221744, 3486468741, 3503319995, 4025428677, 2863326543, 4227536621, 1128514950, 1296947098, 859002214, 2240123921, 1162203018, 4193849577, 33687044, 2139062782, 1347481760, 1010582648, 2678045221, 2829640523, 1364325282, 2745433693, 1077985408, 2408548869, 2459086143, 2644360225, 943212656, 4126475505, 3166494563, 3065430391, 3671750063, 555836226, 269496352, 4294908645, 4092792573, 3537006015, 3452783745, 202118168, 320025894, 3974901699, 1600119230, 2543297077, 1145359496, 387397934, 3301201811, 2812801621, 2122220284, 1027426170, 1684319432, 1566435258, 421079858, 1936954854, 1616945344, 2172753945, 1330631070, 3705438115, 572679748, 707427924, 2425400123, 2290647819, 1179044492, 4008585671, 3099120491, 336870440, 3739122087, 1583276732, 185277718, 3688593069, 3772791771, 842159716, 976899700, 168435220, 1229577106, 101059084, 606366792, 1549591736, 3267517855, 3553849021, 2897014595, 1650632388, 2442242105, 2509612081, 3840161747, 2038008818, 3890688725, 3368567691, 926374254, 1835907034, 2374863873, 3587531953, 1313788572, 2846482505, 1819063512, 1448540844, 4109633523, 3941213647, 1701162954, 2054852340, 2930698567, 134748176, 3132806511, 2021165296, 623210314, 774795868, 471606328, 2795958615, 3031746419, 3334885783, 3907527627, 3722280097, 1953799400, 522133822, 1263263126, 3183336545, 2341176845, 2324333839, 1886425312, 1044267644, 3048588401, 1718004428, 1212733584, 50529542, 4143317495, 235803164, 1633788866, 892690282, 1465383342, 3115962473, 2256965911, 3250673817, 488449850, 2661202215, 3789633753, 4177007595, 2560144171, 286339874, 1768537042, 3654906025, 2391705863, 2492770099, 2610673197, 505291324, 2273808917, 3924369609, 3469625735, 1431699370, 673740880, 3755965093, 2358021891, 2711746649, 2307489801, 218961690, 3217021541, 3873845719, 1111672452, 1751693520, 1094828930, 2576986153, 757954394, 252645662, 2964376443, 1414855848, 3149649517, 370555436];\n      var T5 = [1374988112, 2118214995, 437757123, 975658646, 1001089995, 530400753, 2902087851, 1273168787, 540080725, 2910219766, 2295101073, 4110568485, 1340463100, 3307916247, 641025152, 3043140495, 3736164937, 632953703, 1172967064, 1576976609, 3274667266, 2169303058, 2370213795, 1809054150, 59727847, 361929877, 3211623147, 2505202138, 3569255213, 1484005843, 1239443753, 2395588676, 1975683434, 4102977912, 2572697195, 666464733, 3202437046, 4035489047, 3374361702, 2110667444, 1675577880, 3843699074, 2538681184, 1649639237, 2976151520, 3144396420, 4269907996, 4178062228, 1883793496, 2403728665, 2497604743, 1383856311, 2876494627, 1917518562, 3810496343, 1716890410, 3001755655, 800440835, 2261089178, 3543599269, 807962610, 599762354, 33778362, 3977675356, 2328828971, 2809771154, 4077384432, 1315562145, 1708848333, 101039829, 3509871135, 3299278474, 875451293, 2733856160, 92987698, 2767645557, 193195065, 1080094634, 1584504582, 3178106961, 1042385657, 2531067453, 3711829422, 1306967366, 2438237621, 1908694277, 67556463, 1615861247, 429456164, 3602770327, 2302690252, 1742315127, 2968011453, 126454664, 3877198648, 2043211483, 2709260871, 2084704233, 4169408201, 0, 159417987, 841739592, 504459436, 1817866830, 4245618683, 260388950, 1034867998, 908933415, 168810852, 1750902305, 2606453969, 607530554, 202008497, 2472011535, 3035535058, 463180190, 2160117071, 1641816226, 1517767529, 470948374, 3801332234, 3231722213, 1008918595, 303765277, 235474187, 4069246893, 766945465, 337553864, 1475418501, 2943682380, 4003061179, 2743034109, 4144047775, 1551037884, 1147550661, 1543208500, 2336434550, 3408119516, 3069049960, 3102011747, 3610369226, 1113818384, 328671808, 2227573024, 2236228733, 3535486456, 2935566865, 3341394285, 496906059, 3702665459, 226906860, 2009195472, 733156972, 2842737049, 294930682, 1206477858, 2835123396, 2700099354, 1451044056, 573804783, 2269728455, 3644379585, 2362090238, 2564033334, 2801107407, 2776292904, 3669462566, 1068351396, 742039012, 1350078989, 1784663195, 1417561698, 4136440770, 2430122216, 775550814, 2193862645, 2673705150, 1775276924, 1876241833, 3475313331, 3366754619, 270040487, 3902563182, 3678124923, 3441850377, 1851332852, 3969562369, 2203032232, 3868552805, 2868897406, 566021896, 4011190502, 3135740889, 1248802510, 3936291284, 699432150, 832877231, 708780849, 3332740144, 899835584, 1951317047, 4236429990, 3767586992, 866637845, 4043610186, 1106041591, 2144161806, 395441711, 1984812685, 1139781709, 3433712980, 3835036895, 2664543715, 1282050075, 3240894392, 1181045119, 2640243204, 25965917, 4203181171, 4211818798, 3009879386, 2463879762, 3910161971, 1842759443, 2597806476, 933301370, 1509430414, 3943906441, 3467192302, 3076639029, 3776767469, 2051518780, 2631065433, 1441952575, 404016761, 1942435775, 1408749034, 1610459739, 3745345300, 2017778566, 3400528769, 3110650942, 941896748, 3265478751, 371049330, 3168937228, 675039627, 4279080257, 967311729, 135050206, 3635733660, 1683407248, 2076935265, 3576870512, 1215061108, 3501741890];\n      var T6 = [1347548327, 1400783205, 3273267108, 2520393566, 3409685355, 4045380933, 2880240216, 2471224067, 1428173050, 4138563181, 2441661558, 636813900, 4233094615, 3620022987, 2149987652, 2411029155, 1239331162, 1730525723, 2554718734, 3781033664, 46346101, 310463728, 2743944855, 3328955385, 3875770207, 2501218972, 3955191162, 3667219033, 768917123, 3545789473, 692707433, 1150208456, 1786102409, 2029293177, 1805211710, 3710368113, 3065962831, 401639597, 1724457132, 3028143674, 409198410, 2196052529, 1620529459, 1164071807, 3769721975, 2226875310, 486441376, 2499348523, 1483753576, 428819965, 2274680428, 3075636216, 598438867, 3799141122, 1474502543, 711349675, 129166120, 53458370, 2592523643, 2782082824, 4063242375, 2988687269, 3120694122, 1559041666, 730517276, 2460449204, 4042459122, 2706270690, 3446004468, 3573941694, 533804130, 2328143614, 2637442643, 2695033685, 839224033, 1973745387, 957055980, 2856345839, 106852767, 1371368976, 4181598602, 1033297158, 2933734917, 1179510461, 3046200461, 91341917, 1862534868, 4284502037, 605657339, 2547432937, 3431546947, 2003294622, 3182487618, 2282195339, 954669403, 3682191598, 1201765386, 3917234703, 3388507166, 0, 2198438022, 1211247597, 2887651696, 1315723890, 4227665663, 1443857720, 507358933, 657861945, 1678381017, 560487590, 3516619604, 975451694, 2970356327, 261314535, 3535072918, 2652609425, 1333838021, 2724322336, 1767536459, 370938394, 182621114, 3854606378, 1128014560, 487725847, 185469197, 2918353863, 3106780840, 3356761769, 2237133081, 1286567175, 3152976349, 4255350624, 2683765030, 3160175349, 3309594171, 878443390, 1988838185, 3704300486, 1756818940, 1673061617, 3403100636, 272786309, 1075025698, 545572369, 2105887268, 4174560061, 296679730, 1841768865, 1260232239, 4091327024, 3960309330, 3497509347, 1814803222, 2578018489, 4195456072, 575138148, 3299409036, 446754879, 3629546796, 4011996048, 3347532110, 3252238545, 4270639778, 915985419, 3483825537, 681933534, 651868046, 2755636671, 3828103837, 223377554, 2607439820, 1649704518, 3270937875, 3901806776, 1580087799, 4118987695, 3198115200, 2087309459, 2842678573, 3016697106, 1003007129, 2802849917, 1860738147, 2077965243, 164439672, 4100872472, 32283319, 2827177882, 1709610350, 2125135846, 136428751, 3874428392, 3652904859, 3460984630, 3572145929, 3593056380, 2939266226, 824852259, 818324884, 3224740454, 930369212, 2801566410, 2967507152, 355706840, 1257309336, 4148292826, 243256656, 790073846, 2373340630, 1296297904, 1422699085, 3756299780, 3818836405, 457992840, 3099667487, 2135319889, 77422314, 1560382517, 1945798516, 788204353, 1521706781, 1385356242, 870912086, 325965383, 2358957921, 2050466060, 2388260884, 2313884476, 4006521127, 901210569, 3990953189, 1014646705, 1503449823, 1062597235, 2031621326, 3212035895, 3931371469, 1533017514, 350174575, 2256028891, 2177544179, 1052338372, 741876788, 1606591296, 1914052035, 213705253, 2334669897, 1107234197, 1899603969, 3725069491, 2631447780, 2422494913, 1635502980, 1893020342, 1950903388, 1120974935];\n      var T7 = [2807058932, 1699970625, 2764249623, 1586903591, 1808481195, 1173430173, 1487645946, 59984867, 4199882800, 1844882806, 1989249228, 1277555970, 3623636965, 3419915562, 1149249077, 2744104290, 1514790577, 459744698, 244860394, 3235995134, 1963115311, 4027744588, 2544078150, 4190530515, 1608975247, 2627016082, 2062270317, 1507497298, 2200818878, 567498868, 1764313568, 3359936201, 2305455554, 2037970062, 1047239e3, 1910319033, 1337376481, 2904027272, 2892417312, 984907214, 1243112415, 830661914, 861968209, 2135253587, 2011214180, 2927934315, 2686254721, 731183368, 1750626376, 4246310725, 1820824798, 4172763771, 3542330227, 48394827, 2404901663, 2871682645, 671593195, 3254988725, 2073724613, 145085239, 2280796200, 2779915199, 1790575107, 2187128086, 472615631, 3029510009, 4075877127, 3802222185, 4107101658, 3201631749, 1646252340, 4270507174, 1402811438, 1436590835, 3778151818, 3950355702, 3963161475, 4020912224, 2667994737, 273792366, 2331590177, 104699613, 95345982, 3175501286, 2377486676, 1560637892, 3564045318, 369057872, 4213447064, 3919042237, 1137477952, 2658625497, 1119727848, 2340947849, 1530455833, 4007360968, 172466556, 266959938, 516552836, 0, 2256734592, 3980931627, 1890328081, 1917742170, 4294704398, 945164165, 3575528878, 958871085, 3647212047, 2787207260, 1423022939, 775562294, 1739656202, 3876557655, 2530391278, 2443058075, 3310321856, 547512796, 1265195639, 437656594, 3121275539, 719700128, 3762502690, 387781147, 218828297, 3350065803, 2830708150, 2848461854, 428169201, 122466165, 3720081049, 1627235199, 648017665, 4122762354, 1002783846, 2117360635, 695634755, 3336358691, 4234721005, 4049844452, 3704280881, 2232435299, 574624663, 287343814, 612205898, 1039717051, 840019705, 2708326185, 793451934, 821288114, 1391201670, 3822090177, 376187827, 3113855344, 1224348052, 1679968233, 2361698556, 1058709744, 752375421, 2431590963, 1321699145, 3519142200, 2734591178, 188127444, 2177869557, 3727205754, 2384911031, 3215212461, 2648976442, 2450346104, 3432737375, 1180849278, 331544205, 3102249176, 4150144569, 2952102595, 2159976285, 2474404304, 766078933, 313773861, 2570832044, 2108100632, 1668212892, 3145456443, 2013908262, 418672217, 3070356634, 2594734927, 1852171925, 3867060991, 3473416636, 3907448597, 2614737639, 919489135, 164948639, 2094410160, 2997825956, 590424639, 2486224549, 1723872674, 3157750862, 3399941250, 3501252752, 3625268135, 2555048196, 3673637356, 1343127501, 4130281361, 3599595085, 2957853679, 1297403050, 81781910, 3051593425, 2283490410, 532201772, 1367295589, 3926170974, 895287692, 1953757831, 1093597963, 492483431, 3528626907, 1446242576, 1192455638, 1636604631, 209336225, 344873464, 1015671571, 669961897, 3375740769, 3857572124, 2973530695, 3747192018, 1933530610, 3464042516, 935293895, 3454686199, 2858115069, 1863638845, 3683022916, 4085369519, 3292445032, 875313188, 1080017571, 3279033885, 621591778, 1233856572, 2504130317, 24197544, 3017672716, 3835484340, 3247465558, 2220981195, 3060847922, 1551124588, 1463996600];\n      var T8 = [4104605777, 1097159550, 396673818, 660510266, 2875968315, 2638606623, 4200115116, 3808662347, 821712160, 1986918061, 3430322568, 38544885, 3856137295, 718002117, 893681702, 1654886325, 2975484382, 3122358053, 3926825029, 4274053469, 796197571, 1290801793, 1184342925, 3556361835, 2405426947, 2459735317, 1836772287, 1381620373, 3196267988, 1948373848, 3764988233, 3385345166, 3263785589, 2390325492, 1480485785, 3111247143, 3780097726, 2293045232, 548169417, 3459953789, 3746175075, 439452389, 1362321559, 1400849762, 1685577905, 1806599355, 2174754046, 137073913, 1214797936, 1174215055, 3731654548, 2079897426, 1943217067, 1258480242, 529487843, 1437280870, 3945269170, 3049390895, 3313212038, 923313619, 679998e3, 3215307299, 57326082, 377642221, 3474729866, 2041877159, 133361907, 1776460110, 3673476453, 96392454, 878845905, 2801699524, 777231668, 4082475170, 2330014213, 4142626212, 2213296395, 1626319424, 1906247262, 1846563261, 562755902, 3708173718, 1040559837, 3871163981, 1418573201, 3294430577, 114585348, 1343618912, 2566595609, 3186202582, 1078185097, 3651041127, 3896688048, 2307622919, 425408743, 3371096953, 2081048481, 1108339068, 2216610296, 0, 2156299017, 736970802, 292596766, 1517440620, 251657213, 2235061775, 2933202493, 758720310, 265905162, 1554391400, 1532285339, 908999204, 174567692, 1474760595, 4002861748, 2610011675, 3234156416, 3693126241, 2001430874, 303699484, 2478443234, 2687165888, 585122620, 454499602, 151849742, 2345119218, 3064510765, 514443284, 4044981591, 1963412655, 2581445614, 2137062819, 19308535, 1928707164, 1715193156, 4219352155, 1126790795, 600235211, 3992742070, 3841024952, 836553431, 1669664834, 2535604243, 3323011204, 1243905413, 3141400786, 4180808110, 698445255, 2653899549, 2989552604, 2253581325, 3252932727, 3004591147, 1891211689, 2487810577, 3915653703, 4237083816, 4030667424, 2100090966, 865136418, 1229899655, 953270745, 3399679628, 3557504664, 4118925222, 2061379749, 3079546586, 2915017791, 983426092, 2022837584, 1607244650, 2118541908, 2366882550, 3635996816, 972512814, 3283088770, 1568718495, 3499326569, 3576539503, 621982671, 2895723464, 410887952, 2623762152, 1002142683, 645401037, 1494807662, 2595684844, 1335535747, 2507040230, 4293295786, 3167684641, 367585007, 3885750714, 1865862730, 2668221674, 2960971305, 2763173681, 1059270954, 2777952454, 2724642869, 1320957812, 2194319100, 2429595872, 2815956275, 77089521, 3973773121, 3444575871, 2448830231, 1305906550, 4021308739, 2857194700, 2516901860, 3518358430, 1787304780, 740276417, 1699839814, 1592394909, 2352307457, 2272556026, 188821243, 1729977011, 3687994002, 274084841, 3594982253, 3613494426, 2701949495, 4162096729, 322734571, 2837966542, 1640576439, 484830689, 1202797690, 3537852828, 4067639125, 349075736, 3342319475, 4157467219, 4255800159, 1030690015, 1155237496, 2951971274, 1757691577, 607398968, 2738905026, 499347990, 3794078908, 1011452712, 227885567, 2818666809, 213114376, 3034881240, 1455525988, 3414450555, 850817237, 1817998408, 3092726480];\n      var U1 = [0, 235474187, 470948374, 303765277, 941896748, 908933415, 607530554, 708780849, 1883793496, 2118214995, 1817866830, 1649639237, 1215061108, 1181045119, 1417561698, 1517767529, 3767586992, 4003061179, 4236429990, 4069246893, 3635733660, 3602770327, 3299278474, 3400528769, 2430122216, 2664543715, 2362090238, 2193862645, 2835123396, 2801107407, 3035535058, 3135740889, 3678124923, 3576870512, 3341394285, 3374361702, 3810496343, 3977675356, 4279080257, 4043610186, 2876494627, 2776292904, 3076639029, 3110650942, 2472011535, 2640243204, 2403728665, 2169303058, 1001089995, 899835584, 666464733, 699432150, 59727847, 226906860, 530400753, 294930682, 1273168787, 1172967064, 1475418501, 1509430414, 1942435775, 2110667444, 1876241833, 1641816226, 2910219766, 2743034109, 2976151520, 3211623147, 2505202138, 2606453969, 2302690252, 2269728455, 3711829422, 3543599269, 3240894392, 3475313331, 3843699074, 3943906441, 4178062228, 4144047775, 1306967366, 1139781709, 1374988112, 1610459739, 1975683434, 2076935265, 1775276924, 1742315127, 1034867998, 866637845, 566021896, 800440835, 92987698, 193195065, 429456164, 395441711, 1984812685, 2017778566, 1784663195, 1683407248, 1315562145, 1080094634, 1383856311, 1551037884, 101039829, 135050206, 437757123, 337553864, 1042385657, 807962610, 573804783, 742039012, 2531067453, 2564033334, 2328828971, 2227573024, 2935566865, 2700099354, 3001755655, 3168937228, 3868552805, 3902563182, 4203181171, 4102977912, 3736164937, 3501741890, 3265478751, 3433712980, 1106041591, 1340463100, 1576976609, 1408749034, 2043211483, 2009195472, 1708848333, 1809054150, 832877231, 1068351396, 766945465, 599762354, 159417987, 126454664, 361929877, 463180190, 2709260871, 2943682380, 3178106961, 3009879386, 2572697195, 2538681184, 2236228733, 2336434550, 3509871135, 3745345300, 3441850377, 3274667266, 3910161971, 3877198648, 4110568485, 4211818798, 2597806476, 2497604743, 2261089178, 2295101073, 2733856160, 2902087851, 3202437046, 2968011453, 3936291284, 3835036895, 4136440770, 4169408201, 3535486456, 3702665459, 3467192302, 3231722213, 2051518780, 1951317047, 1716890410, 1750902305, 1113818384, 1282050075, 1584504582, 1350078989, 168810852, 67556463, 371049330, 404016761, 841739592, 1008918595, 775550814, 540080725, 3969562369, 3801332234, 4035489047, 4269907996, 3569255213, 3669462566, 3366754619, 3332740144, 2631065433, 2463879762, 2160117071, 2395588676, 2767645557, 2868897406, 3102011747, 3069049960, 202008497, 33778362, 270040487, 504459436, 875451293, 975658646, 675039627, 641025152, 2084704233, 1917518562, 1615861247, 1851332852, 1147550661, 1248802510, 1484005843, 1451044056, 933301370, 967311729, 733156972, 632953703, 260388950, 25965917, 328671808, 496906059, 1206477858, 1239443753, 1543208500, 1441952575, 2144161806, 1908694277, 1675577880, 1842759443, 3610369226, 3644379585, 3408119516, 3307916247, 4011190502, 3776767469, 4077384432, 4245618683, 2809771154, 2842737049, 3144396420, 3043140495, 2673705150, 2438237621, 2203032232, 2370213795];\n      var U2 = [0, 185469197, 370938394, 487725847, 741876788, 657861945, 975451694, 824852259, 1483753576, 1400783205, 1315723890, 1164071807, 1950903388, 2135319889, 1649704518, 1767536459, 2967507152, 3152976349, 2801566410, 2918353863, 2631447780, 2547432937, 2328143614, 2177544179, 3901806776, 3818836405, 4270639778, 4118987695, 3299409036, 3483825537, 3535072918, 3652904859, 2077965243, 1893020342, 1841768865, 1724457132, 1474502543, 1559041666, 1107234197, 1257309336, 598438867, 681933534, 901210569, 1052338372, 261314535, 77422314, 428819965, 310463728, 3409685355, 3224740454, 3710368113, 3593056380, 3875770207, 3960309330, 4045380933, 4195456072, 2471224067, 2554718734, 2237133081, 2388260884, 3212035895, 3028143674, 2842678573, 2724322336, 4138563181, 4255350624, 3769721975, 3955191162, 3667219033, 3516619604, 3431546947, 3347532110, 2933734917, 2782082824, 3099667487, 3016697106, 2196052529, 2313884476, 2499348523, 2683765030, 1179510461, 1296297904, 1347548327, 1533017514, 1786102409, 1635502980, 2087309459, 2003294622, 507358933, 355706840, 136428751, 53458370, 839224033, 957055980, 605657339, 790073846, 2373340630, 2256028891, 2607439820, 2422494913, 2706270690, 2856345839, 3075636216, 3160175349, 3573941694, 3725069491, 3273267108, 3356761769, 4181598602, 4063242375, 4011996048, 3828103837, 1033297158, 915985419, 730517276, 545572369, 296679730, 446754879, 129166120, 213705253, 1709610350, 1860738147, 1945798516, 2029293177, 1239331162, 1120974935, 1606591296, 1422699085, 4148292826, 4233094615, 3781033664, 3931371469, 3682191598, 3497509347, 3446004468, 3328955385, 2939266226, 2755636671, 3106780840, 2988687269, 2198438022, 2282195339, 2501218972, 2652609425, 1201765386, 1286567175, 1371368976, 1521706781, 1805211710, 1620529459, 2105887268, 1988838185, 533804130, 350174575, 164439672, 46346101, 870912086, 954669403, 636813900, 788204353, 2358957921, 2274680428, 2592523643, 2441661558, 2695033685, 2880240216, 3065962831, 3182487618, 3572145929, 3756299780, 3270937875, 3388507166, 4174560061, 4091327024, 4006521127, 3854606378, 1014646705, 930369212, 711349675, 560487590, 272786309, 457992840, 106852767, 223377554, 1678381017, 1862534868, 1914052035, 2031621326, 1211247597, 1128014560, 1580087799, 1428173050, 32283319, 182621114, 401639597, 486441376, 768917123, 651868046, 1003007129, 818324884, 1503449823, 1385356242, 1333838021, 1150208456, 1973745387, 2125135846, 1673061617, 1756818940, 2970356327, 3120694122, 2802849917, 2887651696, 2637442643, 2520393566, 2334669897, 2149987652, 3917234703, 3799141122, 4284502037, 4100872472, 3309594171, 3460984630, 3545789473, 3629546796, 2050466060, 1899603969, 1814803222, 1730525723, 1443857720, 1560382517, 1075025698, 1260232239, 575138148, 692707433, 878443390, 1062597235, 243256656, 91341917, 409198410, 325965383, 3403100636, 3252238545, 3704300486, 3620022987, 3874428392, 3990953189, 4042459122, 4227665663, 2460449204, 2578018489, 2226875310, 2411029155, 3198115200, 3046200461, 2827177882, 2743944855];\n      var U3 = [0, 218828297, 437656594, 387781147, 875313188, 958871085, 775562294, 590424639, 1750626376, 1699970625, 1917742170, 2135253587, 1551124588, 1367295589, 1180849278, 1265195639, 3501252752, 3720081049, 3399941250, 3350065803, 3835484340, 3919042237, 4270507174, 4085369519, 3102249176, 3051593425, 2734591178, 2952102595, 2361698556, 2177869557, 2530391278, 2614737639, 3145456443, 3060847922, 2708326185, 2892417312, 2404901663, 2187128086, 2504130317, 2555048196, 3542330227, 3727205754, 3375740769, 3292445032, 3876557655, 3926170974, 4246310725, 4027744588, 1808481195, 1723872674, 1910319033, 2094410160, 1608975247, 1391201670, 1173430173, 1224348052, 59984867, 244860394, 428169201, 344873464, 935293895, 984907214, 766078933, 547512796, 1844882806, 1627235199, 2011214180, 2062270317, 1507497298, 1423022939, 1137477952, 1321699145, 95345982, 145085239, 532201772, 313773861, 830661914, 1015671571, 731183368, 648017665, 3175501286, 2957853679, 2807058932, 2858115069, 2305455554, 2220981195, 2474404304, 2658625497, 3575528878, 3625268135, 3473416636, 3254988725, 3778151818, 3963161475, 4213447064, 4130281361, 3599595085, 3683022916, 3432737375, 3247465558, 3802222185, 4020912224, 4172763771, 4122762354, 3201631749, 3017672716, 2764249623, 2848461854, 2331590177, 2280796200, 2431590963, 2648976442, 104699613, 188127444, 472615631, 287343814, 840019705, 1058709744, 671593195, 621591778, 1852171925, 1668212892, 1953757831, 2037970062, 1514790577, 1463996600, 1080017571, 1297403050, 3673637356, 3623636965, 3235995134, 3454686199, 4007360968, 3822090177, 4107101658, 4190530515, 2997825956, 3215212461, 2830708150, 2779915199, 2256734592, 2340947849, 2627016082, 2443058075, 172466556, 122466165, 273792366, 492483431, 1047239e3, 861968209, 612205898, 695634755, 1646252340, 1863638845, 2013908262, 1963115311, 1446242576, 1530455833, 1277555970, 1093597963, 1636604631, 1820824798, 2073724613, 1989249228, 1436590835, 1487645946, 1337376481, 1119727848, 164948639, 81781910, 331544205, 516552836, 1039717051, 821288114, 669961897, 719700128, 2973530695, 3157750862, 2871682645, 2787207260, 2232435299, 2283490410, 2667994737, 2450346104, 3647212047, 3564045318, 3279033885, 3464042516, 3980931627, 3762502690, 4150144569, 4199882800, 3070356634, 3121275539, 2904027272, 2686254721, 2200818878, 2384911031, 2570832044, 2486224549, 3747192018, 3528626907, 3310321856, 3359936201, 3950355702, 3867060991, 4049844452, 4234721005, 1739656202, 1790575107, 2108100632, 1890328081, 1402811438, 1586903591, 1233856572, 1149249077, 266959938, 48394827, 369057872, 418672217, 1002783846, 919489135, 567498868, 752375421, 209336225, 24197544, 376187827, 459744698, 945164165, 895287692, 574624663, 793451934, 1679968233, 1764313568, 2117360635, 1933530610, 1343127501, 1560637892, 1243112415, 1192455638, 3704280881, 3519142200, 3336358691, 3419915562, 3907448597, 3857572124, 4075877127, 4294704398, 3029510009, 3113855344, 2927934315, 2744104290, 2159976285, 2377486676, 2594734927, 2544078150];\n      var U4 = [0, 151849742, 303699484, 454499602, 607398968, 758720310, 908999204, 1059270954, 1214797936, 1097159550, 1517440620, 1400849762, 1817998408, 1699839814, 2118541908, 2001430874, 2429595872, 2581445614, 2194319100, 2345119218, 3034881240, 3186202582, 2801699524, 2951971274, 3635996816, 3518358430, 3399679628, 3283088770, 4237083816, 4118925222, 4002861748, 3885750714, 1002142683, 850817237, 698445255, 548169417, 529487843, 377642221, 227885567, 77089521, 1943217067, 2061379749, 1640576439, 1757691577, 1474760595, 1592394909, 1174215055, 1290801793, 2875968315, 2724642869, 3111247143, 2960971305, 2405426947, 2253581325, 2638606623, 2487810577, 3808662347, 3926825029, 4044981591, 4162096729, 3342319475, 3459953789, 3576539503, 3693126241, 1986918061, 2137062819, 1685577905, 1836772287, 1381620373, 1532285339, 1078185097, 1229899655, 1040559837, 923313619, 740276417, 621982671, 439452389, 322734571, 137073913, 19308535, 3871163981, 4021308739, 4104605777, 4255800159, 3263785589, 3414450555, 3499326569, 3651041127, 2933202493, 2815956275, 3167684641, 3049390895, 2330014213, 2213296395, 2566595609, 2448830231, 1305906550, 1155237496, 1607244650, 1455525988, 1776460110, 1626319424, 2079897426, 1928707164, 96392454, 213114376, 396673818, 514443284, 562755902, 679998e3, 865136418, 983426092, 3708173718, 3557504664, 3474729866, 3323011204, 4180808110, 4030667424, 3945269170, 3794078908, 2507040230, 2623762152, 2272556026, 2390325492, 2975484382, 3092726480, 2738905026, 2857194700, 3973773121, 3856137295, 4274053469, 4157467219, 3371096953, 3252932727, 3673476453, 3556361835, 2763173681, 2915017791, 3064510765, 3215307299, 2156299017, 2307622919, 2459735317, 2610011675, 2081048481, 1963412655, 1846563261, 1729977011, 1480485785, 1362321559, 1243905413, 1126790795, 878845905, 1030690015, 645401037, 796197571, 274084841, 425408743, 38544885, 188821243, 3613494426, 3731654548, 3313212038, 3430322568, 4082475170, 4200115116, 3780097726, 3896688048, 2668221674, 2516901860, 2366882550, 2216610296, 3141400786, 2989552604, 2837966542, 2687165888, 1202797690, 1320957812, 1437280870, 1554391400, 1669664834, 1787304780, 1906247262, 2022837584, 265905162, 114585348, 499347990, 349075736, 736970802, 585122620, 972512814, 821712160, 2595684844, 2478443234, 2293045232, 2174754046, 3196267988, 3079546586, 2895723464, 2777952454, 3537852828, 3687994002, 3234156416, 3385345166, 4142626212, 4293295786, 3841024952, 3992742070, 174567692, 57326082, 410887952, 292596766, 777231668, 660510266, 1011452712, 893681702, 1108339068, 1258480242, 1343618912, 1494807662, 1715193156, 1865862730, 1948373848, 2100090966, 2701949495, 2818666809, 3004591147, 3122358053, 2235061775, 2352307457, 2535604243, 2653899549, 3915653703, 3764988233, 4219352155, 4067639125, 3444575871, 3294430577, 3746175075, 3594982253, 836553431, 953270745, 600235211, 718002117, 367585007, 484830689, 133361907, 251657213, 2041877159, 1891211689, 1806599355, 1654886325, 1568718495, 1418573201, 1335535747, 1184342925];\n      function convertToInt32(bytes) {\n        var result = [];\n        for (var i = 0; i < bytes.length; i += 4) {\n          result.push(\n            bytes[i] << 24 | bytes[i + 1] << 16 | bytes[i + 2] << 8 | bytes[i + 3]\n          );\n        }\n        return result;\n      }\n      var AES = function(key) {\n        if (!(this instanceof AES)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        Object.defineProperty(this, \"key\", {\n          value: coerceArray(key, true)\n        });\n        this._prepare();\n      };\n      AES.prototype._prepare = function() {\n        var rounds = numberOfRounds[this.key.length];\n        if (rounds == null) {\n          throw new Error(\"invalid key size (must be 16, 24 or 32 bytes)\");\n        }\n        this._Ke = [];\n        this._Kd = [];\n        for (var i = 0; i <= rounds; i++) {\n          this._Ke.push([0, 0, 0, 0]);\n          this._Kd.push([0, 0, 0, 0]);\n        }\n        var roundKeyCount = (rounds + 1) * 4;\n        var KC = this.key.length / 4;\n        var tk = convertToInt32(this.key);\n        var index;\n        for (var i = 0; i < KC; i++) {\n          index = i >> 2;\n          this._Ke[index][i % 4] = tk[i];\n          this._Kd[rounds - index][i % 4] = tk[i];\n        }\n        var rconpointer = 0;\n        var t = KC, tt;\n        while (t < roundKeyCount) {\n          tt = tk[KC - 1];\n          tk[0] ^= S[tt >> 16 & 255] << 24 ^ S[tt >> 8 & 255] << 16 ^ S[tt & 255] << 8 ^ S[tt >> 24 & 255] ^ rcon[rconpointer] << 24;\n          rconpointer += 1;\n          if (KC != 8) {\n            for (var i = 1; i < KC; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n          } else {\n            for (var i = 1; i < KC / 2; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n            tt = tk[KC / 2 - 1];\n            tk[KC / 2] ^= S[tt & 255] ^ S[tt >> 8 & 255] << 8 ^ S[tt >> 16 & 255] << 16 ^ S[tt >> 24 & 255] << 24;\n            for (var i = KC / 2 + 1; i < KC; i++) {\n              tk[i] ^= tk[i - 1];\n            }\n          }\n          var i = 0, r, c;\n          while (i < KC && t < roundKeyCount) {\n            r = t >> 2;\n            c = t % 4;\n            this._Ke[r][c] = tk[i];\n            this._Kd[rounds - r][c] = tk[i++];\n            t++;\n          }\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var c = 0; c < 4; c++) {\n            tt = this._Kd[r][c];\n            this._Kd[r][c] = U1[tt >> 24 & 255] ^ U2[tt >> 16 & 255] ^ U3[tt >> 8 & 255] ^ U4[tt & 255];\n          }\n        }\n      };\n      AES.prototype.encrypt = function(plaintext) {\n        if (plaintext.length != 16) {\n          throw new Error(\"invalid plaintext size (must be 16 bytes)\");\n        }\n        var rounds = this._Ke.length - 1;\n        var a = [0, 0, 0, 0];\n        var t = convertToInt32(plaintext);\n        for (var i = 0; i < 4; i++) {\n          t[i] ^= this._Ke[0][i];\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var i = 0; i < 4; i++) {\n            a[i] = T1[t[i] >> 24 & 255] ^ T2[t[(i + 1) % 4] >> 16 & 255] ^ T3[t[(i + 2) % 4] >> 8 & 255] ^ T4[t[(i + 3) % 4] & 255] ^ this._Ke[r][i];\n          }\n          t = a.slice();\n        }\n        var result = createArray(16), tt;\n        for (var i = 0; i < 4; i++) {\n          tt = this._Ke[rounds][i];\n          result[4 * i] = (S[t[i] >> 24 & 255] ^ tt >> 24) & 255;\n          result[4 * i + 1] = (S[t[(i + 1) % 4] >> 16 & 255] ^ tt >> 16) & 255;\n          result[4 * i + 2] = (S[t[(i + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;\n          result[4 * i + 3] = (S[t[(i + 3) % 4] & 255] ^ tt) & 255;\n        }\n        return result;\n      };\n      AES.prototype.decrypt = function(ciphertext) {\n        if (ciphertext.length != 16) {\n          throw new Error(\"invalid ciphertext size (must be 16 bytes)\");\n        }\n        var rounds = this._Kd.length - 1;\n        var a = [0, 0, 0, 0];\n        var t = convertToInt32(ciphertext);\n        for (var i = 0; i < 4; i++) {\n          t[i] ^= this._Kd[0][i];\n        }\n        for (var r = 1; r < rounds; r++) {\n          for (var i = 0; i < 4; i++) {\n            a[i] = T5[t[i] >> 24 & 255] ^ T6[t[(i + 3) % 4] >> 16 & 255] ^ T7[t[(i + 2) % 4] >> 8 & 255] ^ T8[t[(i + 1) % 4] & 255] ^ this._Kd[r][i];\n          }\n          t = a.slice();\n        }\n        var result = createArray(16), tt;\n        for (var i = 0; i < 4; i++) {\n          tt = this._Kd[rounds][i];\n          result[4 * i] = (Si[t[i] >> 24 & 255] ^ tt >> 24) & 255;\n          result[4 * i + 1] = (Si[t[(i + 3) % 4] >> 16 & 255] ^ tt >> 16) & 255;\n          result[4 * i + 2] = (Si[t[(i + 2) % 4] >> 8 & 255] ^ tt >> 8) & 255;\n          result[4 * i + 3] = (Si[t[(i + 1) % 4] & 255] ^ tt) & 255;\n        }\n        return result;\n      };\n      var ModeOfOperationECB = function(key) {\n        if (!(this instanceof ModeOfOperationECB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Electronic Code Block\";\n        this.name = \"ecb\";\n        this._aes = new AES(key);\n      };\n      ModeOfOperationECB.prototype.encrypt = function(plaintext) {\n        plaintext = coerceArray(plaintext);\n        if (plaintext.length % 16 !== 0) {\n          throw new Error(\"invalid plaintext size (must be multiple of 16 bytes)\");\n        }\n        var ciphertext = createArray(plaintext.length);\n        var block = createArray(16);\n        for (var i = 0; i < plaintext.length; i += 16) {\n          copyArray(plaintext, block, 0, i, i + 16);\n          block = this._aes.encrypt(block);\n          copyArray(block, ciphertext, i);\n        }\n        return ciphertext;\n      };\n      ModeOfOperationECB.prototype.decrypt = function(ciphertext) {\n        ciphertext = coerceArray(ciphertext);\n        if (ciphertext.length % 16 !== 0) {\n          throw new Error(\"invalid ciphertext size (must be multiple of 16 bytes)\");\n        }\n        var plaintext = createArray(ciphertext.length);\n        var block = createArray(16);\n        for (var i = 0; i < ciphertext.length; i += 16) {\n          copyArray(ciphertext, block, 0, i, i + 16);\n          block = this._aes.decrypt(block);\n          copyArray(block, plaintext, i);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationCBC = function(key, iv) {\n        if (!(this instanceof ModeOfOperationCBC)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Cipher Block Chaining\";\n        this.name = \"cbc\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 bytes)\");\n        }\n        this._lastCipherblock = coerceArray(iv, true);\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCBC.prototype.encrypt = function(plaintext) {\n        plaintext = coerceArray(plaintext);\n        if (plaintext.length % 16 !== 0) {\n          throw new Error(\"invalid plaintext size (must be multiple of 16 bytes)\");\n        }\n        var ciphertext = createArray(plaintext.length);\n        var block = createArray(16);\n        for (var i = 0; i < plaintext.length; i += 16) {\n          copyArray(plaintext, block, 0, i, i + 16);\n          for (var j = 0; j < 16; j++) {\n            block[j] ^= this._lastCipherblock[j];\n          }\n          this._lastCipherblock = this._aes.encrypt(block);\n          copyArray(this._lastCipherblock, ciphertext, i);\n        }\n        return ciphertext;\n      };\n      ModeOfOperationCBC.prototype.decrypt = function(ciphertext) {\n        ciphertext = coerceArray(ciphertext);\n        if (ciphertext.length % 16 !== 0) {\n          throw new Error(\"invalid ciphertext size (must be multiple of 16 bytes)\");\n        }\n        var plaintext = createArray(ciphertext.length);\n        var block = createArray(16);\n        for (var i = 0; i < ciphertext.length; i += 16) {\n          copyArray(ciphertext, block, 0, i, i + 16);\n          block = this._aes.decrypt(block);\n          for (var j = 0; j < 16; j++) {\n            plaintext[i + j] = block[j] ^ this._lastCipherblock[j];\n          }\n          copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationCFB = function(key, iv, segmentSize) {\n        if (!(this instanceof ModeOfOperationCFB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Cipher Feedback\";\n        this.name = \"cfb\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 size)\");\n        }\n        if (!segmentSize) {\n          segmentSize = 1;\n        }\n        this.segmentSize = segmentSize;\n        this._shiftRegister = coerceArray(iv, true);\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCFB.prototype.encrypt = function(plaintext) {\n        if (plaintext.length % this.segmentSize != 0) {\n          throw new Error(\"invalid plaintext size (must be segmentSize bytes)\");\n        }\n        var encrypted = coerceArray(plaintext, true);\n        var xorSegment;\n        for (var i = 0; i < encrypted.length; i += this.segmentSize) {\n          xorSegment = this._aes.encrypt(this._shiftRegister);\n          for (var j = 0; j < this.segmentSize; j++) {\n            encrypted[i + j] ^= xorSegment[j];\n          }\n          copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n          copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n        }\n        return encrypted;\n      };\n      ModeOfOperationCFB.prototype.decrypt = function(ciphertext) {\n        if (ciphertext.length % this.segmentSize != 0) {\n          throw new Error(\"invalid ciphertext size (must be segmentSize bytes)\");\n        }\n        var plaintext = coerceArray(ciphertext, true);\n        var xorSegment;\n        for (var i = 0; i < plaintext.length; i += this.segmentSize) {\n          xorSegment = this._aes.encrypt(this._shiftRegister);\n          for (var j = 0; j < this.segmentSize; j++) {\n            plaintext[i + j] ^= xorSegment[j];\n          }\n          copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);\n          copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);\n        }\n        return plaintext;\n      };\n      var ModeOfOperationOFB = function(key, iv) {\n        if (!(this instanceof ModeOfOperationOFB)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Output Feedback\";\n        this.name = \"ofb\";\n        if (!iv) {\n          iv = createArray(16);\n        } else if (iv.length != 16) {\n          throw new Error(\"invalid initialation vector size (must be 16 bytes)\");\n        }\n        this._lastPrecipher = coerceArray(iv, true);\n        this._lastPrecipherIndex = 16;\n        this._aes = new AES(key);\n      };\n      ModeOfOperationOFB.prototype.encrypt = function(plaintext) {\n        var encrypted = coerceArray(plaintext, true);\n        for (var i = 0; i < encrypted.length; i++) {\n          if (this._lastPrecipherIndex === 16) {\n            this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);\n            this._lastPrecipherIndex = 0;\n          }\n          encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];\n        }\n        return encrypted;\n      };\n      ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;\n      var Counter = function(initialValue) {\n        if (!(this instanceof Counter)) {\n          throw Error(\"Counter must be instanitated with `new`\");\n        }\n        if (initialValue !== 0 && !initialValue) {\n          initialValue = 1;\n        }\n        if (typeof initialValue === \"number\") {\n          this._counter = createArray(16);\n          this.setValue(initialValue);\n        } else {\n          this.setBytes(initialValue);\n        }\n      };\n      Counter.prototype.setValue = function(value) {\n        if (typeof value !== \"number\" || parseInt(value) != value) {\n          throw new Error(\"invalid counter value (must be an integer)\");\n        }\n        for (var index = 15; index >= 0; --index) {\n          this._counter[index] = value % 256;\n          value = value >> 8;\n        }\n      };\n      Counter.prototype.setBytes = function(bytes) {\n        bytes = coerceArray(bytes, true);\n        if (bytes.length != 16) {\n          throw new Error(\"invalid counter bytes size (must be 16 bytes)\");\n        }\n        this._counter = bytes;\n      };\n      Counter.prototype.increment = function() {\n        for (var i = 15; i >= 0; i--) {\n          if (this._counter[i] === 255) {\n            this._counter[i] = 0;\n          } else {\n            this._counter[i]++;\n            break;\n          }\n        }\n      };\n      var ModeOfOperationCTR = function(key, counter) {\n        if (!(this instanceof ModeOfOperationCTR)) {\n          throw Error(\"AES must be instanitated with `new`\");\n        }\n        this.description = \"Counter\";\n        this.name = \"ctr\";\n        if (!(counter instanceof Counter)) {\n          counter = new Counter(counter);\n        }\n        this._counter = counter;\n        this._remainingCounter = null;\n        this._remainingCounterIndex = 16;\n        this._aes = new AES(key);\n      };\n      ModeOfOperationCTR.prototype.encrypt = function(plaintext) {\n        var encrypted = coerceArray(plaintext, true);\n        for (var i = 0; i < encrypted.length; i++) {\n          if (this._remainingCounterIndex === 16) {\n            this._remainingCounter = this._aes.encrypt(this._counter._counter);\n            this._remainingCounterIndex = 0;\n            this._counter.increment();\n          }\n          encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\n        }\n        return encrypted;\n      };\n      ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;\n      function pkcs7pad(data) {\n        data = coerceArray(data, true);\n        var padder = 16 - data.length % 16;\n        var result = createArray(data.length + padder);\n        copyArray(data, result);\n        for (var i = data.length; i < result.length; i++) {\n          result[i] = padder;\n        }\n        return result;\n      }\n      function pkcs7strip(data) {\n        data = coerceArray(data, true);\n        if (data.length < 16) {\n          throw new Error(\"PKCS#7 invalid length\");\n        }\n        var padder = data[data.length - 1];\n        if (padder > 16) {\n          throw new Error(\"PKCS#7 padding byte out of range\");\n        }\n        var length = data.length - padder;\n        for (var i = 0; i < padder; i++) {\n          if (data[length + i] !== padder) {\n            throw new Error(\"PKCS#7 invalid padding byte\");\n          }\n        }\n        var result = createArray(length);\n        copyArray(data, result, 0, 0, length);\n        return result;\n      }\n      var aesjs = {\n        AES,\n        Counter,\n        ModeOfOperation: {\n          ecb: ModeOfOperationECB,\n          cbc: ModeOfOperationCBC,\n          cfb: ModeOfOperationCFB,\n          ofb: ModeOfOperationOFB,\n          ctr: ModeOfOperationCTR\n        },\n        utils: {\n          hex: convertHex,\n          utf8: convertUtf8\n        },\n        padding: {\n          pkcs7: {\n            pad: pkcs7pad,\n            strip: pkcs7strip\n          }\n        },\n        _arrayTest: {\n          coerceArray,\n          createArray,\n          copyArray\n        }\n      };\n      if (typeof exports2 !== \"undefined\") {\n        module2.exports = aesjs;\n      } else if (typeof define === \"function\" && define.amd) {\n        define(aesjs);\n      } else {\n        if (root.aesjs) {\n          aesjs._aesjs = root.aesjs;\n        }\n        root.aesjs = aesjs;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/_version.js\nvar require_version18 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"json-wallets/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/utils.js\nvar require_utils4 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/utils.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.uuidV4 = exports2.searchPath = exports2.getPassword = exports2.zpad = exports2.looseArrayify = void 0;\n    var bytes_1 = require_lib2();\n    var strings_1 = require_lib9();\n    function looseArrayify(hexString) {\n      if (typeof hexString === \"string\" && hexString.substring(0, 2) !== \"0x\") {\n        hexString = \"0x\" + hexString;\n      }\n      return (0, bytes_1.arrayify)(hexString);\n    }\n    exports2.looseArrayify = looseArrayify;\n    function zpad(value, length) {\n      value = String(value);\n      while (value.length < length) {\n        value = \"0\" + value;\n      }\n      return value;\n    }\n    exports2.zpad = zpad;\n    function getPassword(password) {\n      if (typeof password === \"string\") {\n        return (0, strings_1.toUtf8Bytes)(password, strings_1.UnicodeNormalizationForm.NFKC);\n      }\n      return (0, bytes_1.arrayify)(password);\n    }\n    exports2.getPassword = getPassword;\n    function searchPath(object, path) {\n      var currentChild = object;\n      var comps = path.toLowerCase().split(\"/\");\n      for (var i = 0; i < comps.length; i++) {\n        var matchingChild = null;\n        for (var key in currentChild) {\n          if (key.toLowerCase() === comps[i]) {\n            matchingChild = currentChild[key];\n            break;\n          }\n        }\n        if (matchingChild === null) {\n          return null;\n        }\n        currentChild = matchingChild;\n      }\n      return currentChild;\n    }\n    exports2.searchPath = searchPath;\n    function uuidV4(randomBytes) {\n      var bytes = (0, bytes_1.arrayify)(randomBytes);\n      bytes[6] = bytes[6] & 15 | 64;\n      bytes[8] = bytes[8] & 63 | 128;\n      var value = (0, bytes_1.hexlify)(bytes);\n      return [\n        value.substring(2, 10),\n        value.substring(10, 14),\n        value.substring(14, 18),\n        value.substring(18, 22),\n        value.substring(22, 34)\n      ].join(\"-\");\n    }\n    exports2.uuidV4 = uuidV4;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/crowdsale.js\nvar require_crowdsale = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/crowdsale.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decrypt = exports2.CrowdsaleAccount = void 0;\n    var aes_js_1 = __importDefault(require_aes_js());\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var pbkdf2_1 = require_lib18();\n    var strings_1 = require_lib9();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version18();\n    var logger = new logger_1.Logger(_version_1.version);\n    var utils_1 = require_utils4();\n    var CrowdsaleAccount = (\n      /** @class */\n      function(_super) {\n        __extends(CrowdsaleAccount2, _super);\n        function CrowdsaleAccount2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        CrowdsaleAccount2.prototype.isCrowdsaleAccount = function(value) {\n          return !!(value && value._isCrowdsaleAccount);\n        };\n        return CrowdsaleAccount2;\n      }(properties_1.Description)\n    );\n    exports2.CrowdsaleAccount = CrowdsaleAccount;\n    function decrypt(json, password) {\n      var data = JSON.parse(json);\n      password = (0, utils_1.getPassword)(password);\n      var ethaddr = (0, address_1.getAddress)((0, utils_1.searchPath)(data, \"ethaddr\"));\n      var encseed = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"encseed\"));\n      if (!encseed || encseed.length % 16 !== 0) {\n        logger.throwArgumentError(\"invalid encseed\", \"json\", json);\n      }\n      var key = (0, bytes_1.arrayify)((0, pbkdf2_1.pbkdf2)(password, password, 2e3, 32, \"sha256\")).slice(0, 16);\n      var iv = encseed.slice(0, 16);\n      var encryptedSeed = encseed.slice(16);\n      var aesCbc = new aes_js_1.default.ModeOfOperation.cbc(key, iv);\n      var seed = aes_js_1.default.padding.pkcs7.strip((0, bytes_1.arrayify)(aesCbc.decrypt(encryptedSeed)));\n      var seedHex = \"\";\n      for (var i = 0; i < seed.length; i++) {\n        seedHex += String.fromCharCode(seed[i]);\n      }\n      var seedHexBytes = (0, strings_1.toUtf8Bytes)(seedHex);\n      var privateKey = (0, keccak256_1.keccak256)(seedHexBytes);\n      return new CrowdsaleAccount({\n        _isCrowdsaleAccount: true,\n        address: ethaddr,\n        privateKey\n      });\n    }\n    exports2.decrypt = decrypt;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/inspect.js\nvar require_inspect = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/inspect.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getJsonWalletAddress = exports2.isKeystoreWallet = exports2.isCrowdsaleWallet = void 0;\n    var address_1 = require_lib7();\n    function isCrowdsaleWallet(json) {\n      var data = null;\n      try {\n        data = JSON.parse(json);\n      } catch (error) {\n        return false;\n      }\n      return data.encseed && data.ethaddr;\n    }\n    exports2.isCrowdsaleWallet = isCrowdsaleWallet;\n    function isKeystoreWallet(json) {\n      var data = null;\n      try {\n        data = JSON.parse(json);\n      } catch (error) {\n        return false;\n      }\n      if (!data.version || parseInt(data.version) !== data.version || parseInt(data.version) !== 3) {\n        return false;\n      }\n      return true;\n    }\n    exports2.isKeystoreWallet = isKeystoreWallet;\n    function getJsonWalletAddress(json) {\n      if (isCrowdsaleWallet(json)) {\n        try {\n          return (0, address_1.getAddress)(JSON.parse(json).ethaddr);\n        } catch (error) {\n          return null;\n        }\n      }\n      if (isKeystoreWallet(json)) {\n        try {\n          return (0, address_1.getAddress)(JSON.parse(json).address);\n        } catch (error) {\n          return null;\n        }\n      }\n      return null;\n    }\n    exports2.getJsonWalletAddress = getJsonWalletAddress;\n  }\n});\n\n// node_modules/scrypt-js/scrypt.js\nvar require_scrypt = __commonJS({\n  \"node_modules/scrypt-js/scrypt.js\"(exports2, module2) {\n    \"use strict\";\n    (function(root) {\n      const MAX_VALUE = 2147483647;\n      function SHA256(m) {\n        const K = new Uint32Array([\n          1116352408,\n          1899447441,\n          3049323471,\n          3921009573,\n          961987163,\n          1508970993,\n          2453635748,\n          2870763221,\n          3624381080,\n          310598401,\n          607225278,\n          1426881987,\n          1925078388,\n          2162078206,\n          2614888103,\n          3248222580,\n          3835390401,\n          4022224774,\n          264347078,\n          604807628,\n          770255983,\n          1249150122,\n          1555081692,\n          1996064986,\n          2554220882,\n          2821834349,\n          2952996808,\n          3210313671,\n          3336571891,\n          3584528711,\n          113926993,\n          338241895,\n          666307205,\n          773529912,\n          1294757372,\n          1396182291,\n          1695183700,\n          1986661051,\n          2177026350,\n          2456956037,\n          2730485921,\n          2820302411,\n          3259730800,\n          3345764771,\n          3516065817,\n          3600352804,\n          4094571909,\n          275423344,\n          430227734,\n          506948616,\n          659060556,\n          883997877,\n          958139571,\n          1322822218,\n          1537002063,\n          1747873779,\n          1955562222,\n          2024104815,\n          2227730452,\n          2361852424,\n          2428436474,\n          2756734187,\n          3204031479,\n          3329325298\n        ]);\n        let h0 = 1779033703, h1 = 3144134277, h2 = 1013904242, h3 = 2773480762;\n        let h4 = 1359893119, h5 = 2600822924, h6 = 528734635, h7 = 1541459225;\n        const w = new Uint32Array(64);\n        function blocks(p2) {\n          let off = 0, len = p2.length;\n          while (len >= 64) {\n            let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, u, i2, j, t1, t2;\n            for (i2 = 0; i2 < 16; i2++) {\n              j = off + i2 * 4;\n              w[i2] = (p2[j] & 255) << 24 | (p2[j + 1] & 255) << 16 | (p2[j + 2] & 255) << 8 | p2[j + 3] & 255;\n            }\n            for (i2 = 16; i2 < 64; i2++) {\n              u = w[i2 - 2];\n              t1 = (u >>> 17 | u << 32 - 17) ^ (u >>> 19 | u << 32 - 19) ^ u >>> 10;\n              u = w[i2 - 15];\n              t2 = (u >>> 7 | u << 32 - 7) ^ (u >>> 18 | u << 32 - 18) ^ u >>> 3;\n              w[i2] = (t1 + w[i2 - 7] | 0) + (t2 + w[i2 - 16] | 0) | 0;\n            }\n            for (i2 = 0; i2 < 64; i2++) {\n              t1 = (((e >>> 6 | e << 32 - 6) ^ (e >>> 11 | e << 32 - 11) ^ (e >>> 25 | e << 32 - 25)) + (e & f ^ ~e & g) | 0) + (h + (K[i2] + w[i2] | 0) | 0) | 0;\n              t2 = ((a >>> 2 | a << 32 - 2) ^ (a >>> 13 | a << 32 - 13) ^ (a >>> 22 | a << 32 - 22)) + (a & b ^ a & c ^ b & c) | 0;\n              h = g;\n              g = f;\n              f = e;\n              e = d + t1 | 0;\n              d = c;\n              c = b;\n              b = a;\n              a = t1 + t2 | 0;\n            }\n            h0 = h0 + a | 0;\n            h1 = h1 + b | 0;\n            h2 = h2 + c | 0;\n            h3 = h3 + d | 0;\n            h4 = h4 + e | 0;\n            h5 = h5 + f | 0;\n            h6 = h6 + g | 0;\n            h7 = h7 + h | 0;\n            off += 64;\n            len -= 64;\n          }\n        }\n        blocks(m);\n        let i, bytesLeft = m.length % 64, bitLenHi = m.length / 536870912 | 0, bitLenLo = m.length << 3, numZeros = bytesLeft < 56 ? 56 : 120, p = m.slice(m.length - bytesLeft, m.length);\n        p.push(128);\n        for (i = bytesLeft + 1; i < numZeros; i++) {\n          p.push(0);\n        }\n        p.push(bitLenHi >>> 24 & 255);\n        p.push(bitLenHi >>> 16 & 255);\n        p.push(bitLenHi >>> 8 & 255);\n        p.push(bitLenHi >>> 0 & 255);\n        p.push(bitLenLo >>> 24 & 255);\n        p.push(bitLenLo >>> 16 & 255);\n        p.push(bitLenLo >>> 8 & 255);\n        p.push(bitLenLo >>> 0 & 255);\n        blocks(p);\n        return [\n          h0 >>> 24 & 255,\n          h0 >>> 16 & 255,\n          h0 >>> 8 & 255,\n          h0 >>> 0 & 255,\n          h1 >>> 24 & 255,\n          h1 >>> 16 & 255,\n          h1 >>> 8 & 255,\n          h1 >>> 0 & 255,\n          h2 >>> 24 & 255,\n          h2 >>> 16 & 255,\n          h2 >>> 8 & 255,\n          h2 >>> 0 & 255,\n          h3 >>> 24 & 255,\n          h3 >>> 16 & 255,\n          h3 >>> 8 & 255,\n          h3 >>> 0 & 255,\n          h4 >>> 24 & 255,\n          h4 >>> 16 & 255,\n          h4 >>> 8 & 255,\n          h4 >>> 0 & 255,\n          h5 >>> 24 & 255,\n          h5 >>> 16 & 255,\n          h5 >>> 8 & 255,\n          h5 >>> 0 & 255,\n          h6 >>> 24 & 255,\n          h6 >>> 16 & 255,\n          h6 >>> 8 & 255,\n          h6 >>> 0 & 255,\n          h7 >>> 24 & 255,\n          h7 >>> 16 & 255,\n          h7 >>> 8 & 255,\n          h7 >>> 0 & 255\n        ];\n      }\n      function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) {\n        password = password.length <= 64 ? password : SHA256(password);\n        const innerLen = 64 + salt.length + 4;\n        const inner = new Array(innerLen);\n        const outerKey = new Array(64);\n        let i;\n        let dk = [];\n        for (i = 0; i < 64; i++) {\n          inner[i] = 54;\n        }\n        for (i = 0; i < password.length; i++) {\n          inner[i] ^= password[i];\n        }\n        for (i = 0; i < salt.length; i++) {\n          inner[64 + i] = salt[i];\n        }\n        for (i = innerLen - 4; i < innerLen; i++) {\n          inner[i] = 0;\n        }\n        for (i = 0; i < 64; i++) outerKey[i] = 92;\n        for (i = 0; i < password.length; i++) outerKey[i] ^= password[i];\n        function incrementCounter() {\n          for (let i2 = innerLen - 1; i2 >= innerLen - 4; i2--) {\n            inner[i2]++;\n            if (inner[i2] <= 255) return;\n            inner[i2] = 0;\n          }\n        }\n        while (dkLen >= 32) {\n          incrementCounter();\n          dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))));\n          dkLen -= 32;\n        }\n        if (dkLen > 0) {\n          incrementCounter();\n          dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen));\n        }\n        return dk;\n      }\n      function blockmix_salsa8(BY, Yi, r, x, _X) {\n        let i;\n        arraycopy(BY, (2 * r - 1) * 16, _X, 0, 16);\n        for (i = 0; i < 2 * r; i++) {\n          blockxor(BY, i * 16, _X, 16);\n          salsa20_8(_X, x);\n          arraycopy(_X, 0, BY, Yi + i * 16, 16);\n        }\n        for (i = 0; i < r; i++) {\n          arraycopy(BY, Yi + i * 2 * 16, BY, i * 16, 16);\n        }\n        for (i = 0; i < r; i++) {\n          arraycopy(BY, Yi + (i * 2 + 1) * 16, BY, (i + r) * 16, 16);\n        }\n      }\n      function R(a, b) {\n        return a << b | a >>> 32 - b;\n      }\n      function salsa20_8(B, x) {\n        arraycopy(B, 0, x, 0, 16);\n        for (let i = 8; i > 0; i -= 2) {\n          x[4] ^= R(x[0] + x[12], 7);\n          x[8] ^= R(x[4] + x[0], 9);\n          x[12] ^= R(x[8] + x[4], 13);\n          x[0] ^= R(x[12] + x[8], 18);\n          x[9] ^= R(x[5] + x[1], 7);\n          x[13] ^= R(x[9] + x[5], 9);\n          x[1] ^= R(x[13] + x[9], 13);\n          x[5] ^= R(x[1] + x[13], 18);\n          x[14] ^= R(x[10] + x[6], 7);\n          x[2] ^= R(x[14] + x[10], 9);\n          x[6] ^= R(x[2] + x[14], 13);\n          x[10] ^= R(x[6] + x[2], 18);\n          x[3] ^= R(x[15] + x[11], 7);\n          x[7] ^= R(x[3] + x[15], 9);\n          x[11] ^= R(x[7] + x[3], 13);\n          x[15] ^= R(x[11] + x[7], 18);\n          x[1] ^= R(x[0] + x[3], 7);\n          x[2] ^= R(x[1] + x[0], 9);\n          x[3] ^= R(x[2] + x[1], 13);\n          x[0] ^= R(x[3] + x[2], 18);\n          x[6] ^= R(x[5] + x[4], 7);\n          x[7] ^= R(x[6] + x[5], 9);\n          x[4] ^= R(x[7] + x[6], 13);\n          x[5] ^= R(x[4] + x[7], 18);\n          x[11] ^= R(x[10] + x[9], 7);\n          x[8] ^= R(x[11] + x[10], 9);\n          x[9] ^= R(x[8] + x[11], 13);\n          x[10] ^= R(x[9] + x[8], 18);\n          x[12] ^= R(x[15] + x[14], 7);\n          x[13] ^= R(x[12] + x[15], 9);\n          x[14] ^= R(x[13] + x[12], 13);\n          x[15] ^= R(x[14] + x[13], 18);\n        }\n        for (let i = 0; i < 16; ++i) {\n          B[i] += x[i];\n        }\n      }\n      function blockxor(S, Si, D, len) {\n        for (let i = 0; i < len; i++) {\n          D[i] ^= S[Si + i];\n        }\n      }\n      function arraycopy(src, srcPos, dest, destPos, length) {\n        while (length--) {\n          dest[destPos++] = src[srcPos++];\n        }\n      }\n      function checkBufferish(o) {\n        if (!o || typeof o.length !== \"number\") {\n          return false;\n        }\n        for (let i = 0; i < o.length; i++) {\n          const v = o[i];\n          if (typeof v !== \"number\" || v % 1 || v < 0 || v >= 256) {\n            return false;\n          }\n        }\n        return true;\n      }\n      function ensureInteger(value, name2) {\n        if (typeof value !== \"number\" || value % 1) {\n          throw new Error(\"invalid \" + name2);\n        }\n        return value;\n      }\n      function _scrypt(password, salt, N, r, p, dkLen, callback) {\n        N = ensureInteger(N, \"N\");\n        r = ensureInteger(r, \"r\");\n        p = ensureInteger(p, \"p\");\n        dkLen = ensureInteger(dkLen, \"dkLen\");\n        if (N === 0 || (N & N - 1) !== 0) {\n          throw new Error(\"N must be power of 2\");\n        }\n        if (N > MAX_VALUE / 128 / r) {\n          throw new Error(\"N too large\");\n        }\n        if (r > MAX_VALUE / 128 / p) {\n          throw new Error(\"r too large\");\n        }\n        if (!checkBufferish(password)) {\n          throw new Error(\"password must be an array or buffer\");\n        }\n        password = Array.prototype.slice.call(password);\n        if (!checkBufferish(salt)) {\n          throw new Error(\"salt must be an array or buffer\");\n        }\n        salt = Array.prototype.slice.call(salt);\n        let b = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r);\n        const B = new Uint32Array(p * 32 * r);\n        for (let i = 0; i < B.length; i++) {\n          const j = i * 4;\n          B[i] = (b[j + 3] & 255) << 24 | (b[j + 2] & 255) << 16 | (b[j + 1] & 255) << 8 | (b[j + 0] & 255) << 0;\n        }\n        const XY = new Uint32Array(64 * r);\n        const V = new Uint32Array(32 * r * N);\n        const Yi = 32 * r;\n        const x = new Uint32Array(16);\n        const _X = new Uint32Array(16);\n        const totalOps = p * N * 2;\n        let currentOp = 0;\n        let lastPercent10 = null;\n        let stop = false;\n        let state = 0;\n        let i0 = 0, i1;\n        let Bi;\n        const limit = callback ? parseInt(1e3 / r) : 4294967295;\n        const nextTick = typeof setImmediate !== \"undefined\" ? setImmediate : setTimeout;\n        const incrementalSMix = function() {\n          if (stop) {\n            return callback(new Error(\"cancelled\"), currentOp / totalOps);\n          }\n          let steps;\n          switch (state) {\n            case 0:\n              Bi = i0 * 32 * r;\n              arraycopy(B, Bi, XY, 0, Yi);\n              state = 1;\n              i1 = 0;\n            case 1:\n              steps = N - i1;\n              if (steps > limit) {\n                steps = limit;\n              }\n              for (let i = 0; i < steps; i++) {\n                arraycopy(XY, 0, V, (i1 + i) * Yi, Yi);\n                blockmix_salsa8(XY, Yi, r, x, _X);\n              }\n              i1 += steps;\n              currentOp += steps;\n              if (callback) {\n                const percent10 = parseInt(1e3 * currentOp / totalOps);\n                if (percent10 !== lastPercent10) {\n                  stop = callback(null, currentOp / totalOps);\n                  if (stop) {\n                    break;\n                  }\n                  lastPercent10 = percent10;\n                }\n              }\n              if (i1 < N) {\n                break;\n              }\n              i1 = 0;\n              state = 2;\n            case 2:\n              steps = N - i1;\n              if (steps > limit) {\n                steps = limit;\n              }\n              for (let i = 0; i < steps; i++) {\n                const offset = (2 * r - 1) * 16;\n                const j = XY[offset] & N - 1;\n                blockxor(V, j * Yi, XY, Yi);\n                blockmix_salsa8(XY, Yi, r, x, _X);\n              }\n              i1 += steps;\n              currentOp += steps;\n              if (callback) {\n                const percent10 = parseInt(1e3 * currentOp / totalOps);\n                if (percent10 !== lastPercent10) {\n                  stop = callback(null, currentOp / totalOps);\n                  if (stop) {\n                    break;\n                  }\n                  lastPercent10 = percent10;\n                }\n              }\n              if (i1 < N) {\n                break;\n              }\n              arraycopy(XY, 0, B, Bi, Yi);\n              i0++;\n              if (i0 < p) {\n                state = 0;\n                break;\n              }\n              b = [];\n              for (let i = 0; i < B.length; i++) {\n                b.push(B[i] >> 0 & 255);\n                b.push(B[i] >> 8 & 255);\n                b.push(B[i] >> 16 & 255);\n                b.push(B[i] >> 24 & 255);\n              }\n              const derivedKey = PBKDF2_HMAC_SHA256_OneIter(password, b, dkLen);\n              if (callback) {\n                callback(null, 1, derivedKey);\n              }\n              return derivedKey;\n          }\n          if (callback) {\n            nextTick(incrementalSMix);\n          }\n        };\n        if (!callback) {\n          while (true) {\n            const derivedKey = incrementalSMix();\n            if (derivedKey != void 0) {\n              return derivedKey;\n            }\n          }\n        }\n        incrementalSMix();\n      }\n      const lib = {\n        scrypt: function(password, salt, N, r, p, dkLen, progressCallback) {\n          return new Promise(function(resolve, reject) {\n            let lastProgress = 0;\n            if (progressCallback) {\n              progressCallback(0);\n            }\n            _scrypt(password, salt, N, r, p, dkLen, function(error, progress, key) {\n              if (error) {\n                reject(error);\n              } else if (key) {\n                if (progressCallback && lastProgress !== 1) {\n                  progressCallback(1);\n                }\n                resolve(new Uint8Array(key));\n              } else if (progressCallback && progress !== lastProgress) {\n                lastProgress = progress;\n                return progressCallback(progress);\n              }\n            });\n          });\n        },\n        syncScrypt: function(password, salt, N, r, p, dkLen) {\n          return new Uint8Array(_scrypt(password, salt, N, r, p, dkLen));\n        }\n      };\n      if (typeof exports2 !== \"undefined\") {\n        module2.exports = lib;\n      } else if (typeof define === \"function\" && define.amd) {\n        define(lib);\n      } else if (root) {\n        if (root.scrypt) {\n          root._scrypt = root.scrypt;\n        }\n        root.scrypt = lib;\n      }\n    })(exports2);\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/keystore.js\nvar require_keystore = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/keystore.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encrypt = exports2.decrypt = exports2.decryptSync = exports2.KeystoreAccount = void 0;\n    var aes_js_1 = __importDefault(require_aes_js());\n    var scrypt_js_1 = __importDefault(require_scrypt());\n    var address_1 = require_lib7();\n    var bytes_1 = require_lib2();\n    var hdnode_1 = require_lib21();\n    var keccak256_1 = require_lib5();\n    var pbkdf2_1 = require_lib18();\n    var random_1 = require_lib22();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var utils_1 = require_utils4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version18();\n    var logger = new logger_1.Logger(_version_1.version);\n    function hasMnemonic(value) {\n      return value != null && value.mnemonic && value.mnemonic.phrase;\n    }\n    var KeystoreAccount = (\n      /** @class */\n      function(_super) {\n        __extends(KeystoreAccount2, _super);\n        function KeystoreAccount2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        KeystoreAccount2.prototype.isKeystoreAccount = function(value) {\n          return !!(value && value._isKeystoreAccount);\n        };\n        return KeystoreAccount2;\n      }(properties_1.Description)\n    );\n    exports2.KeystoreAccount = KeystoreAccount;\n    function _decrypt(data, key, ciphertext) {\n      var cipher = (0, utils_1.searchPath)(data, \"crypto/cipher\");\n      if (cipher === \"aes-128-ctr\") {\n        var iv = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/cipherparams/iv\"));\n        var counter = new aes_js_1.default.Counter(iv);\n        var aesCtr = new aes_js_1.default.ModeOfOperation.ctr(key, counter);\n        return (0, bytes_1.arrayify)(aesCtr.decrypt(ciphertext));\n      }\n      return null;\n    }\n    function _getAccount(data, key) {\n      var ciphertext = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/ciphertext\"));\n      var computedMAC = (0, bytes_1.hexlify)((0, keccak256_1.keccak256)((0, bytes_1.concat)([key.slice(16, 32), ciphertext]))).substring(2);\n      if (computedMAC !== (0, utils_1.searchPath)(data, \"crypto/mac\").toLowerCase()) {\n        throw new Error(\"invalid password\");\n      }\n      var privateKey = _decrypt(data, key.slice(0, 16), ciphertext);\n      if (!privateKey) {\n        logger.throwError(\"unsupported cipher\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          operation: \"decrypt\"\n        });\n      }\n      var mnemonicKey = key.slice(32, 64);\n      var address = (0, transactions_1.computeAddress)(privateKey);\n      if (data.address) {\n        var check = data.address.toLowerCase();\n        if (check.substring(0, 2) !== \"0x\") {\n          check = \"0x\" + check;\n        }\n        if ((0, address_1.getAddress)(check) !== address) {\n          throw new Error(\"address mismatch\");\n        }\n      }\n      var account = {\n        _isKeystoreAccount: true,\n        address,\n        privateKey: (0, bytes_1.hexlify)(privateKey)\n      };\n      if ((0, utils_1.searchPath)(data, \"x-ethers/version\") === \"0.1\") {\n        var mnemonicCiphertext = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"x-ethers/mnemonicCiphertext\"));\n        var mnemonicIv = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"x-ethers/mnemonicCounter\"));\n        var mnemonicCounter = new aes_js_1.default.Counter(mnemonicIv);\n        var mnemonicAesCtr = new aes_js_1.default.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter);\n        var path = (0, utils_1.searchPath)(data, \"x-ethers/path\") || hdnode_1.defaultPath;\n        var locale = (0, utils_1.searchPath)(data, \"x-ethers/locale\") || \"en\";\n        var entropy = (0, bytes_1.arrayify)(mnemonicAesCtr.decrypt(mnemonicCiphertext));\n        try {\n          var mnemonic = (0, hdnode_1.entropyToMnemonic)(entropy, locale);\n          var node = hdnode_1.HDNode.fromMnemonic(mnemonic, null, locale).derivePath(path);\n          if (node.privateKey != account.privateKey) {\n            throw new Error(\"mnemonic mismatch\");\n          }\n          account.mnemonic = node.mnemonic;\n        } catch (error) {\n          if (error.code !== logger_1.Logger.errors.INVALID_ARGUMENT || error.argument !== \"wordlist\") {\n            throw error;\n          }\n        }\n      }\n      return new KeystoreAccount(account);\n    }\n    function pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc) {\n      return (0, bytes_1.arrayify)((0, pbkdf2_1.pbkdf2)(passwordBytes, salt, count, dkLen, prfFunc));\n    }\n    function pbkdf2(passwordBytes, salt, count, dkLen, prfFunc) {\n      return Promise.resolve(pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc));\n    }\n    function _computeKdfKey(data, password, pbkdf2Func, scryptFunc, progressCallback) {\n      var passwordBytes = (0, utils_1.getPassword)(password);\n      var kdf = (0, utils_1.searchPath)(data, \"crypto/kdf\");\n      if (kdf && typeof kdf === \"string\") {\n        var throwError = function(name2, value) {\n          return logger.throwArgumentError(\"invalid key-derivation function parameters\", name2, value);\n        };\n        if (kdf.toLowerCase() === \"scrypt\") {\n          var salt = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/kdfparams/salt\"));\n          var N = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/n\"));\n          var r = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/r\"));\n          var p = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/p\"));\n          if (!N || !r || !p) {\n            throwError(\"kdf\", kdf);\n          }\n          if ((N & N - 1) !== 0) {\n            throwError(\"N\", N);\n          }\n          var dkLen = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/dklen\"));\n          if (dkLen !== 32) {\n            throwError(\"dklen\", dkLen);\n          }\n          return scryptFunc(passwordBytes, salt, N, r, p, 64, progressCallback);\n        } else if (kdf.toLowerCase() === \"pbkdf2\") {\n          var salt = (0, utils_1.looseArrayify)((0, utils_1.searchPath)(data, \"crypto/kdfparams/salt\"));\n          var prfFunc = null;\n          var prf = (0, utils_1.searchPath)(data, \"crypto/kdfparams/prf\");\n          if (prf === \"hmac-sha256\") {\n            prfFunc = \"sha256\";\n          } else if (prf === \"hmac-sha512\") {\n            prfFunc = \"sha512\";\n          } else {\n            throwError(\"prf\", prf);\n          }\n          var count = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/c\"));\n          var dkLen = parseInt((0, utils_1.searchPath)(data, \"crypto/kdfparams/dklen\"));\n          if (dkLen !== 32) {\n            throwError(\"dklen\", dkLen);\n          }\n          return pbkdf2Func(passwordBytes, salt, count, dkLen, prfFunc);\n        }\n      }\n      return logger.throwArgumentError(\"unsupported key-derivation function\", \"kdf\", kdf);\n    }\n    function decryptSync(json, password) {\n      var data = JSON.parse(json);\n      var key = _computeKdfKey(data, password, pbkdf2Sync, scrypt_js_1.default.syncScrypt);\n      return _getAccount(data, key);\n    }\n    exports2.decryptSync = decryptSync;\n    function decrypt(json, password, progressCallback) {\n      return __awaiter(this, void 0, void 0, function() {\n        var data, key;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              data = JSON.parse(json);\n              return [4, _computeKdfKey(data, password, pbkdf2, scrypt_js_1.default.scrypt, progressCallback)];\n            case 1:\n              key = _a.sent();\n              return [2, _getAccount(data, key)];\n          }\n        });\n      });\n    }\n    exports2.decrypt = decrypt;\n    function encrypt(account, password, options, progressCallback) {\n      try {\n        if ((0, address_1.getAddress)(account.address) !== (0, transactions_1.computeAddress)(account.privateKey)) {\n          throw new Error(\"address/privateKey mismatch\");\n        }\n        if (hasMnemonic(account)) {\n          var mnemonic = account.mnemonic;\n          var node = hdnode_1.HDNode.fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path || hdnode_1.defaultPath);\n          if (node.privateKey != account.privateKey) {\n            throw new Error(\"mnemonic mismatch\");\n          }\n        }\n      } catch (e) {\n        return Promise.reject(e);\n      }\n      if (typeof options === \"function\" && !progressCallback) {\n        progressCallback = options;\n        options = {};\n      }\n      if (!options) {\n        options = {};\n      }\n      var privateKey = (0, bytes_1.arrayify)(account.privateKey);\n      var passwordBytes = (0, utils_1.getPassword)(password);\n      var entropy = null;\n      var path = null;\n      var locale = null;\n      if (hasMnemonic(account)) {\n        var srcMnemonic = account.mnemonic;\n        entropy = (0, bytes_1.arrayify)((0, hdnode_1.mnemonicToEntropy)(srcMnemonic.phrase, srcMnemonic.locale || \"en\"));\n        path = srcMnemonic.path || hdnode_1.defaultPath;\n        locale = srcMnemonic.locale || \"en\";\n      }\n      var client = options.client;\n      if (!client) {\n        client = \"ethers.js\";\n      }\n      var salt = null;\n      if (options.salt) {\n        salt = (0, bytes_1.arrayify)(options.salt);\n      } else {\n        salt = (0, random_1.randomBytes)(32);\n        ;\n      }\n      var iv = null;\n      if (options.iv) {\n        iv = (0, bytes_1.arrayify)(options.iv);\n        if (iv.length !== 16) {\n          throw new Error(\"invalid iv\");\n        }\n      } else {\n        iv = (0, random_1.randomBytes)(16);\n      }\n      var uuidRandom = null;\n      if (options.uuid) {\n        uuidRandom = (0, bytes_1.arrayify)(options.uuid);\n        if (uuidRandom.length !== 16) {\n          throw new Error(\"invalid uuid\");\n        }\n      } else {\n        uuidRandom = (0, random_1.randomBytes)(16);\n      }\n      var N = 1 << 17, r = 8, p = 1;\n      if (options.scrypt) {\n        if (options.scrypt.N) {\n          N = options.scrypt.N;\n        }\n        if (options.scrypt.r) {\n          r = options.scrypt.r;\n        }\n        if (options.scrypt.p) {\n          p = options.scrypt.p;\n        }\n      }\n      return scrypt_js_1.default.scrypt(passwordBytes, salt, N, r, p, 64, progressCallback).then(function(key) {\n        key = (0, bytes_1.arrayify)(key);\n        var derivedKey = key.slice(0, 16);\n        var macPrefix = key.slice(16, 32);\n        var mnemonicKey = key.slice(32, 64);\n        var counter = new aes_js_1.default.Counter(iv);\n        var aesCtr = new aes_js_1.default.ModeOfOperation.ctr(derivedKey, counter);\n        var ciphertext = (0, bytes_1.arrayify)(aesCtr.encrypt(privateKey));\n        var mac = (0, keccak256_1.keccak256)((0, bytes_1.concat)([macPrefix, ciphertext]));\n        var data = {\n          address: account.address.substring(2).toLowerCase(),\n          id: (0, utils_1.uuidV4)(uuidRandom),\n          version: 3,\n          Crypto: {\n            cipher: \"aes-128-ctr\",\n            cipherparams: {\n              iv: (0, bytes_1.hexlify)(iv).substring(2)\n            },\n            ciphertext: (0, bytes_1.hexlify)(ciphertext).substring(2),\n            kdf: \"scrypt\",\n            kdfparams: {\n              salt: (0, bytes_1.hexlify)(salt).substring(2),\n              n: N,\n              dklen: 32,\n              p,\n              r\n            },\n            mac: mac.substring(2)\n          }\n        };\n        if (entropy) {\n          var mnemonicIv = (0, random_1.randomBytes)(16);\n          var mnemonicCounter = new aes_js_1.default.Counter(mnemonicIv);\n          var mnemonicAesCtr = new aes_js_1.default.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter);\n          var mnemonicCiphertext = (0, bytes_1.arrayify)(mnemonicAesCtr.encrypt(entropy));\n          var now = /* @__PURE__ */ new Date();\n          var timestamp = now.getUTCFullYear() + \"-\" + (0, utils_1.zpad)(now.getUTCMonth() + 1, 2) + \"-\" + (0, utils_1.zpad)(now.getUTCDate(), 2) + \"T\" + (0, utils_1.zpad)(now.getUTCHours(), 2) + \"-\" + (0, utils_1.zpad)(now.getUTCMinutes(), 2) + \"-\" + (0, utils_1.zpad)(now.getUTCSeconds(), 2) + \".0Z\";\n          data[\"x-ethers\"] = {\n            client,\n            gethFilename: \"UTC--\" + timestamp + \"--\" + data.address,\n            mnemonicCounter: (0, bytes_1.hexlify)(mnemonicIv).substring(2),\n            mnemonicCiphertext: (0, bytes_1.hexlify)(mnemonicCiphertext).substring(2),\n            path,\n            locale,\n            version: \"0.1\"\n          };\n        }\n        return JSON.stringify(data);\n      });\n    }\n    exports2.encrypt = encrypt;\n  }\n});\n\n// node_modules/@ethersproject/json-wallets/lib/index.js\nvar require_lib23 = __commonJS({\n  \"node_modules/@ethersproject/json-wallets/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.decryptJsonWalletSync = exports2.decryptJsonWallet = exports2.getJsonWalletAddress = exports2.isKeystoreWallet = exports2.isCrowdsaleWallet = exports2.encryptKeystore = exports2.decryptKeystoreSync = exports2.decryptKeystore = exports2.decryptCrowdsale = void 0;\n    var crowdsale_1 = require_crowdsale();\n    Object.defineProperty(exports2, \"decryptCrowdsale\", { enumerable: true, get: function() {\n      return crowdsale_1.decrypt;\n    } });\n    var inspect_1 = require_inspect();\n    Object.defineProperty(exports2, \"getJsonWalletAddress\", { enumerable: true, get: function() {\n      return inspect_1.getJsonWalletAddress;\n    } });\n    Object.defineProperty(exports2, \"isCrowdsaleWallet\", { enumerable: true, get: function() {\n      return inspect_1.isCrowdsaleWallet;\n    } });\n    Object.defineProperty(exports2, \"isKeystoreWallet\", { enumerable: true, get: function() {\n      return inspect_1.isKeystoreWallet;\n    } });\n    var keystore_1 = require_keystore();\n    Object.defineProperty(exports2, \"decryptKeystore\", { enumerable: true, get: function() {\n      return keystore_1.decrypt;\n    } });\n    Object.defineProperty(exports2, \"decryptKeystoreSync\", { enumerable: true, get: function() {\n      return keystore_1.decryptSync;\n    } });\n    Object.defineProperty(exports2, \"encryptKeystore\", { enumerable: true, get: function() {\n      return keystore_1.encrypt;\n    } });\n    function decryptJsonWallet(json, password, progressCallback) {\n      if ((0, inspect_1.isCrowdsaleWallet)(json)) {\n        if (progressCallback) {\n          progressCallback(0);\n        }\n        var account = (0, crowdsale_1.decrypt)(json, password);\n        if (progressCallback) {\n          progressCallback(1);\n        }\n        return Promise.resolve(account);\n      }\n      if ((0, inspect_1.isKeystoreWallet)(json)) {\n        return (0, keystore_1.decrypt)(json, password, progressCallback);\n      }\n      return Promise.reject(new Error(\"invalid JSON wallet\"));\n    }\n    exports2.decryptJsonWallet = decryptJsonWallet;\n    function decryptJsonWalletSync(json, password) {\n      if ((0, inspect_1.isCrowdsaleWallet)(json)) {\n        return (0, crowdsale_1.decrypt)(json, password);\n      }\n      if ((0, inspect_1.isKeystoreWallet)(json)) {\n        return (0, keystore_1.decryptSync)(json, password);\n      }\n      throw new Error(\"invalid JSON wallet\");\n    }\n    exports2.decryptJsonWalletSync = decryptJsonWalletSync;\n  }\n});\n\n// node_modules/@ethersproject/wallet/lib/_version.js\nvar require_version19 = __commonJS({\n  \"node_modules/@ethersproject/wallet/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"wallet/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/wallet/lib/index.js\nvar require_lib24 = __commonJS({\n  \"node_modules/@ethersproject/wallet/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.verifyTypedData = exports2.verifyMessage = exports2.Wallet = void 0;\n    var address_1 = require_lib7();\n    var abstract_provider_1 = require_lib12();\n    var abstract_signer_1 = require_lib13();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var hdnode_1 = require_lib21();\n    var keccak256_1 = require_lib5();\n    var properties_1 = require_lib4();\n    var random_1 = require_lib22();\n    var signing_key_1 = require_lib14();\n    var json_wallets_1 = require_lib23();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version19();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isAccount(value) {\n      return value != null && (0, bytes_1.isHexString)(value.privateKey, 32) && value.address != null;\n    }\n    function hasMnemonic(value) {\n      var mnemonic = value.mnemonic;\n      return mnemonic && mnemonic.phrase;\n    }\n    var Wallet = (\n      /** @class */\n      function(_super) {\n        __extends(Wallet2, _super);\n        function Wallet2(privateKey, provider) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Wallet2);\n          _this = _super.call(this) || this;\n          if (isAccount(privateKey)) {\n            var signingKey_1 = new signing_key_1.SigningKey(privateKey.privateKey);\n            (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n              return signingKey_1;\n            });\n            (0, properties_1.defineReadOnly)(_this, \"address\", (0, transactions_1.computeAddress)(_this.publicKey));\n            if (_this.address !== (0, address_1.getAddress)(privateKey.address)) {\n              logger.throwArgumentError(\"privateKey/address mismatch\", \"privateKey\", \"[REDACTED]\");\n            }\n            if (hasMnemonic(privateKey)) {\n              var srcMnemonic_1 = privateKey.mnemonic;\n              (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n                return {\n                  phrase: srcMnemonic_1.phrase,\n                  path: srcMnemonic_1.path || hdnode_1.defaultPath,\n                  locale: srcMnemonic_1.locale || \"en\"\n                };\n              });\n              var mnemonic = _this.mnemonic;\n              var node = hdnode_1.HDNode.fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path);\n              if ((0, transactions_1.computeAddress)(node.privateKey) !== _this.address) {\n                logger.throwArgumentError(\"mnemonic/address mismatch\", \"privateKey\", \"[REDACTED]\");\n              }\n            } else {\n              (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n                return null;\n              });\n            }\n          } else {\n            if (signing_key_1.SigningKey.isSigningKey(privateKey)) {\n              if (privateKey.curve !== \"secp256k1\") {\n                logger.throwArgumentError(\"unsupported curve; must be secp256k1\", \"privateKey\", \"[REDACTED]\");\n              }\n              (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n                return privateKey;\n              });\n            } else {\n              if (typeof privateKey === \"string\") {\n                if (privateKey.match(/^[0-9a-f]*$/i) && privateKey.length === 64) {\n                  privateKey = \"0x\" + privateKey;\n                }\n              }\n              var signingKey_2 = new signing_key_1.SigningKey(privateKey);\n              (0, properties_1.defineReadOnly)(_this, \"_signingKey\", function() {\n                return signingKey_2;\n              });\n            }\n            (0, properties_1.defineReadOnly)(_this, \"_mnemonic\", function() {\n              return null;\n            });\n            (0, properties_1.defineReadOnly)(_this, \"address\", (0, transactions_1.computeAddress)(_this.publicKey));\n          }\n          if (provider && !abstract_provider_1.Provider.isProvider(provider)) {\n            logger.throwArgumentError(\"invalid provider\", \"provider\", provider);\n          }\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider || null);\n          return _this;\n        }\n        Object.defineProperty(Wallet2.prototype, \"mnemonic\", {\n          get: function() {\n            return this._mnemonic();\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Wallet2.prototype, \"privateKey\", {\n          get: function() {\n            return this._signingKey().privateKey;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Wallet2.prototype, \"publicKey\", {\n          get: function() {\n            return this._signingKey().publicKey;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Wallet2.prototype.getAddress = function() {\n          return Promise.resolve(this.address);\n        };\n        Wallet2.prototype.connect = function(provider) {\n          return new Wallet2(this, provider);\n        };\n        Wallet2.prototype.signTransaction = function(transaction) {\n          var _this = this;\n          return (0, properties_1.resolveProperties)(transaction).then(function(tx) {\n            if (tx.from != null) {\n              if ((0, address_1.getAddress)(tx.from) !== _this.address) {\n                logger.throwArgumentError(\"transaction from address mismatch\", \"transaction.from\", transaction.from);\n              }\n              delete tx.from;\n            }\n            var signature = _this._signingKey().signDigest((0, keccak256_1.keccak256)((0, transactions_1.serialize)(tx)));\n            return (0, transactions_1.serialize)(tx, signature);\n          });\n        };\n        Wallet2.prototype.signMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, (0, bytes_1.joinSignature)(this._signingKey().signDigest((0, hash_1.hashMessage)(message)))];\n            });\n          });\n        };\n        Wallet2.prototype._signTypedData = function(domain, types, value) {\n          return __awaiter(this, void 0, void 0, function() {\n            var populated;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, hash_1._TypedDataEncoder.resolveNames(domain, types, value, function(name2) {\n                    if (_this.provider == null) {\n                      logger.throwError(\"cannot resolve ENS names without a provider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                        operation: \"resolveName\",\n                        value: name2\n                      });\n                    }\n                    return _this.provider.resolveName(name2);\n                  })];\n                case 1:\n                  populated = _a.sent();\n                  return [2, (0, bytes_1.joinSignature)(this._signingKey().signDigest(hash_1._TypedDataEncoder.hash(populated.domain, types, populated.value)))];\n              }\n            });\n          });\n        };\n        Wallet2.prototype.encrypt = function(password, options, progressCallback) {\n          if (typeof options === \"function\" && !progressCallback) {\n            progressCallback = options;\n            options = {};\n          }\n          if (progressCallback && typeof progressCallback !== \"function\") {\n            throw new Error(\"invalid callback\");\n          }\n          if (!options) {\n            options = {};\n          }\n          return (0, json_wallets_1.encryptKeystore)(this, password, options, progressCallback);\n        };\n        Wallet2.createRandom = function(options) {\n          var entropy = (0, random_1.randomBytes)(16);\n          if (!options) {\n            options = {};\n          }\n          if (options.extraEntropy) {\n            entropy = (0, bytes_1.arrayify)((0, bytes_1.hexDataSlice)((0, keccak256_1.keccak256)((0, bytes_1.concat)([entropy, options.extraEntropy])), 0, 16));\n          }\n          var mnemonic = (0, hdnode_1.entropyToMnemonic)(entropy, options.locale);\n          return Wallet2.fromMnemonic(mnemonic, options.path, options.locale);\n        };\n        Wallet2.fromEncryptedJson = function(json, password, progressCallback) {\n          return (0, json_wallets_1.decryptJsonWallet)(json, password, progressCallback).then(function(account) {\n            return new Wallet2(account);\n          });\n        };\n        Wallet2.fromEncryptedJsonSync = function(json, password) {\n          return new Wallet2((0, json_wallets_1.decryptJsonWalletSync)(json, password));\n        };\n        Wallet2.fromMnemonic = function(mnemonic, path, wordlist) {\n          if (!path) {\n            path = hdnode_1.defaultPath;\n          }\n          return new Wallet2(hdnode_1.HDNode.fromMnemonic(mnemonic, null, wordlist).derivePath(path));\n        };\n        return Wallet2;\n      }(abstract_signer_1.Signer)\n    );\n    exports2.Wallet = Wallet;\n    function verifyMessage(message, signature) {\n      return (0, transactions_1.recoverAddress)((0, hash_1.hashMessage)(message), signature);\n    }\n    exports2.verifyMessage = verifyMessage;\n    function verifyTypedData(domain, types, value, signature) {\n      return (0, transactions_1.recoverAddress)(hash_1._TypedDataEncoder.hash(domain, types, value), signature);\n    }\n    exports2.verifyTypedData = verifyTypedData;\n  }\n});\n\n// node_modules/@ethersproject/networks/lib/_version.js\nvar require_version20 = __commonJS({\n  \"node_modules/@ethersproject/networks/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"networks/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/networks/lib/index.js\nvar require_lib25 = __commonJS({\n  \"node_modules/@ethersproject/networks/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getNetwork = void 0;\n    var logger_1 = require_lib();\n    var _version_1 = require_version20();\n    var logger = new logger_1.Logger(_version_1.version);\n    function isRenetworkable(value) {\n      return value && typeof value.renetwork === \"function\";\n    }\n    function ethDefaultProvider(network) {\n      var func = function(providers, options) {\n        if (options == null) {\n          options = {};\n        }\n        var providerList = [];\n        if (providers.InfuraProvider) {\n          try {\n            providerList.push(new providers.InfuraProvider(network, options.infura));\n          } catch (error) {\n          }\n        }\n        if (providers.EtherscanProvider) {\n          try {\n            providerList.push(new providers.EtherscanProvider(network, options.etherscan));\n          } catch (error) {\n          }\n        }\n        if (providers.AlchemyProvider) {\n          try {\n            providerList.push(new providers.AlchemyProvider(network, options.alchemy));\n          } catch (error) {\n          }\n        }\n        if (providers.PocketProvider) {\n          var skip = [\"goerli\", \"ropsten\", \"rinkeby\"];\n          try {\n            var provider = new providers.PocketProvider(network);\n            if (provider.network && skip.indexOf(provider.network.name) === -1) {\n              providerList.push(provider);\n            }\n          } catch (error) {\n          }\n        }\n        if (providers.CloudflareProvider) {\n          try {\n            providerList.push(new providers.CloudflareProvider(network));\n          } catch (error) {\n          }\n        }\n        if (providerList.length === 0) {\n          return null;\n        }\n        if (providers.FallbackProvider) {\n          var quorum = 1;\n          if (options.quorum != null) {\n            quorum = options.quorum;\n          } else if (network === \"homestead\") {\n            quorum = 2;\n          }\n          return new providers.FallbackProvider(providerList, quorum);\n        }\n        return providerList[0];\n      };\n      func.renetwork = function(network2) {\n        return ethDefaultProvider(network2);\n      };\n      return func;\n    }\n    function etcDefaultProvider(url, network) {\n      var func = function(providers, options) {\n        if (providers.JsonRpcProvider) {\n          return new providers.JsonRpcProvider(url, network);\n        }\n        return null;\n      };\n      func.renetwork = function(network2) {\n        return etcDefaultProvider(url, network2);\n      };\n      return func;\n    }\n    var homestead = {\n      chainId: 1,\n      ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n      name: \"homestead\",\n      _defaultProvider: ethDefaultProvider(\"homestead\")\n    };\n    var ropsten = {\n      chainId: 3,\n      ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n      name: \"ropsten\",\n      _defaultProvider: ethDefaultProvider(\"ropsten\")\n    };\n    var classicMordor = {\n      chainId: 63,\n      name: \"classicMordor\",\n      _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/mordor\", \"classicMordor\")\n    };\n    var networks = {\n      unspecified: { chainId: 0, name: \"unspecified\" },\n      homestead,\n      mainnet: homestead,\n      morden: { chainId: 2, name: \"morden\" },\n      ropsten,\n      testnet: ropsten,\n      rinkeby: {\n        chainId: 4,\n        ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n        name: \"rinkeby\",\n        _defaultProvider: ethDefaultProvider(\"rinkeby\")\n      },\n      kovan: {\n        chainId: 42,\n        name: \"kovan\",\n        _defaultProvider: ethDefaultProvider(\"kovan\")\n      },\n      goerli: {\n        chainId: 5,\n        ensAddress: \"0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e\",\n        name: \"goerli\",\n        _defaultProvider: ethDefaultProvider(\"goerli\")\n      },\n      // ETC (See: #351)\n      classic: {\n        chainId: 61,\n        name: \"classic\",\n        _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/etc\", \"classic\")\n      },\n      classicMorden: { chainId: 62, name: \"classicMorden\" },\n      classicMordor,\n      classicTestnet: classicMordor,\n      classicKotti: {\n        chainId: 6,\n        name: \"classicKotti\",\n        _defaultProvider: etcDefaultProvider(\"https://www.ethercluster.com/kotti\", \"classicKotti\")\n      },\n      xdai: { chainId: 100, name: \"xdai\" },\n      matic: { chainId: 137, name: \"matic\" },\n      maticmum: { chainId: 80001, name: \"maticmum\" },\n      optimism: { chainId: 10, name: \"optimism\" },\n      \"optimism-kovan\": { chainId: 69, name: \"optimism-kovan\" },\n      \"optimism-goerli\": { chainId: 420, name: \"optimism-goerli\" },\n      arbitrum: { chainId: 42161, name: \"arbitrum\" },\n      \"arbitrum-rinkeby\": { chainId: 421611, name: \"arbitrum-rinkeby\" },\n      bnb: { chainId: 56, name: \"bnb\" },\n      bnbt: { chainId: 97, name: \"bnbt\" }\n    };\n    function getNetwork(network) {\n      if (network == null) {\n        return null;\n      }\n      if (typeof network === \"number\") {\n        for (var name_1 in networks) {\n          var standard_1 = networks[name_1];\n          if (standard_1.chainId === network) {\n            return {\n              name: standard_1.name,\n              chainId: standard_1.chainId,\n              ensAddress: standard_1.ensAddress || null,\n              _defaultProvider: standard_1._defaultProvider || null\n            };\n          }\n        }\n        return {\n          chainId: network,\n          name: \"unknown\"\n        };\n      }\n      if (typeof network === \"string\") {\n        var standard_2 = networks[network];\n        if (standard_2 == null) {\n          return null;\n        }\n        return {\n          name: standard_2.name,\n          chainId: standard_2.chainId,\n          ensAddress: standard_2.ensAddress,\n          _defaultProvider: standard_2._defaultProvider || null\n        };\n      }\n      var standard = networks[network.name];\n      if (!standard) {\n        if (typeof network.chainId !== \"number\") {\n          logger.throwArgumentError(\"invalid network chainId\", \"network\", network);\n        }\n        return network;\n      }\n      if (network.chainId !== 0 && network.chainId !== standard.chainId) {\n        logger.throwArgumentError(\"network chainId mismatch\", \"network\", network);\n      }\n      var defaultProvider = network._defaultProvider || null;\n      if (defaultProvider == null && standard._defaultProvider) {\n        if (isRenetworkable(standard._defaultProvider)) {\n          defaultProvider = standard._defaultProvider.renetwork(network);\n        } else {\n          defaultProvider = standard._defaultProvider;\n        }\n      }\n      return {\n        name: network.name,\n        chainId: standard.chainId,\n        ensAddress: network.ensAddress || standard.ensAddress || null,\n        _defaultProvider: defaultProvider\n      };\n    }\n    exports2.getNetwork = getNetwork;\n  }\n});\n\n// node_modules/@ethersproject/base64/lib/base64.js\nvar require_base64 = __commonJS({\n  \"node_modules/@ethersproject/base64/lib/base64.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encode = exports2.decode = void 0;\n    var bytes_1 = require_lib2();\n    function decode(textData) {\n      return (0, bytes_1.arrayify)(new Uint8Array(Buffer.from(textData, \"base64\")));\n    }\n    exports2.decode = decode;\n    function encode(data) {\n      return Buffer.from((0, bytes_1.arrayify)(data)).toString(\"base64\");\n    }\n    exports2.encode = encode;\n  }\n});\n\n// node_modules/@ethersproject/base64/lib/index.js\nvar require_lib26 = __commonJS({\n  \"node_modules/@ethersproject/base64/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.encode = exports2.decode = void 0;\n    var base64_1 = require_base64();\n    Object.defineProperty(exports2, \"decode\", { enumerable: true, get: function() {\n      return base64_1.decode;\n    } });\n    Object.defineProperty(exports2, \"encode\", { enumerable: true, get: function() {\n      return base64_1.encode;\n    } });\n  }\n});\n\n// node_modules/@ethersproject/web/lib/_version.js\nvar require_version21 = __commonJS({\n  \"node_modules/@ethersproject/web/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"web/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/web/lib/geturl.js\nvar require_geturl = __commonJS({\n  \"node_modules/@ethersproject/web/lib/geturl.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.getUrl = void 0;\n    var http_1 = __importDefault(require(\"http\"));\n    var https_1 = __importDefault(require(\"https\"));\n    var zlib_1 = require(\"zlib\");\n    var url_1 = require(\"url\");\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version21();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getResponse(request) {\n      return new Promise(function(resolve, reject) {\n        request.once(\"response\", function(resp) {\n          var response = {\n            statusCode: resp.statusCode,\n            statusMessage: resp.statusMessage,\n            headers: Object.keys(resp.headers).reduce(function(accum, name2) {\n              var value = resp.headers[name2];\n              if (Array.isArray(value)) {\n                value = value.join(\", \");\n              }\n              accum[name2] = value;\n              return accum;\n            }, {}),\n            body: null\n          };\n          resp.on(\"data\", function(chunk) {\n            if (response.body == null) {\n              response.body = new Uint8Array(0);\n            }\n            response.body = (0, bytes_1.concat)([response.body, chunk]);\n          });\n          resp.on(\"end\", function() {\n            if (response.headers[\"content-encoding\"] === \"gzip\") {\n              response.body = (0, bytes_1.arrayify)((0, zlib_1.gunzipSync)(response.body));\n            }\n            resolve(response);\n          });\n          resp.on(\"error\", function(error) {\n            error.response = response;\n            reject(error);\n          });\n        });\n        request.on(\"error\", function(error) {\n          reject(error);\n        });\n      });\n    }\n    function nonnull(value) {\n      if (value == null) {\n        return \"\";\n      }\n      return value;\n    }\n    function getUrl(href, options) {\n      return __awaiter(this, void 0, void 0, function() {\n        var url, request, req, response;\n        return __generator(this, function(_a) {\n          switch (_a.label) {\n            case 0:\n              if (options == null) {\n                options = {};\n              }\n              url = (0, url_1.parse)(href);\n              request = {\n                protocol: nonnull(url.protocol),\n                hostname: nonnull(url.hostname),\n                port: nonnull(url.port),\n                path: nonnull(url.pathname) + nonnull(url.search),\n                method: options.method || \"GET\",\n                headers: (0, properties_1.shallowCopy)(options.headers || {})\n              };\n              if (options.allowGzip) {\n                request.headers[\"accept-encoding\"] = \"gzip\";\n              }\n              req = null;\n              switch (nonnull(url.protocol)) {\n                case \"http:\":\n                  req = http_1.default.request(request);\n                  break;\n                case \"https:\":\n                  req = https_1.default.request(request);\n                  break;\n                default:\n                  logger.throwError(\"unsupported protocol \" + url.protocol, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    protocol: url.protocol,\n                    operation: \"request\"\n                  });\n              }\n              if (options.body) {\n                req.write(Buffer.from(options.body));\n              }\n              req.end();\n              return [4, getResponse(req)];\n            case 1:\n              response = _a.sent();\n              return [2, response];\n          }\n        });\n      });\n    }\n    exports2.getUrl = getUrl;\n  }\n});\n\n// node_modules/@ethersproject/web/lib/index.js\nvar require_lib27 = __commonJS({\n  \"node_modules/@ethersproject/web/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.poll = exports2.fetchJson = exports2._fetchData = void 0;\n    var base64_1 = require_lib26();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var strings_1 = require_lib9();\n    var logger_1 = require_lib();\n    var _version_1 = require_version21();\n    var logger = new logger_1.Logger(_version_1.version);\n    var geturl_1 = require_geturl();\n    function staller(duration) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, duration);\n      });\n    }\n    function bodyify(value, type) {\n      if (value == null) {\n        return null;\n      }\n      if (typeof value === \"string\") {\n        return value;\n      }\n      if ((0, bytes_1.isBytesLike)(value)) {\n        if (type && (type.split(\"/\")[0] === \"text\" || type.split(\";\")[0].trim() === \"application/json\")) {\n          try {\n            return (0, strings_1.toUtf8String)(value);\n          } catch (error) {\n          }\n          ;\n        }\n        return (0, bytes_1.hexlify)(value);\n      }\n      return value;\n    }\n    function _fetchData(connection, body, processFunc) {\n      var attemptLimit = typeof connection === \"object\" && connection.throttleLimit != null ? connection.throttleLimit : 12;\n      logger.assertArgument(attemptLimit > 0 && attemptLimit % 1 === 0, \"invalid connection throttle limit\", \"connection.throttleLimit\", attemptLimit);\n      var throttleCallback = typeof connection === \"object\" ? connection.throttleCallback : null;\n      var throttleSlotInterval = typeof connection === \"object\" && typeof connection.throttleSlotInterval === \"number\" ? connection.throttleSlotInterval : 100;\n      logger.assertArgument(throttleSlotInterval > 0 && throttleSlotInterval % 1 === 0, \"invalid connection throttle slot interval\", \"connection.throttleSlotInterval\", throttleSlotInterval);\n      var headers = {};\n      var url = null;\n      var options = {\n        method: \"GET\"\n      };\n      var allow304 = false;\n      var timeout = 2 * 60 * 1e3;\n      if (typeof connection === \"string\") {\n        url = connection;\n      } else if (typeof connection === \"object\") {\n        if (connection == null || connection.url == null) {\n          logger.throwArgumentError(\"missing URL\", \"connection.url\", connection);\n        }\n        url = connection.url;\n        if (typeof connection.timeout === \"number\" && connection.timeout > 0) {\n          timeout = connection.timeout;\n        }\n        if (connection.headers) {\n          for (var key in connection.headers) {\n            headers[key.toLowerCase()] = { key, value: String(connection.headers[key]) };\n            if ([\"if-none-match\", \"if-modified-since\"].indexOf(key.toLowerCase()) >= 0) {\n              allow304 = true;\n            }\n          }\n        }\n        options.allowGzip = !!connection.allowGzip;\n        if (connection.user != null && connection.password != null) {\n          if (url.substring(0, 6) !== \"https:\" && connection.allowInsecureAuthentication !== true) {\n            logger.throwError(\"basic authentication requires a secure https url\", logger_1.Logger.errors.INVALID_ARGUMENT, { argument: \"url\", url, user: connection.user, password: \"[REDACTED]\" });\n          }\n          var authorization = connection.user + \":\" + connection.password;\n          headers[\"authorization\"] = {\n            key: \"Authorization\",\n            value: \"Basic \" + (0, base64_1.encode)((0, strings_1.toUtf8Bytes)(authorization))\n          };\n        }\n      }\n      var reData = new RegExp(\"^data:([a-z0-9-]+/[a-z0-9-]+);base64,(.*)$\", \"i\");\n      var dataMatch = url ? url.match(reData) : null;\n      if (dataMatch) {\n        try {\n          var response = {\n            statusCode: 200,\n            statusMessage: \"OK\",\n            headers: { \"content-type\": dataMatch[1] },\n            body: (0, base64_1.decode)(dataMatch[2])\n          };\n          var result = response.body;\n          if (processFunc) {\n            result = processFunc(response.body, response);\n          }\n          return Promise.resolve(result);\n        } catch (error) {\n          logger.throwError(\"processing response error\", logger_1.Logger.errors.SERVER_ERROR, {\n            body: bodyify(dataMatch[1], dataMatch[2]),\n            error,\n            requestBody: null,\n            requestMethod: \"GET\",\n            url\n          });\n        }\n      }\n      if (body) {\n        options.method = \"POST\";\n        options.body = body;\n        if (headers[\"content-type\"] == null) {\n          headers[\"content-type\"] = { key: \"Content-Type\", value: \"application/octet-stream\" };\n        }\n        if (headers[\"content-length\"] == null) {\n          headers[\"content-length\"] = { key: \"Content-Length\", value: String(body.length) };\n        }\n      }\n      var flatHeaders = {};\n      Object.keys(headers).forEach(function(key2) {\n        var header = headers[key2];\n        flatHeaders[header.key] = header.value;\n      });\n      options.headers = flatHeaders;\n      var runningTimeout = function() {\n        var timer = null;\n        var promise = new Promise(function(resolve, reject) {\n          if (timeout) {\n            timer = setTimeout(function() {\n              if (timer == null) {\n                return;\n              }\n              timer = null;\n              reject(logger.makeError(\"timeout\", logger_1.Logger.errors.TIMEOUT, {\n                requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                requestMethod: options.method,\n                timeout,\n                url\n              }));\n            }, timeout);\n          }\n        });\n        var cancel = function() {\n          if (timer == null) {\n            return;\n          }\n          clearTimeout(timer);\n          timer = null;\n        };\n        return { promise, cancel };\n      }();\n      var runningFetch = function() {\n        return __awaiter(this, void 0, void 0, function() {\n          var attempt, response2, location_1, tryAgain, stall, retryAfter, error_1, body_1, result2, error_2, tryAgain, timeout_1;\n          return __generator(this, function(_a) {\n            switch (_a.label) {\n              case 0:\n                attempt = 0;\n                _a.label = 1;\n              case 1:\n                if (!(attempt < attemptLimit)) return [3, 20];\n                response2 = null;\n                _a.label = 2;\n              case 2:\n                _a.trys.push([2, 9, , 10]);\n                return [4, (0, geturl_1.getUrl)(url, options)];\n              case 3:\n                response2 = _a.sent();\n                if (!(attempt < attemptLimit)) return [3, 8];\n                if (!(response2.statusCode === 301 || response2.statusCode === 302)) return [3, 4];\n                location_1 = response2.headers.location || \"\";\n                if (options.method === \"GET\" && location_1.match(/^https:/)) {\n                  url = response2.headers.location;\n                  return [3, 19];\n                }\n                return [3, 8];\n              case 4:\n                if (!(response2.statusCode === 429)) return [3, 8];\n                tryAgain = true;\n                if (!throttleCallback) return [3, 6];\n                return [4, throttleCallback(attempt, url)];\n              case 5:\n                tryAgain = _a.sent();\n                _a.label = 6;\n              case 6:\n                if (!tryAgain) return [3, 8];\n                stall = 0;\n                retryAfter = response2.headers[\"retry-after\"];\n                if (typeof retryAfter === \"string\" && retryAfter.match(/^[1-9][0-9]*$/)) {\n                  stall = parseInt(retryAfter) * 1e3;\n                } else {\n                  stall = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n                }\n                return [4, staller(stall)];\n              case 7:\n                _a.sent();\n                return [3, 19];\n              case 8:\n                return [3, 10];\n              case 9:\n                error_1 = _a.sent();\n                response2 = error_1.response;\n                if (response2 == null) {\n                  runningTimeout.cancel();\n                  logger.throwError(\"missing response\", logger_1.Logger.errors.SERVER_ERROR, {\n                    requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                    requestMethod: options.method,\n                    serverError: error_1,\n                    url\n                  });\n                }\n                return [3, 10];\n              case 10:\n                body_1 = response2.body;\n                if (allow304 && response2.statusCode === 304) {\n                  body_1 = null;\n                } else if (response2.statusCode < 200 || response2.statusCode >= 300) {\n                  runningTimeout.cancel();\n                  logger.throwError(\"bad response\", logger_1.Logger.errors.SERVER_ERROR, {\n                    status: response2.statusCode,\n                    headers: response2.headers,\n                    body: bodyify(body_1, response2.headers ? response2.headers[\"content-type\"] : null),\n                    requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                    requestMethod: options.method,\n                    url\n                  });\n                }\n                if (!processFunc) return [3, 18];\n                _a.label = 11;\n              case 11:\n                _a.trys.push([11, 13, , 18]);\n                return [4, processFunc(body_1, response2)];\n              case 12:\n                result2 = _a.sent();\n                runningTimeout.cancel();\n                return [2, result2];\n              case 13:\n                error_2 = _a.sent();\n                if (!(error_2.throttleRetry && attempt < attemptLimit)) return [3, 17];\n                tryAgain = true;\n                if (!throttleCallback) return [3, 15];\n                return [4, throttleCallback(attempt, url)];\n              case 14:\n                tryAgain = _a.sent();\n                _a.label = 15;\n              case 15:\n                if (!tryAgain) return [3, 17];\n                timeout_1 = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n                return [4, staller(timeout_1)];\n              case 16:\n                _a.sent();\n                return [3, 19];\n              case 17:\n                runningTimeout.cancel();\n                logger.throwError(\"processing response error\", logger_1.Logger.errors.SERVER_ERROR, {\n                  body: bodyify(body_1, response2.headers ? response2.headers[\"content-type\"] : null),\n                  error: error_2,\n                  requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                  requestMethod: options.method,\n                  url\n                });\n                return [3, 18];\n              case 18:\n                runningTimeout.cancel();\n                return [2, body_1];\n              case 19:\n                attempt++;\n                return [3, 1];\n              case 20:\n                return [2, logger.throwError(\"failed response\", logger_1.Logger.errors.SERVER_ERROR, {\n                  requestBody: bodyify(options.body, flatHeaders[\"content-type\"]),\n                  requestMethod: options.method,\n                  url\n                })];\n            }\n          });\n        });\n      }();\n      return Promise.race([runningTimeout.promise, runningFetch]);\n    }\n    exports2._fetchData = _fetchData;\n    function fetchJson(connection, json, processFunc) {\n      var processJsonFunc = function(value, response) {\n        var result = null;\n        if (value != null) {\n          try {\n            result = JSON.parse((0, strings_1.toUtf8String)(value));\n          } catch (error) {\n            logger.throwError(\"invalid JSON\", logger_1.Logger.errors.SERVER_ERROR, {\n              body: value,\n              error\n            });\n          }\n        }\n        if (processFunc) {\n          result = processFunc(result, response);\n        }\n        return result;\n      };\n      var body = null;\n      if (json != null) {\n        body = (0, strings_1.toUtf8Bytes)(json);\n        var updated = typeof connection === \"string\" ? { url: connection } : (0, properties_1.shallowCopy)(connection);\n        if (updated.headers) {\n          var hasContentType = Object.keys(updated.headers).filter(function(k) {\n            return k.toLowerCase() === \"content-type\";\n          }).length !== 0;\n          if (!hasContentType) {\n            updated.headers = (0, properties_1.shallowCopy)(updated.headers);\n            updated.headers[\"content-type\"] = \"application/json\";\n          }\n        } else {\n          updated.headers = { \"content-type\": \"application/json\" };\n        }\n        connection = updated;\n      }\n      return _fetchData(connection, body, processJsonFunc);\n    }\n    exports2.fetchJson = fetchJson;\n    function poll(func, options) {\n      if (!options) {\n        options = {};\n      }\n      options = (0, properties_1.shallowCopy)(options);\n      if (options.floor == null) {\n        options.floor = 0;\n      }\n      if (options.ceiling == null) {\n        options.ceiling = 1e4;\n      }\n      if (options.interval == null) {\n        options.interval = 250;\n      }\n      return new Promise(function(resolve, reject) {\n        var timer = null;\n        var done = false;\n        var cancel = function() {\n          if (done) {\n            return false;\n          }\n          done = true;\n          if (timer) {\n            clearTimeout(timer);\n          }\n          return true;\n        };\n        if (options.timeout) {\n          timer = setTimeout(function() {\n            if (cancel()) {\n              reject(new Error(\"timeout\"));\n            }\n          }, options.timeout);\n        }\n        var retryLimit = options.retryLimit;\n        var attempt = 0;\n        function check() {\n          return func().then(function(result) {\n            if (result !== void 0) {\n              if (cancel()) {\n                resolve(result);\n              }\n            } else if (options.oncePoll) {\n              options.oncePoll.once(\"poll\", check);\n            } else if (options.onceBlock) {\n              options.onceBlock.once(\"block\", check);\n            } else if (!done) {\n              attempt++;\n              if (attempt > retryLimit) {\n                if (cancel()) {\n                  reject(new Error(\"retry limit reached\"));\n                }\n                return;\n              }\n              var timeout = options.interval * parseInt(String(Math.random() * Math.pow(2, attempt)));\n              if (timeout < options.floor) {\n                timeout = options.floor;\n              }\n              if (timeout > options.ceiling) {\n                timeout = options.ceiling;\n              }\n              setTimeout(check, timeout);\n            }\n            return null;\n          }, function(error) {\n            if (cancel()) {\n              reject(error);\n            }\n          });\n        }\n        check();\n      });\n    }\n    exports2.poll = poll;\n  }\n});\n\n// node_modules/bech32/index.js\nvar require_bech32 = __commonJS({\n  \"node_modules/bech32/index.js\"(exports2, module2) {\n    \"use strict\";\n    var ALPHABET = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\";\n    var ALPHABET_MAP = {};\n    for (z = 0; z < ALPHABET.length; z++) {\n      x = ALPHABET.charAt(z);\n      if (ALPHABET_MAP[x] !== void 0) throw new TypeError(x + \" is ambiguous\");\n      ALPHABET_MAP[x] = z;\n    }\n    var x;\n    var z;\n    function polymodStep(pre) {\n      var b = pre >> 25;\n      return (pre & 33554431) << 5 ^ -(b >> 0 & 1) & 996825010 ^ -(b >> 1 & 1) & 642813549 ^ -(b >> 2 & 1) & 513874426 ^ -(b >> 3 & 1) & 1027748829 ^ -(b >> 4 & 1) & 705979059;\n    }\n    function prefixChk(prefix) {\n      var chk = 1;\n      for (var i = 0; i < prefix.length; ++i) {\n        var c = prefix.charCodeAt(i);\n        if (c < 33 || c > 126) return \"Invalid prefix (\" + prefix + \")\";\n        chk = polymodStep(chk) ^ c >> 5;\n      }\n      chk = polymodStep(chk);\n      for (i = 0; i < prefix.length; ++i) {\n        var v = prefix.charCodeAt(i);\n        chk = polymodStep(chk) ^ v & 31;\n      }\n      return chk;\n    }\n    function encode(prefix, words, LIMIT) {\n      LIMIT = LIMIT || 90;\n      if (prefix.length + 7 + words.length > LIMIT) throw new TypeError(\"Exceeds length limit\");\n      prefix = prefix.toLowerCase();\n      var chk = prefixChk(prefix);\n      if (typeof chk === \"string\") throw new Error(chk);\n      var result = prefix + \"1\";\n      for (var i = 0; i < words.length; ++i) {\n        var x2 = words[i];\n        if (x2 >> 5 !== 0) throw new Error(\"Non 5-bit word\");\n        chk = polymodStep(chk) ^ x2;\n        result += ALPHABET.charAt(x2);\n      }\n      for (i = 0; i < 6; ++i) {\n        chk = polymodStep(chk);\n      }\n      chk ^= 1;\n      for (i = 0; i < 6; ++i) {\n        var v = chk >> (5 - i) * 5 & 31;\n        result += ALPHABET.charAt(v);\n      }\n      return result;\n    }\n    function __decode(str, LIMIT) {\n      LIMIT = LIMIT || 90;\n      if (str.length < 8) return str + \" too short\";\n      if (str.length > LIMIT) return \"Exceeds length limit\";\n      var lowered = str.toLowerCase();\n      var uppered = str.toUpperCase();\n      if (str !== lowered && str !== uppered) return \"Mixed-case string \" + str;\n      str = lowered;\n      var split = str.lastIndexOf(\"1\");\n      if (split === -1) return \"No separator character for \" + str;\n      if (split === 0) return \"Missing prefix for \" + str;\n      var prefix = str.slice(0, split);\n      var wordChars = str.slice(split + 1);\n      if (wordChars.length < 6) return \"Data too short\";\n      var chk = prefixChk(prefix);\n      if (typeof chk === \"string\") return chk;\n      var words = [];\n      for (var i = 0; i < wordChars.length; ++i) {\n        var c = wordChars.charAt(i);\n        var v = ALPHABET_MAP[c];\n        if (v === void 0) return \"Unknown character \" + c;\n        chk = polymodStep(chk) ^ v;\n        if (i + 6 >= wordChars.length) continue;\n        words.push(v);\n      }\n      if (chk !== 1) return \"Invalid checksum for \" + str;\n      return { prefix, words };\n    }\n    function decodeUnsafe() {\n      var res = __decode.apply(null, arguments);\n      if (typeof res === \"object\") return res;\n    }\n    function decode(str) {\n      var res = __decode.apply(null, arguments);\n      if (typeof res === \"object\") return res;\n      throw new Error(res);\n    }\n    function convert(data, inBits, outBits, pad) {\n      var value = 0;\n      var bits = 0;\n      var maxV = (1 << outBits) - 1;\n      var result = [];\n      for (var i = 0; i < data.length; ++i) {\n        value = value << inBits | data[i];\n        bits += inBits;\n        while (bits >= outBits) {\n          bits -= outBits;\n          result.push(value >> bits & maxV);\n        }\n      }\n      if (pad) {\n        if (bits > 0) {\n          result.push(value << outBits - bits & maxV);\n        }\n      } else {\n        if (bits >= inBits) return \"Excess padding\";\n        if (value << outBits - bits & maxV) return \"Non-zero padding\";\n      }\n      return result;\n    }\n    function toWordsUnsafe(bytes) {\n      var res = convert(bytes, 8, 5, true);\n      if (Array.isArray(res)) return res;\n    }\n    function toWords(bytes) {\n      var res = convert(bytes, 8, 5, true);\n      if (Array.isArray(res)) return res;\n      throw new Error(res);\n    }\n    function fromWordsUnsafe(words) {\n      var res = convert(words, 5, 8, false);\n      if (Array.isArray(res)) return res;\n    }\n    function fromWords(words) {\n      var res = convert(words, 5, 8, false);\n      if (Array.isArray(res)) return res;\n      throw new Error(res);\n    }\n    module2.exports = {\n      decodeUnsafe,\n      decode,\n      encode,\n      toWordsUnsafe,\n      toWords,\n      fromWordsUnsafe,\n      fromWords\n    };\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/_version.js\nvar require_version22 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"providers/5.5.1\";\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/formatter.js\nvar require_formatter = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/formatter.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.showThrottleMessage = exports2.isCommunityResource = exports2.isCommunityResourcable = exports2.Formatter = void 0;\n    var address_1 = require_lib7();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var Formatter = (\n      /** @class */\n      function() {\n        function Formatter2() {\n          var _newTarget = this.constructor;\n          logger.checkNew(_newTarget, Formatter2);\n          this.formats = this.getDefaultFormats();\n        }\n        Formatter2.prototype.getDefaultFormats = function() {\n          var _this = this;\n          var formats = {};\n          var address = this.address.bind(this);\n          var bigNumber = this.bigNumber.bind(this);\n          var blockTag = this.blockTag.bind(this);\n          var data = this.data.bind(this);\n          var hash = this.hash.bind(this);\n          var hex = this.hex.bind(this);\n          var number = this.number.bind(this);\n          var type = this.type.bind(this);\n          var strictData = function(v) {\n            return _this.data(v, true);\n          };\n          formats.transaction = {\n            hash,\n            type,\n            accessList: Formatter2.allowNull(this.accessList.bind(this), null),\n            blockHash: Formatter2.allowNull(hash, null),\n            blockNumber: Formatter2.allowNull(number, null),\n            transactionIndex: Formatter2.allowNull(number, null),\n            confirmations: Formatter2.allowNull(number, null),\n            from: address,\n            // either (gasPrice) or (maxPriorityFeePerGas + maxFeePerGas)\n            // must be set\n            gasPrice: Formatter2.allowNull(bigNumber),\n            maxPriorityFeePerGas: Formatter2.allowNull(bigNumber),\n            maxFeePerGas: Formatter2.allowNull(bigNumber),\n            gasLimit: bigNumber,\n            to: Formatter2.allowNull(address, null),\n            value: bigNumber,\n            nonce: number,\n            data,\n            r: Formatter2.allowNull(this.uint256),\n            s: Formatter2.allowNull(this.uint256),\n            v: Formatter2.allowNull(number),\n            creates: Formatter2.allowNull(address, null),\n            raw: Formatter2.allowNull(data)\n          };\n          formats.transactionRequest = {\n            from: Formatter2.allowNull(address),\n            nonce: Formatter2.allowNull(number),\n            gasLimit: Formatter2.allowNull(bigNumber),\n            gasPrice: Formatter2.allowNull(bigNumber),\n            maxPriorityFeePerGas: Formatter2.allowNull(bigNumber),\n            maxFeePerGas: Formatter2.allowNull(bigNumber),\n            to: Formatter2.allowNull(address),\n            value: Formatter2.allowNull(bigNumber),\n            data: Formatter2.allowNull(strictData),\n            type: Formatter2.allowNull(number),\n            accessList: Formatter2.allowNull(this.accessList.bind(this), null)\n          };\n          formats.receiptLog = {\n            transactionIndex: number,\n            blockNumber: number,\n            transactionHash: hash,\n            address,\n            topics: Formatter2.arrayOf(hash),\n            data,\n            logIndex: number,\n            blockHash: hash\n          };\n          formats.receipt = {\n            to: Formatter2.allowNull(this.address, null),\n            from: Formatter2.allowNull(this.address, null),\n            contractAddress: Formatter2.allowNull(address, null),\n            transactionIndex: number,\n            // should be allowNull(hash), but broken-EIP-658 support is handled in receipt\n            root: Formatter2.allowNull(hex),\n            gasUsed: bigNumber,\n            logsBloom: Formatter2.allowNull(data),\n            blockHash: hash,\n            transactionHash: hash,\n            logs: Formatter2.arrayOf(this.receiptLog.bind(this)),\n            blockNumber: number,\n            confirmations: Formatter2.allowNull(number, null),\n            cumulativeGasUsed: bigNumber,\n            effectiveGasPrice: Formatter2.allowNull(bigNumber),\n            status: Formatter2.allowNull(number),\n            type\n          };\n          formats.block = {\n            hash,\n            parentHash: hash,\n            number,\n            timestamp: number,\n            nonce: Formatter2.allowNull(hex),\n            difficulty: this.difficulty.bind(this),\n            gasLimit: bigNumber,\n            gasUsed: bigNumber,\n            miner: address,\n            extraData: data,\n            transactions: Formatter2.allowNull(Formatter2.arrayOf(hash)),\n            baseFeePerGas: Formatter2.allowNull(bigNumber)\n          };\n          formats.blockWithTransactions = (0, properties_1.shallowCopy)(formats.block);\n          formats.blockWithTransactions.transactions = Formatter2.allowNull(Formatter2.arrayOf(this.transactionResponse.bind(this)));\n          formats.filter = {\n            fromBlock: Formatter2.allowNull(blockTag, void 0),\n            toBlock: Formatter2.allowNull(blockTag, void 0),\n            blockHash: Formatter2.allowNull(hash, void 0),\n            address: Formatter2.allowNull(address, void 0),\n            topics: Formatter2.allowNull(this.topics.bind(this), void 0)\n          };\n          formats.filterLog = {\n            blockNumber: Formatter2.allowNull(number),\n            blockHash: Formatter2.allowNull(hash),\n            transactionIndex: number,\n            removed: Formatter2.allowNull(this.boolean.bind(this)),\n            address,\n            data: Formatter2.allowFalsish(data, \"0x\"),\n            topics: Formatter2.arrayOf(hash),\n            transactionHash: hash,\n            logIndex: number\n          };\n          return formats;\n        };\n        Formatter2.prototype.accessList = function(accessList) {\n          return (0, transactions_1.accessListify)(accessList || []);\n        };\n        Formatter2.prototype.number = function(number) {\n          if (number === \"0x\") {\n            return 0;\n          }\n          return bignumber_1.BigNumber.from(number).toNumber();\n        };\n        Formatter2.prototype.type = function(number) {\n          if (number === \"0x\" || number == null) {\n            return 0;\n          }\n          return bignumber_1.BigNumber.from(number).toNumber();\n        };\n        Formatter2.prototype.bigNumber = function(value) {\n          return bignumber_1.BigNumber.from(value);\n        };\n        Formatter2.prototype.boolean = function(value) {\n          if (typeof value === \"boolean\") {\n            return value;\n          }\n          if (typeof value === \"string\") {\n            value = value.toLowerCase();\n            if (value === \"true\") {\n              return true;\n            }\n            if (value === \"false\") {\n              return false;\n            }\n          }\n          throw new Error(\"invalid boolean - \" + value);\n        };\n        Formatter2.prototype.hex = function(value, strict) {\n          if (typeof value === \"string\") {\n            if (!strict && value.substring(0, 2) !== \"0x\") {\n              value = \"0x\" + value;\n            }\n            if ((0, bytes_1.isHexString)(value)) {\n              return value.toLowerCase();\n            }\n          }\n          return logger.throwArgumentError(\"invalid hash\", \"value\", value);\n        };\n        Formatter2.prototype.data = function(value, strict) {\n          var result = this.hex(value, strict);\n          if (result.length % 2 !== 0) {\n            throw new Error(\"invalid data; odd-length - \" + value);\n          }\n          return result;\n        };\n        Formatter2.prototype.address = function(value) {\n          return (0, address_1.getAddress)(value);\n        };\n        Formatter2.prototype.callAddress = function(value) {\n          if (!(0, bytes_1.isHexString)(value, 32)) {\n            return null;\n          }\n          var address = (0, address_1.getAddress)((0, bytes_1.hexDataSlice)(value, 12));\n          return address === constants_1.AddressZero ? null : address;\n        };\n        Formatter2.prototype.contractAddress = function(value) {\n          return (0, address_1.getContractAddress)(value);\n        };\n        Formatter2.prototype.blockTag = function(blockTag) {\n          if (blockTag == null) {\n            return \"latest\";\n          }\n          if (blockTag === \"earliest\") {\n            return \"0x0\";\n          }\n          if (blockTag === \"latest\" || blockTag === \"pending\") {\n            return blockTag;\n          }\n          if (typeof blockTag === \"number\" || (0, bytes_1.isHexString)(blockTag)) {\n            return (0, bytes_1.hexValue)(blockTag);\n          }\n          throw new Error(\"invalid blockTag\");\n        };\n        Formatter2.prototype.hash = function(value, strict) {\n          var result = this.hex(value, strict);\n          if ((0, bytes_1.hexDataLength)(result) !== 32) {\n            return logger.throwArgumentError(\"invalid hash\", \"value\", value);\n          }\n          return result;\n        };\n        Formatter2.prototype.difficulty = function(value) {\n          if (value == null) {\n            return null;\n          }\n          var v = bignumber_1.BigNumber.from(value);\n          try {\n            return v.toNumber();\n          } catch (error) {\n          }\n          return null;\n        };\n        Formatter2.prototype.uint256 = function(value) {\n          if (!(0, bytes_1.isHexString)(value)) {\n            throw new Error(\"invalid uint256\");\n          }\n          return (0, bytes_1.hexZeroPad)(value, 32);\n        };\n        Formatter2.prototype._block = function(value, format) {\n          if (value.author != null && value.miner == null) {\n            value.miner = value.author;\n          }\n          var difficulty = value._difficulty != null ? value._difficulty : value.difficulty;\n          var result = Formatter2.check(format, value);\n          result._difficulty = difficulty == null ? null : bignumber_1.BigNumber.from(difficulty);\n          return result;\n        };\n        Formatter2.prototype.block = function(value) {\n          return this._block(value, this.formats.block);\n        };\n        Formatter2.prototype.blockWithTransactions = function(value) {\n          return this._block(value, this.formats.blockWithTransactions);\n        };\n        Formatter2.prototype.transactionRequest = function(value) {\n          return Formatter2.check(this.formats.transactionRequest, value);\n        };\n        Formatter2.prototype.transactionResponse = function(transaction) {\n          if (transaction.gas != null && transaction.gasLimit == null) {\n            transaction.gasLimit = transaction.gas;\n          }\n          if (transaction.to && bignumber_1.BigNumber.from(transaction.to).isZero()) {\n            transaction.to = \"0x0000000000000000000000000000000000000000\";\n          }\n          if (transaction.input != null && transaction.data == null) {\n            transaction.data = transaction.input;\n          }\n          if (transaction.to == null && transaction.creates == null) {\n            transaction.creates = this.contractAddress(transaction);\n          }\n          if ((transaction.type === 1 || transaction.type === 2) && transaction.accessList == null) {\n            transaction.accessList = [];\n          }\n          var result = Formatter2.check(this.formats.transaction, transaction);\n          if (transaction.chainId != null) {\n            var chainId = transaction.chainId;\n            if ((0, bytes_1.isHexString)(chainId)) {\n              chainId = bignumber_1.BigNumber.from(chainId).toNumber();\n            }\n            result.chainId = chainId;\n          } else {\n            var chainId = transaction.networkId;\n            if (chainId == null && result.v == null) {\n              chainId = transaction.chainId;\n            }\n            if ((0, bytes_1.isHexString)(chainId)) {\n              chainId = bignumber_1.BigNumber.from(chainId).toNumber();\n            }\n            if (typeof chainId !== \"number\" && result.v != null) {\n              chainId = (result.v - 35) / 2;\n              if (chainId < 0) {\n                chainId = 0;\n              }\n              chainId = parseInt(chainId);\n            }\n            if (typeof chainId !== \"number\") {\n              chainId = 0;\n            }\n            result.chainId = chainId;\n          }\n          if (result.blockHash && result.blockHash.replace(/0/g, \"\") === \"x\") {\n            result.blockHash = null;\n          }\n          return result;\n        };\n        Formatter2.prototype.transaction = function(value) {\n          return (0, transactions_1.parse)(value);\n        };\n        Formatter2.prototype.receiptLog = function(value) {\n          return Formatter2.check(this.formats.receiptLog, value);\n        };\n        Formatter2.prototype.receipt = function(value) {\n          var result = Formatter2.check(this.formats.receipt, value);\n          if (result.root != null) {\n            if (result.root.length <= 4) {\n              var value_1 = bignumber_1.BigNumber.from(result.root).toNumber();\n              if (value_1 === 0 || value_1 === 1) {\n                if (result.status != null && result.status !== value_1) {\n                  logger.throwArgumentError(\"alt-root-status/status mismatch\", \"value\", { root: result.root, status: result.status });\n                }\n                result.status = value_1;\n                delete result.root;\n              } else {\n                logger.throwArgumentError(\"invalid alt-root-status\", \"value.root\", result.root);\n              }\n            } else if (result.root.length !== 66) {\n              logger.throwArgumentError(\"invalid root hash\", \"value.root\", result.root);\n            }\n          }\n          if (result.status != null) {\n            result.byzantium = true;\n          }\n          return result;\n        };\n        Formatter2.prototype.topics = function(value) {\n          var _this = this;\n          if (Array.isArray(value)) {\n            return value.map(function(v) {\n              return _this.topics(v);\n            });\n          } else if (value != null) {\n            return this.hash(value, true);\n          }\n          return null;\n        };\n        Formatter2.prototype.filter = function(value) {\n          return Formatter2.check(this.formats.filter, value);\n        };\n        Formatter2.prototype.filterLog = function(value) {\n          return Formatter2.check(this.formats.filterLog, value);\n        };\n        Formatter2.check = function(format, object) {\n          var result = {};\n          for (var key in format) {\n            try {\n              var value = format[key](object[key]);\n              if (value !== void 0) {\n                result[key] = value;\n              }\n            } catch (error) {\n              error.checkKey = key;\n              error.checkValue = object[key];\n              throw error;\n            }\n          }\n          return result;\n        };\n        Formatter2.allowNull = function(format, nullValue) {\n          return function(value) {\n            if (value == null) {\n              return nullValue;\n            }\n            return format(value);\n          };\n        };\n        Formatter2.allowFalsish = function(format, replaceValue) {\n          return function(value) {\n            if (!value) {\n              return replaceValue;\n            }\n            return format(value);\n          };\n        };\n        Formatter2.arrayOf = function(format) {\n          return function(array) {\n            if (!Array.isArray(array)) {\n              throw new Error(\"not an array\");\n            }\n            var result = [];\n            array.forEach(function(value) {\n              result.push(format(value));\n            });\n            return result;\n          };\n        };\n        return Formatter2;\n      }()\n    );\n    exports2.Formatter = Formatter;\n    function isCommunityResourcable(value) {\n      return value && typeof value.isCommunityResource === \"function\";\n    }\n    exports2.isCommunityResourcable = isCommunityResourcable;\n    function isCommunityResource(value) {\n      return isCommunityResourcable(value) && value.isCommunityResource();\n    }\n    exports2.isCommunityResource = isCommunityResource;\n    var throttleMessage = false;\n    function showThrottleMessage() {\n      if (throttleMessage) {\n        return;\n      }\n      throttleMessage = true;\n      console.log(\"========= NOTICE =========\");\n      console.log(\"Request-Rate Exceeded  (this message will not be repeated)\");\n      console.log(\"\");\n      console.log(\"The default API keys for each service are provided as a highly-throttled,\");\n      console.log(\"community resource for low-traffic projects and early prototyping.\");\n      console.log(\"\");\n      console.log(\"While your application will continue to function, we highly recommended\");\n      console.log(\"signing up for your own API keys to improve performance, increase your\");\n      console.log(\"request rate/limit and enable other perks, such as metrics and advanced APIs.\");\n      console.log(\"\");\n      console.log(\"For more details: https://docs.ethers.io/api-keys/\");\n      console.log(\"==========================\");\n    }\n    exports2.showThrottleMessage = showThrottleMessage;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/base-provider.js\nvar require_base_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/base-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.BaseProvider = exports2.Resolver = exports2.Event = void 0;\n    var abstract_provider_1 = require_lib12();\n    var basex_1 = require_lib17();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var constants_1 = require_lib8();\n    var hash_1 = require_lib10();\n    var networks_1 = require_lib25();\n    var properties_1 = require_lib4();\n    var sha2_1 = require_lib19();\n    var strings_1 = require_lib9();\n    var web_1 = require_lib27();\n    var bech32_1 = __importDefault(require_bech32());\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var formatter_1 = require_formatter();\n    function checkTopic(topic) {\n      if (topic == null) {\n        return \"null\";\n      }\n      if ((0, bytes_1.hexDataLength)(topic) !== 32) {\n        logger.throwArgumentError(\"invalid topic\", \"topic\", topic);\n      }\n      return topic.toLowerCase();\n    }\n    function serializeTopics(topics) {\n      topics = topics.slice();\n      while (topics.length > 0 && topics[topics.length - 1] == null) {\n        topics.pop();\n      }\n      return topics.map(function(topic) {\n        if (Array.isArray(topic)) {\n          var unique_1 = {};\n          topic.forEach(function(topic2) {\n            unique_1[checkTopic(topic2)] = true;\n          });\n          var sorted = Object.keys(unique_1);\n          sorted.sort();\n          return sorted.join(\"|\");\n        } else {\n          return checkTopic(topic);\n        }\n      }).join(\"&\");\n    }\n    function deserializeTopics(data) {\n      if (data === \"\") {\n        return [];\n      }\n      return data.split(/&/g).map(function(topic) {\n        if (topic === \"\") {\n          return [];\n        }\n        var comps = topic.split(\"|\").map(function(topic2) {\n          return topic2 === \"null\" ? null : topic2;\n        });\n        return comps.length === 1 ? comps[0] : comps;\n      });\n    }\n    function getEventTag(eventName) {\n      if (typeof eventName === \"string\") {\n        eventName = eventName.toLowerCase();\n        if ((0, bytes_1.hexDataLength)(eventName) === 32) {\n          return \"tx:\" + eventName;\n        }\n        if (eventName.indexOf(\":\") === -1) {\n          return eventName;\n        }\n      } else if (Array.isArray(eventName)) {\n        return \"filter:*:\" + serializeTopics(eventName);\n      } else if (abstract_provider_1.ForkEvent.isForkEvent(eventName)) {\n        logger.warn(\"not implemented\");\n        throw new Error(\"not implemented\");\n      } else if (eventName && typeof eventName === \"object\") {\n        return \"filter:\" + (eventName.address || \"*\") + \":\" + serializeTopics(eventName.topics || []);\n      }\n      throw new Error(\"invalid event - \" + eventName);\n    }\n    function getTime() {\n      return (/* @__PURE__ */ new Date()).getTime();\n    }\n    function stall(duration) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, duration);\n      });\n    }\n    var PollableEvents = [\"block\", \"network\", \"pending\", \"poll\"];\n    var Event = (\n      /** @class */\n      function() {\n        function Event2(tag, listener, once) {\n          (0, properties_1.defineReadOnly)(this, \"tag\", tag);\n          (0, properties_1.defineReadOnly)(this, \"listener\", listener);\n          (0, properties_1.defineReadOnly)(this, \"once\", once);\n        }\n        Object.defineProperty(Event2.prototype, \"event\", {\n          get: function() {\n            switch (this.type) {\n              case \"tx\":\n                return this.hash;\n              case \"filter\":\n                return this.filter;\n            }\n            return this.tag;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"type\", {\n          get: function() {\n            return this.tag.split(\":\")[0];\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"hash\", {\n          get: function() {\n            var comps = this.tag.split(\":\");\n            if (comps[0] !== \"tx\") {\n              return null;\n            }\n            return comps[1];\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(Event2.prototype, \"filter\", {\n          get: function() {\n            var comps = this.tag.split(\":\");\n            if (comps[0] !== \"filter\") {\n              return null;\n            }\n            var address = comps[1];\n            var topics = deserializeTopics(comps[2]);\n            var filter = {};\n            if (topics.length > 0) {\n              filter.topics = topics;\n            }\n            if (address && address !== \"*\") {\n              filter.address = address;\n            }\n            return filter;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Event2.prototype.pollable = function() {\n          return this.tag.indexOf(\":\") >= 0 || PollableEvents.indexOf(this.tag) >= 0;\n        };\n        return Event2;\n      }()\n    );\n    exports2.Event = Event;\n    var coinInfos = {\n      \"0\": { symbol: \"btc\", p2pkh: 0, p2sh: 5, prefix: \"bc\" },\n      \"2\": { symbol: \"ltc\", p2pkh: 48, p2sh: 50, prefix: \"ltc\" },\n      \"3\": { symbol: \"doge\", p2pkh: 30, p2sh: 22 },\n      \"60\": { symbol: \"eth\", ilk: \"eth\" },\n      \"61\": { symbol: \"etc\", ilk: \"eth\" },\n      \"700\": { symbol: \"xdai\", ilk: \"eth\" }\n    };\n    function bytes32ify(value) {\n      return (0, bytes_1.hexZeroPad)(bignumber_1.BigNumber.from(value).toHexString(), 32);\n    }\n    function base58Encode(data) {\n      return basex_1.Base58.encode((0, bytes_1.concat)([data, (0, bytes_1.hexDataSlice)((0, sha2_1.sha256)((0, sha2_1.sha256)(data)), 0, 4)]));\n    }\n    var matchers = [\n      new RegExp(\"^(https)://(.*)$\", \"i\"),\n      new RegExp(\"^(data):(.*)$\", \"i\"),\n      new RegExp(\"^(ipfs)://(.*)$\", \"i\"),\n      new RegExp(\"^eip155:[0-9]+/(erc[0-9]+):(.*)$\", \"i\")\n    ];\n    function _parseString(result) {\n      try {\n        return (0, strings_1.toUtf8String)(_parseBytes(result));\n      } catch (error) {\n      }\n      return null;\n    }\n    function _parseBytes(result) {\n      if (result === \"0x\") {\n        return null;\n      }\n      var offset = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(result, 0, 32)).toNumber();\n      var length = bignumber_1.BigNumber.from((0, bytes_1.hexDataSlice)(result, offset, offset + 32)).toNumber();\n      return (0, bytes_1.hexDataSlice)(result, offset + 32, offset + 32 + length);\n    }\n    var Resolver = (\n      /** @class */\n      function() {\n        function Resolver2(provider, address, name2, resolvedAddress) {\n          (0, properties_1.defineReadOnly)(this, \"provider\", provider);\n          (0, properties_1.defineReadOnly)(this, \"name\", name2);\n          (0, properties_1.defineReadOnly)(this, \"address\", provider.formatter.address(address));\n          (0, properties_1.defineReadOnly)(this, \"_resolvedAddress\", resolvedAddress);\n        }\n        Resolver2.prototype._fetchBytes = function(selector, parameters) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, _a, error_1;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  tx = {\n                    to: this.address,\n                    data: (0, bytes_1.hexConcat)([selector, (0, hash_1.namehash)(this.name), parameters || \"0x\"])\n                  };\n                  _b.label = 1;\n                case 1:\n                  _b.trys.push([1, 3, , 4]);\n                  _a = _parseBytes;\n                  return [4, this.provider.call(tx)];\n                case 2:\n                  return [2, _a.apply(void 0, [_b.sent()])];\n                case 3:\n                  error_1 = _b.sent();\n                  if (error_1.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  return [2, null];\n                case 4:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        Resolver2.prototype._getAddress = function(coinType, hexBytes) {\n          var coinInfo = coinInfos[String(coinType)];\n          if (coinInfo == null) {\n            logger.throwError(\"unsupported coin type: \" + coinType, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"getAddress(\" + coinType + \")\"\n            });\n          }\n          if (coinInfo.ilk === \"eth\") {\n            return this.provider.formatter.address(hexBytes);\n          }\n          var bytes = (0, bytes_1.arrayify)(hexBytes);\n          if (coinInfo.p2pkh != null) {\n            var p2pkh = hexBytes.match(/^0x76a9([0-9a-f][0-9a-f])([0-9a-f]*)88ac$/);\n            if (p2pkh) {\n              var length_1 = parseInt(p2pkh[1], 16);\n              if (p2pkh[2].length === length_1 * 2 && length_1 >= 1 && length_1 <= 75) {\n                return base58Encode((0, bytes_1.concat)([[coinInfo.p2pkh], \"0x\" + p2pkh[2]]));\n              }\n            }\n          }\n          if (coinInfo.p2sh != null) {\n            var p2sh = hexBytes.match(/^0xa9([0-9a-f][0-9a-f])([0-9a-f]*)87$/);\n            if (p2sh) {\n              var length_2 = parseInt(p2sh[1], 16);\n              if (p2sh[2].length === length_2 * 2 && length_2 >= 1 && length_2 <= 75) {\n                return base58Encode((0, bytes_1.concat)([[coinInfo.p2sh], \"0x\" + p2sh[2]]));\n              }\n            }\n          }\n          if (coinInfo.prefix != null) {\n            var length_3 = bytes[1];\n            var version_1 = bytes[0];\n            if (version_1 === 0) {\n              if (length_3 !== 20 && length_3 !== 32) {\n                version_1 = -1;\n              }\n            } else {\n              version_1 = -1;\n            }\n            if (version_1 >= 0 && bytes.length === 2 + length_3 && length_3 >= 1 && length_3 <= 75) {\n              var words = bech32_1.default.toWords(bytes.slice(2));\n              words.unshift(version_1);\n              return bech32_1.default.encode(coinInfo.prefix, words);\n            }\n          }\n          return null;\n        };\n        Resolver2.prototype.getAddress = function(coinType) {\n          return __awaiter(this, void 0, void 0, function() {\n            var transaction, hexBytes_1, error_2, hexBytes, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (coinType == null) {\n                    coinType = 60;\n                  }\n                  if (!(coinType === 60)) return [3, 4];\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  transaction = {\n                    to: this.address,\n                    data: \"0x3b3b57de\" + (0, hash_1.namehash)(this.name).substring(2)\n                  };\n                  return [4, this.provider.call(transaction)];\n                case 2:\n                  hexBytes_1 = _a.sent();\n                  if (hexBytes_1 === \"0x\" || hexBytes_1 === constants_1.HashZero) {\n                    return [2, null];\n                  }\n                  return [2, this.provider.formatter.callAddress(hexBytes_1)];\n                case 3:\n                  error_2 = _a.sent();\n                  if (error_2.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  throw error_2;\n                case 4:\n                  return [4, this._fetchBytes(\"0xf1cb7e06\", bytes32ify(coinType))];\n                case 5:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  address = this._getAddress(coinType, hexBytes);\n                  if (address == null) {\n                    logger.throwError(\"invalid or unsupported coin data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                      operation: \"getAddress(\" + coinType + \")\",\n                      coinType,\n                      data: hexBytes\n                    });\n                  }\n                  return [2, address];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getAvatar = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var linkage, avatar, i, match, _a, selector, owner, _b, comps, addr, tokenId, tokenOwner, _c, _d, balance, _e, _f, tx, metadataUrl, _g, metadata, error_3;\n            return __generator(this, function(_h) {\n              switch (_h.label) {\n                case 0:\n                  linkage = [];\n                  _h.label = 1;\n                case 1:\n                  _h.trys.push([1, 19, , 20]);\n                  return [4, this.getText(\"avatar\")];\n                case 2:\n                  avatar = _h.sent();\n                  if (avatar == null) {\n                    return [2, null];\n                  }\n                  i = 0;\n                  _h.label = 3;\n                case 3:\n                  if (!(i < matchers.length)) return [3, 18];\n                  match = avatar.match(matchers[i]);\n                  if (match == null) {\n                    return [3, 17];\n                  }\n                  _a = match[1];\n                  switch (_a) {\n                    case \"https\":\n                      return [3, 4];\n                    case \"data\":\n                      return [3, 5];\n                    case \"ipfs\":\n                      return [3, 6];\n                    case \"erc721\":\n                      return [3, 7];\n                    case \"erc1155\":\n                      return [3, 7];\n                  }\n                  return [3, 17];\n                case 4:\n                  linkage.push({ type: \"url\", content: avatar });\n                  return [2, { linkage, url: avatar }];\n                case 5:\n                  linkage.push({ type: \"data\", content: avatar });\n                  return [2, { linkage, url: avatar }];\n                case 6:\n                  linkage.push({ type: \"ipfs\", content: avatar });\n                  return [2, { linkage, url: \"https://gateway.ipfs.io/ipfs/\" + avatar.substring(7) }];\n                case 7:\n                  selector = match[1] === \"erc721\" ? \"0xc87b56dd\" : \"0x0e89341c\";\n                  linkage.push({ type: match[1], content: avatar });\n                  _b = this._resolvedAddress;\n                  if (_b) return [3, 9];\n                  return [4, this.getAddress()];\n                case 8:\n                  _b = _h.sent();\n                  _h.label = 9;\n                case 9:\n                  owner = _b;\n                  comps = (match[2] || \"\").split(\"/\");\n                  if (comps.length !== 2) {\n                    return [2, null];\n                  }\n                  return [4, this.provider.formatter.address(comps[0])];\n                case 10:\n                  addr = _h.sent();\n                  tokenId = (0, bytes_1.hexZeroPad)(bignumber_1.BigNumber.from(comps[1]).toHexString(), 32);\n                  if (!(match[1] === \"erc721\")) return [3, 12];\n                  _d = (_c = this.provider.formatter).callAddress;\n                  return [4, this.provider.call({\n                    to: addr,\n                    data: (0, bytes_1.hexConcat)([\"0x6352211e\", tokenId])\n                  })];\n                case 11:\n                  tokenOwner = _d.apply(_c, [_h.sent()]);\n                  if (owner !== tokenOwner) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"owner\", content: tokenOwner });\n                  return [3, 14];\n                case 12:\n                  if (!(match[1] === \"erc1155\")) return [3, 14];\n                  _f = (_e = bignumber_1.BigNumber).from;\n                  return [4, this.provider.call({\n                    to: addr,\n                    data: (0, bytes_1.hexConcat)([\"0x00fdd58e\", (0, bytes_1.hexZeroPad)(owner, 32), tokenId])\n                  })];\n                case 13:\n                  balance = _f.apply(_e, [_h.sent()]);\n                  if (balance.isZero()) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"balance\", content: balance.toString() });\n                  _h.label = 14;\n                case 14:\n                  tx = {\n                    to: this.provider.formatter.address(comps[0]),\n                    data: (0, bytes_1.hexConcat)([selector, tokenId])\n                  };\n                  _g = _parseString;\n                  return [4, this.provider.call(tx)];\n                case 15:\n                  metadataUrl = _g.apply(void 0, [_h.sent()]);\n                  if (metadataUrl == null) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"metadata-url\", content: metadataUrl });\n                  if (match[1] === \"erc1155\") {\n                    metadataUrl = metadataUrl.replace(\"{id}\", tokenId.substring(2));\n                  }\n                  return [4, (0, web_1.fetchJson)(metadataUrl)];\n                case 16:\n                  metadata = _h.sent();\n                  if (!metadata || typeof metadata.image !== \"string\" || !metadata.image.match(/^(https:\\/\\/|data:)/i)) {\n                    return [2, null];\n                  }\n                  linkage.push({ type: \"metadata\", content: JSON.stringify(metadata) });\n                  linkage.push({ type: \"url\", content: metadata.image });\n                  return [2, { linkage, url: metadata.image }];\n                case 17:\n                  i++;\n                  return [3, 3];\n                case 18:\n                  return [3, 20];\n                case 19:\n                  error_3 = _h.sent();\n                  return [3, 20];\n                case 20:\n                  return [2, null];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getContentHash = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var hexBytes, ipfs, length_4, swarm;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._fetchBytes(\"0xbc1c58d1\")];\n                case 1:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  ipfs = hexBytes.match(/^0xe3010170(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/);\n                  if (ipfs) {\n                    length_4 = parseInt(ipfs[3], 16);\n                    if (ipfs[4].length === length_4 * 2) {\n                      return [2, \"ipfs://\" + basex_1.Base58.encode(\"0x\" + ipfs[1])];\n                    }\n                  }\n                  swarm = hexBytes.match(/^0xe40101fa011b20([0-9a-f]*)$/);\n                  if (swarm) {\n                    if (swarm[1].length === 32 * 2) {\n                      return [2, \"bzz://\" + swarm[1]];\n                    }\n                  }\n                  return [2, logger.throwError(\"invalid or unsupported content hash data\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                    operation: \"getContentHash()\",\n                    data: hexBytes\n                  })];\n              }\n            });\n          });\n        };\n        Resolver2.prototype.getText = function(key) {\n          return __awaiter(this, void 0, void 0, function() {\n            var keyBytes, hexBytes;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  keyBytes = (0, strings_1.toUtf8Bytes)(key);\n                  keyBytes = (0, bytes_1.concat)([bytes32ify(64), bytes32ify(keyBytes.length), keyBytes]);\n                  if (keyBytes.length % 32 !== 0) {\n                    keyBytes = (0, bytes_1.concat)([keyBytes, (0, bytes_1.hexZeroPad)(\"0x\", 32 - key.length % 32)]);\n                  }\n                  return [4, this._fetchBytes(\"0x59d1d43c\", (0, bytes_1.hexlify)(keyBytes))];\n                case 1:\n                  hexBytes = _a.sent();\n                  if (hexBytes == null || hexBytes === \"0x\") {\n                    return [2, null];\n                  }\n                  return [2, (0, strings_1.toUtf8String)(hexBytes)];\n              }\n            });\n          });\n        };\n        return Resolver2;\n      }()\n    );\n    exports2.Resolver = Resolver;\n    var defaultFormatter = null;\n    var nextPollId = 1;\n    var BaseProvider = (\n      /** @class */\n      function(_super) {\n        __extends(BaseProvider2, _super);\n        function BaseProvider2(network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, abstract_provider_1.Provider);\n          _this = _super.call(this) || this;\n          _this._events = [];\n          _this._emitted = { block: -2 };\n          _this.formatter = _newTarget.getFormatter();\n          (0, properties_1.defineReadOnly)(_this, \"anyNetwork\", network === \"any\");\n          if (_this.anyNetwork) {\n            network = _this.detectNetwork();\n          }\n          if (network instanceof Promise) {\n            _this._networkPromise = network;\n            network.catch(function(error) {\n            });\n            _this._ready().catch(function(error) {\n            });\n          } else {\n            var knownNetwork = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n            if (knownNetwork) {\n              (0, properties_1.defineReadOnly)(_this, \"_network\", knownNetwork);\n              _this.emit(\"network\", knownNetwork, null);\n            } else {\n              logger.throwArgumentError(\"invalid network\", \"network\", network);\n            }\n          }\n          _this._maxInternalBlockNumber = -1024;\n          _this._lastBlockNumber = -2;\n          _this._pollingInterval = 4e3;\n          _this._fastQueryDate = 0;\n          return _this;\n        }\n        BaseProvider2.prototype._ready = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, error_4;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(this._network == null)) return [3, 7];\n                  network = null;\n                  if (!this._networkPromise) return [3, 4];\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  return [4, this._networkPromise];\n                case 2:\n                  network = _a.sent();\n                  return [3, 4];\n                case 3:\n                  error_4 = _a.sent();\n                  return [3, 4];\n                case 4:\n                  if (!(network == null)) return [3, 6];\n                  return [4, this.detectNetwork()];\n                case 5:\n                  network = _a.sent();\n                  _a.label = 6;\n                case 6:\n                  if (!network) {\n                    logger.throwError(\"no network detected\", logger_1.Logger.errors.UNKNOWN_ERROR, {});\n                  }\n                  if (this._network == null) {\n                    if (this.anyNetwork) {\n                      this._network = network;\n                    } else {\n                      (0, properties_1.defineReadOnly)(this, \"_network\", network);\n                    }\n                    this.emit(\"network\", network, null);\n                  }\n                  _a.label = 7;\n                case 7:\n                  return [2, this._network];\n              }\n            });\n          });\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"ready\", {\n          // This will always return the most recently established network.\n          // For \"any\", this can change (a \"network\" event is emitted before\n          // any change is reflected); otherwise this cannot change\n          get: function() {\n            var _this = this;\n            return (0, web_1.poll)(function() {\n              return _this._ready().then(function(network) {\n                return network;\n              }, function(error) {\n                if (error.code === logger_1.Logger.errors.NETWORK_ERROR && error.event === \"noNetwork\") {\n                  return void 0;\n                }\n                throw error;\n              });\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.getFormatter = function() {\n          if (defaultFormatter == null) {\n            defaultFormatter = new formatter_1.Formatter();\n          }\n          return defaultFormatter;\n        };\n        BaseProvider2.getNetwork = function(network) {\n          return (0, networks_1.getNetwork)(network == null ? \"homestead\" : network);\n        };\n        BaseProvider2.prototype._getInternalBlockNumber = function(maxAge) {\n          return __awaiter(this, void 0, void 0, function() {\n            var internalBlockNumber, result, error_5, reqTime, checkInternalBlockNumber;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._ready()];\n                case 1:\n                  _a.sent();\n                  if (!(maxAge > 0)) return [3, 7];\n                  _a.label = 2;\n                case 2:\n                  if (!this._internalBlockNumber) return [3, 7];\n                  internalBlockNumber = this._internalBlockNumber;\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, internalBlockNumber];\n                case 4:\n                  result = _a.sent();\n                  if (getTime() - result.respTime <= maxAge) {\n                    return [2, result.blockNumber];\n                  }\n                  return [3, 7];\n                case 5:\n                  error_5 = _a.sent();\n                  if (this._internalBlockNumber === internalBlockNumber) {\n                    return [3, 7];\n                  }\n                  return [3, 6];\n                case 6:\n                  return [3, 2];\n                case 7:\n                  reqTime = getTime();\n                  checkInternalBlockNumber = (0, properties_1.resolveProperties)({\n                    blockNumber: this.perform(\"getBlockNumber\", {}),\n                    networkError: this.getNetwork().then(function(network) {\n                      return null;\n                    }, function(error) {\n                      return error;\n                    })\n                  }).then(function(_a2) {\n                    var blockNumber = _a2.blockNumber, networkError = _a2.networkError;\n                    if (networkError) {\n                      if (_this._internalBlockNumber === checkInternalBlockNumber) {\n                        _this._internalBlockNumber = null;\n                      }\n                      throw networkError;\n                    }\n                    var respTime = getTime();\n                    blockNumber = bignumber_1.BigNumber.from(blockNumber).toNumber();\n                    if (blockNumber < _this._maxInternalBlockNumber) {\n                      blockNumber = _this._maxInternalBlockNumber;\n                    }\n                    _this._maxInternalBlockNumber = blockNumber;\n                    _this._setFastBlockNumber(blockNumber);\n                    return { blockNumber, reqTime, respTime };\n                  });\n                  this._internalBlockNumber = checkInternalBlockNumber;\n                  checkInternalBlockNumber.catch(function(error) {\n                    if (_this._internalBlockNumber === checkInternalBlockNumber) {\n                      _this._internalBlockNumber = null;\n                    }\n                  });\n                  return [4, checkInternalBlockNumber];\n                case 8:\n                  return [2, _a.sent().blockNumber];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.poll = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var pollId, runners, blockNumber, error_6, i;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  pollId = nextPollId++;\n                  runners = [];\n                  blockNumber = null;\n                  _a.label = 1;\n                case 1:\n                  _a.trys.push([1, 3, , 4]);\n                  return [4, this._getInternalBlockNumber(100 + this.pollingInterval / 2)];\n                case 2:\n                  blockNumber = _a.sent();\n                  return [3, 4];\n                case 3:\n                  error_6 = _a.sent();\n                  this.emit(\"error\", error_6);\n                  return [\n                    2\n                    /*return*/\n                  ];\n                case 4:\n                  this._setFastBlockNumber(blockNumber);\n                  this.emit(\"poll\", pollId, blockNumber);\n                  if (blockNumber === this._lastBlockNumber) {\n                    this.emit(\"didPoll\", pollId);\n                    return [\n                      2\n                      /*return*/\n                    ];\n                  }\n                  if (this._emitted.block === -2) {\n                    this._emitted.block = blockNumber - 1;\n                  }\n                  if (Math.abs(this._emitted.block - blockNumber) > 1e3) {\n                    logger.warn(\"network block skew detected; skipping block events (emitted=\" + this._emitted.block + \" blockNumber\" + blockNumber + \")\");\n                    this.emit(\"error\", logger.makeError(\"network block skew detected\", logger_1.Logger.errors.NETWORK_ERROR, {\n                      blockNumber,\n                      event: \"blockSkew\",\n                      previousBlockNumber: this._emitted.block\n                    }));\n                    this.emit(\"block\", blockNumber);\n                  } else {\n                    for (i = this._emitted.block + 1; i <= blockNumber; i++) {\n                      this.emit(\"block\", i);\n                    }\n                  }\n                  if (this._emitted.block !== blockNumber) {\n                    this._emitted.block = blockNumber;\n                    Object.keys(this._emitted).forEach(function(key) {\n                      if (key === \"block\") {\n                        return;\n                      }\n                      var eventBlockNumber = _this._emitted[key];\n                      if (eventBlockNumber === \"pending\") {\n                        return;\n                      }\n                      if (blockNumber - eventBlockNumber > 12) {\n                        delete _this._emitted[key];\n                      }\n                    });\n                  }\n                  if (this._lastBlockNumber === -2) {\n                    this._lastBlockNumber = blockNumber - 1;\n                  }\n                  this._events.forEach(function(event) {\n                    switch (event.type) {\n                      case \"tx\": {\n                        var hash_2 = event.hash;\n                        var runner = _this.getTransactionReceipt(hash_2).then(function(receipt) {\n                          if (!receipt || receipt.blockNumber == null) {\n                            return null;\n                          }\n                          _this._emitted[\"t:\" + hash_2] = receipt.blockNumber;\n                          _this.emit(hash_2, receipt);\n                          return null;\n                        }).catch(function(error) {\n                          _this.emit(\"error\", error);\n                        });\n                        runners.push(runner);\n                        break;\n                      }\n                      case \"filter\": {\n                        var filter_1 = event.filter;\n                        filter_1.fromBlock = _this._lastBlockNumber + 1;\n                        filter_1.toBlock = blockNumber;\n                        var runner = _this.getLogs(filter_1).then(function(logs) {\n                          if (logs.length === 0) {\n                            return;\n                          }\n                          logs.forEach(function(log) {\n                            _this._emitted[\"b:\" + log.blockHash] = log.blockNumber;\n                            _this._emitted[\"t:\" + log.transactionHash] = log.blockNumber;\n                            _this.emit(filter_1, log);\n                          });\n                        }).catch(function(error) {\n                          _this.emit(\"error\", error);\n                        });\n                        runners.push(runner);\n                        break;\n                      }\n                    }\n                  });\n                  this._lastBlockNumber = blockNumber;\n                  Promise.all(runners).then(function() {\n                    _this.emit(\"didPoll\", pollId);\n                  }).catch(function(error) {\n                    _this.emit(\"error\", error);\n                  });\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.resetEventsBlock = function(blockNumber) {\n          this._lastBlockNumber = blockNumber - 1;\n          if (this.polling) {\n            this.poll();\n          }\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"network\", {\n          get: function() {\n            return this._network;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, logger.throwError(\"provider does not support network detection\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"provider.detectNetwork\"\n              })];\n            });\n          });\n        };\n        BaseProvider2.prototype.getNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, currentNetwork, error;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this._ready()];\n                case 1:\n                  network = _a.sent();\n                  return [4, this.detectNetwork()];\n                case 2:\n                  currentNetwork = _a.sent();\n                  if (!(network.chainId !== currentNetwork.chainId)) return [3, 5];\n                  if (!this.anyNetwork) return [3, 4];\n                  this._network = currentNetwork;\n                  this._lastBlockNumber = -2;\n                  this._fastBlockNumber = null;\n                  this._fastBlockNumberPromise = null;\n                  this._fastQueryDate = 0;\n                  this._emitted.block = -2;\n                  this._maxInternalBlockNumber = -1024;\n                  this._internalBlockNumber = null;\n                  this.emit(\"network\", currentNetwork, network);\n                  return [4, stall(0)];\n                case 3:\n                  _a.sent();\n                  return [2, this._network];\n                case 4:\n                  error = logger.makeError(\"underlying network changed\", logger_1.Logger.errors.NETWORK_ERROR, {\n                    event: \"changed\",\n                    network,\n                    detectedNetwork: currentNetwork\n                  });\n                  this.emit(\"error\", error);\n                  throw error;\n                case 5:\n                  return [2, network];\n              }\n            });\n          });\n        };\n        Object.defineProperty(BaseProvider2.prototype, \"blockNumber\", {\n          get: function() {\n            var _this = this;\n            this._getInternalBlockNumber(100 + this.pollingInterval / 2).then(function(blockNumber) {\n              _this._setFastBlockNumber(blockNumber);\n            }, function(error) {\n            });\n            return this._fastBlockNumber != null ? this._fastBlockNumber : -1;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(BaseProvider2.prototype, \"polling\", {\n          get: function() {\n            return this._poller != null;\n          },\n          set: function(value) {\n            var _this = this;\n            if (value && !this._poller) {\n              this._poller = setInterval(function() {\n                _this.poll();\n              }, this.pollingInterval);\n              if (!this._bootstrapPoll) {\n                this._bootstrapPoll = setTimeout(function() {\n                  _this.poll();\n                  _this._bootstrapPoll = setTimeout(function() {\n                    if (!_this._poller) {\n                      _this.poll();\n                    }\n                    _this._bootstrapPoll = null;\n                  }, _this.pollingInterval);\n                }, 0);\n              }\n            } else if (!value && this._poller) {\n              clearInterval(this._poller);\n              this._poller = null;\n            }\n          },\n          enumerable: false,\n          configurable: true\n        });\n        Object.defineProperty(BaseProvider2.prototype, \"pollingInterval\", {\n          get: function() {\n            return this._pollingInterval;\n          },\n          set: function(value) {\n            var _this = this;\n            if (typeof value !== \"number\" || value <= 0 || parseInt(String(value)) != value) {\n              throw new Error(\"invalid polling interval\");\n            }\n            this._pollingInterval = value;\n            if (this._poller) {\n              clearInterval(this._poller);\n              this._poller = setInterval(function() {\n                _this.poll();\n              }, this._pollingInterval);\n            }\n          },\n          enumerable: false,\n          configurable: true\n        });\n        BaseProvider2.prototype._getFastBlockNumber = function() {\n          var _this = this;\n          var now = getTime();\n          if (now - this._fastQueryDate > 2 * this._pollingInterval) {\n            this._fastQueryDate = now;\n            this._fastBlockNumberPromise = this.getBlockNumber().then(function(blockNumber) {\n              if (_this._fastBlockNumber == null || blockNumber > _this._fastBlockNumber) {\n                _this._fastBlockNumber = blockNumber;\n              }\n              return _this._fastBlockNumber;\n            });\n          }\n          return this._fastBlockNumberPromise;\n        };\n        BaseProvider2.prototype._setFastBlockNumber = function(blockNumber) {\n          if (this._fastBlockNumber != null && blockNumber < this._fastBlockNumber) {\n            return;\n          }\n          this._fastQueryDate = getTime();\n          if (this._fastBlockNumber == null || blockNumber > this._fastBlockNumber) {\n            this._fastBlockNumber = blockNumber;\n            this._fastBlockNumberPromise = Promise.resolve(blockNumber);\n          }\n        };\n        BaseProvider2.prototype.waitForTransaction = function(transactionHash, confirmations, timeout) {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this._waitForTransaction(transactionHash, confirmations == null ? 1 : confirmations, timeout || 0, null)];\n            });\n          });\n        };\n        BaseProvider2.prototype._waitForTransaction = function(transactionHash, confirmations, timeout, replaceable) {\n          return __awaiter(this, void 0, void 0, function() {\n            var receipt;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getTransactionReceipt(transactionHash)];\n                case 1:\n                  receipt = _a.sent();\n                  if ((receipt ? receipt.confirmations : 0) >= confirmations) {\n                    return [2, receipt];\n                  }\n                  return [2, new Promise(function(resolve, reject) {\n                    var cancelFuncs = [];\n                    var done = false;\n                    var alreadyDone = function() {\n                      if (done) {\n                        return true;\n                      }\n                      done = true;\n                      cancelFuncs.forEach(function(func) {\n                        func();\n                      });\n                      return false;\n                    };\n                    var minedHandler = function(receipt2) {\n                      if (receipt2.confirmations < confirmations) {\n                        return;\n                      }\n                      if (alreadyDone()) {\n                        return;\n                      }\n                      resolve(receipt2);\n                    };\n                    _this.on(transactionHash, minedHandler);\n                    cancelFuncs.push(function() {\n                      _this.removeListener(transactionHash, minedHandler);\n                    });\n                    if (replaceable) {\n                      var lastBlockNumber_1 = replaceable.startBlock;\n                      var scannedBlock_1 = null;\n                      var replaceHandler_1 = function(blockNumber) {\n                        return __awaiter(_this, void 0, void 0, function() {\n                          var _this2 = this;\n                          return __generator(this, function(_a2) {\n                            switch (_a2.label) {\n                              case 0:\n                                if (done) {\n                                  return [\n                                    2\n                                    /*return*/\n                                  ];\n                                }\n                                return [4, stall(1e3)];\n                              case 1:\n                                _a2.sent();\n                                this.getTransactionCount(replaceable.from).then(function(nonce) {\n                                  return __awaiter(_this2, void 0, void 0, function() {\n                                    var mined, block, ti, tx, receipt_1, reason;\n                                    return __generator(this, function(_a3) {\n                                      switch (_a3.label) {\n                                        case 0:\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (!(nonce <= replaceable.nonce)) return [3, 1];\n                                          lastBlockNumber_1 = blockNumber;\n                                          return [3, 9];\n                                        case 1:\n                                          return [4, this.getTransaction(transactionHash)];\n                                        case 2:\n                                          mined = _a3.sent();\n                                          if (mined && mined.blockNumber != null) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (scannedBlock_1 == null) {\n                                            scannedBlock_1 = lastBlockNumber_1 - 3;\n                                            if (scannedBlock_1 < replaceable.startBlock) {\n                                              scannedBlock_1 = replaceable.startBlock;\n                                            }\n                                          }\n                                          _a3.label = 3;\n                                        case 3:\n                                          if (!(scannedBlock_1 <= blockNumber)) return [3, 9];\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          return [4, this.getBlockWithTransactions(scannedBlock_1)];\n                                        case 4:\n                                          block = _a3.sent();\n                                          ti = 0;\n                                          _a3.label = 5;\n                                        case 5:\n                                          if (!(ti < block.transactions.length)) return [3, 8];\n                                          tx = block.transactions[ti];\n                                          if (tx.hash === transactionHash) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          if (!(tx.from === replaceable.from && tx.nonce === replaceable.nonce)) return [3, 7];\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          return [4, this.waitForTransaction(tx.hash, confirmations)];\n                                        case 6:\n                                          receipt_1 = _a3.sent();\n                                          if (alreadyDone()) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          reason = \"replaced\";\n                                          if (tx.data === replaceable.data && tx.to === replaceable.to && tx.value.eq(replaceable.value)) {\n                                            reason = \"repriced\";\n                                          } else if (tx.data === \"0x\" && tx.from === tx.to && tx.value.isZero()) {\n                                            reason = \"cancelled\";\n                                          }\n                                          reject(logger.makeError(\"transaction was replaced\", logger_1.Logger.errors.TRANSACTION_REPLACED, {\n                                            cancelled: reason === \"replaced\" || reason === \"cancelled\",\n                                            reason,\n                                            replacement: this._wrapTransaction(tx),\n                                            hash: transactionHash,\n                                            receipt: receipt_1\n                                          }));\n                                          return [\n                                            2\n                                            /*return*/\n                                          ];\n                                        case 7:\n                                          ti++;\n                                          return [3, 5];\n                                        case 8:\n                                          scannedBlock_1++;\n                                          return [3, 3];\n                                        case 9:\n                                          if (done) {\n                                            return [\n                                              2\n                                              /*return*/\n                                            ];\n                                          }\n                                          this.once(\"block\", replaceHandler_1);\n                                          return [\n                                            2\n                                            /*return*/\n                                          ];\n                                      }\n                                    });\n                                  });\n                                }, function(error) {\n                                  if (done) {\n                                    return;\n                                  }\n                                  _this2.once(\"block\", replaceHandler_1);\n                                });\n                                return [\n                                  2\n                                  /*return*/\n                                ];\n                            }\n                          });\n                        });\n                      };\n                      if (done) {\n                        return;\n                      }\n                      _this.once(\"block\", replaceHandler_1);\n                      cancelFuncs.push(function() {\n                        _this.removeListener(\"block\", replaceHandler_1);\n                      });\n                    }\n                    if (typeof timeout === \"number\" && timeout > 0) {\n                      var timer_1 = setTimeout(function() {\n                        if (alreadyDone()) {\n                          return;\n                        }\n                        reject(logger.makeError(\"timeout exceeded\", logger_1.Logger.errors.TIMEOUT, { timeout }));\n                      }, timeout);\n                      if (timer_1.unref) {\n                        timer_1.unref();\n                      }\n                      cancelFuncs.push(function() {\n                        clearTimeout(timer_1);\n                      });\n                    }\n                  })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBlockNumber = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this._getInternalBlockNumber(0)];\n            });\n          });\n        };\n        BaseProvider2.prototype.getGasPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, this.perform(\"getGasPrice\", {})];\n                case 2:\n                  result = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getGasPrice\",\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBalance = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getBalance\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getBalance\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getTransactionCount = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getTransactionCount\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result).toNumber()];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getTransactionCount\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getCode = function(addressOrName, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getCode\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getCode\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getStorageAt = function(addressOrName, position, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    address: this._getAddress(addressOrName),\n                    blockTag: this._getBlockTag(blockTag),\n                    position: Promise.resolve(position).then(function(p) {\n                      return (0, bytes_1.hexValue)(p);\n                    })\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getStorageAt\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"getStorageAt\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._wrapTransaction = function(tx, hash, startBlock) {\n          var _this = this;\n          if (hash != null && (0, bytes_1.hexDataLength)(hash) !== 32) {\n            throw new Error(\"invalid response - sendTransaction\");\n          }\n          var result = tx;\n          if (hash != null && tx.hash !== hash) {\n            logger.throwError(\"Transaction hash mismatch from Provider.sendTransaction.\", logger_1.Logger.errors.UNKNOWN_ERROR, { expectedHash: tx.hash, returnedHash: hash });\n          }\n          result.wait = function(confirms, timeout) {\n            return __awaiter(_this, void 0, void 0, function() {\n              var replacement, receipt;\n              return __generator(this, function(_a) {\n                switch (_a.label) {\n                  case 0:\n                    if (confirms == null) {\n                      confirms = 1;\n                    }\n                    if (timeout == null) {\n                      timeout = 0;\n                    }\n                    replacement = void 0;\n                    if (confirms !== 0 && startBlock != null) {\n                      replacement = {\n                        data: tx.data,\n                        from: tx.from,\n                        nonce: tx.nonce,\n                        to: tx.to,\n                        value: tx.value,\n                        startBlock\n                      };\n                    }\n                    return [4, this._waitForTransaction(tx.hash, confirms, timeout, replacement)];\n                  case 1:\n                    receipt = _a.sent();\n                    if (receipt == null && confirms === 0) {\n                      return [2, null];\n                    }\n                    this._emitted[\"t:\" + tx.hash] = receipt.blockNumber;\n                    if (receipt.status === 0) {\n                      logger.throwError(\"transaction failed\", logger_1.Logger.errors.CALL_EXCEPTION, {\n                        transactionHash: tx.hash,\n                        transaction: tx,\n                        receipt\n                      });\n                    }\n                    return [2, receipt];\n                }\n              });\n            });\n          };\n          return result;\n        };\n        BaseProvider2.prototype.sendTransaction = function(signedTransaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var hexTx, tx, blockNumber, hash, error_7;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, Promise.resolve(signedTransaction).then(function(t) {\n                    return (0, bytes_1.hexlify)(t);\n                  })];\n                case 2:\n                  hexTx = _a.sent();\n                  tx = this.formatter.transaction(signedTransaction);\n                  if (tx.confirmations == null) {\n                    tx.confirmations = 0;\n                  }\n                  return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                case 3:\n                  blockNumber = _a.sent();\n                  _a.label = 4;\n                case 4:\n                  _a.trys.push([4, 6, , 7]);\n                  return [4, this.perform(\"sendTransaction\", { signedTransaction: hexTx })];\n                case 5:\n                  hash = _a.sent();\n                  return [2, this._wrapTransaction(tx, hash, blockNumber)];\n                case 6:\n                  error_7 = _a.sent();\n                  error_7.transaction = tx;\n                  error_7.transactionHash = tx.hash;\n                  throw error_7;\n                case 7:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getTransactionRequest = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var values, tx, _a, _b;\n            var _this = this;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, transaction];\n                case 1:\n                  values = _c.sent();\n                  tx = {};\n                  [\"from\", \"to\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? _this._getAddress(v) : null;\n                    });\n                  });\n                  [\"gasLimit\", \"gasPrice\", \"maxFeePerGas\", \"maxPriorityFeePerGas\", \"value\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? bignumber_1.BigNumber.from(v) : null;\n                    });\n                  });\n                  [\"type\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v != null ? v : null;\n                    });\n                  });\n                  if (values.accessList) {\n                    tx.accessList = this.formatter.accessList(values.accessList);\n                  }\n                  [\"data\"].forEach(function(key) {\n                    if (values[key] == null) {\n                      return;\n                    }\n                    tx[key] = Promise.resolve(values[key]).then(function(v) {\n                      return v ? (0, bytes_1.hexlify)(v) : null;\n                    });\n                  });\n                  _b = (_a = this.formatter).transactionRequest;\n                  return [4, (0, properties_1.resolveProperties)(tx)];\n                case 2:\n                  return [2, _b.apply(_a, [_c.sent()])];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getFilter = function(filter) {\n          return __awaiter(this, void 0, void 0, function() {\n            var result, _a, _b;\n            var _this = this;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, filter];\n                case 1:\n                  filter = _c.sent();\n                  result = {};\n                  if (filter.address != null) {\n                    result.address = this._getAddress(filter.address);\n                  }\n                  [\"blockHash\", \"topics\"].forEach(function(key) {\n                    if (filter[key] == null) {\n                      return;\n                    }\n                    result[key] = filter[key];\n                  });\n                  [\"fromBlock\", \"toBlock\"].forEach(function(key) {\n                    if (filter[key] == null) {\n                      return;\n                    }\n                    result[key] = _this._getBlockTag(filter[key]);\n                  });\n                  _b = (_a = this.formatter).filter;\n                  return [4, (0, properties_1.resolveProperties)(result)];\n                case 2:\n                  return [2, _b.apply(_a, [_c.sent()])];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.call = function(transaction, blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    transaction: this._getTransactionRequest(transaction),\n                    blockTag: this._getBlockTag(blockTag)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"call\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, (0, bytes_1.hexlify)(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"call\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.estimateGas = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({\n                    transaction: this._getTransactionRequest(transaction)\n                  })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"estimateGas\", params)];\n                case 3:\n                  result = _a.sent();\n                  try {\n                    return [2, bignumber_1.BigNumber.from(result)];\n                  } catch (error) {\n                    return [2, logger.throwError(\"bad result from backend\", logger_1.Logger.errors.SERVER_ERROR, {\n                      method: \"estimateGas\",\n                      params,\n                      result,\n                      error\n                    })];\n                  }\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getAddress = function(addressOrName) {\n          return __awaiter(this, void 0, void 0, function() {\n            var address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, addressOrName];\n                case 1:\n                  addressOrName = _a.sent();\n                  if (typeof addressOrName !== \"string\") {\n                    logger.throwArgumentError(\"invalid address or ENS name\", \"name\", addressOrName);\n                  }\n                  return [4, this.resolveName(addressOrName)];\n                case 2:\n                  address = _a.sent();\n                  if (address == null) {\n                    logger.throwError(\"ENS name not configured\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                      operation: \"resolveName(\" + JSON.stringify(addressOrName) + \")\"\n                    });\n                  }\n                  return [2, address];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getBlock = function(blockHashOrBlockTag, includeTransactions) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber, params, _a, error_8;\n            var _this = this;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _b.sent();\n                  return [4, blockHashOrBlockTag];\n                case 2:\n                  blockHashOrBlockTag = _b.sent();\n                  blockNumber = -128;\n                  params = {\n                    includeTransactions: !!includeTransactions\n                  };\n                  if (!(0, bytes_1.isHexString)(blockHashOrBlockTag, 32)) return [3, 3];\n                  params.blockHash = blockHashOrBlockTag;\n                  return [3, 6];\n                case 3:\n                  _b.trys.push([3, 5, , 6]);\n                  _a = params;\n                  return [4, this._getBlockTag(blockHashOrBlockTag)];\n                case 4:\n                  _a.blockTag = _b.sent();\n                  if ((0, bytes_1.isHexString)(params.blockTag)) {\n                    blockNumber = parseInt(params.blockTag.substring(2), 16);\n                  }\n                  return [3, 6];\n                case 5:\n                  error_8 = _b.sent();\n                  logger.throwArgumentError(\"invalid block hash or block tag\", \"blockHashOrBlockTag\", blockHashOrBlockTag);\n                  return [3, 6];\n                case 6:\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var block, blockNumber_1, i, tx, confirmations, blockWithTxs;\n                      var _this2 = this;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getBlock\", params)];\n                          case 1:\n                            block = _a2.sent();\n                            if (block == null) {\n                              if (params.blockHash != null) {\n                                if (this._emitted[\"b:\" + params.blockHash] == null) {\n                                  return [2, null];\n                                }\n                              }\n                              if (params.blockTag != null) {\n                                if (blockNumber > this._emitted.block) {\n                                  return [2, null];\n                                }\n                              }\n                              return [2, void 0];\n                            }\n                            if (!includeTransactions) return [3, 8];\n                            blockNumber_1 = null;\n                            i = 0;\n                            _a2.label = 2;\n                          case 2:\n                            if (!(i < block.transactions.length)) return [3, 7];\n                            tx = block.transactions[i];\n                            if (!(tx.blockNumber == null)) return [3, 3];\n                            tx.confirmations = 0;\n                            return [3, 6];\n                          case 3:\n                            if (!(tx.confirmations == null)) return [3, 6];\n                            if (!(blockNumber_1 == null)) return [3, 5];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 4:\n                            blockNumber_1 = _a2.sent();\n                            _a2.label = 5;\n                          case 5:\n                            confirmations = blockNumber_1 - tx.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            tx.confirmations = confirmations;\n                            _a2.label = 6;\n                          case 6:\n                            i++;\n                            return [3, 2];\n                          case 7:\n                            blockWithTxs = this.formatter.blockWithTransactions(block);\n                            blockWithTxs.transactions = blockWithTxs.transactions.map(function(tx2) {\n                              return _this2._wrapTransaction(tx2);\n                            });\n                            return [2, blockWithTxs];\n                          case 8:\n                            return [2, this.formatter.block(block)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getBlock = function(blockHashOrBlockTag) {\n          return this._getBlock(blockHashOrBlockTag, false);\n        };\n        BaseProvider2.prototype.getBlockWithTransactions = function(blockHashOrBlockTag) {\n          return this._getBlock(blockHashOrBlockTag, true);\n        };\n        BaseProvider2.prototype.getTransaction = function(transactionHash) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, transactionHash];\n                case 2:\n                  transactionHash = _a.sent();\n                  params = { transactionHash: this.formatter.hash(transactionHash, true) };\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var result, tx, blockNumber, confirmations;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getTransaction\", params)];\n                          case 1:\n                            result = _a2.sent();\n                            if (result == null) {\n                              if (this._emitted[\"t:\" + transactionHash] == null) {\n                                return [2, null];\n                              }\n                              return [2, void 0];\n                            }\n                            tx = this.formatter.transactionResponse(result);\n                            if (!(tx.blockNumber == null)) return [3, 2];\n                            tx.confirmations = 0;\n                            return [3, 4];\n                          case 2:\n                            if (!(tx.confirmations == null)) return [3, 4];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 3:\n                            blockNumber = _a2.sent();\n                            confirmations = blockNumber - tx.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            tx.confirmations = confirmations;\n                            _a2.label = 4;\n                          case 4:\n                            return [2, this._wrapTransaction(tx)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getTransactionReceipt = function(transactionHash) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, transactionHash];\n                case 2:\n                  transactionHash = _a.sent();\n                  params = { transactionHash: this.formatter.hash(transactionHash, true) };\n                  return [2, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var result, receipt, blockNumber, confirmations;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.perform(\"getTransactionReceipt\", params)];\n                          case 1:\n                            result = _a2.sent();\n                            if (result == null) {\n                              if (this._emitted[\"t:\" + transactionHash] == null) {\n                                return [2, null];\n                              }\n                              return [2, void 0];\n                            }\n                            if (result.blockHash == null) {\n                              return [2, void 0];\n                            }\n                            receipt = this.formatter.receipt(result);\n                            if (!(receipt.blockNumber == null)) return [3, 2];\n                            receipt.confirmations = 0;\n                            return [3, 4];\n                          case 2:\n                            if (!(receipt.confirmations == null)) return [3, 4];\n                            return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                          case 3:\n                            blockNumber = _a2.sent();\n                            confirmations = blockNumber - receipt.blockNumber + 1;\n                            if (confirmations <= 0) {\n                              confirmations = 1;\n                            }\n                            receipt.confirmations = confirmations;\n                            _a2.label = 4;\n                          case 4:\n                            return [2, receipt];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this })];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getLogs = function(filter) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, logs;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [4, (0, properties_1.resolveProperties)({ filter: this._getFilter(filter) })];\n                case 2:\n                  params = _a.sent();\n                  return [4, this.perform(\"getLogs\", params)];\n                case 3:\n                  logs = _a.sent();\n                  logs.forEach(function(log) {\n                    if (log.removed == null) {\n                      log.removed = false;\n                    }\n                  });\n                  return [2, formatter_1.Formatter.arrayOf(this.formatter.filterLog.bind(this.formatter))(logs)];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getEtherPrice = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  _a.sent();\n                  return [2, this.perform(\"getEtherPrice\", {})];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getBlockTag = function(blockTag) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, blockTag];\n                case 1:\n                  blockTag = _a.sent();\n                  if (!(typeof blockTag === \"number\" && blockTag < 0)) return [3, 3];\n                  if (blockTag % 1) {\n                    logger.throwArgumentError(\"invalid BlockTag\", \"blockTag\", blockTag);\n                  }\n                  return [4, this._getInternalBlockNumber(100 + 2 * this.pollingInterval)];\n                case 2:\n                  blockNumber = _a.sent();\n                  blockNumber += blockTag;\n                  if (blockNumber < 0) {\n                    blockNumber = 0;\n                  }\n                  return [2, this.formatter.blockTag(blockNumber)];\n                case 3:\n                  return [2, this.formatter.blockTag(blockTag)];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getResolver = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var address, error_9;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  _a.trys.push([0, 2, , 3]);\n                  return [4, this._getResolver(name2)];\n                case 1:\n                  address = _a.sent();\n                  if (address == null) {\n                    return [2, null];\n                  }\n                  return [2, new Resolver(this, address, name2)];\n                case 2:\n                  error_9 = _a.sent();\n                  if (error_9.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  return [2, null];\n                case 3:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype._getResolver = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var network, transaction, _a, _b, error_10;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  return [4, this.getNetwork()];\n                case 1:\n                  network = _c.sent();\n                  if (!network.ensAddress) {\n                    logger.throwError(\"network does not support ENS\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"ENS\", network: network.name });\n                  }\n                  transaction = {\n                    to: network.ensAddress,\n                    data: \"0x0178b8bf\" + (0, hash_1.namehash)(name2).substring(2)\n                  };\n                  _c.label = 2;\n                case 2:\n                  _c.trys.push([2, 4, , 5]);\n                  _b = (_a = this.formatter).callAddress;\n                  return [4, this.call(transaction)];\n                case 3:\n                  return [2, _b.apply(_a, [_c.sent()])];\n                case 4:\n                  error_10 = _c.sent();\n                  if (error_10.code === logger_1.Logger.errors.CALL_EXCEPTION) {\n                    return [2, null];\n                  }\n                  throw error_10;\n                case 5:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.resolveName = function(name2) {\n          return __awaiter(this, void 0, void 0, function() {\n            var resolver;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, name2];\n                case 1:\n                  name2 = _a.sent();\n                  try {\n                    return [2, Promise.resolve(this.formatter.address(name2))];\n                  } catch (error) {\n                    if ((0, bytes_1.isHexString)(name2)) {\n                      throw error;\n                    }\n                  }\n                  if (typeof name2 !== \"string\") {\n                    logger.throwArgumentError(\"invalid ENS name\", \"name\", name2);\n                  }\n                  return [4, this.getResolver(name2)];\n                case 2:\n                  resolver = _a.sent();\n                  if (!resolver) {\n                    return [2, null];\n                  }\n                  return [4, resolver.getAddress()];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.lookupAddress = function(address) {\n          return __awaiter(this, void 0, void 0, function() {\n            var reverseName, resolverAddress, bytes, _a, length, name2, addr;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  return [4, address];\n                case 1:\n                  address = _b.sent();\n                  address = this.formatter.address(address);\n                  reverseName = address.substring(2).toLowerCase() + \".addr.reverse\";\n                  return [4, this._getResolver(reverseName)];\n                case 2:\n                  resolverAddress = _b.sent();\n                  if (!resolverAddress) {\n                    return [2, null];\n                  }\n                  _a = bytes_1.arrayify;\n                  return [4, this.call({\n                    to: resolverAddress,\n                    data: \"0x691f3431\" + (0, hash_1.namehash)(reverseName).substring(2)\n                  })];\n                case 3:\n                  bytes = _a.apply(void 0, [_b.sent()]);\n                  if (bytes.length < 32 || !bignumber_1.BigNumber.from(bytes.slice(0, 32)).eq(32)) {\n                    return [2, null];\n                  }\n                  bytes = bytes.slice(32);\n                  if (bytes.length < 32) {\n                    return [2, null];\n                  }\n                  length = bignumber_1.BigNumber.from(bytes.slice(0, 32)).toNumber();\n                  bytes = bytes.slice(32);\n                  if (length > bytes.length) {\n                    return [2, null];\n                  }\n                  name2 = (0, strings_1.toUtf8String)(bytes.slice(0, length));\n                  return [4, this.resolveName(name2)];\n                case 4:\n                  addr = _b.sent();\n                  if (addr != address) {\n                    return [2, null];\n                  }\n                  return [2, name2];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.getAvatar = function(nameOrAddress) {\n          return __awaiter(this, void 0, void 0, function() {\n            var resolver, address, reverseName, resolverAddress, avatar;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  resolver = null;\n                  if (!(0, bytes_1.isHexString)(nameOrAddress)) return [3, 2];\n                  address = this.formatter.address(nameOrAddress);\n                  reverseName = address.substring(2).toLowerCase() + \".addr.reverse\";\n                  return [4, this._getResolver(reverseName)];\n                case 1:\n                  resolverAddress = _a.sent();\n                  if (!resolverAddress) {\n                    return [2, null];\n                  }\n                  resolver = new Resolver(this, resolverAddress, \"_\", address);\n                  return [3, 4];\n                case 2:\n                  return [4, this.getResolver(nameOrAddress)];\n                case 3:\n                  resolver = _a.sent();\n                  if (!resolver) {\n                    return [2, null];\n                  }\n                  _a.label = 4;\n                case 4:\n                  return [4, resolver.getAvatar()];\n                case 5:\n                  avatar = _a.sent();\n                  if (avatar == null) {\n                    return [2, null];\n                  }\n                  return [2, avatar.url];\n              }\n            });\n          });\n        };\n        BaseProvider2.prototype.perform = function(method, params) {\n          return logger.throwError(method + \" not implemented\", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method });\n        };\n        BaseProvider2.prototype._startEvent = function(event) {\n          this.polling = this._events.filter(function(e) {\n            return e.pollable();\n          }).length > 0;\n        };\n        BaseProvider2.prototype._stopEvent = function(event) {\n          this.polling = this._events.filter(function(e) {\n            return e.pollable();\n          }).length > 0;\n        };\n        BaseProvider2.prototype._addEventListener = function(eventName, listener, once) {\n          var event = new Event(getEventTag(eventName), listener, once);\n          this._events.push(event);\n          this._startEvent(event);\n          return this;\n        };\n        BaseProvider2.prototype.on = function(eventName, listener) {\n          return this._addEventListener(eventName, listener, false);\n        };\n        BaseProvider2.prototype.once = function(eventName, listener) {\n          return this._addEventListener(eventName, listener, true);\n        };\n        BaseProvider2.prototype.emit = function(eventName) {\n          var _this = this;\n          var args = [];\n          for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n          }\n          var result = false;\n          var stopped = [];\n          var eventTag = getEventTag(eventName);\n          this._events = this._events.filter(function(event) {\n            if (event.tag !== eventTag) {\n              return true;\n            }\n            setTimeout(function() {\n              event.listener.apply(_this, args);\n            }, 0);\n            result = true;\n            if (event.once) {\n              stopped.push(event);\n              return false;\n            }\n            return true;\n          });\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return result;\n        };\n        BaseProvider2.prototype.listenerCount = function(eventName) {\n          if (!eventName) {\n            return this._events.length;\n          }\n          var eventTag = getEventTag(eventName);\n          return this._events.filter(function(event) {\n            return event.tag === eventTag;\n          }).length;\n        };\n        BaseProvider2.prototype.listeners = function(eventName) {\n          if (eventName == null) {\n            return this._events.map(function(event) {\n              return event.listener;\n            });\n          }\n          var eventTag = getEventTag(eventName);\n          return this._events.filter(function(event) {\n            return event.tag === eventTag;\n          }).map(function(event) {\n            return event.listener;\n          });\n        };\n        BaseProvider2.prototype.off = function(eventName, listener) {\n          var _this = this;\n          if (listener == null) {\n            return this.removeAllListeners(eventName);\n          }\n          var stopped = [];\n          var found = false;\n          var eventTag = getEventTag(eventName);\n          this._events = this._events.filter(function(event) {\n            if (event.tag !== eventTag || event.listener != listener) {\n              return true;\n            }\n            if (found) {\n              return true;\n            }\n            found = true;\n            stopped.push(event);\n            return false;\n          });\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return this;\n        };\n        BaseProvider2.prototype.removeAllListeners = function(eventName) {\n          var _this = this;\n          var stopped = [];\n          if (eventName == null) {\n            stopped = this._events;\n            this._events = [];\n          } else {\n            var eventTag_1 = getEventTag(eventName);\n            this._events = this._events.filter(function(event) {\n              if (event.tag !== eventTag_1) {\n                return true;\n              }\n              stopped.push(event);\n              return false;\n            });\n          }\n          stopped.forEach(function(event) {\n            _this._stopEvent(event);\n          });\n          return this;\n        };\n        return BaseProvider2;\n      }(abstract_provider_1.Provider)\n    );\n    exports2.BaseProvider = BaseProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/json-rpc-provider.js\nvar require_json_rpc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/json-rpc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.JsonRpcProvider = exports2.JsonRpcSigner = void 0;\n    var abstract_signer_1 = require_lib13();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var hash_1 = require_lib10();\n    var properties_1 = require_lib4();\n    var strings_1 = require_lib9();\n    var transactions_1 = require_lib15();\n    var web_1 = require_lib27();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var base_provider_1 = require_base_provider();\n    var errorGas = [\"call\", \"estimateGas\"];\n    function checkError(method, error, params) {\n      if (method === \"call\" && error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        var e = error.error;\n        if (e && e.message.match(\"reverted\") && (0, bytes_1.isHexString)(e.data)) {\n          return e.data;\n        }\n        logger.throwError(\"missing revert data in call exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n          error,\n          data: \"0x\"\n        });\n      }\n      var message = error.message;\n      if (error.code === logger_1.Logger.errors.SERVER_ERROR && error.error && typeof error.error.message === \"string\") {\n        message = error.error.message;\n      } else if (typeof error.body === \"string\") {\n        message = error.body;\n      } else if (typeof error.responseText === \"string\") {\n        message = error.responseText;\n      }\n      message = (message || \"\").toLowerCase();\n      var transaction = params.transaction || params.signedTransaction;\n      if (message.match(/insufficient funds|base fee exceeds gas limit/)) {\n        logger.throwError(\"insufficient funds for intrinsic transaction cost\", logger_1.Logger.errors.INSUFFICIENT_FUNDS, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/nonce too low/)) {\n        logger.throwError(\"nonce has already been used\", logger_1.Logger.errors.NONCE_EXPIRED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/replacement transaction underpriced/)) {\n        logger.throwError(\"replacement fee too low\", logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/only replay-protected/)) {\n        logger.throwError(\"legacy pre-eip-155 transactions not supported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (errorGas.indexOf(method) >= 0 && message.match(/gas required exceeds allowance|always failing transaction|execution reverted/)) {\n        logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n          error,\n          method,\n          transaction\n        });\n      }\n      throw error;\n    }\n    function timer(timeout) {\n      return new Promise(function(resolve) {\n        setTimeout(resolve, timeout);\n      });\n    }\n    function getResult(payload) {\n      if (payload.error) {\n        var error = new Error(payload.error.message);\n        error.code = payload.error.code;\n        error.data = payload.error.data;\n        throw error;\n      }\n      return payload.result;\n    }\n    function getLowerCase(value) {\n      if (value) {\n        return value.toLowerCase();\n      }\n      return value;\n    }\n    var _constructorGuard = {};\n    var JsonRpcSigner = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcSigner2, _super);\n        function JsonRpcSigner2(constructorGuard, provider, addressOrIndex) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, JsonRpcSigner2);\n          _this = _super.call(this) || this;\n          if (constructorGuard !== _constructorGuard) {\n            throw new Error(\"do not call the JsonRpcSigner constructor directly; use provider.getSigner\");\n          }\n          (0, properties_1.defineReadOnly)(_this, \"provider\", provider);\n          if (addressOrIndex == null) {\n            addressOrIndex = 0;\n          }\n          if (typeof addressOrIndex === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"_address\", _this.provider.formatter.address(addressOrIndex));\n            (0, properties_1.defineReadOnly)(_this, \"_index\", null);\n          } else if (typeof addressOrIndex === \"number\") {\n            (0, properties_1.defineReadOnly)(_this, \"_index\", addressOrIndex);\n            (0, properties_1.defineReadOnly)(_this, \"_address\", null);\n          } else {\n            logger.throwArgumentError(\"invalid address or index\", \"addressOrIndex\", addressOrIndex);\n          }\n          return _this;\n        }\n        JsonRpcSigner2.prototype.connect = function(provider) {\n          return logger.throwError(\"cannot alter JSON-RPC Signer connection\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"connect\"\n          });\n        };\n        JsonRpcSigner2.prototype.connectUnchecked = function() {\n          return new UncheckedJsonRpcSigner(_constructorGuard, this.provider, this._address || this._index);\n        };\n        JsonRpcSigner2.prototype.getAddress = function() {\n          var _this = this;\n          if (this._address) {\n            return Promise.resolve(this._address);\n          }\n          return this.provider.send(\"eth_accounts\", []).then(function(accounts) {\n            if (accounts.length <= _this._index) {\n              logger.throwError(\"unknown account #\" + _this._index, logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n                operation: \"getAddress\"\n              });\n            }\n            return _this.provider.formatter.address(accounts[_this._index]);\n          });\n        };\n        JsonRpcSigner2.prototype.sendUncheckedTransaction = function(transaction) {\n          var _this = this;\n          transaction = (0, properties_1.shallowCopy)(transaction);\n          var fromAddress = this.getAddress().then(function(address) {\n            if (address) {\n              address = address.toLowerCase();\n            }\n            return address;\n          });\n          if (transaction.gasLimit == null) {\n            var estimate = (0, properties_1.shallowCopy)(transaction);\n            estimate.from = fromAddress;\n            transaction.gasLimit = this.provider.estimateGas(estimate);\n          }\n          if (transaction.to != null) {\n            transaction.to = Promise.resolve(transaction.to).then(function(to) {\n              return __awaiter(_this, void 0, void 0, function() {\n                var address;\n                return __generator(this, function(_a) {\n                  switch (_a.label) {\n                    case 0:\n                      if (to == null) {\n                        return [2, null];\n                      }\n                      return [4, this.provider.resolveName(to)];\n                    case 1:\n                      address = _a.sent();\n                      if (address == null) {\n                        logger.throwArgumentError(\"provided ENS name resolves to null\", \"tx.to\", to);\n                      }\n                      return [2, address];\n                  }\n                });\n              });\n            });\n          }\n          return (0, properties_1.resolveProperties)({\n            tx: (0, properties_1.resolveProperties)(transaction),\n            sender: fromAddress\n          }).then(function(_a) {\n            var tx = _a.tx, sender = _a.sender;\n            if (tx.from != null) {\n              if (tx.from.toLowerCase() !== sender) {\n                logger.throwArgumentError(\"from address mismatch\", \"transaction\", transaction);\n              }\n            } else {\n              tx.from = sender;\n            }\n            var hexTx = _this.provider.constructor.hexlifyTransaction(tx, { from: true });\n            return _this.provider.send(\"eth_sendTransaction\", [hexTx]).then(function(hash) {\n              return hash;\n            }, function(error) {\n              return checkError(\"sendTransaction\", error, hexTx);\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.signTransaction = function(transaction) {\n          return logger.throwError(\"signing transactions is unsupported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"signTransaction\"\n          });\n        };\n        JsonRpcSigner2.prototype.sendTransaction = function(transaction) {\n          return __awaiter(this, void 0, void 0, function() {\n            var blockNumber, hash, error_1;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, this.provider._getInternalBlockNumber(100 + 2 * this.provider.pollingInterval)];\n                case 1:\n                  blockNumber = _a.sent();\n                  return [4, this.sendUncheckedTransaction(transaction)];\n                case 2:\n                  hash = _a.sent();\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, (0, web_1.poll)(function() {\n                    return __awaiter(_this, void 0, void 0, function() {\n                      var tx;\n                      return __generator(this, function(_a2) {\n                        switch (_a2.label) {\n                          case 0:\n                            return [4, this.provider.getTransaction(hash)];\n                          case 1:\n                            tx = _a2.sent();\n                            if (tx === null) {\n                              return [2, void 0];\n                            }\n                            return [2, this.provider._wrapTransaction(tx, hash, blockNumber)];\n                        }\n                      });\n                    });\n                  }, { oncePoll: this.provider })];\n                case 4:\n                  return [2, _a.sent()];\n                case 5:\n                  error_1 = _a.sent();\n                  error_1.transactionHash = hash;\n                  throw error_1;\n                case 6:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.signMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            var data, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  data = typeof message === \"string\" ? (0, strings_1.toUtf8Bytes)(message) : message;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"personal_sign\", [(0, bytes_1.hexlify)(data), address.toLowerCase()])];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype._legacySignMessage = function(message) {\n          return __awaiter(this, void 0, void 0, function() {\n            var data, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  data = typeof message === \"string\" ? (0, strings_1.toUtf8Bytes)(message) : message;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"eth_sign\", [address.toLowerCase(), (0, bytes_1.hexlify)(data)])];\n                case 2:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype._signTypedData = function(domain, types, value) {\n          return __awaiter(this, void 0, void 0, function() {\n            var populated, address;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, hash_1._TypedDataEncoder.resolveNames(domain, types, value, function(name2) {\n                    return _this.provider.resolveName(name2);\n                  })];\n                case 1:\n                  populated = _a.sent();\n                  return [4, this.getAddress()];\n                case 2:\n                  address = _a.sent();\n                  return [4, this.provider.send(\"eth_signTypedData_v4\", [\n                    address.toLowerCase(),\n                    JSON.stringify(hash_1._TypedDataEncoder.getPayload(populated.domain, types, populated.value))\n                  ])];\n                case 3:\n                  return [2, _a.sent()];\n              }\n            });\n          });\n        };\n        JsonRpcSigner2.prototype.unlock = function(password) {\n          return __awaiter(this, void 0, void 0, function() {\n            var provider, address;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  provider = this.provider;\n                  return [4, this.getAddress()];\n                case 1:\n                  address = _a.sent();\n                  return [2, provider.send(\"personal_unlockAccount\", [address.toLowerCase(), password, null])];\n              }\n            });\n          });\n        };\n        return JsonRpcSigner2;\n      }(abstract_signer_1.Signer)\n    );\n    exports2.JsonRpcSigner = JsonRpcSigner;\n    var UncheckedJsonRpcSigner = (\n      /** @class */\n      function(_super) {\n        __extends(UncheckedJsonRpcSigner2, _super);\n        function UncheckedJsonRpcSigner2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        UncheckedJsonRpcSigner2.prototype.sendTransaction = function(transaction) {\n          var _this = this;\n          return this.sendUncheckedTransaction(transaction).then(function(hash) {\n            return {\n              hash,\n              nonce: null,\n              gasLimit: null,\n              gasPrice: null,\n              data: null,\n              value: null,\n              chainId: null,\n              confirmations: 0,\n              from: null,\n              wait: function(confirmations) {\n                return _this.provider.waitForTransaction(hash, confirmations);\n              }\n            };\n          });\n        };\n        return UncheckedJsonRpcSigner2;\n      }(JsonRpcSigner)\n    );\n    var allowedTransactionKeys = {\n      chainId: true,\n      data: true,\n      gasLimit: true,\n      gasPrice: true,\n      nonce: true,\n      to: true,\n      value: true,\n      type: true,\n      accessList: true,\n      maxFeePerGas: true,\n      maxPriorityFeePerGas: true\n    };\n    var JsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcProvider2, _super);\n        function JsonRpcProvider2(url, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, JsonRpcProvider2);\n          var networkOrReady = network;\n          if (networkOrReady == null) {\n            networkOrReady = new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                _this.detectNetwork().then(function(network2) {\n                  resolve(network2);\n                }, function(error) {\n                  reject(error);\n                });\n              }, 0);\n            });\n          }\n          _this = _super.call(this, networkOrReady) || this;\n          if (!url) {\n            url = (0, properties_1.getStatic)(_this.constructor, \"defaultUrl\")();\n          }\n          if (typeof url === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"connection\", Object.freeze({\n              url\n            }));\n          } else {\n            (0, properties_1.defineReadOnly)(_this, \"connection\", Object.freeze((0, properties_1.shallowCopy)(url)));\n          }\n          _this._nextId = 42;\n          return _this;\n        }\n        Object.defineProperty(JsonRpcProvider2.prototype, \"_cache\", {\n          get: function() {\n            if (this._eventLoopCache == null) {\n              this._eventLoopCache = {};\n            }\n            return this._eventLoopCache;\n          },\n          enumerable: false,\n          configurable: true\n        });\n        JsonRpcProvider2.defaultUrl = function() {\n          return \"http://localhost:8545\";\n        };\n        JsonRpcProvider2.prototype.detectNetwork = function() {\n          var _this = this;\n          if (!this._cache[\"detectNetwork\"]) {\n            this._cache[\"detectNetwork\"] = this._uncachedDetectNetwork();\n            setTimeout(function() {\n              _this._cache[\"detectNetwork\"] = null;\n            }, 0);\n          }\n          return this._cache[\"detectNetwork\"];\n        };\n        JsonRpcProvider2.prototype._uncachedDetectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var chainId, error_2, error_3, getNetwork;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, timer(0)];\n                case 1:\n                  _a.sent();\n                  chainId = null;\n                  _a.label = 2;\n                case 2:\n                  _a.trys.push([2, 4, , 9]);\n                  return [4, this.send(\"eth_chainId\", [])];\n                case 3:\n                  chainId = _a.sent();\n                  return [3, 9];\n                case 4:\n                  error_2 = _a.sent();\n                  _a.label = 5;\n                case 5:\n                  _a.trys.push([5, 7, , 8]);\n                  return [4, this.send(\"net_version\", [])];\n                case 6:\n                  chainId = _a.sent();\n                  return [3, 8];\n                case 7:\n                  error_3 = _a.sent();\n                  return [3, 8];\n                case 8:\n                  return [3, 9];\n                case 9:\n                  if (chainId != null) {\n                    getNetwork = (0, properties_1.getStatic)(this.constructor, \"getNetwork\");\n                    try {\n                      return [2, getNetwork(bignumber_1.BigNumber.from(chainId).toNumber())];\n                    } catch (error) {\n                      return [2, logger.throwError(\"could not detect network\", logger_1.Logger.errors.NETWORK_ERROR, {\n                        chainId,\n                        event: \"invalidNetwork\",\n                        serverError: error\n                      })];\n                    }\n                  }\n                  return [2, logger.throwError(\"could not detect network\", logger_1.Logger.errors.NETWORK_ERROR, {\n                    event: \"noNetwork\"\n                  })];\n              }\n            });\n          });\n        };\n        JsonRpcProvider2.prototype.getSigner = function(addressOrIndex) {\n          return new JsonRpcSigner(_constructorGuard, this, addressOrIndex);\n        };\n        JsonRpcProvider2.prototype.getUncheckedSigner = function(addressOrIndex) {\n          return this.getSigner(addressOrIndex).connectUnchecked();\n        };\n        JsonRpcProvider2.prototype.listAccounts = function() {\n          var _this = this;\n          return this.send(\"eth_accounts\", []).then(function(accounts) {\n            return accounts.map(function(a) {\n              return _this.formatter.address(a);\n            });\n          });\n        };\n        JsonRpcProvider2.prototype.send = function(method, params) {\n          var _this = this;\n          var request = {\n            method,\n            params,\n            id: this._nextId++,\n            jsonrpc: \"2.0\"\n          };\n          this.emit(\"debug\", {\n            action: \"request\",\n            request: (0, properties_1.deepCopy)(request),\n            provider: this\n          });\n          var cache = [\"eth_chainId\", \"eth_blockNumber\"].indexOf(method) >= 0;\n          if (cache && this._cache[method]) {\n            return this._cache[method];\n          }\n          var result = (0, web_1.fetchJson)(this.connection, JSON.stringify(request), getResult).then(function(result2) {\n            _this.emit(\"debug\", {\n              action: \"response\",\n              request,\n              response: result2,\n              provider: _this\n            });\n            return result2;\n          }, function(error) {\n            _this.emit(\"debug\", {\n              action: \"response\",\n              error,\n              request,\n              provider: _this\n            });\n            throw error;\n          });\n          if (cache) {\n            this._cache[method] = result;\n            setTimeout(function() {\n              _this._cache[method] = null;\n            }, 0);\n          }\n          return result;\n        };\n        JsonRpcProvider2.prototype.prepareRequest = function(method, params) {\n          switch (method) {\n            case \"getBlockNumber\":\n              return [\"eth_blockNumber\", []];\n            case \"getGasPrice\":\n              return [\"eth_gasPrice\", []];\n            case \"getBalance\":\n              return [\"eth_getBalance\", [getLowerCase(params.address), params.blockTag]];\n            case \"getTransactionCount\":\n              return [\"eth_getTransactionCount\", [getLowerCase(params.address), params.blockTag]];\n            case \"getCode\":\n              return [\"eth_getCode\", [getLowerCase(params.address), params.blockTag]];\n            case \"getStorageAt\":\n              return [\"eth_getStorageAt\", [getLowerCase(params.address), params.position, params.blockTag]];\n            case \"sendTransaction\":\n              return [\"eth_sendRawTransaction\", [params.signedTransaction]];\n            case \"getBlock\":\n              if (params.blockTag) {\n                return [\"eth_getBlockByNumber\", [params.blockTag, !!params.includeTransactions]];\n              } else if (params.blockHash) {\n                return [\"eth_getBlockByHash\", [params.blockHash, !!params.includeTransactions]];\n              }\n              return null;\n            case \"getTransaction\":\n              return [\"eth_getTransactionByHash\", [params.transactionHash]];\n            case \"getTransactionReceipt\":\n              return [\"eth_getTransactionReceipt\", [params.transactionHash]];\n            case \"call\": {\n              var hexlifyTransaction = (0, properties_1.getStatic)(this.constructor, \"hexlifyTransaction\");\n              return [\"eth_call\", [hexlifyTransaction(params.transaction, { from: true }), params.blockTag]];\n            }\n            case \"estimateGas\": {\n              var hexlifyTransaction = (0, properties_1.getStatic)(this.constructor, \"hexlifyTransaction\");\n              return [\"eth_estimateGas\", [hexlifyTransaction(params.transaction, { from: true })]];\n            }\n            case \"getLogs\":\n              if (params.filter && params.filter.address != null) {\n                params.filter.address = getLowerCase(params.filter.address);\n              }\n              return [\"eth_getLogs\", [params.filter]];\n            default:\n              break;\n          }\n          return null;\n        };\n        JsonRpcProvider2.prototype.perform = function(method, params) {\n          return __awaiter(this, void 0, void 0, function() {\n            var tx, feeData, args, error_4;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"call\" || method === \"estimateGas\")) return [3, 2];\n                  tx = params.transaction;\n                  if (!(tx && tx.type != null && bignumber_1.BigNumber.from(tx.type).isZero())) return [3, 2];\n                  if (!(tx.maxFeePerGas == null && tx.maxPriorityFeePerGas == null)) return [3, 2];\n                  return [4, this.getFeeData()];\n                case 1:\n                  feeData = _a.sent();\n                  if (feeData.maxFeePerGas == null && feeData.maxPriorityFeePerGas == null) {\n                    params = (0, properties_1.shallowCopy)(params);\n                    params.transaction = (0, properties_1.shallowCopy)(tx);\n                    delete params.transaction.type;\n                  }\n                  _a.label = 2;\n                case 2:\n                  args = this.prepareRequest(method, params);\n                  if (args == null) {\n                    logger.throwError(method + \" not implemented\", logger_1.Logger.errors.NOT_IMPLEMENTED, { operation: method });\n                  }\n                  _a.label = 3;\n                case 3:\n                  _a.trys.push([3, 5, , 6]);\n                  return [4, this.send(args[0], args[1])];\n                case 4:\n                  return [2, _a.sent()];\n                case 5:\n                  error_4 = _a.sent();\n                  return [2, checkError(method, error_4, params)];\n                case 6:\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        JsonRpcProvider2.prototype._startEvent = function(event) {\n          if (event.tag === \"pending\") {\n            this._startPending();\n          }\n          _super.prototype._startEvent.call(this, event);\n        };\n        JsonRpcProvider2.prototype._startPending = function() {\n          if (this._pendingFilter != null) {\n            return;\n          }\n          var self2 = this;\n          var pendingFilter = this.send(\"eth_newPendingTransactionFilter\", []);\n          this._pendingFilter = pendingFilter;\n          pendingFilter.then(function(filterId) {\n            function poll() {\n              self2.send(\"eth_getFilterChanges\", [filterId]).then(function(hashes) {\n                if (self2._pendingFilter != pendingFilter) {\n                  return null;\n                }\n                var seq = Promise.resolve();\n                hashes.forEach(function(hash) {\n                  self2._emitted[\"t:\" + hash.toLowerCase()] = \"pending\";\n                  seq = seq.then(function() {\n                    return self2.getTransaction(hash).then(function(tx) {\n                      self2.emit(\"pending\", tx);\n                      return null;\n                    });\n                  });\n                });\n                return seq.then(function() {\n                  return timer(1e3);\n                });\n              }).then(function() {\n                if (self2._pendingFilter != pendingFilter) {\n                  self2.send(\"eth_uninstallFilter\", [filterId]);\n                  return;\n                }\n                setTimeout(function() {\n                  poll();\n                }, 0);\n                return null;\n              }).catch(function(error) {\n              });\n            }\n            poll();\n            return filterId;\n          }).catch(function(error) {\n          });\n        };\n        JsonRpcProvider2.prototype._stopEvent = function(event) {\n          if (event.tag === \"pending\" && this.listenerCount(\"pending\") === 0) {\n            this._pendingFilter = null;\n          }\n          _super.prototype._stopEvent.call(this, event);\n        };\n        JsonRpcProvider2.hexlifyTransaction = function(transaction, allowExtra) {\n          var allowed = (0, properties_1.shallowCopy)(allowedTransactionKeys);\n          if (allowExtra) {\n            for (var key in allowExtra) {\n              if (allowExtra[key]) {\n                allowed[key] = true;\n              }\n            }\n          }\n          (0, properties_1.checkProperties)(transaction, allowed);\n          var result = {};\n          [\"gasLimit\", \"gasPrice\", \"type\", \"maxFeePerGas\", \"maxPriorityFeePerGas\", \"nonce\", \"value\"].forEach(function(key2) {\n            if (transaction[key2] == null) {\n              return;\n            }\n            var value = (0, bytes_1.hexValue)(transaction[key2]);\n            if (key2 === \"gasLimit\") {\n              key2 = \"gas\";\n            }\n            result[key2] = value;\n          });\n          [\"from\", \"to\", \"data\"].forEach(function(key2) {\n            if (transaction[key2] == null) {\n              return;\n            }\n            result[key2] = (0, bytes_1.hexlify)(transaction[key2]);\n          });\n          if (transaction.accessList) {\n            result[\"accessList\"] = (0, transactions_1.accessListify)(transaction.accessList);\n          }\n          return result;\n        };\n        return JsonRpcProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.JsonRpcProvider = JsonRpcProvider;\n  }\n});\n\n// node_modules/ws/lib/constants.js\nvar require_constants = __commonJS({\n  \"node_modules/ws/lib/constants.js\"(exports2, module2) {\n    \"use strict\";\n    module2.exports = {\n      BINARY_TYPES: [\"nodebuffer\", \"arraybuffer\", \"fragments\"],\n      GUID: \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\",\n      kStatusCode: Symbol(\"status-code\"),\n      kWebSocket: Symbol(\"websocket\"),\n      EMPTY_BUFFER: Buffer.alloc(0),\n      NOOP: () => {\n      }\n    };\n  }\n});\n\n// node_modules/ws/lib/buffer-util.js\nvar require_buffer_util = __commonJS({\n  \"node_modules/ws/lib/buffer-util.js\"(exports2, module2) {\n    \"use strict\";\n    var { EMPTY_BUFFER } = require_constants();\n    function concat(list, totalLength) {\n      if (list.length === 0) return EMPTY_BUFFER;\n      if (list.length === 1) return list[0];\n      const target = Buffer.allocUnsafe(totalLength);\n      let offset = 0;\n      for (let i = 0; i < list.length; i++) {\n        const buf = list[i];\n        target.set(buf, offset);\n        offset += buf.length;\n      }\n      if (offset < totalLength) return target.slice(0, offset);\n      return target;\n    }\n    function _mask(source, mask, output, offset, length) {\n      for (let i = 0; i < length; i++) {\n        output[offset + i] = source[i] ^ mask[i & 3];\n      }\n    }\n    function _unmask(buffer, mask) {\n      const length = buffer.length;\n      for (let i = 0; i < length; i++) {\n        buffer[i] ^= mask[i & 3];\n      }\n    }\n    function toArrayBuffer(buf) {\n      if (buf.byteLength === buf.buffer.byteLength) {\n        return buf.buffer;\n      }\n      return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n    }\n    function toBuffer(data) {\n      toBuffer.readOnly = true;\n      if (Buffer.isBuffer(data)) return data;\n      let buf;\n      if (data instanceof ArrayBuffer) {\n        buf = Buffer.from(data);\n      } else if (ArrayBuffer.isView(data)) {\n        buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n      } else {\n        buf = Buffer.from(data);\n        toBuffer.readOnly = false;\n      }\n      return buf;\n    }\n    try {\n      const bufferUtil = require(\"bufferutil\");\n      const bu = bufferUtil.BufferUtil || bufferUtil;\n      module2.exports = {\n        concat,\n        mask(source, mask, output, offset, length) {\n          if (length < 48) _mask(source, mask, output, offset, length);\n          else bu.mask(source, mask, output, offset, length);\n        },\n        toArrayBuffer,\n        toBuffer,\n        unmask(buffer, mask) {\n          if (buffer.length < 32) _unmask(buffer, mask);\n          else bu.unmask(buffer, mask);\n        }\n      };\n    } catch (e) {\n      module2.exports = {\n        concat,\n        mask: _mask,\n        toArrayBuffer,\n        toBuffer,\n        unmask: _unmask\n      };\n    }\n  }\n});\n\n// node_modules/ws/lib/limiter.js\nvar require_limiter = __commonJS({\n  \"node_modules/ws/lib/limiter.js\"(exports2, module2) {\n    \"use strict\";\n    var kDone = Symbol(\"kDone\");\n    var kRun = Symbol(\"kRun\");\n    var Limiter = class {\n      /**\n       * Creates a new `Limiter`.\n       *\n       * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n       *     to run concurrently\n       */\n      constructor(concurrency) {\n        this[kDone] = () => {\n          this.pending--;\n          this[kRun]();\n        };\n        this.concurrency = concurrency || Infinity;\n        this.jobs = [];\n        this.pending = 0;\n      }\n      /**\n       * Adds a job to the queue.\n       *\n       * @param {Function} job The job to run\n       * @public\n       */\n      add(job) {\n        this.jobs.push(job);\n        this[kRun]();\n      }\n      /**\n       * Removes a job from the queue and runs it if possible.\n       *\n       * @private\n       */\n      [kRun]() {\n        if (this.pending === this.concurrency) return;\n        if (this.jobs.length) {\n          const job = this.jobs.shift();\n          this.pending++;\n          job(this[kDone]);\n        }\n      }\n    };\n    module2.exports = Limiter;\n  }\n});\n\n// node_modules/ws/lib/permessage-deflate.js\nvar require_permessage_deflate = __commonJS({\n  \"node_modules/ws/lib/permessage-deflate.js\"(exports2, module2) {\n    \"use strict\";\n    var zlib = require(\"zlib\");\n    var bufferUtil = require_buffer_util();\n    var Limiter = require_limiter();\n    var { kStatusCode, NOOP } = require_constants();\n    var TRAILER = Buffer.from([0, 0, 255, 255]);\n    var kPerMessageDeflate = Symbol(\"permessage-deflate\");\n    var kTotalLength = Symbol(\"total-length\");\n    var kCallback = Symbol(\"callback\");\n    var kBuffers = Symbol(\"buffers\");\n    var kError = Symbol(\"error\");\n    var zlibLimiter;\n    var PerMessageDeflate = class {\n      /**\n       * Creates a PerMessageDeflate instance.\n       *\n       * @param {Object} [options] Configuration options\n       * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n       *     disabling of server context takeover\n       * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n       *     acknowledge disabling of client context takeover\n       * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n       *     use of a custom server window size\n       * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n       *     for, or request, a custom client window size\n       * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n       *     deflate\n       * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n       *     inflate\n       * @param {Number} [options.threshold=1024] Size (in bytes) below which\n       *     messages should not be compressed\n       * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n       *     calls to zlib\n       * @param {Boolean} [isServer=false] Create the instance in either server or\n       *     client mode\n       * @param {Number} [maxPayload=0] The maximum allowed message length\n       */\n      constructor(options, isServer, maxPayload) {\n        this._maxPayload = maxPayload | 0;\n        this._options = options || {};\n        this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024;\n        this._isServer = !!isServer;\n        this._deflate = null;\n        this._inflate = null;\n        this.params = null;\n        if (!zlibLimiter) {\n          const concurrency = this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10;\n          zlibLimiter = new Limiter(concurrency);\n        }\n      }\n      /**\n       * @type {String}\n       */\n      static get extensionName() {\n        return \"permessage-deflate\";\n      }\n      /**\n       * Create an extension negotiation offer.\n       *\n       * @return {Object} Extension parameters\n       * @public\n       */\n      offer() {\n        const params = {};\n        if (this._options.serverNoContextTakeover) {\n          params.server_no_context_takeover = true;\n        }\n        if (this._options.clientNoContextTakeover) {\n          params.client_no_context_takeover = true;\n        }\n        if (this._options.serverMaxWindowBits) {\n          params.server_max_window_bits = this._options.serverMaxWindowBits;\n        }\n        if (this._options.clientMaxWindowBits) {\n          params.client_max_window_bits = this._options.clientMaxWindowBits;\n        } else if (this._options.clientMaxWindowBits == null) {\n          params.client_max_window_bits = true;\n        }\n        return params;\n      }\n      /**\n       * Accept an extension negotiation offer/response.\n       *\n       * @param {Array} configurations The extension negotiation offers/reponse\n       * @return {Object} Accepted configuration\n       * @public\n       */\n      accept(configurations) {\n        configurations = this.normalizeParams(configurations);\n        this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations);\n        return this.params;\n      }\n      /**\n       * Releases all resources used by the extension.\n       *\n       * @public\n       */\n      cleanup() {\n        if (this._inflate) {\n          this._inflate.close();\n          this._inflate = null;\n        }\n        if (this._deflate) {\n          const callback = this._deflate[kCallback];\n          this._deflate.close();\n          this._deflate = null;\n          if (callback) {\n            callback(\n              new Error(\n                \"The deflate stream was closed while data was being processed\"\n              )\n            );\n          }\n        }\n      }\n      /**\n       *  Accept an extension negotiation offer.\n       *\n       * @param {Array} offers The extension negotiation offers\n       * @return {Object} Accepted configuration\n       * @private\n       */\n      acceptAsServer(offers) {\n        const opts = this._options;\n        const accepted = offers.find((params) => {\n          if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === \"number\" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === \"number\" && !params.client_max_window_bits) {\n            return false;\n          }\n          return true;\n        });\n        if (!accepted) {\n          throw new Error(\"None of the extension offers can be accepted\");\n        }\n        if (opts.serverNoContextTakeover) {\n          accepted.server_no_context_takeover = true;\n        }\n        if (opts.clientNoContextTakeover) {\n          accepted.client_no_context_takeover = true;\n        }\n        if (typeof opts.serverMaxWindowBits === \"number\") {\n          accepted.server_max_window_bits = opts.serverMaxWindowBits;\n        }\n        if (typeof opts.clientMaxWindowBits === \"number\") {\n          accepted.client_max_window_bits = opts.clientMaxWindowBits;\n        } else if (accepted.client_max_window_bits === true || opts.clientMaxWindowBits === false) {\n          delete accepted.client_max_window_bits;\n        }\n        return accepted;\n      }\n      /**\n       * Accept the extension negotiation response.\n       *\n       * @param {Array} response The extension negotiation response\n       * @return {Object} Accepted configuration\n       * @private\n       */\n      acceptAsClient(response) {\n        const params = response[0];\n        if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) {\n          throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n        }\n        if (!params.client_max_window_bits) {\n          if (typeof this._options.clientMaxWindowBits === \"number\") {\n            params.client_max_window_bits = this._options.clientMaxWindowBits;\n          }\n        } else if (this._options.clientMaxWindowBits === false || typeof this._options.clientMaxWindowBits === \"number\" && params.client_max_window_bits > this._options.clientMaxWindowBits) {\n          throw new Error(\n            'Unexpected or invalid parameter \"client_max_window_bits\"'\n          );\n        }\n        return params;\n      }\n      /**\n       * Normalize parameters.\n       *\n       * @param {Array} configurations The extension negotiation offers/reponse\n       * @return {Array} The offers/response with normalized parameters\n       * @private\n       */\n      normalizeParams(configurations) {\n        configurations.forEach((params) => {\n          Object.keys(params).forEach((key) => {\n            let value = params[key];\n            if (value.length > 1) {\n              throw new Error(`Parameter \"${key}\" must have only a single value`);\n            }\n            value = value[0];\n            if (key === \"client_max_window_bits\") {\n              if (value !== true) {\n                const num = +value;\n                if (!Number.isInteger(num) || num < 8 || num > 15) {\n                  throw new TypeError(\n                    `Invalid value for parameter \"${key}\": ${value}`\n                  );\n                }\n                value = num;\n              } else if (!this._isServer) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n            } else if (key === \"server_max_window_bits\") {\n              const num = +value;\n              if (!Number.isInteger(num) || num < 8 || num > 15) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n              value = num;\n            } else if (key === \"client_no_context_takeover\" || key === \"server_no_context_takeover\") {\n              if (value !== true) {\n                throw new TypeError(\n                  `Invalid value for parameter \"${key}\": ${value}`\n                );\n              }\n            } else {\n              throw new Error(`Unknown parameter \"${key}\"`);\n            }\n            params[key] = value;\n          });\n        });\n        return configurations;\n      }\n      /**\n       * Decompress data. Concurrency limited.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @public\n       */\n      decompress(data, fin, callback) {\n        zlibLimiter.add((done) => {\n          this._decompress(data, fin, (err, result) => {\n            done();\n            callback(err, result);\n          });\n        });\n      }\n      /**\n       * Compress data. Concurrency limited.\n       *\n       * @param {Buffer} data Data to compress\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @public\n       */\n      compress(data, fin, callback) {\n        zlibLimiter.add((done) => {\n          this._compress(data, fin, (err, result) => {\n            done();\n            callback(err, result);\n          });\n        });\n      }\n      /**\n       * Decompress data.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @private\n       */\n      _decompress(data, fin, callback) {\n        const endpoint = this._isServer ? \"client\" : \"server\";\n        if (!this._inflate) {\n          const key = `${endpoint}_max_window_bits`;\n          const windowBits = typeof this.params[key] !== \"number\" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key];\n          this._inflate = zlib.createInflateRaw({\n            ...this._options.zlibInflateOptions,\n            windowBits\n          });\n          this._inflate[kPerMessageDeflate] = this;\n          this._inflate[kTotalLength] = 0;\n          this._inflate[kBuffers] = [];\n          this._inflate.on(\"error\", inflateOnError);\n          this._inflate.on(\"data\", inflateOnData);\n        }\n        this._inflate[kCallback] = callback;\n        this._inflate.write(data);\n        if (fin) this._inflate.write(TRAILER);\n        this._inflate.flush(() => {\n          const err = this._inflate[kError];\n          if (err) {\n            this._inflate.close();\n            this._inflate = null;\n            callback(err);\n            return;\n          }\n          const data2 = bufferUtil.concat(\n            this._inflate[kBuffers],\n            this._inflate[kTotalLength]\n          );\n          if (this._inflate._readableState.endEmitted) {\n            this._inflate.close();\n            this._inflate = null;\n          } else {\n            this._inflate[kTotalLength] = 0;\n            this._inflate[kBuffers] = [];\n            if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n              this._inflate.reset();\n            }\n          }\n          callback(null, data2);\n        });\n      }\n      /**\n       * Compress data.\n       *\n       * @param {Buffer} data Data to compress\n       * @param {Boolean} fin Specifies whether or not this is the last fragment\n       * @param {Function} callback Callback\n       * @private\n       */\n      _compress(data, fin, callback) {\n        const endpoint = this._isServer ? \"server\" : \"client\";\n        if (!this._deflate) {\n          const key = `${endpoint}_max_window_bits`;\n          const windowBits = typeof this.params[key] !== \"number\" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key];\n          this._deflate = zlib.createDeflateRaw({\n            ...this._options.zlibDeflateOptions,\n            windowBits\n          });\n          this._deflate[kTotalLength] = 0;\n          this._deflate[kBuffers] = [];\n          this._deflate.on(\"error\", NOOP);\n          this._deflate.on(\"data\", deflateOnData);\n        }\n        this._deflate[kCallback] = callback;\n        this._deflate.write(data);\n        this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n          if (!this._deflate) {\n            return;\n          }\n          let data2 = bufferUtil.concat(\n            this._deflate[kBuffers],\n            this._deflate[kTotalLength]\n          );\n          if (fin) data2 = data2.slice(0, data2.length - 4);\n          this._deflate[kCallback] = null;\n          this._deflate[kTotalLength] = 0;\n          this._deflate[kBuffers] = [];\n          if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n            this._deflate.reset();\n          }\n          callback(null, data2);\n        });\n      }\n    };\n    module2.exports = PerMessageDeflate;\n    function deflateOnData(chunk) {\n      this[kBuffers].push(chunk);\n      this[kTotalLength] += chunk.length;\n    }\n    function inflateOnData(chunk) {\n      this[kTotalLength] += chunk.length;\n      if (this[kPerMessageDeflate]._maxPayload < 1 || this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload) {\n        this[kBuffers].push(chunk);\n        return;\n      }\n      this[kError] = new RangeError(\"Max payload size exceeded\");\n      this[kError][kStatusCode] = 1009;\n      this.removeListener(\"data\", inflateOnData);\n      this.reset();\n    }\n    function inflateOnError(err) {\n      this[kPerMessageDeflate]._inflate = null;\n      err[kStatusCode] = 1007;\n      this[kCallback](err);\n    }\n  }\n});\n\n// node_modules/ws/lib/validation.js\nvar require_validation = __commonJS({\n  \"node_modules/ws/lib/validation.js\"(exports2, module2) {\n    \"use strict\";\n    function isValidStatusCode(code) {\n      return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999;\n    }\n    function _isValidUTF8(buf) {\n      const len = buf.length;\n      let i = 0;\n      while (i < len) {\n        if ((buf[i] & 128) === 0) {\n          i++;\n        } else if ((buf[i] & 224) === 192) {\n          if (i + 1 === len || (buf[i + 1] & 192) !== 128 || (buf[i] & 254) === 192) {\n            return false;\n          }\n          i += 2;\n        } else if ((buf[i] & 240) === 224) {\n          if (i + 2 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || buf[i] === 224 && (buf[i + 1] & 224) === 128 || // Overlong\n          buf[i] === 237 && (buf[i + 1] & 224) === 160) {\n            return false;\n          }\n          i += 3;\n        } else if ((buf[i] & 248) === 240) {\n          if (i + 3 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || (buf[i + 3] & 192) !== 128 || buf[i] === 240 && (buf[i + 1] & 240) === 128 || // Overlong\n          buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) {\n            return false;\n          }\n          i += 4;\n        } else {\n          return false;\n        }\n      }\n      return true;\n    }\n    try {\n      let isValidUTF8 = require(\"utf-8-validate\");\n      if (typeof isValidUTF8 === \"object\") {\n        isValidUTF8 = isValidUTF8.Validation.isValidUTF8;\n      }\n      module2.exports = {\n        isValidStatusCode,\n        isValidUTF8(buf) {\n          return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf);\n        }\n      };\n    } catch (e) {\n      module2.exports = {\n        isValidStatusCode,\n        isValidUTF8: _isValidUTF8\n      };\n    }\n  }\n});\n\n// node_modules/ws/lib/receiver.js\nvar require_receiver = __commonJS({\n  \"node_modules/ws/lib/receiver.js\"(exports2, module2) {\n    \"use strict\";\n    var { Writable } = require(\"stream\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var {\n      BINARY_TYPES,\n      EMPTY_BUFFER,\n      kStatusCode,\n      kWebSocket\n    } = require_constants();\n    var { concat, toArrayBuffer, unmask } = require_buffer_util();\n    var { isValidStatusCode, isValidUTF8 } = require_validation();\n    var GET_INFO = 0;\n    var GET_PAYLOAD_LENGTH_16 = 1;\n    var GET_PAYLOAD_LENGTH_64 = 2;\n    var GET_MASK = 3;\n    var GET_DATA = 4;\n    var INFLATING = 5;\n    var Receiver = class extends Writable {\n      /**\n       * Creates a Receiver instance.\n       *\n       * @param {String} [binaryType=nodebuffer] The type for binary data\n       * @param {Object} [extensions] An object containing the negotiated extensions\n       * @param {Boolean} [isServer=false] Specifies whether to operate in client or\n       *     server mode\n       * @param {Number} [maxPayload=0] The maximum allowed message length\n       */\n      constructor(binaryType, extensions, isServer, maxPayload) {\n        super();\n        this._binaryType = binaryType || BINARY_TYPES[0];\n        this[kWebSocket] = void 0;\n        this._extensions = extensions || {};\n        this._isServer = !!isServer;\n        this._maxPayload = maxPayload | 0;\n        this._bufferedBytes = 0;\n        this._buffers = [];\n        this._compressed = false;\n        this._payloadLength = 0;\n        this._mask = void 0;\n        this._fragmented = 0;\n        this._masked = false;\n        this._fin = false;\n        this._opcode = 0;\n        this._totalPayloadLength = 0;\n        this._messageLength = 0;\n        this._fragments = [];\n        this._state = GET_INFO;\n        this._loop = false;\n      }\n      /**\n       * Implements `Writable.prototype._write()`.\n       *\n       * @param {Buffer} chunk The chunk of data to write\n       * @param {String} encoding The character encoding of `chunk`\n       * @param {Function} cb Callback\n       * @private\n       */\n      _write(chunk, encoding, cb) {\n        if (this._opcode === 8 && this._state == GET_INFO) return cb();\n        this._bufferedBytes += chunk.length;\n        this._buffers.push(chunk);\n        this.startLoop(cb);\n      }\n      /**\n       * Consumes `n` bytes from the buffered data.\n       *\n       * @param {Number} n The number of bytes to consume\n       * @return {Buffer} The consumed bytes\n       * @private\n       */\n      consume(n) {\n        this._bufferedBytes -= n;\n        if (n === this._buffers[0].length) return this._buffers.shift();\n        if (n < this._buffers[0].length) {\n          const buf = this._buffers[0];\n          this._buffers[0] = buf.slice(n);\n          return buf.slice(0, n);\n        }\n        const dst = Buffer.allocUnsafe(n);\n        do {\n          const buf = this._buffers[0];\n          const offset = dst.length - n;\n          if (n >= buf.length) {\n            dst.set(this._buffers.shift(), offset);\n          } else {\n            dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n            this._buffers[0] = buf.slice(n);\n          }\n          n -= buf.length;\n        } while (n > 0);\n        return dst;\n      }\n      /**\n       * Starts the parsing loop.\n       *\n       * @param {Function} cb Callback\n       * @private\n       */\n      startLoop(cb) {\n        let err;\n        this._loop = true;\n        do {\n          switch (this._state) {\n            case GET_INFO:\n              err = this.getInfo();\n              break;\n            case GET_PAYLOAD_LENGTH_16:\n              err = this.getPayloadLength16();\n              break;\n            case GET_PAYLOAD_LENGTH_64:\n              err = this.getPayloadLength64();\n              break;\n            case GET_MASK:\n              this.getMask();\n              break;\n            case GET_DATA:\n              err = this.getData(cb);\n              break;\n            default:\n              this._loop = false;\n              return;\n          }\n        } while (this._loop);\n        cb(err);\n      }\n      /**\n       * Reads the first two bytes of a frame.\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getInfo() {\n        if (this._bufferedBytes < 2) {\n          this._loop = false;\n          return;\n        }\n        const buf = this.consume(2);\n        if ((buf[0] & 48) !== 0) {\n          this._loop = false;\n          return error(RangeError, \"RSV2 and RSV3 must be clear\", true, 1002);\n        }\n        const compressed = (buf[0] & 64) === 64;\n        if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n          this._loop = false;\n          return error(RangeError, \"RSV1 must be clear\", true, 1002);\n        }\n        this._fin = (buf[0] & 128) === 128;\n        this._opcode = buf[0] & 15;\n        this._payloadLength = buf[1] & 127;\n        if (this._opcode === 0) {\n          if (compressed) {\n            this._loop = false;\n            return error(RangeError, \"RSV1 must be clear\", true, 1002);\n          }\n          if (!this._fragmented) {\n            this._loop = false;\n            return error(RangeError, \"invalid opcode 0\", true, 1002);\n          }\n          this._opcode = this._fragmented;\n        } else if (this._opcode === 1 || this._opcode === 2) {\n          if (this._fragmented) {\n            this._loop = false;\n            return error(RangeError, `invalid opcode ${this._opcode}`, true, 1002);\n          }\n          this._compressed = compressed;\n        } else if (this._opcode > 7 && this._opcode < 11) {\n          if (!this._fin) {\n            this._loop = false;\n            return error(RangeError, \"FIN must be set\", true, 1002);\n          }\n          if (compressed) {\n            this._loop = false;\n            return error(RangeError, \"RSV1 must be clear\", true, 1002);\n          }\n          if (this._payloadLength > 125) {\n            this._loop = false;\n            return error(\n              RangeError,\n              `invalid payload length ${this._payloadLength}`,\n              true,\n              1002\n            );\n          }\n        } else {\n          this._loop = false;\n          return error(RangeError, `invalid opcode ${this._opcode}`, true, 1002);\n        }\n        if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n        this._masked = (buf[1] & 128) === 128;\n        if (this._isServer) {\n          if (!this._masked) {\n            this._loop = false;\n            return error(RangeError, \"MASK must be set\", true, 1002);\n          }\n        } else if (this._masked) {\n          this._loop = false;\n          return error(RangeError, \"MASK must be clear\", true, 1002);\n        }\n        if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n        else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n        else return this.haveLength();\n      }\n      /**\n       * Gets extended payload length (7+16).\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getPayloadLength16() {\n        if (this._bufferedBytes < 2) {\n          this._loop = false;\n          return;\n        }\n        this._payloadLength = this.consume(2).readUInt16BE(0);\n        return this.haveLength();\n      }\n      /**\n       * Gets extended payload length (7+64).\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      getPayloadLength64() {\n        if (this._bufferedBytes < 8) {\n          this._loop = false;\n          return;\n        }\n        const buf = this.consume(8);\n        const num = buf.readUInt32BE(0);\n        if (num > Math.pow(2, 53 - 32) - 1) {\n          this._loop = false;\n          return error(\n            RangeError,\n            \"Unsupported WebSocket frame: payload length > 2^53 - 1\",\n            false,\n            1009\n          );\n        }\n        this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n        return this.haveLength();\n      }\n      /**\n       * Payload length has been read.\n       *\n       * @return {(RangeError|undefined)} A possible error\n       * @private\n       */\n      haveLength() {\n        if (this._payloadLength && this._opcode < 8) {\n          this._totalPayloadLength += this._payloadLength;\n          if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n            this._loop = false;\n            return error(RangeError, \"Max payload size exceeded\", false, 1009);\n          }\n        }\n        if (this._masked) this._state = GET_MASK;\n        else this._state = GET_DATA;\n      }\n      /**\n       * Reads mask bytes.\n       *\n       * @private\n       */\n      getMask() {\n        if (this._bufferedBytes < 4) {\n          this._loop = false;\n          return;\n        }\n        this._mask = this.consume(4);\n        this._state = GET_DATA;\n      }\n      /**\n       * Reads data bytes.\n       *\n       * @param {Function} cb Callback\n       * @return {(Error|RangeError|undefined)} A possible error\n       * @private\n       */\n      getData(cb) {\n        let data = EMPTY_BUFFER;\n        if (this._payloadLength) {\n          if (this._bufferedBytes < this._payloadLength) {\n            this._loop = false;\n            return;\n          }\n          data = this.consume(this._payloadLength);\n          if (this._masked) unmask(data, this._mask);\n        }\n        if (this._opcode > 7) return this.controlMessage(data);\n        if (this._compressed) {\n          this._state = INFLATING;\n          this.decompress(data, cb);\n          return;\n        }\n        if (data.length) {\n          this._messageLength = this._totalPayloadLength;\n          this._fragments.push(data);\n        }\n        return this.dataMessage();\n      }\n      /**\n       * Decompresses data.\n       *\n       * @param {Buffer} data Compressed data\n       * @param {Function} cb Callback\n       * @private\n       */\n      decompress(data, cb) {\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n          if (err) return cb(err);\n          if (buf.length) {\n            this._messageLength += buf.length;\n            if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n              return cb(\n                error(RangeError, \"Max payload size exceeded\", false, 1009)\n              );\n            }\n            this._fragments.push(buf);\n          }\n          const er = this.dataMessage();\n          if (er) return cb(er);\n          this.startLoop(cb);\n        });\n      }\n      /**\n       * Handles a data message.\n       *\n       * @return {(Error|undefined)} A possible error\n       * @private\n       */\n      dataMessage() {\n        if (this._fin) {\n          const messageLength = this._messageLength;\n          const fragments = this._fragments;\n          this._totalPayloadLength = 0;\n          this._messageLength = 0;\n          this._fragmented = 0;\n          this._fragments = [];\n          if (this._opcode === 2) {\n            let data;\n            if (this._binaryType === \"nodebuffer\") {\n              data = concat(fragments, messageLength);\n            } else if (this._binaryType === \"arraybuffer\") {\n              data = toArrayBuffer(concat(fragments, messageLength));\n            } else {\n              data = fragments;\n            }\n            this.emit(\"message\", data);\n          } else {\n            const buf = concat(fragments, messageLength);\n            if (!isValidUTF8(buf)) {\n              this._loop = false;\n              return error(Error, \"invalid UTF-8 sequence\", true, 1007);\n            }\n            this.emit(\"message\", buf.toString());\n          }\n        }\n        this._state = GET_INFO;\n      }\n      /**\n       * Handles a control message.\n       *\n       * @param {Buffer} data Data to handle\n       * @return {(Error|RangeError|undefined)} A possible error\n       * @private\n       */\n      controlMessage(data) {\n        if (this._opcode === 8) {\n          this._loop = false;\n          if (data.length === 0) {\n            this.emit(\"conclude\", 1005, \"\");\n            this.end();\n          } else if (data.length === 1) {\n            return error(RangeError, \"invalid payload length 1\", true, 1002);\n          } else {\n            const code = data.readUInt16BE(0);\n            if (!isValidStatusCode(code)) {\n              return error(RangeError, `invalid status code ${code}`, true, 1002);\n            }\n            const buf = data.slice(2);\n            if (!isValidUTF8(buf)) {\n              return error(Error, \"invalid UTF-8 sequence\", true, 1007);\n            }\n            this.emit(\"conclude\", code, buf.toString());\n            this.end();\n          }\n        } else if (this._opcode === 9) {\n          this.emit(\"ping\", data);\n        } else {\n          this.emit(\"pong\", data);\n        }\n        this._state = GET_INFO;\n      }\n    };\n    module2.exports = Receiver;\n    function error(ErrorCtor, message, prefix, statusCode) {\n      const err = new ErrorCtor(\n        prefix ? `Invalid WebSocket frame: ${message}` : message\n      );\n      Error.captureStackTrace(err, error);\n      err[kStatusCode] = statusCode;\n      return err;\n    }\n  }\n});\n\n// node_modules/ws/lib/sender.js\nvar require_sender = __commonJS({\n  \"node_modules/ws/lib/sender.js\"(exports2, module2) {\n    \"use strict\";\n    var { randomFillSync } = require(\"crypto\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var { EMPTY_BUFFER } = require_constants();\n    var { isValidStatusCode } = require_validation();\n    var { mask: applyMask, toBuffer } = require_buffer_util();\n    var mask = Buffer.alloc(4);\n    var Sender = class _Sender {\n      /**\n       * Creates a Sender instance.\n       *\n       * @param {net.Socket} socket The connection socket\n       * @param {Object} [extensions] An object containing the negotiated extensions\n       */\n      constructor(socket, extensions) {\n        this._extensions = extensions || {};\n        this._socket = socket;\n        this._firstFragment = true;\n        this._compress = false;\n        this._bufferedBytes = 0;\n        this._deflating = false;\n        this._queue = [];\n      }\n      /**\n       * Frames a piece of data according to the HyBi WebSocket protocol.\n       *\n       * @param {Buffer} data The data to frame\n       * @param {Object} options Options object\n       * @param {Number} options.opcode The opcode\n       * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n       *     modified\n       * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n       *     FIN bit\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n       *     RSV1 bit\n       * @return {Buffer[]} The framed data as a list of `Buffer` instances\n       * @public\n       */\n      static frame(data, options) {\n        const merge = options.mask && options.readOnly;\n        let offset = options.mask ? 6 : 2;\n        let payloadLength = data.length;\n        if (data.length >= 65536) {\n          offset += 8;\n          payloadLength = 127;\n        } else if (data.length > 125) {\n          offset += 2;\n          payloadLength = 126;\n        }\n        const target = Buffer.allocUnsafe(merge ? data.length + offset : offset);\n        target[0] = options.fin ? options.opcode | 128 : options.opcode;\n        if (options.rsv1) target[0] |= 64;\n        target[1] = payloadLength;\n        if (payloadLength === 126) {\n          target.writeUInt16BE(data.length, 2);\n        } else if (payloadLength === 127) {\n          target.writeUInt32BE(0, 2);\n          target.writeUInt32BE(data.length, 6);\n        }\n        if (!options.mask) return [target, data];\n        randomFillSync(mask, 0, 4);\n        target[1] |= 128;\n        target[offset - 4] = mask[0];\n        target[offset - 3] = mask[1];\n        target[offset - 2] = mask[2];\n        target[offset - 1] = mask[3];\n        if (merge) {\n          applyMask(data, mask, target, offset, data.length);\n          return [target];\n        }\n        applyMask(data, mask, data, 0, data.length);\n        return [target, data];\n      }\n      /**\n       * Sends a close message to the other peer.\n       *\n       * @param {Number} [code] The status code component of the body\n       * @param {String} [data] The message component of the body\n       * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      close(code, data, mask2, cb) {\n        let buf;\n        if (code === void 0) {\n          buf = EMPTY_BUFFER;\n        } else if (typeof code !== \"number\" || !isValidStatusCode(code)) {\n          throw new TypeError(\"First argument must be a valid error code number\");\n        } else if (data === void 0 || data === \"\") {\n          buf = Buffer.allocUnsafe(2);\n          buf.writeUInt16BE(code, 0);\n        } else {\n          const length = Buffer.byteLength(data);\n          if (length > 123) {\n            throw new RangeError(\"The message must not be greater than 123 bytes\");\n          }\n          buf = Buffer.allocUnsafe(2 + length);\n          buf.writeUInt16BE(code, 0);\n          buf.write(data, 2);\n        }\n        if (this._deflating) {\n          this.enqueue([this.doClose, buf, mask2, cb]);\n        } else {\n          this.doClose(buf, mask2, cb);\n        }\n      }\n      /**\n       * Frames and sends a close message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doClose(data, mask2, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 8,\n            mask: mask2,\n            readOnly: false\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a ping message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      ping(data, mask2, cb) {\n        const buf = toBuffer(data);\n        if (buf.length > 125) {\n          throw new RangeError(\"The data size must not be greater than 125 bytes\");\n        }\n        if (this._deflating) {\n          this.enqueue([this.doPing, buf, mask2, toBuffer.readOnly, cb]);\n        } else {\n          this.doPing(buf, mask2, toBuffer.readOnly, cb);\n        }\n      }\n      /**\n       * Frames and sends a ping message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doPing(data, mask2, readOnly, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 9,\n            mask: mask2,\n            readOnly\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a pong message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      pong(data, mask2, cb) {\n        const buf = toBuffer(data);\n        if (buf.length > 125) {\n          throw new RangeError(\"The data size must not be greater than 125 bytes\");\n        }\n        if (this._deflating) {\n          this.enqueue([this.doPong, buf, mask2, toBuffer.readOnly, cb]);\n        } else {\n          this.doPong(buf, mask2, toBuffer.readOnly, cb);\n        }\n      }\n      /**\n       * Frames and sends a pong message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n       * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      doPong(data, mask2, readOnly, cb) {\n        this.sendFrame(\n          _Sender.frame(data, {\n            fin: true,\n            rsv1: false,\n            opcode: 10,\n            mask: mask2,\n            readOnly\n          }),\n          cb\n        );\n      }\n      /**\n       * Sends a data message to the other peer.\n       *\n       * @param {*} data The message to send\n       * @param {Object} options Options object\n       * @param {Boolean} [options.compress=false] Specifies whether or not to\n       *     compress `data`\n       * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n       *     or text\n       * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n       *     last one\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      send(data, options, cb) {\n        const buf = toBuffer(data);\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        let opcode = options.binary ? 2 : 1;\n        let rsv1 = options.compress;\n        if (this._firstFragment) {\n          this._firstFragment = false;\n          if (rsv1 && perMessageDeflate) {\n            rsv1 = buf.length >= perMessageDeflate._threshold;\n          }\n          this._compress = rsv1;\n        } else {\n          rsv1 = false;\n          opcode = 0;\n        }\n        if (options.fin) this._firstFragment = true;\n        if (perMessageDeflate) {\n          const opts = {\n            fin: options.fin,\n            rsv1,\n            opcode,\n            mask: options.mask,\n            readOnly: toBuffer.readOnly\n          };\n          if (this._deflating) {\n            this.enqueue([this.dispatch, buf, this._compress, opts, cb]);\n          } else {\n            this.dispatch(buf, this._compress, opts, cb);\n          }\n        } else {\n          this.sendFrame(\n            _Sender.frame(buf, {\n              fin: options.fin,\n              rsv1: false,\n              opcode,\n              mask: options.mask,\n              readOnly: toBuffer.readOnly\n            }),\n            cb\n          );\n        }\n      }\n      /**\n       * Dispatches a data message.\n       *\n       * @param {Buffer} data The message to send\n       * @param {Boolean} [compress=false] Specifies whether or not to compress\n       *     `data`\n       * @param {Object} options Options object\n       * @param {Number} options.opcode The opcode\n       * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n       *     modified\n       * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n       *     FIN bit\n       * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n       *     `data`\n       * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n       *     RSV1 bit\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      dispatch(data, compress, options, cb) {\n        if (!compress) {\n          this.sendFrame(_Sender.frame(data, options), cb);\n          return;\n        }\n        const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n        this._bufferedBytes += data.length;\n        this._deflating = true;\n        perMessageDeflate.compress(data, options.fin, (_, buf) => {\n          if (this._socket.destroyed) {\n            const err = new Error(\n              \"The socket was closed while data was being compressed\"\n            );\n            if (typeof cb === \"function\") cb(err);\n            for (let i = 0; i < this._queue.length; i++) {\n              const callback = this._queue[i][4];\n              if (typeof callback === \"function\") callback(err);\n            }\n            return;\n          }\n          this._bufferedBytes -= data.length;\n          this._deflating = false;\n          options.readOnly = false;\n          this.sendFrame(_Sender.frame(buf, options), cb);\n          this.dequeue();\n        });\n      }\n      /**\n       * Executes queued send operations.\n       *\n       * @private\n       */\n      dequeue() {\n        while (!this._deflating && this._queue.length) {\n          const params = this._queue.shift();\n          this._bufferedBytes -= params[1].length;\n          Reflect.apply(params[0], this, params.slice(1));\n        }\n      }\n      /**\n       * Enqueues a send operation.\n       *\n       * @param {Array} params Send operation parameters.\n       * @private\n       */\n      enqueue(params) {\n        this._bufferedBytes += params[1].length;\n        this._queue.push(params);\n      }\n      /**\n       * Sends a frame.\n       *\n       * @param {Buffer[]} list The frame to send\n       * @param {Function} [cb] Callback\n       * @private\n       */\n      sendFrame(list, cb) {\n        if (list.length === 2) {\n          this._socket.cork();\n          this._socket.write(list[0]);\n          this._socket.write(list[1], cb);\n          this._socket.uncork();\n        } else {\n          this._socket.write(list[0], cb);\n        }\n      }\n    };\n    module2.exports = Sender;\n  }\n});\n\n// node_modules/ws/lib/event-target.js\nvar require_event_target = __commonJS({\n  \"node_modules/ws/lib/event-target.js\"(exports2, module2) {\n    \"use strict\";\n    var Event = class {\n      /**\n       * Create a new `Event`.\n       *\n       * @param {String} type The name of the event\n       * @param {Object} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(type, target) {\n        this.target = target;\n        this.type = type;\n      }\n    };\n    var MessageEvent = class extends Event {\n      /**\n       * Create a new `MessageEvent`.\n       *\n       * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(data, target) {\n        super(\"message\", target);\n        this.data = data;\n      }\n    };\n    var CloseEvent = class extends Event {\n      /**\n       * Create a new `CloseEvent`.\n       *\n       * @param {Number} code The status code explaining why the connection is being\n       *     closed\n       * @param {String} reason A human-readable string explaining why the\n       *     connection is closing\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(code, reason, target) {\n        super(\"close\", target);\n        this.wasClean = target._closeFrameReceived && target._closeFrameSent;\n        this.reason = reason;\n        this.code = code;\n      }\n    };\n    var OpenEvent = class extends Event {\n      /**\n       * Create a new `OpenEvent`.\n       *\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(target) {\n        super(\"open\", target);\n      }\n    };\n    var ErrorEvent = class extends Event {\n      /**\n       * Create a new `ErrorEvent`.\n       *\n       * @param {Object} error The error that generated this event\n       * @param {WebSocket} target A reference to the target to which the event was\n       *     dispatched\n       */\n      constructor(error, target) {\n        super(\"error\", target);\n        this.message = error.message;\n        this.error = error;\n      }\n    };\n    var EventTarget = {\n      /**\n       * Register an event listener.\n       *\n       * @param {String} type A string representing the event type to listen for\n       * @param {Function} listener The listener to add\n       * @param {Object} [options] An options object specifies characteristics about\n       *     the event listener\n       * @param {Boolean} [options.once=false] A `Boolean`` indicating that the\n       *     listener should be invoked at most once after being added. If `true`,\n       *     the listener would be automatically removed when invoked.\n       * @public\n       */\n      addEventListener(type, listener, options) {\n        if (typeof listener !== \"function\") return;\n        function onMessage(data) {\n          listener.call(this, new MessageEvent(data, this));\n        }\n        function onClose(code, message) {\n          listener.call(this, new CloseEvent(code, message, this));\n        }\n        function onError(error) {\n          listener.call(this, new ErrorEvent(error, this));\n        }\n        function onOpen() {\n          listener.call(this, new OpenEvent(this));\n        }\n        const method = options && options.once ? \"once\" : \"on\";\n        if (type === \"message\") {\n          onMessage._listener = listener;\n          this[method](type, onMessage);\n        } else if (type === \"close\") {\n          onClose._listener = listener;\n          this[method](type, onClose);\n        } else if (type === \"error\") {\n          onError._listener = listener;\n          this[method](type, onError);\n        } else if (type === \"open\") {\n          onOpen._listener = listener;\n          this[method](type, onOpen);\n        } else {\n          this[method](type, listener);\n        }\n      },\n      /**\n       * Remove an event listener.\n       *\n       * @param {String} type A string representing the event type to remove\n       * @param {Function} listener The listener to remove\n       * @public\n       */\n      removeEventListener(type, listener) {\n        const listeners = this.listeners(type);\n        for (let i = 0; i < listeners.length; i++) {\n          if (listeners[i] === listener || listeners[i]._listener === listener) {\n            this.removeListener(type, listeners[i]);\n          }\n        }\n      }\n    };\n    module2.exports = EventTarget;\n  }\n});\n\n// node_modules/ws/lib/extension.js\nvar require_extension = __commonJS({\n  \"node_modules/ws/lib/extension.js\"(exports2, module2) {\n    \"use strict\";\n    var tokenChars = [\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 0 - 15\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 16 - 31\n      0,\n      1,\n      0,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      1,\n      1,\n      0,\n      1,\n      1,\n      0,\n      // 32 - 47\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // 48 - 63\n      0,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      // 64 - 79\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      0,\n      0,\n      1,\n      1,\n      // 80 - 95\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      // 96 - 111\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      1,\n      0,\n      1,\n      0,\n      1,\n      0\n      // 112 - 127\n    ];\n    function push(dest, name2, elem) {\n      if (dest[name2] === void 0) dest[name2] = [elem];\n      else dest[name2].push(elem);\n    }\n    function parse(header) {\n      const offers = /* @__PURE__ */ Object.create(null);\n      if (header === void 0 || header === \"\") return offers;\n      let params = /* @__PURE__ */ Object.create(null);\n      let mustUnescape = false;\n      let isEscaping = false;\n      let inQuotes = false;\n      let extensionName;\n      let paramName;\n      let start = -1;\n      let end = -1;\n      let i = 0;\n      for (; i < header.length; i++) {\n        const code = header.charCodeAt(i);\n        if (extensionName === void 0) {\n          if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (code === 32 || code === 9) {\n            if (end === -1 && start !== -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            const name2 = header.slice(start, end);\n            if (code === 44) {\n              push(offers, name2, params);\n              params = /* @__PURE__ */ Object.create(null);\n            } else {\n              extensionName = name2;\n            }\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        } else if (paramName === void 0) {\n          if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (code === 32 || code === 9) {\n            if (end === -1 && start !== -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            push(params, header.slice(start, end), true);\n            if (code === 44) {\n              push(offers, extensionName, params);\n              params = /* @__PURE__ */ Object.create(null);\n              extensionName = void 0;\n            }\n            start = end = -1;\n          } else if (code === 61 && start !== -1 && end === -1) {\n            paramName = header.slice(start, i);\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        } else {\n          if (isEscaping) {\n            if (tokenChars[code] !== 1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (start === -1) start = i;\n            else if (!mustUnescape) mustUnescape = true;\n            isEscaping = false;\n          } else if (inQuotes) {\n            if (tokenChars[code] === 1) {\n              if (start === -1) start = i;\n            } else if (code === 34 && start !== -1) {\n              inQuotes = false;\n              end = i;\n            } else if (code === 92) {\n              isEscaping = true;\n            } else {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n          } else if (code === 34 && header.charCodeAt(i - 1) === 61) {\n            inQuotes = true;\n          } else if (end === -1 && tokenChars[code] === 1) {\n            if (start === -1) start = i;\n          } else if (start !== -1 && (code === 32 || code === 9)) {\n            if (end === -1) end = i;\n          } else if (code === 59 || code === 44) {\n            if (start === -1) {\n              throw new SyntaxError(`Unexpected character at index ${i}`);\n            }\n            if (end === -1) end = i;\n            let value = header.slice(start, end);\n            if (mustUnescape) {\n              value = value.replace(/\\\\/g, \"\");\n              mustUnescape = false;\n            }\n            push(params, paramName, value);\n            if (code === 44) {\n              push(offers, extensionName, params);\n              params = /* @__PURE__ */ Object.create(null);\n              extensionName = void 0;\n            }\n            paramName = void 0;\n            start = end = -1;\n          } else {\n            throw new SyntaxError(`Unexpected character at index ${i}`);\n          }\n        }\n      }\n      if (start === -1 || inQuotes) {\n        throw new SyntaxError(\"Unexpected end of input\");\n      }\n      if (end === -1) end = i;\n      const token = header.slice(start, end);\n      if (extensionName === void 0) {\n        push(offers, token, params);\n      } else {\n        if (paramName === void 0) {\n          push(params, token, true);\n        } else if (mustUnescape) {\n          push(params, paramName, token.replace(/\\\\/g, \"\"));\n        } else {\n          push(params, paramName, token);\n        }\n        push(offers, extensionName, params);\n      }\n      return offers;\n    }\n    function format(extensions) {\n      return Object.keys(extensions).map((extension) => {\n        let configurations = extensions[extension];\n        if (!Array.isArray(configurations)) configurations = [configurations];\n        return configurations.map((params) => {\n          return [extension].concat(\n            Object.keys(params).map((k) => {\n              let values = params[k];\n              if (!Array.isArray(values)) values = [values];\n              return values.map((v) => v === true ? k : `${k}=${v}`).join(\"; \");\n            })\n          ).join(\"; \");\n        }).join(\", \");\n      }).join(\", \");\n    }\n    module2.exports = { format, parse };\n  }\n});\n\n// node_modules/ws/lib/websocket.js\nvar require_websocket = __commonJS({\n  \"node_modules/ws/lib/websocket.js\"(exports2, module2) {\n    \"use strict\";\n    var EventEmitter = require(\"events\");\n    var https = require(\"https\");\n    var http = require(\"http\");\n    var net = require(\"net\");\n    var tls = require(\"tls\");\n    var { randomBytes, createHash } = require(\"crypto\");\n    var { URL } = require(\"url\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var Receiver = require_receiver();\n    var Sender = require_sender();\n    var {\n      BINARY_TYPES,\n      EMPTY_BUFFER,\n      GUID,\n      kStatusCode,\n      kWebSocket,\n      NOOP\n    } = require_constants();\n    var { addEventListener, removeEventListener } = require_event_target();\n    var { format, parse } = require_extension();\n    var { toBuffer } = require_buffer_util();\n    var readyStates = [\"CONNECTING\", \"OPEN\", \"CLOSING\", \"CLOSED\"];\n    var protocolVersions = [8, 13];\n    var closeTimeout = 30 * 1e3;\n    var WebSocket = class _WebSocket extends EventEmitter {\n      /**\n       * Create a new `WebSocket`.\n       *\n       * @param {(String|url.URL)} address The URL to which to connect\n       * @param {(String|String[])} [protocols] The subprotocols\n       * @param {Object} [options] Connection options\n       */\n      constructor(address, protocols, options) {\n        super();\n        this._binaryType = BINARY_TYPES[0];\n        this._closeCode = 1006;\n        this._closeFrameReceived = false;\n        this._closeFrameSent = false;\n        this._closeMessage = \"\";\n        this._closeTimer = null;\n        this._extensions = {};\n        this._protocol = \"\";\n        this._readyState = _WebSocket.CONNECTING;\n        this._receiver = null;\n        this._sender = null;\n        this._socket = null;\n        if (address !== null) {\n          this._bufferedAmount = 0;\n          this._isServer = false;\n          this._redirects = 0;\n          if (Array.isArray(protocols)) {\n            protocols = protocols.join(\", \");\n          } else if (typeof protocols === \"object\" && protocols !== null) {\n            options = protocols;\n            protocols = void 0;\n          }\n          initAsClient(this, address, protocols, options);\n        } else {\n          this._isServer = true;\n        }\n      }\n      /**\n       * This deviates from the WHATWG interface since ws doesn't support the\n       * required default \"blob\" type (instead we define a custom \"nodebuffer\"\n       * type).\n       *\n       * @type {String}\n       */\n      get binaryType() {\n        return this._binaryType;\n      }\n      set binaryType(type) {\n        if (!BINARY_TYPES.includes(type)) return;\n        this._binaryType = type;\n        if (this._receiver) this._receiver._binaryType = type;\n      }\n      /**\n       * @type {Number}\n       */\n      get bufferedAmount() {\n        if (!this._socket) return this._bufferedAmount;\n        return this._socket._writableState.length + this._sender._bufferedBytes;\n      }\n      /**\n       * @type {String}\n       */\n      get extensions() {\n        return Object.keys(this._extensions).join();\n      }\n      /**\n       * @type {String}\n       */\n      get protocol() {\n        return this._protocol;\n      }\n      /**\n       * @type {Number}\n       */\n      get readyState() {\n        return this._readyState;\n      }\n      /**\n       * @type {String}\n       */\n      get url() {\n        return this._url;\n      }\n      /**\n       * Set up the socket and the internal resources.\n       *\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Number} [maxPayload=0] The maximum allowed message size\n       * @private\n       */\n      setSocket(socket, head, maxPayload) {\n        const receiver = new Receiver(\n          this.binaryType,\n          this._extensions,\n          this._isServer,\n          maxPayload\n        );\n        this._sender = new Sender(socket, this._extensions);\n        this._receiver = receiver;\n        this._socket = socket;\n        receiver[kWebSocket] = this;\n        socket[kWebSocket] = this;\n        receiver.on(\"conclude\", receiverOnConclude);\n        receiver.on(\"drain\", receiverOnDrain);\n        receiver.on(\"error\", receiverOnError);\n        receiver.on(\"message\", receiverOnMessage);\n        receiver.on(\"ping\", receiverOnPing);\n        receiver.on(\"pong\", receiverOnPong);\n        socket.setTimeout(0);\n        socket.setNoDelay();\n        if (head.length > 0) socket.unshift(head);\n        socket.on(\"close\", socketOnClose);\n        socket.on(\"data\", socketOnData);\n        socket.on(\"end\", socketOnEnd);\n        socket.on(\"error\", socketOnError);\n        this._readyState = _WebSocket.OPEN;\n        this.emit(\"open\");\n      }\n      /**\n       * Emit the `'close'` event.\n       *\n       * @private\n       */\n      emitClose() {\n        if (!this._socket) {\n          this._readyState = _WebSocket.CLOSED;\n          this.emit(\"close\", this._closeCode, this._closeMessage);\n          return;\n        }\n        if (this._extensions[PerMessageDeflate.extensionName]) {\n          this._extensions[PerMessageDeflate.extensionName].cleanup();\n        }\n        this._receiver.removeAllListeners();\n        this._readyState = _WebSocket.CLOSED;\n        this.emit(\"close\", this._closeCode, this._closeMessage);\n      }\n      /**\n       * Start a closing handshake.\n       *\n       *          +----------+   +-----------+   +----------+\n       *     - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n       *    |     +----------+   +-----------+   +----------+     |\n       *          +----------+   +-----------+         |\n       * CLOSING  |ws.close()|<--|close frame|<--+-----+       CLOSING\n       *          +----------+   +-----------+   |\n       *    |           |                        |   +---+        |\n       *                +------------------------+-->|fin| - - - -\n       *    |         +---+                      |   +---+\n       *     - - - - -|fin|<---------------------+\n       *              +---+\n       *\n       * @param {Number} [code] Status code explaining why the connection is closing\n       * @param {String} [data] A string explaining why the connection is closing\n       * @public\n       */\n      close(code, data) {\n        if (this.readyState === _WebSocket.CLOSED) return;\n        if (this.readyState === _WebSocket.CONNECTING) {\n          const msg = \"WebSocket was closed before the connection was established\";\n          return abortHandshake(this, this._req, msg);\n        }\n        if (this.readyState === _WebSocket.CLOSING) {\n          if (this._closeFrameSent && this._closeFrameReceived) this._socket.end();\n          return;\n        }\n        this._readyState = _WebSocket.CLOSING;\n        this._sender.close(code, data, !this._isServer, (err) => {\n          if (err) return;\n          this._closeFrameSent = true;\n          if (this._closeFrameReceived) this._socket.end();\n        });\n        this._closeTimer = setTimeout(\n          this._socket.destroy.bind(this._socket),\n          closeTimeout\n        );\n      }\n      /**\n       * Send a ping.\n       *\n       * @param {*} [data] The data to send\n       * @param {Boolean} [mask] Indicates whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when the ping is sent\n       * @public\n       */\n      ping(data, mask, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof data === \"function\") {\n          cb = data;\n          data = mask = void 0;\n        } else if (typeof mask === \"function\") {\n          cb = mask;\n          mask = void 0;\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        if (mask === void 0) mask = !this._isServer;\n        this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n      }\n      /**\n       * Send a pong.\n       *\n       * @param {*} [data] The data to send\n       * @param {Boolean} [mask] Indicates whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when the pong is sent\n       * @public\n       */\n      pong(data, mask, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof data === \"function\") {\n          cb = data;\n          data = mask = void 0;\n        } else if (typeof mask === \"function\") {\n          cb = mask;\n          mask = void 0;\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        if (mask === void 0) mask = !this._isServer;\n        this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n      }\n      /**\n       * Send a data message.\n       *\n       * @param {*} data The message to send\n       * @param {Object} [options] Options object\n       * @param {Boolean} [options.compress] Specifies whether or not to compress\n       *     `data`\n       * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n       *     text\n       * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n       *     last one\n       * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n       * @param {Function} [cb] Callback which is executed when data is written out\n       * @public\n       */\n      send(data, options, cb) {\n        if (this.readyState === _WebSocket.CONNECTING) {\n          throw new Error(\"WebSocket is not open: readyState 0 (CONNECTING)\");\n        }\n        if (typeof options === \"function\") {\n          cb = options;\n          options = {};\n        }\n        if (typeof data === \"number\") data = data.toString();\n        if (this.readyState !== _WebSocket.OPEN) {\n          sendAfterClose(this, data, cb);\n          return;\n        }\n        const opts = {\n          binary: typeof data !== \"string\",\n          mask: !this._isServer,\n          compress: true,\n          fin: true,\n          ...options\n        };\n        if (!this._extensions[PerMessageDeflate.extensionName]) {\n          opts.compress = false;\n        }\n        this._sender.send(data || EMPTY_BUFFER, opts, cb);\n      }\n      /**\n       * Forcibly close the connection.\n       *\n       * @public\n       */\n      terminate() {\n        if (this.readyState === _WebSocket.CLOSED) return;\n        if (this.readyState === _WebSocket.CONNECTING) {\n          const msg = \"WebSocket was closed before the connection was established\";\n          return abortHandshake(this, this._req, msg);\n        }\n        if (this._socket) {\n          this._readyState = _WebSocket.CLOSING;\n          this._socket.destroy();\n        }\n      }\n    };\n    readyStates.forEach((readyState, i) => {\n      const descriptor = { enumerable: true, value: i };\n      Object.defineProperty(WebSocket.prototype, readyState, descriptor);\n      Object.defineProperty(WebSocket, readyState, descriptor);\n    });\n    [\n      \"binaryType\",\n      \"bufferedAmount\",\n      \"extensions\",\n      \"protocol\",\n      \"readyState\",\n      \"url\"\n    ].forEach((property) => {\n      Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n    });\n    [\"open\", \"error\", \"close\", \"message\"].forEach((method) => {\n      Object.defineProperty(WebSocket.prototype, `on${method}`, {\n        configurable: true,\n        enumerable: true,\n        /**\n         * Return the listener of the event.\n         *\n         * @return {(Function|undefined)} The event listener or `undefined`\n         * @public\n         */\n        get() {\n          const listeners = this.listeners(method);\n          for (let i = 0; i < listeners.length; i++) {\n            if (listeners[i]._listener) return listeners[i]._listener;\n          }\n          return void 0;\n        },\n        /**\n         * Add a listener for the event.\n         *\n         * @param {Function} listener The listener to add\n         * @public\n         */\n        set(listener) {\n          const listeners = this.listeners(method);\n          for (let i = 0; i < listeners.length; i++) {\n            if (listeners[i]._listener) this.removeListener(method, listeners[i]);\n          }\n          this.addEventListener(method, listener);\n        }\n      });\n    });\n    WebSocket.prototype.addEventListener = addEventListener;\n    WebSocket.prototype.removeEventListener = removeEventListener;\n    module2.exports = WebSocket;\n    function initAsClient(websocket, address, protocols, options) {\n      const opts = {\n        protocolVersion: protocolVersions[1],\n        maxPayload: 100 * 1024 * 1024,\n        perMessageDeflate: true,\n        followRedirects: false,\n        maxRedirects: 10,\n        ...options,\n        createConnection: void 0,\n        socketPath: void 0,\n        hostname: void 0,\n        protocol: void 0,\n        timeout: void 0,\n        method: void 0,\n        host: void 0,\n        path: void 0,\n        port: void 0\n      };\n      if (!protocolVersions.includes(opts.protocolVersion)) {\n        throw new RangeError(\n          `Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(\", \")})`\n        );\n      }\n      let parsedUrl;\n      if (address instanceof URL) {\n        parsedUrl = address;\n        websocket._url = address.href;\n      } else {\n        parsedUrl = new URL(address);\n        websocket._url = address;\n      }\n      const isUnixSocket = parsedUrl.protocol === \"ws+unix:\";\n      if (!parsedUrl.host && (!isUnixSocket || !parsedUrl.pathname)) {\n        throw new Error(`Invalid URL: ${websocket.url}`);\n      }\n      const isSecure = parsedUrl.protocol === \"wss:\" || parsedUrl.protocol === \"https:\";\n      const defaultPort = isSecure ? 443 : 80;\n      const key = randomBytes(16).toString(\"base64\");\n      const get = isSecure ? https.get : http.get;\n      let perMessageDeflate;\n      opts.createConnection = isSecure ? tlsConnect : netConnect;\n      opts.defaultPort = opts.defaultPort || defaultPort;\n      opts.port = parsedUrl.port || defaultPort;\n      opts.host = parsedUrl.hostname.startsWith(\"[\") ? parsedUrl.hostname.slice(1, -1) : parsedUrl.hostname;\n      opts.headers = {\n        \"Sec-WebSocket-Version\": opts.protocolVersion,\n        \"Sec-WebSocket-Key\": key,\n        Connection: \"Upgrade\",\n        Upgrade: \"websocket\",\n        ...opts.headers\n      };\n      opts.path = parsedUrl.pathname + parsedUrl.search;\n      opts.timeout = opts.handshakeTimeout;\n      if (opts.perMessageDeflate) {\n        perMessageDeflate = new PerMessageDeflate(\n          opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n          false,\n          opts.maxPayload\n        );\n        opts.headers[\"Sec-WebSocket-Extensions\"] = format({\n          [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n        });\n      }\n      if (protocols) {\n        opts.headers[\"Sec-WebSocket-Protocol\"] = protocols;\n      }\n      if (opts.origin) {\n        if (opts.protocolVersion < 13) {\n          opts.headers[\"Sec-WebSocket-Origin\"] = opts.origin;\n        } else {\n          opts.headers.Origin = opts.origin;\n        }\n      }\n      if (parsedUrl.username || parsedUrl.password) {\n        opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n      }\n      if (isUnixSocket) {\n        const parts = opts.path.split(\":\");\n        opts.socketPath = parts[0];\n        opts.path = parts[1];\n      }\n      let req = websocket._req = get(opts);\n      if (opts.timeout) {\n        req.on(\"timeout\", () => {\n          abortHandshake(websocket, req, \"Opening handshake has timed out\");\n        });\n      }\n      req.on(\"error\", (err) => {\n        if (req === null || req.aborted) return;\n        req = websocket._req = null;\n        websocket._readyState = WebSocket.CLOSING;\n        websocket.emit(\"error\", err);\n        websocket.emitClose();\n      });\n      req.on(\"response\", (res) => {\n        const location = res.headers.location;\n        const statusCode = res.statusCode;\n        if (location && opts.followRedirects && statusCode >= 300 && statusCode < 400) {\n          if (++websocket._redirects > opts.maxRedirects) {\n            abortHandshake(websocket, req, \"Maximum redirects exceeded\");\n            return;\n          }\n          req.abort();\n          const addr = new URL(location, address);\n          initAsClient(websocket, addr, protocols, options);\n        } else if (!websocket.emit(\"unexpected-response\", req, res)) {\n          abortHandshake(\n            websocket,\n            req,\n            `Unexpected server response: ${res.statusCode}`\n          );\n        }\n      });\n      req.on(\"upgrade\", (res, socket, head) => {\n        websocket.emit(\"upgrade\", res);\n        if (websocket.readyState !== WebSocket.CONNECTING) return;\n        req = websocket._req = null;\n        const digest = createHash(\"sha1\").update(key + GUID).digest(\"base64\");\n        if (res.headers[\"sec-websocket-accept\"] !== digest) {\n          abortHandshake(websocket, socket, \"Invalid Sec-WebSocket-Accept header\");\n          return;\n        }\n        const serverProt = res.headers[\"sec-websocket-protocol\"];\n        const protList = (protocols || \"\").split(/, */);\n        let protError;\n        if (!protocols && serverProt) {\n          protError = \"Server sent a subprotocol but none was requested\";\n        } else if (protocols && !serverProt) {\n          protError = \"Server sent no subprotocol\";\n        } else if (serverProt && !protList.includes(serverProt)) {\n          protError = \"Server sent an invalid subprotocol\";\n        }\n        if (protError) {\n          abortHandshake(websocket, socket, protError);\n          return;\n        }\n        if (serverProt) websocket._protocol = serverProt;\n        if (perMessageDeflate) {\n          try {\n            const extensions = parse(res.headers[\"sec-websocket-extensions\"]);\n            if (extensions[PerMessageDeflate.extensionName]) {\n              perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n              websocket._extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n            }\n          } catch (err) {\n            abortHandshake(\n              websocket,\n              socket,\n              \"Invalid Sec-WebSocket-Extensions header\"\n            );\n            return;\n          }\n        }\n        websocket.setSocket(socket, head, opts.maxPayload);\n      });\n    }\n    function netConnect(options) {\n      options.path = options.socketPath;\n      return net.connect(options);\n    }\n    function tlsConnect(options) {\n      options.path = void 0;\n      if (!options.servername && options.servername !== \"\") {\n        options.servername = net.isIP(options.host) ? \"\" : options.host;\n      }\n      return tls.connect(options);\n    }\n    function abortHandshake(websocket, stream, message) {\n      websocket._readyState = WebSocket.CLOSING;\n      const err = new Error(message);\n      Error.captureStackTrace(err, abortHandshake);\n      if (stream.setHeader) {\n        stream.abort();\n        if (stream.socket && !stream.socket.destroyed) {\n          stream.socket.destroy();\n        }\n        stream.once(\"abort\", websocket.emitClose.bind(websocket));\n        websocket.emit(\"error\", err);\n      } else {\n        stream.destroy(err);\n        stream.once(\"error\", websocket.emit.bind(websocket, \"error\"));\n        stream.once(\"close\", websocket.emitClose.bind(websocket));\n      }\n    }\n    function sendAfterClose(websocket, data, cb) {\n      if (data) {\n        const length = toBuffer(data).length;\n        if (websocket._socket) websocket._sender._bufferedBytes += length;\n        else websocket._bufferedAmount += length;\n      }\n      if (cb) {\n        const err = new Error(\n          `WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})`\n        );\n        cb(err);\n      }\n    }\n    function receiverOnConclude(code, reason) {\n      const websocket = this[kWebSocket];\n      websocket._socket.removeListener(\"data\", socketOnData);\n      websocket._socket.resume();\n      websocket._closeFrameReceived = true;\n      websocket._closeMessage = reason;\n      websocket._closeCode = code;\n      if (code === 1005) websocket.close();\n      else websocket.close(code, reason);\n    }\n    function receiverOnDrain() {\n      this[kWebSocket]._socket.resume();\n    }\n    function receiverOnError(err) {\n      const websocket = this[kWebSocket];\n      websocket._socket.removeListener(\"data\", socketOnData);\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._closeCode = err[kStatusCode];\n      websocket.emit(\"error\", err);\n      websocket._socket.destroy();\n    }\n    function receiverOnFinish() {\n      this[kWebSocket].emitClose();\n    }\n    function receiverOnMessage(data) {\n      this[kWebSocket].emit(\"message\", data);\n    }\n    function receiverOnPing(data) {\n      const websocket = this[kWebSocket];\n      websocket.pong(data, !websocket._isServer, NOOP);\n      websocket.emit(\"ping\", data);\n    }\n    function receiverOnPong(data) {\n      this[kWebSocket].emit(\"pong\", data);\n    }\n    function socketOnClose() {\n      const websocket = this[kWebSocket];\n      this.removeListener(\"close\", socketOnClose);\n      this.removeListener(\"end\", socketOnEnd);\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._socket.read();\n      websocket._receiver.end();\n      this.removeListener(\"data\", socketOnData);\n      this[kWebSocket] = void 0;\n      clearTimeout(websocket._closeTimer);\n      if (websocket._receiver._writableState.finished || websocket._receiver._writableState.errorEmitted) {\n        websocket.emitClose();\n      } else {\n        websocket._receiver.on(\"error\", receiverOnFinish);\n        websocket._receiver.on(\"finish\", receiverOnFinish);\n      }\n    }\n    function socketOnData(chunk) {\n      if (!this[kWebSocket]._receiver.write(chunk)) {\n        this.pause();\n      }\n    }\n    function socketOnEnd() {\n      const websocket = this[kWebSocket];\n      websocket._readyState = WebSocket.CLOSING;\n      websocket._receiver.end();\n      this.end();\n    }\n    function socketOnError() {\n      const websocket = this[kWebSocket];\n      this.removeListener(\"error\", socketOnError);\n      this.on(\"error\", NOOP);\n      if (websocket) {\n        websocket._readyState = WebSocket.CLOSING;\n        this.destroy();\n      }\n    }\n  }\n});\n\n// node_modules/ws/lib/stream.js\nvar require_stream = __commonJS({\n  \"node_modules/ws/lib/stream.js\"(exports2, module2) {\n    \"use strict\";\n    var { Duplex } = require(\"stream\");\n    function emitClose(stream) {\n      stream.emit(\"close\");\n    }\n    function duplexOnEnd() {\n      if (!this.destroyed && this._writableState.finished) {\n        this.destroy();\n      }\n    }\n    function duplexOnError(err) {\n      this.removeListener(\"error\", duplexOnError);\n      this.destroy();\n      if (this.listenerCount(\"error\") === 0) {\n        this.emit(\"error\", err);\n      }\n    }\n    function createWebSocketStream(ws, options) {\n      let resumeOnReceiverDrain = true;\n      function receiverOnDrain() {\n        if (resumeOnReceiverDrain) ws._socket.resume();\n      }\n      if (ws.readyState === ws.CONNECTING) {\n        ws.once(\"open\", function open() {\n          ws._receiver.removeAllListeners(\"drain\");\n          ws._receiver.on(\"drain\", receiverOnDrain);\n        });\n      } else {\n        ws._receiver.removeAllListeners(\"drain\");\n        ws._receiver.on(\"drain\", receiverOnDrain);\n      }\n      const duplex = new Duplex({\n        ...options,\n        autoDestroy: false,\n        emitClose: false,\n        objectMode: false,\n        writableObjectMode: false\n      });\n      ws.on(\"message\", function message(msg) {\n        if (!duplex.push(msg)) {\n          resumeOnReceiverDrain = false;\n          ws._socket.pause();\n        }\n      });\n      ws.once(\"error\", function error(err) {\n        if (duplex.destroyed) return;\n        duplex.destroy(err);\n      });\n      ws.once(\"close\", function close() {\n        if (duplex.destroyed) return;\n        duplex.push(null);\n      });\n      duplex._destroy = function(err, callback) {\n        if (ws.readyState === ws.CLOSED) {\n          callback(err);\n          process.nextTick(emitClose, duplex);\n          return;\n        }\n        let called = false;\n        ws.once(\"error\", function error(err2) {\n          called = true;\n          callback(err2);\n        });\n        ws.once(\"close\", function close() {\n          if (!called) callback(err);\n          process.nextTick(emitClose, duplex);\n        });\n        ws.terminate();\n      };\n      duplex._final = function(callback) {\n        if (ws.readyState === ws.CONNECTING) {\n          ws.once(\"open\", function open() {\n            duplex._final(callback);\n          });\n          return;\n        }\n        if (ws._socket === null) return;\n        if (ws._socket._writableState.finished) {\n          callback();\n          if (duplex._readableState.endEmitted) duplex.destroy();\n        } else {\n          ws._socket.once(\"finish\", function finish() {\n            callback();\n          });\n          ws.close();\n        }\n      };\n      duplex._read = function() {\n        if (ws.readyState === ws.OPEN && !resumeOnReceiverDrain) {\n          resumeOnReceiverDrain = true;\n          if (!ws._receiver._writableState.needDrain) ws._socket.resume();\n        }\n      };\n      duplex._write = function(chunk, encoding, callback) {\n        if (ws.readyState === ws.CONNECTING) {\n          ws.once(\"open\", function open() {\n            duplex._write(chunk, encoding, callback);\n          });\n          return;\n        }\n        ws.send(chunk, callback);\n      };\n      duplex.on(\"end\", duplexOnEnd);\n      duplex.on(\"error\", duplexOnError);\n      return duplex;\n    }\n    module2.exports = createWebSocketStream;\n  }\n});\n\n// node_modules/ws/lib/websocket-server.js\nvar require_websocket_server = __commonJS({\n  \"node_modules/ws/lib/websocket-server.js\"(exports2, module2) {\n    \"use strict\";\n    var EventEmitter = require(\"events\");\n    var { createHash } = require(\"crypto\");\n    var { createServer, STATUS_CODES } = require(\"http\");\n    var PerMessageDeflate = require_permessage_deflate();\n    var WebSocket = require_websocket();\n    var { format, parse } = require_extension();\n    var { GUID, kWebSocket } = require_constants();\n    var keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n    var WebSocketServer = class extends EventEmitter {\n      /**\n       * Create a `WebSocketServer` instance.\n       *\n       * @param {Object} options Configuration options\n       * @param {Number} [options.backlog=511] The maximum length of the queue of\n       *     pending connections\n       * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n       *     track clients\n       * @param {Function} [options.handleProtocols] A hook to handle protocols\n       * @param {String} [options.host] The hostname where to bind the server\n       * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n       *     size\n       * @param {Boolean} [options.noServer=false] Enable no server mode\n       * @param {String} [options.path] Accept only connections matching this path\n       * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n       *     permessage-deflate\n       * @param {Number} [options.port] The port where to bind the server\n       * @param {http.Server} [options.server] A pre-created HTTP/S server to use\n       * @param {Function} [options.verifyClient] A hook to reject connections\n       * @param {Function} [callback] A listener for the `listening` event\n       */\n      constructor(options, callback) {\n        super();\n        options = {\n          maxPayload: 100 * 1024 * 1024,\n          perMessageDeflate: false,\n          handleProtocols: null,\n          clientTracking: true,\n          verifyClient: null,\n          noServer: false,\n          backlog: null,\n          // use default (511 as implemented in net.js)\n          server: null,\n          host: null,\n          path: null,\n          port: null,\n          ...options\n        };\n        if (options.port == null && !options.server && !options.noServer) {\n          throw new TypeError(\n            'One of the \"port\", \"server\", or \"noServer\" options must be specified'\n          );\n        }\n        if (options.port != null) {\n          this._server = createServer((req, res) => {\n            const body = STATUS_CODES[426];\n            res.writeHead(426, {\n              \"Content-Length\": body.length,\n              \"Content-Type\": \"text/plain\"\n            });\n            res.end(body);\n          });\n          this._server.listen(\n            options.port,\n            options.host,\n            options.backlog,\n            callback\n          );\n        } else if (options.server) {\n          this._server = options.server;\n        }\n        if (this._server) {\n          const emitConnection = this.emit.bind(this, \"connection\");\n          this._removeListeners = addListeners(this._server, {\n            listening: this.emit.bind(this, \"listening\"),\n            error: this.emit.bind(this, \"error\"),\n            upgrade: (req, socket, head) => {\n              this.handleUpgrade(req, socket, head, emitConnection);\n            }\n          });\n        }\n        if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n        if (options.clientTracking) this.clients = /* @__PURE__ */ new Set();\n        this.options = options;\n      }\n      /**\n       * Returns the bound address, the address family name, and port of the server\n       * as reported by the operating system if listening on an IP socket.\n       * If the server is listening on a pipe or UNIX domain socket, the name is\n       * returned as a string.\n       *\n       * @return {(Object|String|null)} The address of the server\n       * @public\n       */\n      address() {\n        if (this.options.noServer) {\n          throw new Error('The server is operating in \"noServer\" mode');\n        }\n        if (!this._server) return null;\n        return this._server.address();\n      }\n      /**\n       * Close the server.\n       *\n       * @param {Function} [cb] Callback\n       * @public\n       */\n      close(cb) {\n        if (cb) this.once(\"close\", cb);\n        if (this.clients) {\n          for (const client of this.clients) client.terminate();\n        }\n        const server = this._server;\n        if (server) {\n          this._removeListeners();\n          this._removeListeners = this._server = null;\n          if (this.options.port != null) {\n            server.close(() => this.emit(\"close\"));\n            return;\n          }\n        }\n        process.nextTick(emitClose, this);\n      }\n      /**\n       * See if a given request should be handled by this server instance.\n       *\n       * @param {http.IncomingMessage} req Request object to inspect\n       * @return {Boolean} `true` if the request is valid, else `false`\n       * @public\n       */\n      shouldHandle(req) {\n        if (this.options.path) {\n          const index = req.url.indexOf(\"?\");\n          const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n          if (pathname !== this.options.path) return false;\n        }\n        return true;\n      }\n      /**\n       * Handle a HTTP Upgrade request.\n       *\n       * @param {http.IncomingMessage} req The request object\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Function} cb Callback\n       * @public\n       */\n      handleUpgrade(req, socket, head, cb) {\n        socket.on(\"error\", socketOnError);\n        const key = req.headers[\"sec-websocket-key\"] !== void 0 ? req.headers[\"sec-websocket-key\"].trim() : false;\n        const version = +req.headers[\"sec-websocket-version\"];\n        const extensions = {};\n        if (req.method !== \"GET\" || req.headers.upgrade.toLowerCase() !== \"websocket\" || !key || !keyRegex.test(key) || version !== 8 && version !== 13 || !this.shouldHandle(req)) {\n          return abortHandshake(socket, 400);\n        }\n        if (this.options.perMessageDeflate) {\n          const perMessageDeflate = new PerMessageDeflate(\n            this.options.perMessageDeflate,\n            true,\n            this.options.maxPayload\n          );\n          try {\n            const offers = parse(req.headers[\"sec-websocket-extensions\"]);\n            if (offers[PerMessageDeflate.extensionName]) {\n              perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n              extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n            }\n          } catch (err) {\n            return abortHandshake(socket, 400);\n          }\n        }\n        if (this.options.verifyClient) {\n          const info = {\n            origin: req.headers[`${version === 8 ? \"sec-websocket-origin\" : \"origin\"}`],\n            secure: !!(req.socket.authorized || req.socket.encrypted),\n            req\n          };\n          if (this.options.verifyClient.length === 2) {\n            this.options.verifyClient(info, (verified, code, message, headers) => {\n              if (!verified) {\n                return abortHandshake(socket, code || 401, message, headers);\n              }\n              this.completeUpgrade(key, extensions, req, socket, head, cb);\n            });\n            return;\n          }\n          if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n        }\n        this.completeUpgrade(key, extensions, req, socket, head, cb);\n      }\n      /**\n       * Upgrade the connection to WebSocket.\n       *\n       * @param {String} key The value of the `Sec-WebSocket-Key` header\n       * @param {Object} extensions The accepted extensions\n       * @param {http.IncomingMessage} req The request object\n       * @param {net.Socket} socket The network socket between the server and client\n       * @param {Buffer} head The first packet of the upgraded stream\n       * @param {Function} cb Callback\n       * @throws {Error} If called more than once with the same socket\n       * @private\n       */\n      completeUpgrade(key, extensions, req, socket, head, cb) {\n        if (!socket.readable || !socket.writable) return socket.destroy();\n        if (socket[kWebSocket]) {\n          throw new Error(\n            \"server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration\"\n          );\n        }\n        const digest = createHash(\"sha1\").update(key + GUID).digest(\"base64\");\n        const headers = [\n          \"HTTP/1.1 101 Switching Protocols\",\n          \"Upgrade: websocket\",\n          \"Connection: Upgrade\",\n          `Sec-WebSocket-Accept: ${digest}`\n        ];\n        const ws = new WebSocket(null);\n        let protocol = req.headers[\"sec-websocket-protocol\"];\n        if (protocol) {\n          protocol = protocol.split(\",\").map(trim);\n          if (this.options.handleProtocols) {\n            protocol = this.options.handleProtocols(protocol, req);\n          } else {\n            protocol = protocol[0];\n          }\n          if (protocol) {\n            headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n            ws._protocol = protocol;\n          }\n        }\n        if (extensions[PerMessageDeflate.extensionName]) {\n          const params = extensions[PerMessageDeflate.extensionName].params;\n          const value = format({\n            [PerMessageDeflate.extensionName]: [params]\n          });\n          headers.push(`Sec-WebSocket-Extensions: ${value}`);\n          ws._extensions = extensions;\n        }\n        this.emit(\"headers\", headers, req);\n        socket.write(headers.concat(\"\\r\\n\").join(\"\\r\\n\"));\n        socket.removeListener(\"error\", socketOnError);\n        ws.setSocket(socket, head, this.options.maxPayload);\n        if (this.clients) {\n          this.clients.add(ws);\n          ws.on(\"close\", () => this.clients.delete(ws));\n        }\n        cb(ws, req);\n      }\n    };\n    module2.exports = WebSocketServer;\n    function addListeners(server, map) {\n      for (const event of Object.keys(map)) server.on(event, map[event]);\n      return function removeListeners() {\n        for (const event of Object.keys(map)) {\n          server.removeListener(event, map[event]);\n        }\n      };\n    }\n    function emitClose(server) {\n      server.emit(\"close\");\n    }\n    function socketOnError() {\n      this.destroy();\n    }\n    function abortHandshake(socket, code, message, headers) {\n      if (socket.writable) {\n        message = message || STATUS_CODES[code];\n        headers = {\n          Connection: \"close\",\n          \"Content-Type\": \"text/html\",\n          \"Content-Length\": Buffer.byteLength(message),\n          ...headers\n        };\n        socket.write(\n          `HTTP/1.1 ${code} ${STATUS_CODES[code]}\\r\n` + Object.keys(headers).map((h) => `${h}: ${headers[h]}`).join(\"\\r\\n\") + \"\\r\\n\\r\\n\" + message\n        );\n      }\n      socket.removeListener(\"error\", socketOnError);\n      socket.destroy();\n    }\n    function trim(str) {\n      return str.trim();\n    }\n  }\n});\n\n// node_modules/ws/index.js\nvar require_ws = __commonJS({\n  \"node_modules/ws/index.js\"(exports2, module2) {\n    \"use strict\";\n    var WebSocket = require_websocket();\n    WebSocket.createWebSocketStream = require_stream();\n    WebSocket.Server = require_websocket_server();\n    WebSocket.Receiver = require_receiver();\n    WebSocket.Sender = require_sender();\n    module2.exports = WebSocket;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/ws.js\nvar require_ws2 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/ws.js\"(exports2) {\n    \"use strict\";\n    var __importDefault = exports2 && exports2.__importDefault || function(mod) {\n      return mod && mod.__esModule ? mod : { \"default\": mod };\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.WebSocket = void 0;\n    var ws_1 = __importDefault(require_ws());\n    exports2.WebSocket = ws_1.default;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/websocket-provider.js\nvar require_websocket_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/websocket-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.WebSocketProvider = void 0;\n    var bignumber_1 = require_lib3();\n    var properties_1 = require_lib4();\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var ws_1 = require_ws2();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var NextId = 1;\n    var WebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(WebSocketProvider2, _super);\n        function WebSocketProvider2(url, network) {\n          var _this = this;\n          if (network === \"any\") {\n            logger.throwError(\"WebSocketProvider does not support 'any' network yet\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"network:any\"\n            });\n          }\n          _this = _super.call(this, url, network) || this;\n          _this._pollingInterval = -1;\n          _this._wsReady = false;\n          (0, properties_1.defineReadOnly)(_this, \"_websocket\", new ws_1.WebSocket(_this.connection.url));\n          (0, properties_1.defineReadOnly)(_this, \"_requests\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_subs\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_subIds\", {});\n          (0, properties_1.defineReadOnly)(_this, \"_detectNetwork\", _super.prototype.detectNetwork.call(_this));\n          _this._websocket.onopen = function() {\n            _this._wsReady = true;\n            Object.keys(_this._requests).forEach(function(id) {\n              _this._websocket.send(_this._requests[id].payload);\n            });\n          };\n          _this._websocket.onmessage = function(messageEvent) {\n            var data = messageEvent.data;\n            var result = JSON.parse(data);\n            if (result.id != null) {\n              var id = String(result.id);\n              var request = _this._requests[id];\n              delete _this._requests[id];\n              if (result.result !== void 0) {\n                request.callback(null, result.result);\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  request: JSON.parse(request.payload),\n                  response: result.result,\n                  provider: _this\n                });\n              } else {\n                var error = null;\n                if (result.error) {\n                  error = new Error(result.error.message || \"unknown error\");\n                  (0, properties_1.defineReadOnly)(error, \"code\", result.error.code || null);\n                  (0, properties_1.defineReadOnly)(error, \"response\", data);\n                } else {\n                  error = new Error(\"unknown error\");\n                }\n                request.callback(error, void 0);\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  error,\n                  request: JSON.parse(request.payload),\n                  provider: _this\n                });\n              }\n            } else if (result.method === \"eth_subscription\") {\n              var sub = _this._subs[result.params.subscription];\n              if (sub) {\n                sub.processFunc(result.params.result);\n              }\n            } else {\n              console.warn(\"this should not happen\");\n            }\n          };\n          var fauxPoll = setInterval(function() {\n            _this.emit(\"poll\");\n          }, 1e3);\n          if (fauxPoll.unref) {\n            fauxPoll.unref();\n          }\n          return _this;\n        }\n        WebSocketProvider2.prototype.detectNetwork = function() {\n          return this._detectNetwork;\n        };\n        Object.defineProperty(WebSocketProvider2.prototype, \"pollingInterval\", {\n          get: function() {\n            return 0;\n          },\n          set: function(value) {\n            logger.throwError(\"cannot set polling interval on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setPollingInterval\"\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        WebSocketProvider2.prototype.resetEventsBlock = function(blockNumber) {\n          logger.throwError(\"cannot reset events block on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n            operation: \"resetEventBlock\"\n          });\n        };\n        WebSocketProvider2.prototype.poll = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, null];\n            });\n          });\n        };\n        Object.defineProperty(WebSocketProvider2.prototype, \"polling\", {\n          set: function(value) {\n            if (!value) {\n              return;\n            }\n            logger.throwError(\"cannot set polling on WebSocketProvider\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"setPolling\"\n            });\n          },\n          enumerable: false,\n          configurable: true\n        });\n        WebSocketProvider2.prototype.send = function(method, params) {\n          var _this = this;\n          var rid = NextId++;\n          return new Promise(function(resolve, reject) {\n            function callback(error, result) {\n              if (error) {\n                return reject(error);\n              }\n              return resolve(result);\n            }\n            var payload = JSON.stringify({\n              method,\n              params,\n              id: rid,\n              jsonrpc: \"2.0\"\n            });\n            _this.emit(\"debug\", {\n              action: \"request\",\n              request: JSON.parse(payload),\n              provider: _this\n            });\n            _this._requests[String(rid)] = { callback, payload };\n            if (_this._wsReady) {\n              _this._websocket.send(payload);\n            }\n          });\n        };\n        WebSocketProvider2.defaultUrl = function() {\n          return \"ws://localhost:8546\";\n        };\n        WebSocketProvider2.prototype._subscribe = function(tag, param, processFunc) {\n          return __awaiter(this, void 0, void 0, function() {\n            var subIdPromise, subId;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  subIdPromise = this._subIds[tag];\n                  if (subIdPromise == null) {\n                    subIdPromise = Promise.all(param).then(function(param2) {\n                      return _this.send(\"eth_subscribe\", param2);\n                    });\n                    this._subIds[tag] = subIdPromise;\n                  }\n                  return [4, subIdPromise];\n                case 1:\n                  subId = _a.sent();\n                  this._subs[subId] = { tag, processFunc };\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        WebSocketProvider2.prototype._startEvent = function(event) {\n          var _this = this;\n          switch (event.type) {\n            case \"block\":\n              this._subscribe(\"block\", [\"newHeads\"], function(result) {\n                var blockNumber = bignumber_1.BigNumber.from(result.number).toNumber();\n                _this._emitted.block = blockNumber;\n                _this.emit(\"block\", blockNumber);\n              });\n              break;\n            case \"pending\":\n              this._subscribe(\"pending\", [\"newPendingTransactions\"], function(result) {\n                _this.emit(\"pending\", result);\n              });\n              break;\n            case \"filter\":\n              this._subscribe(event.tag, [\"logs\", this._getFilter(event.filter)], function(result) {\n                if (result.removed == null) {\n                  result.removed = false;\n                }\n                _this.emit(event.filter, _this.formatter.filterLog(result));\n              });\n              break;\n            case \"tx\": {\n              var emitReceipt_1 = function(event2) {\n                var hash = event2.hash;\n                _this.getTransactionReceipt(hash).then(function(receipt) {\n                  if (!receipt) {\n                    return;\n                  }\n                  _this.emit(hash, receipt);\n                });\n              };\n              emitReceipt_1(event);\n              this._subscribe(\"tx\", [\"newHeads\"], function(result) {\n                _this._events.filter(function(e) {\n                  return e.type === \"tx\";\n                }).forEach(emitReceipt_1);\n              });\n              break;\n            }\n            case \"debug\":\n            case \"poll\":\n            case \"willPoll\":\n            case \"didPoll\":\n            case \"error\":\n              break;\n            default:\n              console.log(\"unhandled:\", event);\n              break;\n          }\n        };\n        WebSocketProvider2.prototype._stopEvent = function(event) {\n          var _this = this;\n          var tag = event.tag;\n          if (event.type === \"tx\") {\n            if (this._events.filter(function(e) {\n              return e.type === \"tx\";\n            }).length) {\n              return;\n            }\n            tag = \"tx\";\n          } else if (this.listenerCount(event.event)) {\n            return;\n          }\n          var subId = this._subIds[tag];\n          if (!subId) {\n            return;\n          }\n          delete this._subIds[tag];\n          subId.then(function(subId2) {\n            if (!_this._subs[subId2]) {\n              return;\n            }\n            delete _this._subs[subId2];\n            _this.send(\"eth_unsubscribe\", [subId2]);\n          });\n        };\n        WebSocketProvider2.prototype.destroy = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(this._websocket.readyState === ws_1.WebSocket.CONNECTING)) return [3, 2];\n                  return [4, new Promise(function(resolve) {\n                    _this._websocket.onopen = function() {\n                      resolve(true);\n                    };\n                    _this._websocket.onerror = function() {\n                      resolve(false);\n                    };\n                  })];\n                case 1:\n                  _a.sent();\n                  _a.label = 2;\n                case 2:\n                  this._websocket.close(1e3);\n                  return [\n                    2\n                    /*return*/\n                  ];\n              }\n            });\n          });\n        };\n        return WebSocketProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.WebSocketProvider = WebSocketProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/url-json-rpc-provider.js\nvar require_url_json_rpc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/url-json-rpc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.UrlJsonRpcProvider = exports2.StaticJsonRpcProvider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var StaticJsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(StaticJsonRpcProvider2, _super);\n        function StaticJsonRpcProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        StaticJsonRpcProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var network;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  network = this.network;\n                  if (!(network == null)) return [3, 2];\n                  return [4, _super.prototype.detectNetwork.call(this)];\n                case 1:\n                  network = _a.sent();\n                  if (!network) {\n                    logger.throwError(\"no network detected\", logger_1.Logger.errors.UNKNOWN_ERROR, {});\n                  }\n                  if (this._network == null) {\n                    (0, properties_1.defineReadOnly)(this, \"_network\", network);\n                    this.emit(\"network\", network, null);\n                  }\n                  _a.label = 2;\n                case 2:\n                  return [2, network];\n              }\n            });\n          });\n        };\n        return StaticJsonRpcProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.StaticJsonRpcProvider = StaticJsonRpcProvider;\n    var UrlJsonRpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(UrlJsonRpcProvider2, _super);\n        function UrlJsonRpcProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkAbstract(_newTarget, UrlJsonRpcProvider2);\n          network = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n          apiKey = (0, properties_1.getStatic)(_newTarget, \"getApiKey\")(apiKey);\n          var connection = (0, properties_1.getStatic)(_newTarget, \"getUrl\")(network, apiKey);\n          _this = _super.call(this, connection, network) || this;\n          if (typeof apiKey === \"string\") {\n            (0, properties_1.defineReadOnly)(_this, \"apiKey\", apiKey);\n          } else if (apiKey != null) {\n            Object.keys(apiKey).forEach(function(key) {\n              (0, properties_1.defineReadOnly)(_this, key, apiKey[key]);\n            });\n          }\n          return _this;\n        }\n        UrlJsonRpcProvider2.prototype._startPending = function() {\n          logger.warn(\"WARNING: API provider does not support pending filters\");\n        };\n        UrlJsonRpcProvider2.prototype.isCommunityResource = function() {\n          return false;\n        };\n        UrlJsonRpcProvider2.prototype.getSigner = function(address) {\n          return logger.throwError(\"API provider does not support signing\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: \"getSigner\" });\n        };\n        UrlJsonRpcProvider2.prototype.listAccounts = function() {\n          return Promise.resolve([]);\n        };\n        UrlJsonRpcProvider2.getApiKey = function(apiKey) {\n          return apiKey;\n        };\n        UrlJsonRpcProvider2.getUrl = function(network, apiKey) {\n          return logger.throwError(\"not implemented; sub-classes must override getUrl\", logger_1.Logger.errors.NOT_IMPLEMENTED, {\n            operation: \"getUrl\"\n          });\n        };\n        return UrlJsonRpcProvider2;\n      }(StaticJsonRpcProvider)\n    );\n    exports2.UrlJsonRpcProvider = UrlJsonRpcProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/alchemy-provider.js\nvar require_alchemy_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/alchemy-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.AlchemyProvider = exports2.AlchemyWebSocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var formatter_1 = require_formatter();\n    var websocket_provider_1 = require_websocket_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultApiKey = \"_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC\";\n    var AlchemyWebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(AlchemyWebSocketProvider2, _super);\n        function AlchemyWebSocketProvider2(network, apiKey) {\n          var _this = this;\n          var provider = new AlchemyProvider(network, apiKey);\n          var url = provider.connection.url.replace(/^http/i, \"ws\").replace(\".alchemyapi.\", \".ws.alchemyapi.\");\n          _this = _super.call(this, url, provider.network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", provider.apiKey);\n          return _this;\n        }\n        AlchemyWebSocketProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return AlchemyWebSocketProvider2;\n      }(websocket_provider_1.WebSocketProvider)\n    );\n    exports2.AlchemyWebSocketProvider = AlchemyWebSocketProvider;\n    var AlchemyProvider = (\n      /** @class */\n      function(_super) {\n        __extends(AlchemyProvider2, _super);\n        function AlchemyProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        AlchemyProvider2.getWebSocketProvider = function(network, apiKey) {\n          return new AlchemyWebSocketProvider(network, apiKey);\n        };\n        AlchemyProvider2.getApiKey = function(apiKey) {\n          if (apiKey == null) {\n            return defaultApiKey;\n          }\n          if (apiKey && typeof apiKey !== \"string\") {\n            logger.throwArgumentError(\"invalid apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKey;\n        };\n        AlchemyProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"eth-mainnet.alchemyapi.io/v2/\";\n              break;\n            case \"ropsten\":\n              host = \"eth-ropsten.alchemyapi.io/v2/\";\n              break;\n            case \"rinkeby\":\n              host = \"eth-rinkeby.alchemyapi.io/v2/\";\n              break;\n            case \"goerli\":\n              host = \"eth-goerli.alchemyapi.io/v2/\";\n              break;\n            case \"kovan\":\n              host = \"eth-kovan.alchemyapi.io/v2/\";\n              break;\n            case \"matic\":\n              host = \"polygon-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"maticmum\":\n              host = \"polygon-mumbai.g.alchemy.com/v2/\";\n              break;\n            case \"arbitrum\":\n              host = \"arb-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"arbitrum-rinkeby\":\n              host = \"arb-rinkeby.g.alchemy.com/v2/\";\n              break;\n            case \"optimism\":\n              host = \"opt-mainnet.g.alchemy.com/v2/\";\n              break;\n            case \"optimism-kovan\":\n              host = \"opt-kovan.g.alchemy.com/v2/\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return {\n            allowGzip: true,\n            url: \"https://\" + host + apiKey,\n            throttleCallback: function(attempt, url) {\n              if (apiKey === defaultApiKey) {\n                (0, formatter_1.showThrottleMessage)();\n              }\n              return Promise.resolve(true);\n            }\n          };\n        };\n        AlchemyProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return AlchemyProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.AlchemyProvider = AlchemyProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/cloudflare-provider.js\nvar require_cloudflare_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/cloudflare-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.CloudflareProvider = void 0;\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var CloudflareProvider = (\n      /** @class */\n      function(_super) {\n        __extends(CloudflareProvider2, _super);\n        function CloudflareProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        CloudflareProvider2.getApiKey = function(apiKey) {\n          if (apiKey != null) {\n            logger.throwArgumentError(\"apiKey not supported for cloudflare\", \"apiKey\", apiKey);\n          }\n          return null;\n        };\n        CloudflareProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"https://cloudflare-eth.com/\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return host;\n        };\n        CloudflareProvider2.prototype.perform = function(method, params) {\n          return __awaiter(this, void 0, void 0, function() {\n            var block;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"getBlockNumber\")) return [3, 2];\n                  return [4, _super.prototype.perform.call(this, \"getBlock\", { blockTag: \"latest\" })];\n                case 1:\n                  block = _a.sent();\n                  return [2, block.number];\n                case 2:\n                  return [2, _super.prototype.perform.call(this, method, params)];\n              }\n            });\n          });\n        };\n        return CloudflareProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.CloudflareProvider = CloudflareProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/etherscan-provider.js\nvar require_etherscan_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/etherscan-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.EtherscanProvider = void 0;\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var transactions_1 = require_lib15();\n    var web_1 = require_lib27();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var base_provider_1 = require_base_provider();\n    function getTransactionPostData(transaction) {\n      var result = {};\n      for (var key in transaction) {\n        if (transaction[key] == null) {\n          continue;\n        }\n        var value = transaction[key];\n        if (key === \"type\" && value === 0) {\n          continue;\n        }\n        if ({ type: true, gasLimit: true, gasPrice: true, maxFeePerGs: true, maxPriorityFeePerGas: true, nonce: true, value: true }[key]) {\n          value = (0, bytes_1.hexValue)((0, bytes_1.hexlify)(value));\n        } else if (key === \"accessList\") {\n          value = \"[\" + (0, transactions_1.accessListify)(value).map(function(set) {\n            return '{address:\"' + set.address + '\",storageKeys:[\"' + set.storageKeys.join('\",\"') + '\"]}';\n          }).join(\",\") + \"]\";\n        } else {\n          value = (0, bytes_1.hexlify)(value);\n        }\n        result[key] = value;\n      }\n      return result;\n    }\n    function getResult(result) {\n      if (result.status == 0 && (result.message === \"No records found\" || result.message === \"No transactions found\")) {\n        return result.result;\n      }\n      if (result.status != 1 || result.message != \"OK\") {\n        var error = new Error(\"invalid response\");\n        error.result = JSON.stringify(result);\n        if ((result.result || \"\").toLowerCase().indexOf(\"rate limit\") >= 0) {\n          error.throttleRetry = true;\n        }\n        throw error;\n      }\n      return result.result;\n    }\n    function getJsonResult(result) {\n      if (result && result.status == 0 && result.message == \"NOTOK\" && (result.result || \"\").toLowerCase().indexOf(\"rate limit\") >= 0) {\n        var error = new Error(\"throttled response\");\n        error.result = JSON.stringify(result);\n        error.throttleRetry = true;\n        throw error;\n      }\n      if (result.jsonrpc != \"2.0\") {\n        var error = new Error(\"invalid response\");\n        error.result = JSON.stringify(result);\n        throw error;\n      }\n      if (result.error) {\n        var error = new Error(result.error.message || \"unknown error\");\n        if (result.error.code) {\n          error.code = result.error.code;\n        }\n        if (result.error.data) {\n          error.data = result.error.data;\n        }\n        throw error;\n      }\n      return result.result;\n    }\n    function checkLogTag(blockTag) {\n      if (blockTag === \"pending\") {\n        throw new Error(\"pending not supported\");\n      }\n      if (blockTag === \"latest\") {\n        return blockTag;\n      }\n      return parseInt(blockTag.substring(2), 16);\n    }\n    var defaultApiKey = \"9D13ZE7XSBTJ94N9BNJ2MA33VMAY2YPIRB\";\n    function checkError(method, error, transaction) {\n      if (method === \"call\" && error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        var e = error.error;\n        if (e && (e.message.match(/reverted/i) || e.message.match(/VM execution error/i))) {\n          var data = e.data;\n          if (data) {\n            data = \"0x\" + data.replace(/^.*0x/i, \"\");\n          }\n          if ((0, bytes_1.isHexString)(data)) {\n            return data;\n          }\n          logger.throwError(\"missing revert data in call exception\", logger_1.Logger.errors.CALL_EXCEPTION, {\n            error,\n            data: \"0x\"\n          });\n        }\n      }\n      var message = error.message;\n      if (error.code === logger_1.Logger.errors.SERVER_ERROR) {\n        if (error.error && typeof error.error.message === \"string\") {\n          message = error.error.message;\n        } else if (typeof error.body === \"string\") {\n          message = error.body;\n        } else if (typeof error.responseText === \"string\") {\n          message = error.responseText;\n        }\n      }\n      message = (message || \"\").toLowerCase();\n      if (message.match(/insufficient funds/)) {\n        logger.throwError(\"insufficient funds for intrinsic transaction cost\", logger_1.Logger.errors.INSUFFICIENT_FUNDS, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/same hash was already imported|transaction nonce is too low|nonce too low/)) {\n        logger.throwError(\"nonce has already been used\", logger_1.Logger.errors.NONCE_EXPIRED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/another transaction with same nonce/)) {\n        logger.throwError(\"replacement fee too low\", logger_1.Logger.errors.REPLACEMENT_UNDERPRICED, {\n          error,\n          method,\n          transaction\n        });\n      }\n      if (message.match(/execution failed due to an exception|execution reverted/)) {\n        logger.throwError(\"cannot estimate gas; transaction may fail or may require manual gas limit\", logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT, {\n          error,\n          method,\n          transaction\n        });\n      }\n      throw error;\n    }\n    var EtherscanProvider = (\n      /** @class */\n      function(_super) {\n        __extends(EtherscanProvider2, _super);\n        function EtherscanProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, EtherscanProvider2);\n          _this = _super.call(this, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"baseUrl\", _this.getBaseUrl());\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", apiKey || defaultApiKey);\n          return _this;\n        }\n        EtherscanProvider2.prototype.getBaseUrl = function() {\n          switch (this.network ? this.network.name : \"invalid\") {\n            case \"homestead\":\n              return \"https://api.etherscan.io\";\n            case \"ropsten\":\n              return \"https://api-ropsten.etherscan.io\";\n            case \"rinkeby\":\n              return \"https://api-rinkeby.etherscan.io\";\n            case \"kovan\":\n              return \"https://api-kovan.etherscan.io\";\n            case \"goerli\":\n              return \"https://api-goerli.etherscan.io\";\n            default:\n          }\n          return logger.throwArgumentError(\"unsupported network\", \"network\", name);\n        };\n        EtherscanProvider2.prototype.getUrl = function(module3, params) {\n          var query = Object.keys(params).reduce(function(accum, key) {\n            var value = params[key];\n            if (value != null) {\n              accum += \"&\" + key + \"=\" + value;\n            }\n            return accum;\n          }, \"\");\n          var apiKey = this.apiKey ? \"&apikey=\" + this.apiKey : \"\";\n          return this.baseUrl + \"/api?module=\" + module3 + query + apiKey;\n        };\n        EtherscanProvider2.prototype.getPostUrl = function() {\n          return this.baseUrl + \"/api\";\n        };\n        EtherscanProvider2.prototype.getPostData = function(module3, params) {\n          params.module = module3;\n          params.apikey = this.apiKey;\n          return params;\n        };\n        EtherscanProvider2.prototype.fetch = function(module3, params, post) {\n          return __awaiter(this, void 0, void 0, function() {\n            var url, payload, procFunc, connection, payloadStr, result;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  url = post ? this.getPostUrl() : this.getUrl(module3, params);\n                  payload = post ? this.getPostData(module3, params) : null;\n                  procFunc = module3 === \"proxy\" ? getJsonResult : getResult;\n                  this.emit(\"debug\", {\n                    action: \"request\",\n                    request: url,\n                    provider: this\n                  });\n                  connection = {\n                    url,\n                    throttleSlotInterval: 1e3,\n                    throttleCallback: function(attempt, url2) {\n                      if (_this.isCommunityResource()) {\n                        (0, formatter_1.showThrottleMessage)();\n                      }\n                      return Promise.resolve(true);\n                    }\n                  };\n                  payloadStr = null;\n                  if (payload) {\n                    connection.headers = { \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\" };\n                    payloadStr = Object.keys(payload).map(function(key) {\n                      return key + \"=\" + payload[key];\n                    }).join(\"&\");\n                  }\n                  return [4, (0, web_1.fetchJson)(connection, payloadStr, procFunc || getJsonResult)];\n                case 1:\n                  result = _a.sent();\n                  this.emit(\"debug\", {\n                    action: \"response\",\n                    request: url,\n                    response: (0, properties_1.deepCopy)(result),\n                    provider: this\n                  });\n                  return [2, result];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            return __generator(this, function(_a) {\n              return [2, this.network];\n            });\n          });\n        };\n        EtherscanProvider2.prototype.perform = function(method, params) {\n          return __awaiter(this, void 0, void 0, function() {\n            var _a, postData, error_1, postData, error_2, args, topic0, logs, blocks, i, log, block, _b;\n            return __generator(this, function(_c) {\n              switch (_c.label) {\n                case 0:\n                  _a = method;\n                  switch (_a) {\n                    case \"getBlockNumber\":\n                      return [3, 1];\n                    case \"getGasPrice\":\n                      return [3, 2];\n                    case \"getBalance\":\n                      return [3, 3];\n                    case \"getTransactionCount\":\n                      return [3, 4];\n                    case \"getCode\":\n                      return [3, 5];\n                    case \"getStorageAt\":\n                      return [3, 6];\n                    case \"sendTransaction\":\n                      return [3, 7];\n                    case \"getBlock\":\n                      return [3, 8];\n                    case \"getTransaction\":\n                      return [3, 9];\n                    case \"getTransactionReceipt\":\n                      return [3, 10];\n                    case \"call\":\n                      return [3, 11];\n                    case \"estimateGas\":\n                      return [3, 15];\n                    case \"getLogs\":\n                      return [3, 19];\n                    case \"getEtherPrice\":\n                      return [3, 26];\n                  }\n                  return [3, 28];\n                case 1:\n                  return [2, this.fetch(\"proxy\", { action: \"eth_blockNumber\" })];\n                case 2:\n                  return [2, this.fetch(\"proxy\", { action: \"eth_gasPrice\" })];\n                case 3:\n                  return [2, this.fetch(\"account\", {\n                    action: \"balance\",\n                    address: params.address,\n                    tag: params.blockTag\n                  })];\n                case 4:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionCount\",\n                    address: params.address,\n                    tag: params.blockTag\n                  })];\n                case 5:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getCode\",\n                    address: params.address,\n                    tag: params.blockTag\n                  })];\n                case 6:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getStorageAt\",\n                    address: params.address,\n                    position: params.position,\n                    tag: params.blockTag\n                  })];\n                case 7:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_sendRawTransaction\",\n                    hex: params.signedTransaction\n                  }, true).catch(function(error) {\n                    return checkError(\"sendTransaction\", error, params.signedTransaction);\n                  })];\n                case 8:\n                  if (params.blockTag) {\n                    return [2, this.fetch(\"proxy\", {\n                      action: \"eth_getBlockByNumber\",\n                      tag: params.blockTag,\n                      boolean: params.includeTransactions ? \"true\" : \"false\"\n                    })];\n                  }\n                  throw new Error(\"getBlock by blockHash not implemented\");\n                case 9:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionByHash\",\n                    txhash: params.transactionHash\n                  })];\n                case 10:\n                  return [2, this.fetch(\"proxy\", {\n                    action: \"eth_getTransactionReceipt\",\n                    txhash: params.transactionHash\n                  })];\n                case 11:\n                  if (params.blockTag !== \"latest\") {\n                    throw new Error(\"EtherscanProvider does not support blockTag for call\");\n                  }\n                  postData = getTransactionPostData(params.transaction);\n                  postData.module = \"proxy\";\n                  postData.action = \"eth_call\";\n                  _c.label = 12;\n                case 12:\n                  _c.trys.push([12, 14, , 15]);\n                  return [4, this.fetch(\"proxy\", postData, true)];\n                case 13:\n                  return [2, _c.sent()];\n                case 14:\n                  error_1 = _c.sent();\n                  return [2, checkError(\"call\", error_1, params.transaction)];\n                case 15:\n                  postData = getTransactionPostData(params.transaction);\n                  postData.module = \"proxy\";\n                  postData.action = \"eth_estimateGas\";\n                  _c.label = 16;\n                case 16:\n                  _c.trys.push([16, 18, , 19]);\n                  return [4, this.fetch(\"proxy\", postData, true)];\n                case 17:\n                  return [2, _c.sent()];\n                case 18:\n                  error_2 = _c.sent();\n                  return [2, checkError(\"estimateGas\", error_2, params.transaction)];\n                case 19:\n                  args = { action: \"getLogs\" };\n                  if (params.filter.fromBlock) {\n                    args.fromBlock = checkLogTag(params.filter.fromBlock);\n                  }\n                  if (params.filter.toBlock) {\n                    args.toBlock = checkLogTag(params.filter.toBlock);\n                  }\n                  if (params.filter.address) {\n                    args.address = params.filter.address;\n                  }\n                  if (params.filter.topics && params.filter.topics.length > 0) {\n                    if (params.filter.topics.length > 1) {\n                      logger.throwError(\"unsupported topic count\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { topics: params.filter.topics });\n                    }\n                    if (params.filter.topics.length === 1) {\n                      topic0 = params.filter.topics[0];\n                      if (typeof topic0 !== \"string\" || topic0.length !== 66) {\n                        logger.throwError(\"unsupported topic format\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { topic0 });\n                      }\n                      args.topic0 = topic0;\n                    }\n                  }\n                  return [4, this.fetch(\"logs\", args)];\n                case 20:\n                  logs = _c.sent();\n                  blocks = {};\n                  i = 0;\n                  _c.label = 21;\n                case 21:\n                  if (!(i < logs.length)) return [3, 25];\n                  log = logs[i];\n                  if (log.blockHash != null) {\n                    return [3, 24];\n                  }\n                  if (!(blocks[log.blockNumber] == null)) return [3, 23];\n                  return [4, this.getBlock(log.blockNumber)];\n                case 22:\n                  block = _c.sent();\n                  if (block) {\n                    blocks[log.blockNumber] = block.hash;\n                  }\n                  _c.label = 23;\n                case 23:\n                  log.blockHash = blocks[log.blockNumber];\n                  _c.label = 24;\n                case 24:\n                  i++;\n                  return [3, 21];\n                case 25:\n                  return [2, logs];\n                case 26:\n                  if (this.network.name !== \"homestead\") {\n                    return [2, 0];\n                  }\n                  _b = parseFloat;\n                  return [4, this.fetch(\"stats\", { action: \"ethprice\" })];\n                case 27:\n                  return [2, _b.apply(void 0, [_c.sent().ethusd])];\n                case 28:\n                  return [3, 29];\n                case 29:\n                  return [2, _super.prototype.perform.call(this, method, params)];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.getHistory = function(addressOrName, startBlock, endBlock) {\n          return __awaiter(this, void 0, void 0, function() {\n            var params, result;\n            var _a;\n            var _this = this;\n            return __generator(this, function(_b) {\n              switch (_b.label) {\n                case 0:\n                  _a = {\n                    action: \"txlist\"\n                  };\n                  return [4, this.resolveName(addressOrName)];\n                case 1:\n                  params = (_a.address = _b.sent(), _a.startblock = startBlock == null ? 0 : startBlock, _a.endblock = endBlock == null ? 99999999 : endBlock, _a.sort = \"asc\", _a);\n                  return [4, this.fetch(\"account\", params)];\n                case 2:\n                  result = _b.sent();\n                  return [2, result.map(function(tx) {\n                    [\"contractAddress\", \"to\"].forEach(function(key) {\n                      if (tx[key] == \"\") {\n                        delete tx[key];\n                      }\n                    });\n                    if (tx.creates == null && tx.contractAddress != null) {\n                      tx.creates = tx.contractAddress;\n                    }\n                    var item = _this.formatter.transactionResponse(tx);\n                    if (tx.timeStamp) {\n                      item.timestamp = parseInt(tx.timeStamp);\n                    }\n                    return item;\n                  })];\n              }\n            });\n          });\n        };\n        EtherscanProvider2.prototype.isCommunityResource = function() {\n          return this.apiKey === defaultApiKey;\n        };\n        return EtherscanProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.EtherscanProvider = EtherscanProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/fallback-provider.js\nvar require_fallback_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/fallback-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) {\n      function adopt(value) {\n        return value instanceof P ? value : new P(function(resolve) {\n          resolve(value);\n        });\n      }\n      return new (P || (P = Promise))(function(resolve, reject) {\n        function fulfilled(value) {\n          try {\n            step(generator.next(value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function rejected(value) {\n          try {\n            step(generator[\"throw\"](value));\n          } catch (e) {\n            reject(e);\n          }\n        }\n        function step(result) {\n          result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n        }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n      });\n    };\n    var __generator = exports2 && exports2.__generator || function(thisArg, body) {\n      var _ = { label: 0, sent: function() {\n        if (t[0] & 1) throw t[1];\n        return t[1];\n      }, trys: [], ops: [] }, f, y, t, g;\n      return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() {\n        return this;\n      }), g;\n      function verb(n) {\n        return function(v) {\n          return step([n, v]);\n        };\n      }\n      function step(op) {\n        if (f) throw new TypeError(\"Generator is already executing.\");\n        while (_) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n            case 0:\n            case 1:\n              t = op;\n              break;\n            case 4:\n              _.label++;\n              return { value: op[1], done: false };\n            case 5:\n              _.label++;\n              y = op[1];\n              op = [0];\n              continue;\n            case 7:\n              op = _.ops.pop();\n              _.trys.pop();\n              continue;\n            default:\n              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {\n                _ = 0;\n                continue;\n              }\n              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {\n                _.label = op[1];\n                break;\n              }\n              if (op[0] === 6 && _.label < t[1]) {\n                _.label = t[1];\n                t = op;\n                break;\n              }\n              if (t && _.label < t[2]) {\n                _.label = t[2];\n                _.ops.push(op);\n                break;\n              }\n              if (t[2]) _.ops.pop();\n              _.trys.pop();\n              continue;\n          }\n          op = body.call(thisArg, _);\n        } catch (e) {\n          op = [6, e];\n          y = 0;\n        } finally {\n          f = t = 0;\n        }\n        if (op[0] & 5) throw op[1];\n        return { value: op[0] ? op[1] : void 0, done: true };\n      }\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.FallbackProvider = void 0;\n    var abstract_provider_1 = require_lib12();\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var properties_1 = require_lib4();\n    var random_1 = require_lib22();\n    var web_1 = require_lib27();\n    var base_provider_1 = require_base_provider();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    function now() {\n      return (/* @__PURE__ */ new Date()).getTime();\n    }\n    function checkNetworks(networks) {\n      var result = null;\n      for (var i = 0; i < networks.length; i++) {\n        var network = networks[i];\n        if (network == null) {\n          return null;\n        }\n        if (result) {\n          if (!(result.name === network.name && result.chainId === network.chainId && (result.ensAddress === network.ensAddress || result.ensAddress == null && network.ensAddress == null))) {\n            logger.throwArgumentError(\"provider mismatch\", \"networks\", networks);\n          }\n        } else {\n          result = network;\n        }\n      }\n      return result;\n    }\n    function median(values, maxDelta) {\n      values = values.slice().sort();\n      var middle = Math.floor(values.length / 2);\n      if (values.length % 2) {\n        return values[middle];\n      }\n      var a = values[middle - 1], b = values[middle];\n      if (maxDelta != null && Math.abs(a - b) > maxDelta) {\n        return null;\n      }\n      return (a + b) / 2;\n    }\n    function serialize(value) {\n      if (value === null) {\n        return \"null\";\n      } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n        return JSON.stringify(value);\n      } else if (typeof value === \"string\") {\n        return value;\n      } else if (bignumber_1.BigNumber.isBigNumber(value)) {\n        return value.toString();\n      } else if (Array.isArray(value)) {\n        return JSON.stringify(value.map(function(i) {\n          return serialize(i);\n        }));\n      } else if (typeof value === \"object\") {\n        var keys = Object.keys(value);\n        keys.sort();\n        return \"{\" + keys.map(function(key) {\n          var v = value[key];\n          if (typeof v === \"function\") {\n            v = \"[function]\";\n          } else {\n            v = serialize(v);\n          }\n          return JSON.stringify(key) + \":\" + v;\n        }).join(\",\") + \"}\";\n      }\n      throw new Error(\"unknown value type: \" + typeof value);\n    }\n    var nextRid = 1;\n    function stall(duration) {\n      var cancel = null;\n      var timer = null;\n      var promise = new Promise(function(resolve) {\n        cancel = function() {\n          if (timer) {\n            clearTimeout(timer);\n            timer = null;\n          }\n          resolve();\n        };\n        timer = setTimeout(cancel, duration);\n      });\n      var wait = function(func) {\n        promise = promise.then(func);\n        return promise;\n      };\n      function getPromise() {\n        return promise;\n      }\n      return { cancel, getPromise, wait };\n    }\n    var ForwardErrors = [\n      logger_1.Logger.errors.CALL_EXCEPTION,\n      logger_1.Logger.errors.INSUFFICIENT_FUNDS,\n      logger_1.Logger.errors.NONCE_EXPIRED,\n      logger_1.Logger.errors.REPLACEMENT_UNDERPRICED,\n      logger_1.Logger.errors.UNPREDICTABLE_GAS_LIMIT\n    ];\n    var ForwardProperties = [\n      \"address\",\n      \"args\",\n      \"errorArgs\",\n      \"errorSignature\",\n      \"method\",\n      \"transaction\"\n    ];\n    function exposeDebugConfig(config, now2) {\n      var result = {\n        weight: config.weight\n      };\n      Object.defineProperty(result, \"provider\", { get: function() {\n        return config.provider;\n      } });\n      if (config.start) {\n        result.start = config.start;\n      }\n      if (now2) {\n        result.duration = now2 - config.start;\n      }\n      if (config.done) {\n        if (config.error) {\n          result.error = config.error;\n        } else {\n          result.result = config.result || null;\n        }\n      }\n      return result;\n    }\n    function normalizedTally(normalize, quorum) {\n      return function(configs) {\n        var tally = {};\n        configs.forEach(function(c) {\n          var value = normalize(c.result);\n          if (!tally[value]) {\n            tally[value] = { count: 0, result: c.result };\n          }\n          tally[value].count++;\n        });\n        var keys = Object.keys(tally);\n        for (var i = 0; i < keys.length; i++) {\n          var check = tally[keys[i]];\n          if (check.count >= quorum) {\n            return check.result;\n          }\n        }\n        return void 0;\n      };\n    }\n    function getProcessFunc(provider, method, params) {\n      var normalize = serialize;\n      switch (method) {\n        case \"getBlockNumber\":\n          return function(configs) {\n            var values = configs.map(function(c) {\n              return c.result;\n            });\n            var blockNumber = median(configs.map(function(c) {\n              return c.result;\n            }), 2);\n            if (blockNumber == null) {\n              return void 0;\n            }\n            blockNumber = Math.ceil(blockNumber);\n            if (values.indexOf(blockNumber + 1) >= 0) {\n              blockNumber++;\n            }\n            if (blockNumber >= provider._highestBlockNumber) {\n              provider._highestBlockNumber = blockNumber;\n            }\n            return provider._highestBlockNumber;\n          };\n        case \"getGasPrice\":\n          return function(configs) {\n            var values = configs.map(function(c) {\n              return c.result;\n            });\n            values.sort();\n            return values[Math.floor(values.length / 2)];\n          };\n        case \"getEtherPrice\":\n          return function(configs) {\n            return median(configs.map(function(c) {\n              return c.result;\n            }));\n          };\n        case \"getBalance\":\n        case \"getTransactionCount\":\n        case \"getCode\":\n        case \"getStorageAt\":\n        case \"call\":\n        case \"estimateGas\":\n        case \"getLogs\":\n          break;\n        case \"getTransaction\":\n        case \"getTransactionReceipt\":\n          normalize = function(tx) {\n            if (tx == null) {\n              return null;\n            }\n            tx = (0, properties_1.shallowCopy)(tx);\n            tx.confirmations = -1;\n            return serialize(tx);\n          };\n          break;\n        case \"getBlock\":\n          if (params.includeTransactions) {\n            normalize = function(block) {\n              if (block == null) {\n                return null;\n              }\n              block = (0, properties_1.shallowCopy)(block);\n              block.transactions = block.transactions.map(function(tx) {\n                tx = (0, properties_1.shallowCopy)(tx);\n                tx.confirmations = -1;\n                return tx;\n              });\n              return serialize(block);\n            };\n          } else {\n            normalize = function(block) {\n              if (block == null) {\n                return null;\n              }\n              return serialize(block);\n            };\n          }\n          break;\n        default:\n          throw new Error(\"unknown method: \" + method);\n      }\n      return normalizedTally(normalize, provider.quorum);\n    }\n    function waitForSync(config, blockNumber) {\n      return __awaiter(this, void 0, void 0, function() {\n        var provider;\n        return __generator(this, function(_a) {\n          provider = config.provider;\n          if (provider.blockNumber != null && provider.blockNumber >= blockNumber || blockNumber === -1) {\n            return [2, provider];\n          }\n          return [2, (0, web_1.poll)(function() {\n            return new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                if (provider.blockNumber >= blockNumber) {\n                  return resolve(provider);\n                }\n                if (config.cancelled) {\n                  return resolve(null);\n                }\n                return resolve(void 0);\n              }, 0);\n            });\n          }, { oncePoll: provider })];\n        });\n      });\n    }\n    function getRunner(config, currentBlockNumber, method, params) {\n      return __awaiter(this, void 0, void 0, function() {\n        var provider, _a, filter;\n        return __generator(this, function(_b) {\n          switch (_b.label) {\n            case 0:\n              provider = config.provider;\n              _a = method;\n              switch (_a) {\n                case \"getBlockNumber\":\n                  return [3, 1];\n                case \"getGasPrice\":\n                  return [3, 1];\n                case \"getEtherPrice\":\n                  return [3, 2];\n                case \"getBalance\":\n                  return [3, 3];\n                case \"getTransactionCount\":\n                  return [3, 3];\n                case \"getCode\":\n                  return [3, 3];\n                case \"getStorageAt\":\n                  return [3, 6];\n                case \"getBlock\":\n                  return [3, 9];\n                case \"call\":\n                  return [3, 12];\n                case \"estimateGas\":\n                  return [3, 12];\n                case \"getTransaction\":\n                  return [3, 15];\n                case \"getTransactionReceipt\":\n                  return [3, 15];\n                case \"getLogs\":\n                  return [3, 16];\n              }\n              return [3, 19];\n            case 1:\n              return [2, provider[method]()];\n            case 2:\n              if (provider.getEtherPrice) {\n                return [2, provider.getEtherPrice()];\n              }\n              return [3, 19];\n            case 3:\n              if (!(params.blockTag && (0, bytes_1.isHexString)(params.blockTag))) return [3, 5];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 4:\n              provider = _b.sent();\n              _b.label = 5;\n            case 5:\n              return [2, provider[method](params.address, params.blockTag || \"latest\")];\n            case 6:\n              if (!(params.blockTag && (0, bytes_1.isHexString)(params.blockTag))) return [3, 8];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 7:\n              provider = _b.sent();\n              _b.label = 8;\n            case 8:\n              return [2, provider.getStorageAt(params.address, params.position, params.blockTag || \"latest\")];\n            case 9:\n              if (!(params.blockTag && (0, bytes_1.isHexString)(params.blockTag))) return [3, 11];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 10:\n              provider = _b.sent();\n              _b.label = 11;\n            case 11:\n              return [2, provider[params.includeTransactions ? \"getBlockWithTransactions\" : \"getBlock\"](params.blockTag || params.blockHash)];\n            case 12:\n              if (!(params.blockTag && (0, bytes_1.isHexString)(params.blockTag))) return [3, 14];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 13:\n              provider = _b.sent();\n              _b.label = 14;\n            case 14:\n              return [2, provider[method](params.transaction)];\n            case 15:\n              return [2, provider[method](params.transactionHash)];\n            case 16:\n              filter = params.filter;\n              if (!(filter.fromBlock && (0, bytes_1.isHexString)(filter.fromBlock) || filter.toBlock && (0, bytes_1.isHexString)(filter.toBlock))) return [3, 18];\n              return [4, waitForSync(config, currentBlockNumber)];\n            case 17:\n              provider = _b.sent();\n              _b.label = 18;\n            case 18:\n              return [2, provider.getLogs(filter)];\n            case 19:\n              return [2, logger.throwError(\"unknown method error\", logger_1.Logger.errors.UNKNOWN_ERROR, {\n                method,\n                params\n              })];\n          }\n        });\n      });\n    }\n    var FallbackProvider = (\n      /** @class */\n      function(_super) {\n        __extends(FallbackProvider2, _super);\n        function FallbackProvider2(providers, quorum) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, FallbackProvider2);\n          if (providers.length === 0) {\n            logger.throwArgumentError(\"missing providers\", \"providers\", providers);\n          }\n          var providerConfigs = providers.map(function(configOrProvider, index) {\n            if (abstract_provider_1.Provider.isProvider(configOrProvider)) {\n              var stallTimeout = (0, formatter_1.isCommunityResource)(configOrProvider) ? 2e3 : 750;\n              var priority = 1;\n              return Object.freeze({ provider: configOrProvider, weight: 1, stallTimeout, priority });\n            }\n            var config = (0, properties_1.shallowCopy)(configOrProvider);\n            if (config.priority == null) {\n              config.priority = 1;\n            }\n            if (config.stallTimeout == null) {\n              config.stallTimeout = (0, formatter_1.isCommunityResource)(configOrProvider) ? 2e3 : 750;\n            }\n            if (config.weight == null) {\n              config.weight = 1;\n            }\n            var weight = config.weight;\n            if (weight % 1 || weight > 512 || weight < 1) {\n              logger.throwArgumentError(\"invalid weight; must be integer in [1, 512]\", \"providers[\" + index + \"].weight\", weight);\n            }\n            return Object.freeze(config);\n          });\n          var total = providerConfigs.reduce(function(accum, c) {\n            return accum + c.weight;\n          }, 0);\n          if (quorum == null) {\n            quorum = total / 2;\n          } else if (quorum > total) {\n            logger.throwArgumentError(\"quorum will always fail; larger than total weight\", \"quorum\", quorum);\n          }\n          var networkOrReady = checkNetworks(providerConfigs.map(function(c) {\n            return c.provider.network;\n          }));\n          if (networkOrReady == null) {\n            networkOrReady = new Promise(function(resolve, reject) {\n              setTimeout(function() {\n                _this.detectNetwork().then(resolve, reject);\n              }, 0);\n            });\n          }\n          _this = _super.call(this, networkOrReady) || this;\n          (0, properties_1.defineReadOnly)(_this, \"providerConfigs\", Object.freeze(providerConfigs));\n          (0, properties_1.defineReadOnly)(_this, \"quorum\", quorum);\n          _this._highestBlockNumber = -1;\n          return _this;\n        }\n        FallbackProvider2.prototype.detectNetwork = function() {\n          return __awaiter(this, void 0, void 0, function() {\n            var networks;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  return [4, Promise.all(this.providerConfigs.map(function(c) {\n                    return c.provider.getNetwork();\n                  }))];\n                case 1:\n                  networks = _a.sent();\n                  return [2, checkNetworks(networks)];\n              }\n            });\n          });\n        };\n        FallbackProvider2.prototype.perform = function(method, params) {\n          return __awaiter(this, void 0, void 0, function() {\n            var results, i_1, result, processFunc, configs, currentBlockNumber, i, first, _loop_1, this_1, state_1;\n            var _this = this;\n            return __generator(this, function(_a) {\n              switch (_a.label) {\n                case 0:\n                  if (!(method === \"sendTransaction\")) return [3, 2];\n                  return [4, Promise.all(this.providerConfigs.map(function(c) {\n                    return c.provider.sendTransaction(params.signedTransaction).then(function(result2) {\n                      return result2.hash;\n                    }, function(error) {\n                      return error;\n                    });\n                  }))];\n                case 1:\n                  results = _a.sent();\n                  for (i_1 = 0; i_1 < results.length; i_1++) {\n                    result = results[i_1];\n                    if (typeof result === \"string\") {\n                      return [2, result];\n                    }\n                  }\n                  throw results[0];\n                case 2:\n                  if (!(this._highestBlockNumber === -1 && method !== \"getBlockNumber\")) return [3, 4];\n                  return [4, this.getBlockNumber()];\n                case 3:\n                  _a.sent();\n                  _a.label = 4;\n                case 4:\n                  processFunc = getProcessFunc(this, method, params);\n                  configs = (0, random_1.shuffled)(this.providerConfigs.map(properties_1.shallowCopy));\n                  configs.sort(function(a, b) {\n                    return a.priority - b.priority;\n                  });\n                  currentBlockNumber = this._highestBlockNumber;\n                  i = 0;\n                  first = true;\n                  _loop_1 = function() {\n                    var t0, inflightWeight, _loop_2, waiting, results2, result2, errors;\n                    return __generator(this, function(_b) {\n                      switch (_b.label) {\n                        case 0:\n                          t0 = now();\n                          inflightWeight = configs.filter(function(c) {\n                            return c.runner && t0 - c.start < c.stallTimeout;\n                          }).reduce(function(accum, c) {\n                            return accum + c.weight;\n                          }, 0);\n                          _loop_2 = function() {\n                            var config = configs[i++];\n                            var rid = nextRid++;\n                            config.start = now();\n                            config.staller = stall(config.stallTimeout);\n                            config.staller.wait(function() {\n                              config.staller = null;\n                            });\n                            config.runner = getRunner(config, currentBlockNumber, method, params).then(function(result3) {\n                              config.done = true;\n                              config.result = result3;\n                              if (_this.listenerCount(\"debug\")) {\n                                _this.emit(\"debug\", {\n                                  action: \"request\",\n                                  rid,\n                                  backend: exposeDebugConfig(config, now()),\n                                  request: { method, params: (0, properties_1.deepCopy)(params) },\n                                  provider: _this\n                                });\n                              }\n                            }, function(error) {\n                              config.done = true;\n                              config.error = error;\n                              if (_this.listenerCount(\"debug\")) {\n                                _this.emit(\"debug\", {\n                                  action: \"request\",\n                                  rid,\n                                  backend: exposeDebugConfig(config, now()),\n                                  request: { method, params: (0, properties_1.deepCopy)(params) },\n                                  provider: _this\n                                });\n                              }\n                            });\n                            if (this_1.listenerCount(\"debug\")) {\n                              this_1.emit(\"debug\", {\n                                action: \"request\",\n                                rid,\n                                backend: exposeDebugConfig(config, null),\n                                request: { method, params: (0, properties_1.deepCopy)(params) },\n                                provider: this_1\n                              });\n                            }\n                            inflightWeight += config.weight;\n                          };\n                          while (inflightWeight < this_1.quorum && i < configs.length) {\n                            _loop_2();\n                          }\n                          waiting = [];\n                          configs.forEach(function(c) {\n                            if (c.done || !c.runner) {\n                              return;\n                            }\n                            waiting.push(c.runner);\n                            if (c.staller) {\n                              waiting.push(c.staller.getPromise());\n                            }\n                          });\n                          if (!waiting.length) return [3, 2];\n                          return [4, Promise.race(waiting)];\n                        case 1:\n                          _b.sent();\n                          _b.label = 2;\n                        case 2:\n                          results2 = configs.filter(function(c) {\n                            return c.done && c.error == null;\n                          });\n                          if (!(results2.length >= this_1.quorum)) return [3, 5];\n                          result2 = processFunc(results2);\n                          if (result2 !== void 0) {\n                            configs.forEach(function(c) {\n                              if (c.staller) {\n                                c.staller.cancel();\n                              }\n                              c.cancelled = true;\n                            });\n                            return [2, { value: result2 }];\n                          }\n                          if (!!first) return [3, 4];\n                          return [4, stall(100).getPromise()];\n                        case 3:\n                          _b.sent();\n                          _b.label = 4;\n                        case 4:\n                          first = false;\n                          _b.label = 5;\n                        case 5:\n                          errors = configs.reduce(function(accum, c) {\n                            if (!c.done || c.error == null) {\n                              return accum;\n                            }\n                            var code = c.error.code;\n                            if (ForwardErrors.indexOf(code) >= 0) {\n                              if (!accum[code]) {\n                                accum[code] = { error: c.error, weight: 0 };\n                              }\n                              accum[code].weight += c.weight;\n                            }\n                            return accum;\n                          }, {});\n                          Object.keys(errors).forEach(function(errorCode) {\n                            var tally = errors[errorCode];\n                            if (tally.weight < _this.quorum) {\n                              return;\n                            }\n                            configs.forEach(function(c) {\n                              if (c.staller) {\n                                c.staller.cancel();\n                              }\n                              c.cancelled = true;\n                            });\n                            var e = tally.error;\n                            var props = {};\n                            ForwardProperties.forEach(function(name2) {\n                              if (e[name2] == null) {\n                                return;\n                              }\n                              props[name2] = e[name2];\n                            });\n                            logger.throwError(e.reason || e.message, errorCode, props);\n                          });\n                          if (configs.filter(function(c) {\n                            return !c.done;\n                          }).length === 0) {\n                            return [2, \"break\"];\n                          }\n                          return [\n                            2\n                            /*return*/\n                          ];\n                      }\n                    });\n                  };\n                  this_1 = this;\n                  _a.label = 5;\n                case 5:\n                  if (false) return [3, 7];\n                  return [5, _loop_1()];\n                case 6:\n                  state_1 = _a.sent();\n                  if (typeof state_1 === \"object\")\n                    return [2, state_1.value];\n                  if (state_1 === \"break\")\n                    return [3, 7];\n                  return [3, 5];\n                case 7:\n                  configs.forEach(function(c) {\n                    if (c.staller) {\n                      c.staller.cancel();\n                    }\n                    c.cancelled = true;\n                  });\n                  return [2, logger.throwError(\"failed to meet quorum\", logger_1.Logger.errors.SERVER_ERROR, {\n                    method,\n                    params,\n                    //results: configs.map((c) => c.result),\n                    //errors: configs.map((c) => c.error),\n                    results: configs.map(function(c) {\n                      return exposeDebugConfig(c);\n                    }),\n                    provider: this\n                  })];\n              }\n            });\n          });\n        };\n        return FallbackProvider2;\n      }(base_provider_1.BaseProvider)\n    );\n    exports2.FallbackProvider = FallbackProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/ipc-provider.js\nvar require_ipc_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/ipc-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.IpcProvider = void 0;\n    var net_1 = require(\"net\");\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var IpcProvider = (\n      /** @class */\n      function(_super) {\n        __extends(IpcProvider2, _super);\n        function IpcProvider2(path, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, IpcProvider2);\n          if (path == null) {\n            logger.throwError(\"missing path\", logger_1.Logger.errors.MISSING_ARGUMENT, { arg: \"path\" });\n          }\n          _this = _super.call(this, \"ipc://\" + path, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"path\", path);\n          return _this;\n        }\n        IpcProvider2.prototype.send = function(method, params) {\n          var _this = this;\n          var payload = JSON.stringify({\n            method,\n            params,\n            id: 42,\n            jsonrpc: \"2.0\"\n          });\n          return new Promise(function(resolve, reject) {\n            var response = Buffer.alloc(0);\n            var stream = (0, net_1.connect)(_this.path);\n            stream.on(\"data\", function(data) {\n              response = Buffer.concat([response, data]);\n            });\n            stream.on(\"end\", function() {\n              try {\n                resolve(JSON.parse(response.toString()).result);\n                stream.destroy();\n              } catch (error) {\n                reject(error);\n                stream.destroy();\n              }\n            });\n            stream.on(\"error\", function(error) {\n              reject(error);\n              stream.destroy();\n            });\n            stream.write(payload);\n            stream.end();\n          });\n        };\n        return IpcProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.IpcProvider = IpcProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/infura-provider.js\nvar require_infura_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/infura-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.InfuraProvider = exports2.InfuraWebSocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var websocket_provider_1 = require_websocket_provider();\n    var formatter_1 = require_formatter();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultProjectId = \"84842078b09946638c03157f83405213\";\n    var InfuraWebSocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(InfuraWebSocketProvider2, _super);\n        function InfuraWebSocketProvider2(network, apiKey) {\n          var _this = this;\n          var provider = new InfuraProvider(network, apiKey);\n          var connection = provider.connection;\n          if (connection.password) {\n            logger.throwError(\"INFURA WebSocket project secrets unsupported\", logger_1.Logger.errors.UNSUPPORTED_OPERATION, {\n              operation: \"InfuraProvider.getWebSocketProvider()\"\n            });\n          }\n          var url = connection.url.replace(/^http/i, \"ws\").replace(\"/v3/\", \"/ws/v3/\");\n          _this = _super.call(this, url, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"apiKey\", provider.projectId);\n          (0, properties_1.defineReadOnly)(_this, \"projectId\", provider.projectId);\n          (0, properties_1.defineReadOnly)(_this, \"projectSecret\", provider.projectSecret);\n          return _this;\n        }\n        InfuraWebSocketProvider2.prototype.isCommunityResource = function() {\n          return this.projectId === defaultProjectId;\n        };\n        return InfuraWebSocketProvider2;\n      }(websocket_provider_1.WebSocketProvider)\n    );\n    exports2.InfuraWebSocketProvider = InfuraWebSocketProvider;\n    var InfuraProvider = (\n      /** @class */\n      function(_super) {\n        __extends(InfuraProvider2, _super);\n        function InfuraProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        InfuraProvider2.getWebSocketProvider = function(network, apiKey) {\n          return new InfuraWebSocketProvider(network, apiKey);\n        };\n        InfuraProvider2.getApiKey = function(apiKey) {\n          var apiKeyObj = {\n            apiKey: defaultProjectId,\n            projectId: defaultProjectId,\n            projectSecret: null\n          };\n          if (apiKey == null) {\n            return apiKeyObj;\n          }\n          if (typeof apiKey === \"string\") {\n            apiKeyObj.projectId = apiKey;\n          } else if (apiKey.projectSecret != null) {\n            logger.assertArgument(typeof apiKey.projectId === \"string\", \"projectSecret requires a projectId\", \"projectId\", apiKey.projectId);\n            logger.assertArgument(typeof apiKey.projectSecret === \"string\", \"invalid projectSecret\", \"projectSecret\", \"[REDACTED]\");\n            apiKeyObj.projectId = apiKey.projectId;\n            apiKeyObj.projectSecret = apiKey.projectSecret;\n          } else if (apiKey.projectId) {\n            apiKeyObj.projectId = apiKey.projectId;\n          }\n          apiKeyObj.apiKey = apiKeyObj.projectId;\n          return apiKeyObj;\n        };\n        InfuraProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network ? network.name : \"unknown\") {\n            case \"homestead\":\n              host = \"mainnet.infura.io\";\n              break;\n            case \"ropsten\":\n              host = \"ropsten.infura.io\";\n              break;\n            case \"rinkeby\":\n              host = \"rinkeby.infura.io\";\n              break;\n            case \"kovan\":\n              host = \"kovan.infura.io\";\n              break;\n            case \"goerli\":\n              host = \"goerli.infura.io\";\n              break;\n            case \"matic\":\n              host = \"polygon-mainnet.infura.io\";\n              break;\n            case \"maticmum\":\n              host = \"polygon-mumbai.infura.io\";\n              break;\n            case \"optimism\":\n              host = \"optimism-mainnet.infura.io\";\n              break;\n            case \"optimism-kovan\":\n              host = \"optimism-kovan.infura.io\";\n              break;\n            case \"arbitrum\":\n              host = \"arbitrum-mainnet.infura.io\";\n              break;\n            case \"arbitrum-rinkeby\":\n              host = \"arbitrum-rinkeby.infura.io\";\n              break;\n            default:\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n          }\n          var connection = {\n            allowGzip: true,\n            url: \"https://\" + host + \"/v3/\" + apiKey.projectId,\n            throttleCallback: function(attempt, url) {\n              if (apiKey.projectId === defaultProjectId) {\n                (0, formatter_1.showThrottleMessage)();\n              }\n              return Promise.resolve(true);\n            }\n          };\n          if (apiKey.projectSecret != null) {\n            connection.user = \"\";\n            connection.password = apiKey.projectSecret;\n          }\n          return connection;\n        };\n        InfuraProvider2.prototype.isCommunityResource = function() {\n          return this.projectId === defaultProjectId;\n        };\n        return InfuraProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.InfuraProvider = InfuraProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/json-rpc-batch-provider.js\nvar require_json_rpc_batch_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/json-rpc-batch-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.JsonRpcBatchProvider = void 0;\n    var properties_1 = require_lib4();\n    var web_1 = require_lib27();\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var JsonRpcBatchProvider = (\n      /** @class */\n      function(_super) {\n        __extends(JsonRpcBatchProvider2, _super);\n        function JsonRpcBatchProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        JsonRpcBatchProvider2.prototype.send = function(method, params) {\n          var _this = this;\n          var request = {\n            method,\n            params,\n            id: this._nextId++,\n            jsonrpc: \"2.0\"\n          };\n          if (this._pendingBatch == null) {\n            this._pendingBatch = [];\n          }\n          var inflightRequest = { request, resolve: null, reject: null };\n          var promise = new Promise(function(resolve, reject) {\n            inflightRequest.resolve = resolve;\n            inflightRequest.reject = reject;\n          });\n          this._pendingBatch.push(inflightRequest);\n          if (!this._pendingBatchAggregator) {\n            this._pendingBatchAggregator = setTimeout(function() {\n              var batch = _this._pendingBatch;\n              _this._pendingBatch = null;\n              _this._pendingBatchAggregator = null;\n              var request2 = batch.map(function(inflight) {\n                return inflight.request;\n              });\n              _this.emit(\"debug\", {\n                action: \"requestBatch\",\n                request: (0, properties_1.deepCopy)(request2),\n                provider: _this\n              });\n              return (0, web_1.fetchJson)(_this.connection, JSON.stringify(request2)).then(function(result) {\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  request: request2,\n                  response: result,\n                  provider: _this\n                });\n                batch.forEach(function(inflightRequest2, index) {\n                  var payload = result[index];\n                  if (payload.error) {\n                    var error = new Error(payload.error.message);\n                    error.code = payload.error.code;\n                    error.data = payload.error.data;\n                    inflightRequest2.reject(error);\n                  } else {\n                    inflightRequest2.resolve(payload.result);\n                  }\n                });\n              }, function(error) {\n                _this.emit(\"debug\", {\n                  action: \"response\",\n                  error,\n                  request: request2,\n                  provider: _this\n                });\n                batch.forEach(function(inflightRequest2) {\n                  inflightRequest2.reject(error);\n                });\n              });\n            }, 10);\n          }\n          return promise;\n        };\n        return JsonRpcBatchProvider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.JsonRpcBatchProvider = JsonRpcBatchProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/nodesmith-provider.js\nvar require_nodesmith_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/nodesmith-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.NodesmithProvider = void 0;\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var defaultApiKey = \"ETHERS_JS_SHARED\";\n    var NodesmithProvider = (\n      /** @class */\n      function(_super) {\n        __extends(NodesmithProvider2, _super);\n        function NodesmithProvider2() {\n          return _super !== null && _super.apply(this, arguments) || this;\n        }\n        NodesmithProvider2.getApiKey = function(apiKey) {\n          if (apiKey && typeof apiKey !== \"string\") {\n            logger.throwArgumentError(\"invalid apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKey || defaultApiKey;\n        };\n        NodesmithProvider2.getUrl = function(network, apiKey) {\n          logger.warn(\"NodeSmith will be discontinued on 2019-12-20; please migrate to another platform.\");\n          var host = null;\n          switch (network.name) {\n            case \"homestead\":\n              host = \"https://ethereum.api.nodesmith.io/v1/mainnet/jsonrpc\";\n              break;\n            case \"ropsten\":\n              host = \"https://ethereum.api.nodesmith.io/v1/ropsten/jsonrpc\";\n              break;\n            case \"rinkeby\":\n              host = \"https://ethereum.api.nodesmith.io/v1/rinkeby/jsonrpc\";\n              break;\n            case \"goerli\":\n              host = \"https://ethereum.api.nodesmith.io/v1/goerli/jsonrpc\";\n              break;\n            case \"kovan\":\n              host = \"https://ethereum.api.nodesmith.io/v1/kovan/jsonrpc\";\n              break;\n            default:\n              logger.throwArgumentError(\"unsupported network\", \"network\", arguments[0]);\n          }\n          return host + \"?apiKey=\" + apiKey;\n        };\n        return NodesmithProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.NodesmithProvider = NodesmithProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/pocket-provider.js\nvar require_pocket_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/pocket-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.PocketProvider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    var defaultApplicationIds = {\n      homestead: \"6004bcd10040261633ade990\",\n      ropsten: \"6004bd4d0040261633ade991\",\n      rinkeby: \"6004bda20040261633ade994\",\n      goerli: \"6004bd860040261633ade992\"\n    };\n    var PocketProvider = (\n      /** @class */\n      function(_super) {\n        __extends(PocketProvider2, _super);\n        function PocketProvider2(network, apiKey) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          if (apiKey == null) {\n            var n = (0, properties_1.getStatic)(_newTarget, \"getNetwork\")(network);\n            if (n) {\n              var applicationId = defaultApplicationIds[n.name];\n              if (applicationId) {\n                apiKey = {\n                  applicationId,\n                  loadBalancer: true\n                };\n              }\n            }\n            if (apiKey == null) {\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n            }\n          }\n          _this = _super.call(this, network, apiKey) || this;\n          return _this;\n        }\n        PocketProvider2.getApiKey = function(apiKey) {\n          if (apiKey == null) {\n            logger.throwArgumentError(\"PocketProvider.getApiKey does not support null apiKey\", \"apiKey\", apiKey);\n          }\n          var apiKeyObj = {\n            applicationId: null,\n            loadBalancer: false,\n            applicationSecretKey: null\n          };\n          if (typeof apiKey === \"string\") {\n            apiKeyObj.applicationId = apiKey;\n          } else if (apiKey.applicationSecretKey != null) {\n            logger.assertArgument(typeof apiKey.applicationId === \"string\", \"applicationSecretKey requires an applicationId\", \"applicationId\", apiKey.applicationId);\n            logger.assertArgument(typeof apiKey.applicationSecretKey === \"string\", \"invalid applicationSecretKey\", \"applicationSecretKey\", \"[REDACTED]\");\n            apiKeyObj.applicationId = apiKey.applicationId;\n            apiKeyObj.applicationSecretKey = apiKey.applicationSecretKey;\n            apiKeyObj.loadBalancer = !!apiKey.loadBalancer;\n          } else if (apiKey.applicationId) {\n            logger.assertArgument(typeof apiKey.applicationId === \"string\", \"apiKey.applicationId must be a string\", \"apiKey.applicationId\", apiKey.applicationId);\n            apiKeyObj.applicationId = apiKey.applicationId;\n            apiKeyObj.loadBalancer = !!apiKey.loadBalancer;\n          } else {\n            logger.throwArgumentError(\"unsupported PocketProvider apiKey\", \"apiKey\", apiKey);\n          }\n          return apiKeyObj;\n        };\n        PocketProvider2.getUrl = function(network, apiKey) {\n          var host = null;\n          switch (network ? network.name : \"unknown\") {\n            case \"homestead\":\n              host = \"eth-mainnet.gateway.pokt.network\";\n              break;\n            case \"ropsten\":\n              host = \"eth-ropsten.gateway.pokt.network\";\n              break;\n            case \"rinkeby\":\n              host = \"eth-rinkeby.gateway.pokt.network\";\n              break;\n            case \"goerli\":\n              host = \"eth-goerli.gateway.pokt.network\";\n              break;\n            default:\n              logger.throwError(\"unsupported network\", logger_1.Logger.errors.INVALID_ARGUMENT, {\n                argument: \"network\",\n                value: network\n              });\n          }\n          var url = null;\n          if (apiKey.loadBalancer) {\n            url = \"https://\" + host + \"/v1/lb/\" + apiKey.applicationId;\n          } else {\n            url = \"https://\" + host + \"/v1/\" + apiKey.applicationId;\n          }\n          var connection = { url };\n          connection.headers = {};\n          if (apiKey.applicationSecretKey != null) {\n            connection.user = \"\";\n            connection.password = apiKey.applicationSecretKey;\n          }\n          return connection;\n        };\n        PocketProvider2.prototype.isCommunityResource = function() {\n          return this.applicationId === defaultApplicationIds[this.network.name];\n        };\n        return PocketProvider2;\n      }(url_json_rpc_provider_1.UrlJsonRpcProvider)\n    );\n    exports2.PocketProvider = PocketProvider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/web3-provider.js\nvar require_web3_provider = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/web3-provider.js\"(exports2) {\n    \"use strict\";\n    var __extends = exports2 && exports2.__extends || /* @__PURE__ */ function() {\n      var extendStatics = function(d, b) {\n        extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {\n          d2.__proto__ = b2;\n        } || function(d2, b2) {\n          for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];\n        };\n        return extendStatics(d, b);\n      };\n      return function(d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n      };\n    }();\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Web3Provider = void 0;\n    var properties_1 = require_lib4();\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    var _nextId = 1;\n    function buildWeb3LegacyFetcher(provider, sendFunc) {\n      var fetcher = \"Web3LegacyFetcher\";\n      return function(method, params) {\n        var _this = this;\n        var request = {\n          method,\n          params,\n          id: _nextId++,\n          jsonrpc: \"2.0\"\n        };\n        return new Promise(function(resolve, reject) {\n          _this.emit(\"debug\", {\n            action: \"request\",\n            fetcher,\n            request: (0, properties_1.deepCopy)(request),\n            provider: _this\n          });\n          sendFunc(request, function(error, response) {\n            if (error) {\n              _this.emit(\"debug\", {\n                action: \"response\",\n                fetcher,\n                error,\n                request,\n                provider: _this\n              });\n              return reject(error);\n            }\n            _this.emit(\"debug\", {\n              action: \"response\",\n              fetcher,\n              request,\n              response,\n              provider: _this\n            });\n            if (response.error) {\n              var error_1 = new Error(response.error.message);\n              error_1.code = response.error.code;\n              error_1.data = response.error.data;\n              return reject(error_1);\n            }\n            resolve(response.result);\n          });\n        });\n      };\n    }\n    function buildEip1193Fetcher(provider) {\n      return function(method, params) {\n        var _this = this;\n        if (params == null) {\n          params = [];\n        }\n        var request = { method, params };\n        this.emit(\"debug\", {\n          action: \"request\",\n          fetcher: \"Eip1193Fetcher\",\n          request: (0, properties_1.deepCopy)(request),\n          provider: this\n        });\n        return provider.request(request).then(function(response) {\n          _this.emit(\"debug\", {\n            action: \"response\",\n            fetcher: \"Eip1193Fetcher\",\n            request,\n            response,\n            provider: _this\n          });\n          return response;\n        }, function(error) {\n          _this.emit(\"debug\", {\n            action: \"response\",\n            fetcher: \"Eip1193Fetcher\",\n            request,\n            error,\n            provider: _this\n          });\n          throw error;\n        });\n      };\n    }\n    var Web3Provider = (\n      /** @class */\n      function(_super) {\n        __extends(Web3Provider2, _super);\n        function Web3Provider2(provider, network) {\n          var _newTarget = this.constructor;\n          var _this = this;\n          logger.checkNew(_newTarget, Web3Provider2);\n          if (provider == null) {\n            logger.throwArgumentError(\"missing provider\", \"provider\", provider);\n          }\n          var path = null;\n          var jsonRpcFetchFunc = null;\n          var subprovider = null;\n          if (typeof provider === \"function\") {\n            path = \"unknown:\";\n            jsonRpcFetchFunc = provider;\n          } else {\n            path = provider.host || provider.path || \"\";\n            if (!path && provider.isMetaMask) {\n              path = \"metamask\";\n            }\n            subprovider = provider;\n            if (provider.request) {\n              if (path === \"\") {\n                path = \"eip-1193:\";\n              }\n              jsonRpcFetchFunc = buildEip1193Fetcher(provider);\n            } else if (provider.sendAsync) {\n              jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider));\n            } else if (provider.send) {\n              jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider));\n            } else {\n              logger.throwArgumentError(\"unsupported provider\", \"provider\", provider);\n            }\n            if (!path) {\n              path = \"unknown:\";\n            }\n          }\n          _this = _super.call(this, path, network) || this;\n          (0, properties_1.defineReadOnly)(_this, \"jsonRpcFetchFunc\", jsonRpcFetchFunc);\n          (0, properties_1.defineReadOnly)(_this, \"provider\", subprovider);\n          return _this;\n        }\n        Web3Provider2.prototype.send = function(method, params) {\n          return this.jsonRpcFetchFunc(method, params);\n        };\n        return Web3Provider2;\n      }(json_rpc_provider_1.JsonRpcProvider)\n    );\n    exports2.Web3Provider = Web3Provider;\n  }\n});\n\n// node_modules/@ethersproject/providers/lib/index.js\nvar require_lib28 = __commonJS({\n  \"node_modules/@ethersproject/providers/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Formatter = exports2.showThrottleMessage = exports2.isCommunityResourcable = exports2.isCommunityResource = exports2.getNetwork = exports2.getDefaultProvider = exports2.JsonRpcSigner = exports2.IpcProvider = exports2.WebSocketProvider = exports2.Web3Provider = exports2.StaticJsonRpcProvider = exports2.PocketProvider = exports2.NodesmithProvider = exports2.JsonRpcBatchProvider = exports2.JsonRpcProvider = exports2.InfuraWebSocketProvider = exports2.InfuraProvider = exports2.EtherscanProvider = exports2.CloudflareProvider = exports2.AlchemyWebSocketProvider = exports2.AlchemyProvider = exports2.FallbackProvider = exports2.UrlJsonRpcProvider = exports2.Resolver = exports2.BaseProvider = exports2.Provider = void 0;\n    var abstract_provider_1 = require_lib12();\n    Object.defineProperty(exports2, \"Provider\", { enumerable: true, get: function() {\n      return abstract_provider_1.Provider;\n    } });\n    var networks_1 = require_lib25();\n    Object.defineProperty(exports2, \"getNetwork\", { enumerable: true, get: function() {\n      return networks_1.getNetwork;\n    } });\n    var base_provider_1 = require_base_provider();\n    Object.defineProperty(exports2, \"BaseProvider\", { enumerable: true, get: function() {\n      return base_provider_1.BaseProvider;\n    } });\n    Object.defineProperty(exports2, \"Resolver\", { enumerable: true, get: function() {\n      return base_provider_1.Resolver;\n    } });\n    var alchemy_provider_1 = require_alchemy_provider();\n    Object.defineProperty(exports2, \"AlchemyProvider\", { enumerable: true, get: function() {\n      return alchemy_provider_1.AlchemyProvider;\n    } });\n    Object.defineProperty(exports2, \"AlchemyWebSocketProvider\", { enumerable: true, get: function() {\n      return alchemy_provider_1.AlchemyWebSocketProvider;\n    } });\n    var cloudflare_provider_1 = require_cloudflare_provider();\n    Object.defineProperty(exports2, \"CloudflareProvider\", { enumerable: true, get: function() {\n      return cloudflare_provider_1.CloudflareProvider;\n    } });\n    var etherscan_provider_1 = require_etherscan_provider();\n    Object.defineProperty(exports2, \"EtherscanProvider\", { enumerable: true, get: function() {\n      return etherscan_provider_1.EtherscanProvider;\n    } });\n    var fallback_provider_1 = require_fallback_provider();\n    Object.defineProperty(exports2, \"FallbackProvider\", { enumerable: true, get: function() {\n      return fallback_provider_1.FallbackProvider;\n    } });\n    var ipc_provider_1 = require_ipc_provider();\n    Object.defineProperty(exports2, \"IpcProvider\", { enumerable: true, get: function() {\n      return ipc_provider_1.IpcProvider;\n    } });\n    var infura_provider_1 = require_infura_provider();\n    Object.defineProperty(exports2, \"InfuraProvider\", { enumerable: true, get: function() {\n      return infura_provider_1.InfuraProvider;\n    } });\n    Object.defineProperty(exports2, \"InfuraWebSocketProvider\", { enumerable: true, get: function() {\n      return infura_provider_1.InfuraWebSocketProvider;\n    } });\n    var json_rpc_provider_1 = require_json_rpc_provider();\n    Object.defineProperty(exports2, \"JsonRpcProvider\", { enumerable: true, get: function() {\n      return json_rpc_provider_1.JsonRpcProvider;\n    } });\n    Object.defineProperty(exports2, \"JsonRpcSigner\", { enumerable: true, get: function() {\n      return json_rpc_provider_1.JsonRpcSigner;\n    } });\n    var json_rpc_batch_provider_1 = require_json_rpc_batch_provider();\n    Object.defineProperty(exports2, \"JsonRpcBatchProvider\", { enumerable: true, get: function() {\n      return json_rpc_batch_provider_1.JsonRpcBatchProvider;\n    } });\n    var nodesmith_provider_1 = require_nodesmith_provider();\n    Object.defineProperty(exports2, \"NodesmithProvider\", { enumerable: true, get: function() {\n      return nodesmith_provider_1.NodesmithProvider;\n    } });\n    var pocket_provider_1 = require_pocket_provider();\n    Object.defineProperty(exports2, \"PocketProvider\", { enumerable: true, get: function() {\n      return pocket_provider_1.PocketProvider;\n    } });\n    var url_json_rpc_provider_1 = require_url_json_rpc_provider();\n    Object.defineProperty(exports2, \"StaticJsonRpcProvider\", { enumerable: true, get: function() {\n      return url_json_rpc_provider_1.StaticJsonRpcProvider;\n    } });\n    Object.defineProperty(exports2, \"UrlJsonRpcProvider\", { enumerable: true, get: function() {\n      return url_json_rpc_provider_1.UrlJsonRpcProvider;\n    } });\n    var web3_provider_1 = require_web3_provider();\n    Object.defineProperty(exports2, \"Web3Provider\", { enumerable: true, get: function() {\n      return web3_provider_1.Web3Provider;\n    } });\n    var websocket_provider_1 = require_websocket_provider();\n    Object.defineProperty(exports2, \"WebSocketProvider\", { enumerable: true, get: function() {\n      return websocket_provider_1.WebSocketProvider;\n    } });\n    var formatter_1 = require_formatter();\n    Object.defineProperty(exports2, \"Formatter\", { enumerable: true, get: function() {\n      return formatter_1.Formatter;\n    } });\n    Object.defineProperty(exports2, \"isCommunityResourcable\", { enumerable: true, get: function() {\n      return formatter_1.isCommunityResourcable;\n    } });\n    Object.defineProperty(exports2, \"isCommunityResource\", { enumerable: true, get: function() {\n      return formatter_1.isCommunityResource;\n    } });\n    Object.defineProperty(exports2, \"showThrottleMessage\", { enumerable: true, get: function() {\n      return formatter_1.showThrottleMessage;\n    } });\n    var logger_1 = require_lib();\n    var _version_1 = require_version22();\n    var logger = new logger_1.Logger(_version_1.version);\n    function getDefaultProvider(network, options) {\n      if (network == null) {\n        network = \"homestead\";\n      }\n      if (typeof network === \"string\") {\n        var match = network.match(/^(ws|http)s?:/i);\n        if (match) {\n          switch (match[1]) {\n            case \"http\":\n              return new json_rpc_provider_1.JsonRpcProvider(network);\n            case \"ws\":\n              return new websocket_provider_1.WebSocketProvider(network);\n            default:\n              logger.throwArgumentError(\"unsupported URL scheme\", \"network\", network);\n          }\n        }\n      }\n      var n = (0, networks_1.getNetwork)(network);\n      if (!n || !n._defaultProvider) {\n        logger.throwError(\"unsupported getDefaultProvider network\", logger_1.Logger.errors.NETWORK_ERROR, {\n          operation: \"getDefaultProvider\",\n          network\n        });\n      }\n      return n._defaultProvider({\n        FallbackProvider: fallback_provider_1.FallbackProvider,\n        AlchemyProvider: alchemy_provider_1.AlchemyProvider,\n        CloudflareProvider: cloudflare_provider_1.CloudflareProvider,\n        EtherscanProvider: etherscan_provider_1.EtherscanProvider,\n        InfuraProvider: infura_provider_1.InfuraProvider,\n        JsonRpcProvider: json_rpc_provider_1.JsonRpcProvider,\n        NodesmithProvider: nodesmith_provider_1.NodesmithProvider,\n        PocketProvider: pocket_provider_1.PocketProvider,\n        Web3Provider: web3_provider_1.Web3Provider,\n        IpcProvider: ipc_provider_1.IpcProvider\n      }, options);\n    }\n    exports2.getDefaultProvider = getDefaultProvider;\n  }\n});\n\n// node_modules/@ethersproject/solidity/lib/_version.js\nvar require_version23 = __commonJS({\n  \"node_modules/@ethersproject/solidity/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"solidity/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/solidity/lib/index.js\nvar require_lib29 = __commonJS({\n  \"node_modules/@ethersproject/solidity/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.sha256 = exports2.keccak256 = exports2.pack = void 0;\n    var bignumber_1 = require_lib3();\n    var bytes_1 = require_lib2();\n    var keccak256_1 = require_lib5();\n    var sha2_1 = require_lib19();\n    var strings_1 = require_lib9();\n    var regexBytes = new RegExp(\"^bytes([0-9]+)$\");\n    var regexNumber = new RegExp(\"^(u?int)([0-9]*)$\");\n    var regexArray = new RegExp(\"^(.*)\\\\[([0-9]*)\\\\]$\");\n    var Zeros = \"0000000000000000000000000000000000000000000000000000000000000000\";\n    var logger_1 = require_lib();\n    var _version_1 = require_version23();\n    var logger = new logger_1.Logger(_version_1.version);\n    function _pack(type, value, isArray) {\n      switch (type) {\n        case \"address\":\n          if (isArray) {\n            return (0, bytes_1.zeroPad)(value, 32);\n          }\n          return (0, bytes_1.arrayify)(value);\n        case \"string\":\n          return (0, strings_1.toUtf8Bytes)(value);\n        case \"bytes\":\n          return (0, bytes_1.arrayify)(value);\n        case \"bool\":\n          value = value ? \"0x01\" : \"0x00\";\n          if (isArray) {\n            return (0, bytes_1.zeroPad)(value, 32);\n          }\n          return (0, bytes_1.arrayify)(value);\n      }\n      var match = type.match(regexNumber);\n      if (match) {\n        var size = parseInt(match[2] || \"256\");\n        if (match[2] && String(size) !== match[2] || size % 8 !== 0 || size === 0 || size > 256) {\n          logger.throwArgumentError(\"invalid number type\", \"type\", type);\n        }\n        if (isArray) {\n          size = 256;\n        }\n        value = bignumber_1.BigNumber.from(value).toTwos(size);\n        return (0, bytes_1.zeroPad)(value, size / 8);\n      }\n      match = type.match(regexBytes);\n      if (match) {\n        var size = parseInt(match[1]);\n        if (String(size) !== match[1] || size === 0 || size > 32) {\n          logger.throwArgumentError(\"invalid bytes type\", \"type\", type);\n        }\n        if ((0, bytes_1.arrayify)(value).byteLength !== size) {\n          logger.throwArgumentError(\"invalid value for \" + type, \"value\", value);\n        }\n        if (isArray) {\n          return (0, bytes_1.arrayify)((value + Zeros).substring(0, 66));\n        }\n        return value;\n      }\n      match = type.match(regexArray);\n      if (match && Array.isArray(value)) {\n        var baseType_1 = match[1];\n        var count = parseInt(match[2] || String(value.length));\n        if (count != value.length) {\n          logger.throwArgumentError(\"invalid array length for \" + type, \"value\", value);\n        }\n        var result_1 = [];\n        value.forEach(function(value2) {\n          result_1.push(_pack(baseType_1, value2, true));\n        });\n        return (0, bytes_1.concat)(result_1);\n      }\n      return logger.throwArgumentError(\"invalid type\", \"type\", type);\n    }\n    function pack(types, values) {\n      if (types.length != values.length) {\n        logger.throwArgumentError(\"wrong number of values; expected ${ types.length }\", \"values\", values);\n      }\n      var tight = [];\n      types.forEach(function(type, index) {\n        tight.push(_pack(type, values[index]));\n      });\n      return (0, bytes_1.hexlify)((0, bytes_1.concat)(tight));\n    }\n    exports2.pack = pack;\n    function keccak256(types, values) {\n      return (0, keccak256_1.keccak256)(pack(types, values));\n    }\n    exports2.keccak256 = keccak256;\n    function sha256(types, values) {\n      return (0, sha2_1.sha256)(pack(types, values));\n    }\n    exports2.sha256 = sha256;\n  }\n});\n\n// node_modules/@ethersproject/units/lib/_version.js\nvar require_version24 = __commonJS({\n  \"node_modules/@ethersproject/units/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"units/5.5.0\";\n  }\n});\n\n// node_modules/@ethersproject/units/lib/index.js\nvar require_lib30 = __commonJS({\n  \"node_modules/@ethersproject/units/lib/index.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.parseEther = exports2.formatEther = exports2.parseUnits = exports2.formatUnits = exports2.commify = void 0;\n    var bignumber_1 = require_lib3();\n    var logger_1 = require_lib();\n    var _version_1 = require_version24();\n    var logger = new logger_1.Logger(_version_1.version);\n    var names = [\n      \"wei\",\n      \"kwei\",\n      \"mwei\",\n      \"gwei\",\n      \"szabo\",\n      \"finney\",\n      \"ether\"\n    ];\n    function commify(value) {\n      var comps = String(value).split(\".\");\n      if (comps.length > 2 || !comps[0].match(/^-?[0-9]*$/) || comps[1] && !comps[1].match(/^[0-9]*$/) || value === \".\" || value === \"-.\") {\n        logger.throwArgumentError(\"invalid value\", \"value\", value);\n      }\n      var whole = comps[0];\n      var negative = \"\";\n      if (whole.substring(0, 1) === \"-\") {\n        negative = \"-\";\n        whole = whole.substring(1);\n      }\n      while (whole.substring(0, 1) === \"0\") {\n        whole = whole.substring(1);\n      }\n      if (whole === \"\") {\n        whole = \"0\";\n      }\n      var suffix = \"\";\n      if (comps.length === 2) {\n        suffix = \".\" + (comps[1] || \"0\");\n      }\n      while (suffix.length > 2 && suffix[suffix.length - 1] === \"0\") {\n        suffix = suffix.substring(0, suffix.length - 1);\n      }\n      var formatted = [];\n      while (whole.length) {\n        if (whole.length <= 3) {\n          formatted.unshift(whole);\n          break;\n        } else {\n          var index = whole.length - 3;\n          formatted.unshift(whole.substring(index));\n          whole = whole.substring(0, index);\n        }\n      }\n      return negative + formatted.join(\",\") + suffix;\n    }\n    exports2.commify = commify;\n    function formatUnits(value, unitName) {\n      if (typeof unitName === \"string\") {\n        var index = names.indexOf(unitName);\n        if (index !== -1) {\n          unitName = 3 * index;\n        }\n      }\n      return (0, bignumber_1.formatFixed)(value, unitName != null ? unitName : 18);\n    }\n    exports2.formatUnits = formatUnits;\n    function parseUnits(value, unitName) {\n      if (typeof value !== \"string\") {\n        logger.throwArgumentError(\"value must be a string\", \"value\", value);\n      }\n      if (typeof unitName === \"string\") {\n        var index = names.indexOf(unitName);\n        if (index !== -1) {\n          unitName = 3 * index;\n        }\n      }\n      return (0, bignumber_1.parseFixed)(value, unitName != null ? unitName : 18);\n    }\n    exports2.parseUnits = parseUnits;\n    function formatEther(wei) {\n      return formatUnits(wei, 18);\n    }\n    exports2.formatEther = formatEther;\n    function parseEther(ether) {\n      return parseUnits(ether, 18);\n    }\n    exports2.parseEther = parseEther;\n  }\n});\n\n// node_modules/ethers/lib/utils.js\nvar require_utils5 = __commonJS({\n  \"node_modules/ethers/lib/utils.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n      }\n      __setModuleDefault(result, mod);\n      return result;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.formatBytes32String = exports2.Utf8ErrorFuncs = exports2.toUtf8String = exports2.toUtf8CodePoints = exports2.toUtf8Bytes = exports2._toEscapedUtf8String = exports2.nameprep = exports2.hexDataSlice = exports2.hexDataLength = exports2.hexZeroPad = exports2.hexValue = exports2.hexStripZeros = exports2.hexConcat = exports2.isHexString = exports2.hexlify = exports2.base64 = exports2.base58 = exports2.TransactionDescription = exports2.LogDescription = exports2.Interface = exports2.SigningKey = exports2.HDNode = exports2.defaultPath = exports2.isBytesLike = exports2.isBytes = exports2.zeroPad = exports2.stripZeros = exports2.concat = exports2.arrayify = exports2.shallowCopy = exports2.resolveProperties = exports2.getStatic = exports2.defineReadOnly = exports2.deepCopy = exports2.checkProperties = exports2.poll = exports2.fetchJson = exports2._fetchData = exports2.RLP = exports2.Logger = exports2.checkResultErrors = exports2.FormatTypes = exports2.ParamType = exports2.FunctionFragment = exports2.EventFragment = exports2.ErrorFragment = exports2.ConstructorFragment = exports2.Fragment = exports2.defaultAbiCoder = exports2.AbiCoder = void 0;\n    exports2.Indexed = exports2.Utf8ErrorReason = exports2.UnicodeNormalizationForm = exports2.SupportedAlgorithm = exports2.mnemonicToSeed = exports2.isValidMnemonic = exports2.entropyToMnemonic = exports2.mnemonicToEntropy = exports2.getAccountPath = exports2.verifyTypedData = exports2.verifyMessage = exports2.recoverPublicKey = exports2.computePublicKey = exports2.recoverAddress = exports2.computeAddress = exports2.getJsonWalletAddress = exports2.TransactionTypes = exports2.serializeTransaction = exports2.parseTransaction = exports2.accessListify = exports2.joinSignature = exports2.splitSignature = exports2.soliditySha256 = exports2.solidityKeccak256 = exports2.solidityPack = exports2.shuffled = exports2.randomBytes = exports2.sha512 = exports2.sha256 = exports2.ripemd160 = exports2.keccak256 = exports2.computeHmac = exports2.commify = exports2.parseUnits = exports2.formatUnits = exports2.parseEther = exports2.formatEther = exports2.isAddress = exports2.getCreate2Address = exports2.getContractAddress = exports2.getIcapAddress = exports2.getAddress = exports2._TypedDataEncoder = exports2.id = exports2.isValidName = exports2.namehash = exports2.hashMessage = exports2.parseBytes32String = void 0;\n    var abi_1 = require_lib11();\n    Object.defineProperty(exports2, \"AbiCoder\", { enumerable: true, get: function() {\n      return abi_1.AbiCoder;\n    } });\n    Object.defineProperty(exports2, \"checkResultErrors\", { enumerable: true, get: function() {\n      return abi_1.checkResultErrors;\n    } });\n    Object.defineProperty(exports2, \"ConstructorFragment\", { enumerable: true, get: function() {\n      return abi_1.ConstructorFragment;\n    } });\n    Object.defineProperty(exports2, \"defaultAbiCoder\", { enumerable: true, get: function() {\n      return abi_1.defaultAbiCoder;\n    } });\n    Object.defineProperty(exports2, \"ErrorFragment\", { enumerable: true, get: function() {\n      return abi_1.ErrorFragment;\n    } });\n    Object.defineProperty(exports2, \"EventFragment\", { enumerable: true, get: function() {\n      return abi_1.EventFragment;\n    } });\n    Object.defineProperty(exports2, \"FormatTypes\", { enumerable: true, get: function() {\n      return abi_1.FormatTypes;\n    } });\n    Object.defineProperty(exports2, \"Fragment\", { enumerable: true, get: function() {\n      return abi_1.Fragment;\n    } });\n    Object.defineProperty(exports2, \"FunctionFragment\", { enumerable: true, get: function() {\n      return abi_1.FunctionFragment;\n    } });\n    Object.defineProperty(exports2, \"Indexed\", { enumerable: true, get: function() {\n      return abi_1.Indexed;\n    } });\n    Object.defineProperty(exports2, \"Interface\", { enumerable: true, get: function() {\n      return abi_1.Interface;\n    } });\n    Object.defineProperty(exports2, \"LogDescription\", { enumerable: true, get: function() {\n      return abi_1.LogDescription;\n    } });\n    Object.defineProperty(exports2, \"ParamType\", { enumerable: true, get: function() {\n      return abi_1.ParamType;\n    } });\n    Object.defineProperty(exports2, \"TransactionDescription\", { enumerable: true, get: function() {\n      return abi_1.TransactionDescription;\n    } });\n    var address_1 = require_lib7();\n    Object.defineProperty(exports2, \"getAddress\", { enumerable: true, get: function() {\n      return address_1.getAddress;\n    } });\n    Object.defineProperty(exports2, \"getCreate2Address\", { enumerable: true, get: function() {\n      return address_1.getCreate2Address;\n    } });\n    Object.defineProperty(exports2, \"getContractAddress\", { enumerable: true, get: function() {\n      return address_1.getContractAddress;\n    } });\n    Object.defineProperty(exports2, \"getIcapAddress\", { enumerable: true, get: function() {\n      return address_1.getIcapAddress;\n    } });\n    Object.defineProperty(exports2, \"isAddress\", { enumerable: true, get: function() {\n      return address_1.isAddress;\n    } });\n    var base64 = __importStar(require_lib26());\n    exports2.base64 = base64;\n    var basex_1 = require_lib17();\n    Object.defineProperty(exports2, \"base58\", { enumerable: true, get: function() {\n      return basex_1.Base58;\n    } });\n    var bytes_1 = require_lib2();\n    Object.defineProperty(exports2, \"arrayify\", { enumerable: true, get: function() {\n      return bytes_1.arrayify;\n    } });\n    Object.defineProperty(exports2, \"concat\", { enumerable: true, get: function() {\n      return bytes_1.concat;\n    } });\n    Object.defineProperty(exports2, \"hexConcat\", { enumerable: true, get: function() {\n      return bytes_1.hexConcat;\n    } });\n    Object.defineProperty(exports2, \"hexDataSlice\", { enumerable: true, get: function() {\n      return bytes_1.hexDataSlice;\n    } });\n    Object.defineProperty(exports2, \"hexDataLength\", { enumerable: true, get: function() {\n      return bytes_1.hexDataLength;\n    } });\n    Object.defineProperty(exports2, \"hexlify\", { enumerable: true, get: function() {\n      return bytes_1.hexlify;\n    } });\n    Object.defineProperty(exports2, \"hexStripZeros\", { enumerable: true, get: function() {\n      return bytes_1.hexStripZeros;\n    } });\n    Object.defineProperty(exports2, \"hexValue\", { enumerable: true, get: function() {\n      return bytes_1.hexValue;\n    } });\n    Object.defineProperty(exports2, \"hexZeroPad\", { enumerable: true, get: function() {\n      return bytes_1.hexZeroPad;\n    } });\n    Object.defineProperty(exports2, \"isBytes\", { enumerable: true, get: function() {\n      return bytes_1.isBytes;\n    } });\n    Object.defineProperty(exports2, \"isBytesLike\", { enumerable: true, get: function() {\n      return bytes_1.isBytesLike;\n    } });\n    Object.defineProperty(exports2, \"isHexString\", { enumerable: true, get: function() {\n      return bytes_1.isHexString;\n    } });\n    Object.defineProperty(exports2, \"joinSignature\", { enumerable: true, get: function() {\n      return bytes_1.joinSignature;\n    } });\n    Object.defineProperty(exports2, \"zeroPad\", { enumerable: true, get: function() {\n      return bytes_1.zeroPad;\n    } });\n    Object.defineProperty(exports2, \"splitSignature\", { enumerable: true, get: function() {\n      return bytes_1.splitSignature;\n    } });\n    Object.defineProperty(exports2, \"stripZeros\", { enumerable: true, get: function() {\n      return bytes_1.stripZeros;\n    } });\n    var hash_1 = require_lib10();\n    Object.defineProperty(exports2, \"_TypedDataEncoder\", { enumerable: true, get: function() {\n      return hash_1._TypedDataEncoder;\n    } });\n    Object.defineProperty(exports2, \"hashMessage\", { enumerable: true, get: function() {\n      return hash_1.hashMessage;\n    } });\n    Object.defineProperty(exports2, \"id\", { enumerable: true, get: function() {\n      return hash_1.id;\n    } });\n    Object.defineProperty(exports2, \"isValidName\", { enumerable: true, get: function() {\n      return hash_1.isValidName;\n    } });\n    Object.defineProperty(exports2, \"namehash\", { enumerable: true, get: function() {\n      return hash_1.namehash;\n    } });\n    var hdnode_1 = require_lib21();\n    Object.defineProperty(exports2, \"defaultPath\", { enumerable: true, get: function() {\n      return hdnode_1.defaultPath;\n    } });\n    Object.defineProperty(exports2, \"entropyToMnemonic\", { enumerable: true, get: function() {\n      return hdnode_1.entropyToMnemonic;\n    } });\n    Object.defineProperty(exports2, \"getAccountPath\", { enumerable: true, get: function() {\n      return hdnode_1.getAccountPath;\n    } });\n    Object.defineProperty(exports2, \"HDNode\", { enumerable: true, get: function() {\n      return hdnode_1.HDNode;\n    } });\n    Object.defineProperty(exports2, \"isValidMnemonic\", { enumerable: true, get: function() {\n      return hdnode_1.isValidMnemonic;\n    } });\n    Object.defineProperty(exports2, \"mnemonicToEntropy\", { enumerable: true, get: function() {\n      return hdnode_1.mnemonicToEntropy;\n    } });\n    Object.defineProperty(exports2, \"mnemonicToSeed\", { enumerable: true, get: function() {\n      return hdnode_1.mnemonicToSeed;\n    } });\n    var json_wallets_1 = require_lib23();\n    Object.defineProperty(exports2, \"getJsonWalletAddress\", { enumerable: true, get: function() {\n      return json_wallets_1.getJsonWalletAddress;\n    } });\n    var keccak256_1 = require_lib5();\n    Object.defineProperty(exports2, \"keccak256\", { enumerable: true, get: function() {\n      return keccak256_1.keccak256;\n    } });\n    var logger_1 = require_lib();\n    Object.defineProperty(exports2, \"Logger\", { enumerable: true, get: function() {\n      return logger_1.Logger;\n    } });\n    var sha2_1 = require_lib19();\n    Object.defineProperty(exports2, \"computeHmac\", { enumerable: true, get: function() {\n      return sha2_1.computeHmac;\n    } });\n    Object.defineProperty(exports2, \"ripemd160\", { enumerable: true, get: function() {\n      return sha2_1.ripemd160;\n    } });\n    Object.defineProperty(exports2, \"sha256\", { enumerable: true, get: function() {\n      return sha2_1.sha256;\n    } });\n    Object.defineProperty(exports2, \"sha512\", { enumerable: true, get: function() {\n      return sha2_1.sha512;\n    } });\n    var solidity_1 = require_lib29();\n    Object.defineProperty(exports2, \"solidityKeccak256\", { enumerable: true, get: function() {\n      return solidity_1.keccak256;\n    } });\n    Object.defineProperty(exports2, \"solidityPack\", { enumerable: true, get: function() {\n      return solidity_1.pack;\n    } });\n    Object.defineProperty(exports2, \"soliditySha256\", { enumerable: true, get: function() {\n      return solidity_1.sha256;\n    } });\n    var random_1 = require_lib22();\n    Object.defineProperty(exports2, \"randomBytes\", { enumerable: true, get: function() {\n      return random_1.randomBytes;\n    } });\n    Object.defineProperty(exports2, \"shuffled\", { enumerable: true, get: function() {\n      return random_1.shuffled;\n    } });\n    var properties_1 = require_lib4();\n    Object.defineProperty(exports2, \"checkProperties\", { enumerable: true, get: function() {\n      return properties_1.checkProperties;\n    } });\n    Object.defineProperty(exports2, \"deepCopy\", { enumerable: true, get: function() {\n      return properties_1.deepCopy;\n    } });\n    Object.defineProperty(exports2, \"defineReadOnly\", { enumerable: true, get: function() {\n      return properties_1.defineReadOnly;\n    } });\n    Object.defineProperty(exports2, \"getStatic\", { enumerable: true, get: function() {\n      return properties_1.getStatic;\n    } });\n    Object.defineProperty(exports2, \"resolveProperties\", { enumerable: true, get: function() {\n      return properties_1.resolveProperties;\n    } });\n    Object.defineProperty(exports2, \"shallowCopy\", { enumerable: true, get: function() {\n      return properties_1.shallowCopy;\n    } });\n    var RLP = __importStar(require_lib6());\n    exports2.RLP = RLP;\n    var signing_key_1 = require_lib14();\n    Object.defineProperty(exports2, \"computePublicKey\", { enumerable: true, get: function() {\n      return signing_key_1.computePublicKey;\n    } });\n    Object.defineProperty(exports2, \"recoverPublicKey\", { enumerable: true, get: function() {\n      return signing_key_1.recoverPublicKey;\n    } });\n    Object.defineProperty(exports2, \"SigningKey\", { enumerable: true, get: function() {\n      return signing_key_1.SigningKey;\n    } });\n    var strings_1 = require_lib9();\n    Object.defineProperty(exports2, \"formatBytes32String\", { enumerable: true, get: function() {\n      return strings_1.formatBytes32String;\n    } });\n    Object.defineProperty(exports2, \"nameprep\", { enumerable: true, get: function() {\n      return strings_1.nameprep;\n    } });\n    Object.defineProperty(exports2, \"parseBytes32String\", { enumerable: true, get: function() {\n      return strings_1.parseBytes32String;\n    } });\n    Object.defineProperty(exports2, \"_toEscapedUtf8String\", { enumerable: true, get: function() {\n      return strings_1._toEscapedUtf8String;\n    } });\n    Object.defineProperty(exports2, \"toUtf8Bytes\", { enumerable: true, get: function() {\n      return strings_1.toUtf8Bytes;\n    } });\n    Object.defineProperty(exports2, \"toUtf8CodePoints\", { enumerable: true, get: function() {\n      return strings_1.toUtf8CodePoints;\n    } });\n    Object.defineProperty(exports2, \"toUtf8String\", { enumerable: true, get: function() {\n      return strings_1.toUtf8String;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorFuncs\", { enumerable: true, get: function() {\n      return strings_1.Utf8ErrorFuncs;\n    } });\n    var transactions_1 = require_lib15();\n    Object.defineProperty(exports2, \"accessListify\", { enumerable: true, get: function() {\n      return transactions_1.accessListify;\n    } });\n    Object.defineProperty(exports2, \"computeAddress\", { enumerable: true, get: function() {\n      return transactions_1.computeAddress;\n    } });\n    Object.defineProperty(exports2, \"parseTransaction\", { enumerable: true, get: function() {\n      return transactions_1.parse;\n    } });\n    Object.defineProperty(exports2, \"recoverAddress\", { enumerable: true, get: function() {\n      return transactions_1.recoverAddress;\n    } });\n    Object.defineProperty(exports2, \"serializeTransaction\", { enumerable: true, get: function() {\n      return transactions_1.serialize;\n    } });\n    Object.defineProperty(exports2, \"TransactionTypes\", { enumerable: true, get: function() {\n      return transactions_1.TransactionTypes;\n    } });\n    var units_1 = require_lib30();\n    Object.defineProperty(exports2, \"commify\", { enumerable: true, get: function() {\n      return units_1.commify;\n    } });\n    Object.defineProperty(exports2, \"formatEther\", { enumerable: true, get: function() {\n      return units_1.formatEther;\n    } });\n    Object.defineProperty(exports2, \"parseEther\", { enumerable: true, get: function() {\n      return units_1.parseEther;\n    } });\n    Object.defineProperty(exports2, \"formatUnits\", { enumerable: true, get: function() {\n      return units_1.formatUnits;\n    } });\n    Object.defineProperty(exports2, \"parseUnits\", { enumerable: true, get: function() {\n      return units_1.parseUnits;\n    } });\n    var wallet_1 = require_lib24();\n    Object.defineProperty(exports2, \"verifyMessage\", { enumerable: true, get: function() {\n      return wallet_1.verifyMessage;\n    } });\n    Object.defineProperty(exports2, \"verifyTypedData\", { enumerable: true, get: function() {\n      return wallet_1.verifyTypedData;\n    } });\n    var web_1 = require_lib27();\n    Object.defineProperty(exports2, \"_fetchData\", { enumerable: true, get: function() {\n      return web_1._fetchData;\n    } });\n    Object.defineProperty(exports2, \"fetchJson\", { enumerable: true, get: function() {\n      return web_1.fetchJson;\n    } });\n    Object.defineProperty(exports2, \"poll\", { enumerable: true, get: function() {\n      return web_1.poll;\n    } });\n    var sha2_2 = require_lib19();\n    Object.defineProperty(exports2, \"SupportedAlgorithm\", { enumerable: true, get: function() {\n      return sha2_2.SupportedAlgorithm;\n    } });\n    var strings_2 = require_lib9();\n    Object.defineProperty(exports2, \"UnicodeNormalizationForm\", { enumerable: true, get: function() {\n      return strings_2.UnicodeNormalizationForm;\n    } });\n    Object.defineProperty(exports2, \"Utf8ErrorReason\", { enumerable: true, get: function() {\n      return strings_2.Utf8ErrorReason;\n    } });\n  }\n});\n\n// node_modules/ethers/lib/_version.js\nvar require_version25 = __commonJS({\n  \"node_modules/ethers/lib/_version.js\"(exports2) {\n    \"use strict\";\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.version = void 0;\n    exports2.version = \"ethers/5.5.2\";\n  }\n});\n\n// node_modules/ethers/lib/ethers.js\nvar require_ethers = __commonJS({\n  \"node_modules/ethers/lib/ethers.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n      }\n      __setModuleDefault(result, mod);\n      return result;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.version = exports2.wordlists = exports2.utils = exports2.logger = exports2.errors = exports2.constants = exports2.FixedNumber = exports2.BigNumber = exports2.ContractFactory = exports2.Contract = exports2.BaseContract = exports2.providers = exports2.getDefaultProvider = exports2.VoidSigner = exports2.Wallet = exports2.Signer = void 0;\n    var contracts_1 = require_lib16();\n    Object.defineProperty(exports2, \"BaseContract\", { enumerable: true, get: function() {\n      return contracts_1.BaseContract;\n    } });\n    Object.defineProperty(exports2, \"Contract\", { enumerable: true, get: function() {\n      return contracts_1.Contract;\n    } });\n    Object.defineProperty(exports2, \"ContractFactory\", { enumerable: true, get: function() {\n      return contracts_1.ContractFactory;\n    } });\n    var bignumber_1 = require_lib3();\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return bignumber_1.BigNumber;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return bignumber_1.FixedNumber;\n    } });\n    var abstract_signer_1 = require_lib13();\n    Object.defineProperty(exports2, \"Signer\", { enumerable: true, get: function() {\n      return abstract_signer_1.Signer;\n    } });\n    Object.defineProperty(exports2, \"VoidSigner\", { enumerable: true, get: function() {\n      return abstract_signer_1.VoidSigner;\n    } });\n    var wallet_1 = require_lib24();\n    Object.defineProperty(exports2, \"Wallet\", { enumerable: true, get: function() {\n      return wallet_1.Wallet;\n    } });\n    var constants = __importStar(require_lib8());\n    exports2.constants = constants;\n    var providers = __importStar(require_lib28());\n    exports2.providers = providers;\n    var providers_1 = require_lib28();\n    Object.defineProperty(exports2, \"getDefaultProvider\", { enumerable: true, get: function() {\n      return providers_1.getDefaultProvider;\n    } });\n    var wordlists_1 = require_lib20();\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return wordlists_1.Wordlist;\n    } });\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return wordlists_1.wordlists;\n    } });\n    var utils = __importStar(require_utils5());\n    exports2.utils = utils;\n    var logger_1 = require_lib();\n    Object.defineProperty(exports2, \"errors\", { enumerable: true, get: function() {\n      return logger_1.ErrorCode;\n    } });\n    var _version_1 = require_version25();\n    Object.defineProperty(exports2, \"version\", { enumerable: true, get: function() {\n      return _version_1.version;\n    } });\n    var logger = new logger_1.Logger(_version_1.version);\n    exports2.logger = logger;\n  }\n});\n\n// node_modules/ethers/lib/index.js\nvar require_lib31 = __commonJS({\n  \"node_modules/ethers/lib/index.js\"(exports2) {\n    \"use strict\";\n    var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      Object.defineProperty(o, k2, { enumerable: true, get: function() {\n        return m[k];\n      } });\n    } : function(o, m, k, k2) {\n      if (k2 === void 0) k2 = k;\n      o[k2] = m[k];\n    });\n    var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) {\n      Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n    } : function(o, v) {\n      o[\"default\"] = v;\n    });\n    var __importStar = exports2 && exports2.__importStar || function(mod) {\n      if (mod && mod.__esModule) return mod;\n      var result = {};\n      if (mod != null) {\n        for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n      }\n      __setModuleDefault(result, mod);\n      return result;\n    };\n    Object.defineProperty(exports2, \"__esModule\", { value: true });\n    exports2.Wordlist = exports2.version = exports2.wordlists = exports2.utils = exports2.logger = exports2.errors = exports2.constants = exports2.FixedNumber = exports2.BigNumber = exports2.ContractFactory = exports2.Contract = exports2.BaseContract = exports2.providers = exports2.getDefaultProvider = exports2.VoidSigner = exports2.Wallet = exports2.Signer = exports2.ethers = void 0;\n    var ethers2 = __importStar(require_ethers());\n    exports2.ethers = ethers2;\n    try {\n      anyGlobal = window;\n      if (anyGlobal._ethers == null) {\n        anyGlobal._ethers = ethers2;\n      }\n    } catch (error) {\n    }\n    var anyGlobal;\n    var ethers_1 = require_ethers();\n    Object.defineProperty(exports2, \"Signer\", { enumerable: true, get: function() {\n      return ethers_1.Signer;\n    } });\n    Object.defineProperty(exports2, \"Wallet\", { enumerable: true, get: function() {\n      return ethers_1.Wallet;\n    } });\n    Object.defineProperty(exports2, \"VoidSigner\", { enumerable: true, get: function() {\n      return ethers_1.VoidSigner;\n    } });\n    Object.defineProperty(exports2, \"getDefaultProvider\", { enumerable: true, get: function() {\n      return ethers_1.getDefaultProvider;\n    } });\n    Object.defineProperty(exports2, \"providers\", { enumerable: true, get: function() {\n      return ethers_1.providers;\n    } });\n    Object.defineProperty(exports2, \"BaseContract\", { enumerable: true, get: function() {\n      return ethers_1.BaseContract;\n    } });\n    Object.defineProperty(exports2, \"Contract\", { enumerable: true, get: function() {\n      return ethers_1.Contract;\n    } });\n    Object.defineProperty(exports2, \"ContractFactory\", { enumerable: true, get: function() {\n      return ethers_1.ContractFactory;\n    } });\n    Object.defineProperty(exports2, \"BigNumber\", { enumerable: true, get: function() {\n      return ethers_1.BigNumber;\n    } });\n    Object.defineProperty(exports2, \"FixedNumber\", { enumerable: true, get: function() {\n      return ethers_1.FixedNumber;\n    } });\n    Object.defineProperty(exports2, \"constants\", { enumerable: true, get: function() {\n      return ethers_1.constants;\n    } });\n    Object.defineProperty(exports2, \"errors\", { enumerable: true, get: function() {\n      return ethers_1.errors;\n    } });\n    Object.defineProperty(exports2, \"logger\", { enumerable: true, get: function() {\n      return ethers_1.logger;\n    } });\n    Object.defineProperty(exports2, \"utils\", { enumerable: true, get: function() {\n      return ethers_1.utils;\n    } });\n    Object.defineProperty(exports2, \"wordlists\", { enumerable: true, get: function() {\n      return ethers_1.wordlists;\n    } });\n    Object.defineProperty(exports2, \"version\", { enumerable: true, get: function() {\n      return ethers_1.version;\n    } });\n    Object.defineProperty(exports2, \"Wordlist\", { enumerable: true, get: function() {\n      return ethers_1.Wordlist;\n    } });\n  }\n});\n\n// src/getTickAtSqrtPrice.ts\nvar import_decimal = __toESM(require_decimal());\nvar import_ethers = __toESM(require_lib31());\nvar sqrtPriceArray = process.argv[2].split(\",\");\nvar resultsArray = [];\nfor (let sqrtPrice of sqrtPriceArray) {\n  const jsResult = new import_decimal.default(sqrtPrice).div(new import_decimal.default(2).pow(96)).pow(2).log(1.0001).floor().toFixed(0);\n  resultsArray.push(jsResult);\n}\nprocess.stdout.write(import_ethers.ethers.utils.defaultAbiCoder.encode([\"int256[]\"], [resultsArray]));\n/*! Bundled license information:\n\njs-sha3/src/sha3.js:\n  (**\n   * [js-sha3]{@link https://github.com/emn178/js-sha3}\n   *\n   * @version 0.8.0\n   * @author Chen, Yi-Cyuan [emn178@gmail.com]\n   * @copyright Chen, Yi-Cyuan 2015-2018\n   * @license MIT\n   *)\n*/\n"
  },
  {
    "path": "test/js-scripts/package.json",
    "content": "{\n  \"name\": \"v4-js-scripts\",\n  \"description\": \"Scripts for v4 tests\",\n  \"license\": \"MIT\",\n  \"publishConfig\": {\n    \"access\": \"restricted\"\n  },\n  \"version\": \"1.0.0\",\n  \"homepage\": \"https://uniswap.org\",\n  \"keywords\": [\n    \"uniswap\",\n    \"core\",\n    \"v4\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Uniswap/v4-core\"\n  },\n  \"engines\": {\n    \"node\": \">=10\"\n  },\n  \"devDependencies\": {\n    \"decimal.js\": \"^10.2.1\",\n    \"esbuild\": \"^0.21.3\",\n    \"ethers\": \"^5.0.8\",\n    \"ts-generator\": \"^0.1.1\",\n    \"ts-node\": \"^8.5.4\",\n    \"typescript\": \"^3.7.3\"\n  },\n  \"scripts\": {\n    \"build\": \"npm i && node build.js && rm -rf node_modules\",\n    \"forge-test-getSqrtPriceAtTick\": \"node dist/getSqrtPriceAtTick.js\",\n    \"forge-test-getTickAtSqrtPrice\": \"node dist/getTickAtSqrtPrice.js\",\n    \"forge-test-getModifyLiquidityResult\": \"node dist/getModifyLiquidityResult.js\"\n  },\n  \"dependencies\": {\n    \"@uniswap/v3-sdk\": \"^3.11.2\"\n  }\n}\n"
  },
  {
    "path": "test/js-scripts/src/getModifyLiquidityResult.ts",
    "content": "import { BigNumber, ethers } from \"ethers\";\nimport JSBI from \"jsbi\";\nimport Decimal from \"decimal.js\";\n\nimport { getSqrtPriceAtTick, getAmount0Delta, getAmount1Delta, JSBI_ZERO } from \"./utils/shared\";\n\nconst params = process.argv[2].split(\",\");\n\nconst tickLower = params[0];\nconst tickUpper = params[1];\nconst liquidity = params[2];\nconst slot0Tick = params[3];\nconst slot0Price = params[4];\n\nconst result = modifyLiquidity(tickLower, tickUpper, liquidity, slot0Tick, slot0Price);\nprocess.stdout.write(ethers.utils.defaultAbiCoder.encode([\"int128[]\"], [result]));\n\nfunction modifyLiquidity(\n  _tickLower: string,\n  _tickUpper: string,\n  _liquidity: string,\n  slot0Tick: string,\n  slot0Price: string,\n): string[] {\n  // TODO: Implement fee delta calculations.\n\n  const liquidity = JSBI.BigInt(_liquidity);\n\n  if (JSBI.EQ(liquidity, 0)) {\n    return [JSBI_ZERO.toString(), JSBI_ZERO.toString()];\n  }\n\n  // State values in slot0.\n  const tick = JSBI.BigInt(slot0Tick);\n  const sqrtPriceX96 = JSBI.BigInt(slot0Price);\n\n  // Position lower and upper ticks.\n  const tickLower = JSBI.BigInt(_tickLower);\n  const tickUpper = JSBI.BigInt(_tickUpper);\n\n  let delta: string[] = [];\n\n  if (JSBI.LT(tick, tickLower)) {\n    // The current tick is less than the lowest tick of the position, so the position is entirely in token0.\n    let priceLower = JSBI.BigInt(getSqrtPriceAtTick(_tickLower));\n    let priceUpper = JSBI.BigInt(getSqrtPriceAtTick(_tickUpper));\n    let amount0 = getAmount0Delta(priceLower, priceUpper, liquidity);\n    delta.push(amount0.toString());\n    delta.push(JSBI_ZERO.toString());\n  } else if (JSBI.LT(tick, tickUpper)) {\n    // In-range liquidity. As we are just calculating the values of the delta.\n    // We do not update any global state variable for state.liquidity, but note that the protocol increments state liquidity in this case.\n\n    let priceUpper = JSBI.BigInt(getSqrtPriceAtTick(_tickUpper));\n    let priceLower = JSBI.BigInt(getSqrtPriceAtTick(_tickLower));\n\n    // When tickLower == the current tick, the price returned from getSqrtPriceATick has a slight error in JS.\n    // In solidity because the calculations for getSqrtRatioAtTick(tickLower) == currentSqrtPriceX96, the\n    // numerator becomes 0, and the amount becomes 0.\n    // So instead of using the price from getSqrtRatioAtTick, we set the priceLower to the current price.\n    if (JSBI.EQ(tickLower, tick)) {\n      priceLower = sqrtPriceX96;\n    }\n\n    let amount0 = getAmount0Delta(sqrtPriceX96, priceUpper, liquidity);\n    let amount1 = getAmount1Delta(priceLower, sqrtPriceX96, liquidity);\n\n    delta.push(amount0.toString());\n    delta.push(amount1.toString());\n  } else {\n    // The current tick is greater than the highest tick of the position, meaning the position is entirely in token1.\n    let priceLower = JSBI.BigInt(getSqrtPriceAtTick(_tickLower));\n    let priceUpper = JSBI.BigInt(getSqrtPriceAtTick(_tickUpper));\n\n    let amount1 = getAmount1Delta(priceLower, priceUpper, liquidity);\n    delta.push(JSBI_ZERO.toString());\n    delta.push(amount1.toString());\n  }\n\n  return delta;\n}\n"
  },
  {
    "path": "test/js-scripts/src/getSqrtPriceAtTick.ts",
    "content": "import Decimal from \"decimal.js\";\nimport { ethers } from \"ethers\";\n\nconst tickArray = process.argv[2].split(\",\");\nconst resultsArray = [];\nfor (let tick of tickArray) {\n  const jsResult = new Decimal(1.0001).pow(tick).sqrt().mul(new Decimal(2).pow(96)).toFixed(0);\n  resultsArray.push(jsResult);\n}\nprocess.stdout.write(ethers.utils.defaultAbiCoder.encode([\"uint160[]\"], [resultsArray]));\n"
  },
  {
    "path": "test/js-scripts/src/getTickAtSqrtPrice.ts",
    "content": "import Decimal from \"decimal.js\";\nimport { ethers } from \"ethers\";\n\nconst sqrtPriceArray = process.argv[2].split(\",\");\nconst resultsArray = [];\nfor (let sqrtPrice of sqrtPriceArray) {\n  const jsResult = new Decimal(sqrtPrice).div(new Decimal(2).pow(96)).pow(2).log(1.0001).floor().toFixed(0);\n  resultsArray.push(jsResult);\n}\nprocess.stdout.write(ethers.utils.defaultAbiCoder.encode([\"int256[]\"], [resultsArray]));\n"
  },
  {
    "path": "test/js-scripts/src/utils/shared.ts",
    "content": "import Decimal from \"decimal.js\";\nimport JSBI from \"jsbi\";\nimport { SqrtPriceMath } from \"@uniswap/v3-sdk\";\n\nexport const JSBI_ZERO = JSBI.BigInt(0);\n\nexport function getSqrtPriceAtTick(tick: string): string {\n  return new Decimal(1.0001).pow(tick).sqrt().mul(new Decimal(2).pow(96)).toFixed(0);\n}\n\nexport function getAmount0Delta(sqrtPriceAX96: JSBI, sqrtPriceBX96: JSBI, liquidity: JSBI): JSBI {\n  if (JSBI.lessThan(liquidity, JSBI_ZERO)) {\n    return SqrtPriceMath.getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, JSBI.unaryMinus(liquidity), false);\n  } else {\n    return JSBI.unaryMinus(SqrtPriceMath.getAmount0Delta(sqrtPriceAX96, sqrtPriceBX96, liquidity, true));\n  }\n}\n\nexport function getAmount1Delta(sqrtPriceAX96: JSBI, sqrtPriceBX96: JSBI, liquidity: JSBI): JSBI {\n  if (JSBI.lessThan(liquidity, JSBI_ZERO)) {\n    return SqrtPriceMath.getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, JSBI.unaryMinus(liquidity), false);\n  } else {\n    return JSBI.unaryMinus(SqrtPriceMath.getAmount1Delta(sqrtPriceAX96, sqrtPriceBX96, liquidity, true));\n  }\n}\n"
  },
  {
    "path": "test/js-scripts/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2018\",\n    \"module\": \"commonjs\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"outDir\": \"dist\",\n    \"typeRoots\": [\"./typechain\", \"./node_modules/@types\"],\n    \"types\": [\"@nomiclabs/hardhat-ethers\"]\n  },\n  \"include\": [\"./test\"]\n}\n"
  },
  {
    "path": "test/libraries/BitMath.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {BitMath} from \"../../src/libraries/BitMath.sol\";\n\ncontract TestBitMath is Test {\n    function test_mostSignificantBit_revertsWhenZero() public {\n        vm.expectRevert();\n        BitMath.mostSignificantBit(0);\n    }\n\n    function test_mostSignificantBit_one() public pure {\n        assertEq(BitMath.mostSignificantBit(1), 0);\n    }\n\n    function test_mostSignificantBit_two() public pure {\n        assertEq(BitMath.mostSignificantBit(2), 1);\n    }\n\n    function test_mostSignificantBit_powersOfTwo() public pure {\n        for (uint256 i = 0; i < 255; i++) {\n            uint256 x = 1 << i;\n            assertEq(BitMath.mostSignificantBit(x), i);\n        }\n    }\n\n    function test_mostSignificantBit_maxUint256() public pure {\n        assertEq(BitMath.mostSignificantBit(type(uint256).max), 255);\n    }\n\n    function test_fuzz_mostSignificantBit(uint256 x) public pure {\n        vm.assume(x != 0);\n        assertEq(BitMath.mostSignificantBit(x), mostSignificantBitReference(x));\n    }\n\n    function test_invariant_mostSignificantBit(uint256 x) public pure {\n        vm.assume(x != 0);\n        uint8 msb = BitMath.mostSignificantBit(x);\n        assertGe(x, uint256(2) ** msb);\n        assertTrue(msb == 255 || x < uint256(2) ** (msb + 1));\n    }\n\n    function test_mostSignificantBit_gas() public {\n        vm.startSnapshotGas(\"BitMathMostSignificantBitSmallNumber\");\n        BitMath.mostSignificantBit(3568);\n        vm.stopSnapshotGas();\n\n        vm.startSnapshotGas(\"BitMathMostSignificantBitMaxUint128\");\n        BitMath.mostSignificantBit(type(uint128).max);\n        vm.stopSnapshotGas();\n\n        vm.startSnapshotGas(\"BitMathMostSignificantBitMaxUint256\");\n        BitMath.mostSignificantBit(type(uint256).max);\n        vm.stopSnapshotGas();\n    }\n\n    function test_leastSignificantBit_revertsWhenZero() public {\n        vm.expectRevert();\n        BitMath.leastSignificantBit(0);\n    }\n\n    function test_leastSignificantBit_one() public pure {\n        assertEq(BitMath.leastSignificantBit(1), 0);\n    }\n\n    function test_leastSignificantBit_two() public pure {\n        assertEq(BitMath.leastSignificantBit(2), 1);\n    }\n\n    function test_leastSignificantBit_powersOfTwo() public pure {\n        for (uint256 i = 0; i < 255; i++) {\n            uint256 x = 1 << i;\n            assertEq(BitMath.leastSignificantBit(x), i);\n        }\n    }\n\n    function test_leastSignificantBit_maxUint256() public pure {\n        assertEq(BitMath.leastSignificantBit(type(uint256).max), 0);\n    }\n\n    function test_fuzz_leastSignificantBit(uint256 x) public pure {\n        vm.assume(x != 0);\n        assertEq(BitMath.leastSignificantBit(x), leastSignificantBitReference(x));\n    }\n\n    function test_invariant_leastSignificantBit(uint256 x) public pure {\n        vm.assume(x != 0);\n        uint8 lsb = BitMath.leastSignificantBit(x);\n        assertNotEq(x & (uint256(2) ** lsb), 0);\n        assertEq(x & (uint256(2) ** lsb - 1), 0);\n    }\n\n    function test_leastSignificantBit_gas() public {\n        vm.startSnapshotGas(\"BitMathLeastSignificantBitSmallNumber\");\n        BitMath.leastSignificantBit(3568);\n        vm.stopSnapshotGas();\n\n        vm.startSnapshotGas(\"BitMathLeastSignificantBitMaxUint128\");\n        BitMath.leastSignificantBit(type(uint128).max);\n        vm.stopSnapshotGas();\n\n        vm.startSnapshotGas(\"BitMathLeastSignificantBitMaxUint256\");\n        BitMath.leastSignificantBit(type(uint256).max);\n        vm.stopSnapshotGas();\n    }\n\n    function mostSignificantBitReference(uint256 x) private pure returns (uint256) {\n        uint256 i = 0;\n        while ((x >>= 1) > 0) {\n            ++i;\n        }\n        return i;\n    }\n\n    function leastSignificantBitReference(uint256 x) private pure returns (uint256) {\n        require(x > 0, \"BitMath: zero has no least significant bit\");\n\n        uint256 i = 0;\n        while ((x >> i) & 1 == 0) {\n            ++i;\n        }\n        return i;\n    }\n}\n"
  },
  {
    "path": "test/libraries/FullMath.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.19;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {FullMath} from \"../../src/libraries/FullMath.sol\";\n\ncontract FullMathTest is Test {\n    using FullMath for uint256;\n\n    uint256 constant Q128 = 2 ** 128;\n    uint256 constant MAX_UINT256 = type(uint256).max;\n\n    function test_fuzz_mulDiv_revertsWith0Denominator(uint256 x, uint256 y) public {\n        vm.expectRevert();\n        x.mulDiv(y, 0);\n    }\n\n    function test_mulDiv_revertsWithOverflowingNumeratorAndZeroDenominator() public {\n        vm.expectRevert();\n        Q128.mulDiv(Q128, 0);\n    }\n\n    function test_mulDiv_revertsIfOutputOverflows() public {\n        vm.expectRevert();\n        Q128.mulDiv(Q128, 1);\n    }\n\n    function test_mulDiv_revertsOverflowWithAllMaxInputs() public {\n        vm.expectRevert();\n        MAX_UINT256.mulDiv(MAX_UINT256, MAX_UINT256 - 1);\n    }\n\n    function test_mulDiv_validAllMaxInputs() public pure {\n        assertEq(MAX_UINT256.mulDiv(MAX_UINT256, MAX_UINT256), MAX_UINT256);\n    }\n\n    function test_mulDiv_validWithoutPhantomOverflow() public pure {\n        uint256 result = Q128 / 3;\n        assertEq(Q128.mulDiv(50 * Q128 / 100, 150 * Q128 / 100), result);\n    }\n\n    function test_mulDiv_validWithPhantomOverflow() public pure {\n        uint256 result = 4375 * Q128 / 1000;\n        assertEq(Q128.mulDiv(35 * Q128, 8 * Q128), result);\n    }\n\n    function test_mulDiv_phantomOverflowRepeatingDecimal() public pure {\n        uint256 result = 1 * Q128 / 3;\n        assertEq(Q128.mulDiv(1000 * Q128, 3000 * Q128), result);\n    }\n\n    function test_fuzz_mulDiv(uint256 x, uint256 y, uint256 d) public pure {\n        vm.assume(d != 0);\n        vm.assume(y != 0);\n        x = bound(x, 0, type(uint256).max / y);\n        assertEq(FullMath.mulDiv(x, y, d), x * y / d);\n    }\n\n    function test_fuzz_mulDivRoundingUp_revertsWith0Denominator(uint256 x, uint256 y) public {\n        vm.expectRevert();\n        x.mulDivRoundingUp(y, 0);\n    }\n\n    function test_mulDivRoundingUp_validWithAllMaxInputs() public pure {\n        assertEq(MAX_UINT256.mulDivRoundingUp(MAX_UINT256, MAX_UINT256), MAX_UINT256);\n    }\n\n    function test_mulDivRoundingUp_validWithNoPhantomOverflow() public pure {\n        uint256 result = Q128 / 3 + 1;\n        assertEq(Q128.mulDivRoundingUp(50 * Q128 / 100, 150 * Q128 / 100), result);\n    }\n\n    function test_mulDivRoundingUp_validWithPhantomOverflow() public pure {\n        uint256 result = 4375 * Q128 / 1000;\n        assertEq(Q128.mulDiv(35 * Q128, 8 * Q128), result);\n    }\n\n    function test_mulDivRoundingUp_validWithPhantomOverflowRepeatingDecimal() public pure {\n        uint256 result = 1 * Q128 / 3 + 1;\n        assertEq(Q128.mulDivRoundingUp(1000 * Q128, 3000 * Q128), result);\n    }\n\n    function test_mulDivRoundingUp_revertsIfMulDivOverflows256BitsAfterRoundingUp() public {\n        vm.expectRevert();\n        FullMath.mulDivRoundingUp(535006138814359, 432862656469423142931042426214547535783388063929571229938474969, 2);\n    }\n\n    function test_mulDivRoundingUp_revertsIfMulDivOverflows256BitsAfterRoundingUpCase2() public {\n        vm.expectRevert();\n        FullMath.mulDivRoundingUp(\n            115792089237316195423570985008687907853269984659341747863450311749907997002549,\n            115792089237316195423570985008687907853269984659341747863450311749907997002550,\n            115792089237316195423570985008687907853269984653042931687443039491902864365164\n        );\n    }\n\n    function test_fuzz_mulDivRoundingUp(uint256 x, uint256 y, uint256 d) public pure {\n        vm.assume(d != 0);\n        vm.assume(y != 0);\n        x = bound(x, 0, type(uint256).max / y);\n        uint256 numerator = x * y;\n        uint256 result = FullMath.mulDivRoundingUp(x, y, d);\n        if (mulmod(x, y, d) > 0) {\n            assertEq(result, numerator / d + 1);\n        } else {\n            assertEq(result, numerator / d);\n        }\n    }\n\n    function test_invariant_mulDivRounding(uint256 x, uint256 y, uint256 d) public pure {\n        unchecked {\n            vm.assume(d > 0);\n            vm.assume(!resultOverflows(x, y, d));\n\n            uint256 ceiled = FullMath.mulDivRoundingUp(x, y, d);\n\n            uint256 floored = FullMath.mulDiv(x, y, d);\n\n            if (mulmod(x, y, d) > 0) {\n                assertEq(ceiled - floored, 1);\n            } else {\n                assertEq(ceiled, floored);\n            }\n        }\n    }\n\n    function test_invariant_mulDiv(uint256 x, uint256 y, uint256 d) public pure {\n        unchecked {\n            vm.assume(d > 0);\n            vm.assume(!resultOverflows(x, y, d));\n            uint256 z = FullMath.mulDiv(x, y, d);\n            if (x == 0 || y == 0) {\n                assertEq(z, 0);\n                return;\n            }\n\n            // recompute x and y via mulDiv of the result of floor(x*y/d), should always be less than original inputs by < d\n            uint256 x2 = FullMath.mulDiv(z, d, y);\n            uint256 y2 = FullMath.mulDiv(z, d, x);\n            assertLe(x2, x);\n            assertLe(y2, y);\n\n            assertLt(x - x2, d);\n            assertLt(y - y2, d);\n        }\n    }\n\n    function test_invariant_mulDivRoundingUp(uint256 x, uint256 y, uint256 d) external pure {\n        unchecked {\n            vm.assume(d > 0);\n            vm.assume(!resultOverflows(x, y, d));\n            uint256 z = FullMath.mulDivRoundingUp(x, y, d);\n            if (x == 0 || y == 0) {\n                assertEq(z, 0);\n                return;\n            }\n\n            vm.assume(!resultOverflows(z, d, y));\n            vm.assume(!resultOverflows(z, d, x));\n            // recompute x and y via mulDiv of the result of ceil(x*y/d), should always be greater than original inputs by < d\n            uint256 x2 = FullMath.mulDiv(z, d, y);\n            uint256 y2 = FullMath.mulDiv(z, d, x);\n            assertGe(x2, x);\n            assertGe(y2, y);\n\n            assertLt(x2 - x, d);\n            assertLt(y2 - y, d);\n        }\n    }\n\n    function test_resultOverflows_helper() public pure {\n        assertFalse(resultOverflows(0, 0, 1));\n        assertFalse(resultOverflows(1, 0, 1));\n        assertFalse(resultOverflows(0, 1, 1));\n        assertFalse(resultOverflows(1, 1, 1));\n        assertFalse(resultOverflows(10000000, 10000000, 1));\n        assertFalse(resultOverflows(Q128, 50 * Q128 / 100, 150 * Q128 / 100));\n        assertFalse(resultOverflows(Q128, 35 * Q128, 8 * Q128));\n        assertTrue(resultOverflows(type(uint256).max, type(uint256).max, type(uint256).max - 1));\n        assertTrue(resultOverflows(Q128, type(uint256).max, 1));\n    }\n\n    function resultOverflows(uint256 x, uint256 y, uint256 d) private pure returns (bool) {\n        require(d > 0);\n\n        // If x or y is zero, the result will be zero, and there's no overflow\n        if (x == 0 || y == 0) {\n            return false;\n        }\n\n        // If intermediate multiplication doesn't overflow, there's no overflow\n        if (x <= type(uint256).max / y) return false;\n\n        uint256 remainder = mulmod(x, y, type(uint256).max);\n        uint256 small;\n        uint256 big;\n        unchecked {\n            small = x * y;\n            big = (remainder - small) - (remainder < small ? 1 : 0);\n        }\n\n        bool mulDivResultOverflows = d <= big;\n        bool mulDivRoundingUpResultOverflows = mulDivResultOverflows;\n\n        // must catch edgecase where mulDiv doesn't overflow but roundingUp does\n        if (!mulDivResultOverflows) {\n            mulDivRoundingUpResultOverflows = FullMath.mulDiv(x, y, d) == type(uint256).max;\n        }\n\n        return mulDivResultOverflows || mulDivRoundingUpResultOverflows;\n    }\n}\n"
  },
  {
    "path": "test/libraries/Hooks.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {Hooks} from \"../../src/libraries/Hooks.sol\";\nimport {LPFeeLibrary} from \"../../src/libraries/LPFeeLibrary.sol\";\nimport {MockHooks} from \"../../src/test/MockHooks.sol\";\nimport {IPoolManager} from \"../../src/interfaces/IPoolManager.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {IHooks} from \"../../src/interfaces/IHooks.sol\";\nimport {Currency} from \"../../src/types/Currency.sol\";\nimport {PoolManager} from \"../../src/PoolManager.sol\";\nimport {PoolSwapTest} from \"../../src/test/PoolSwapTest.sol\";\nimport {PoolDonateTest} from \"../../src/test/PoolDonateTest.sol\";\nimport {Deployers} from \"test/utils/Deployers.sol\";\nimport {ProtocolFees} from \"../../src/ProtocolFees.sol\";\nimport {PoolId} from \"../../src/types/PoolId.sol\";\nimport {PoolKey} from \"../../src/types/PoolKey.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../../src/types/PoolOperation.sol\";\nimport {IERC20Minimal} from \"../../src/interfaces/external/IERC20Minimal.sol\";\nimport {BalanceDelta} from \"../../src/types/BalanceDelta.sol\";\nimport {BaseTestHooks} from \"../../src/test/BaseTestHooks.sol\";\nimport {EmptyRevertContract} from \"../../src/test/EmptyRevertContract.sol\";\nimport {StateLibrary} from \"../../src/libraries/StateLibrary.sol\";\nimport {Constants} from \"../utils/Constants.sol\";\nimport {CustomRevert} from \"../../src/libraries/CustomRevert.sol\";\n\ncontract HooksTest is Test, Deployers {\n    using Hooks for IHooks;\n    using StateLibrary for IPoolManager;\n\n    MockHooks mockHooks;\n    BaseTestHooks revertingHookImpl;\n\n    function setUp() public {\n        MockHooks impl = new MockHooks();\n        vm.etch(Constants.ALL_HOOKS, address(impl).code);\n        mockHooks = MockHooks(Constants.ALL_HOOKS);\n\n        revertingHookImpl = new BaseTestHooks();\n\n        initializeManagerRoutersAndPoolsWithLiq(mockHooks);\n    }\n\n    function test_initialize_succeedsWithHook() public {\n        manager.initialize(uninitializedKey, SQRT_PRICE_1_1);\n\n        (uint160 sqrtPriceX96,,,) = manager.getSlot0(uninitializedKey.toId());\n        assertEq(sqrtPriceX96, SQRT_PRICE_1_1);\n        assertEq(mockHooks.beforeInitializeData(), new bytes(123));\n        assertEq(mockHooks.afterInitializeData(), new bytes(123));\n    }\n\n    function test_beforeInitialize_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.beforeInitialize.selector, bytes4(0xdeadbeef));\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        manager.initialize(uninitializedKey, SQRT_PRICE_1_1);\n    }\n\n    function test_afterInitialize_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.afterInitialize.selector, bytes4(0xdeadbeef));\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        manager.initialize(uninitializedKey, SQRT_PRICE_1_1);\n    }\n\n    function test_beforeAfterAddLiquidity_beforeAfterRemoveLiquidity_succeedsWithHook() public {\n        MockERC20(Currency.unwrap(key.currency0)).mint(address(this), 1e18);\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(modifyLiquidityRouter), 1e18);\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(0, 60, 1e18, 0), new bytes(111));\n        assertEq(mockHooks.beforeAddLiquidityData(), new bytes(111));\n        assertEq(mockHooks.afterAddLiquidityData(), new bytes(111));\n\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(0, 60, -1e18, 0), new bytes(222));\n        assertEq(mockHooks.beforeRemoveLiquidityData(), new bytes(222));\n        assertEq(mockHooks.afterRemoveLiquidityData(), new bytes(222));\n    }\n\n    function test_beforeAfterAddLiquidity_calledWithPositiveLiquidityDelta() public {\n        MockERC20(Currency.unwrap(key.currency0)).mint(address(this), 1e18);\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(modifyLiquidityRouter), 1e18);\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(0, 60, 100, 0), new bytes(111));\n        assertEq(mockHooks.beforeAddLiquidityData(), new bytes(111));\n        assertEq(mockHooks.afterAddLiquidityData(), new bytes(111));\n    }\n\n    function test_beforeAfterRemoveLiquidity_calledWithZeroLiquidityDelta() public {\n        MockERC20(Currency.unwrap(key.currency0)).mint(address(this), 1e18);\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(modifyLiquidityRouter), 1e18);\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(0, 60, 1e18, 0), new bytes(111));\n        assertEq(mockHooks.beforeAddLiquidityData(), new bytes(111));\n        assertEq(mockHooks.afterAddLiquidityData(), new bytes(111));\n\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(0, 60, 0, 0), new bytes(222));\n        assertEq(mockHooks.beforeAddLiquidityData(), new bytes(111));\n        assertEq(mockHooks.afterAddLiquidityData(), new bytes(111));\n        assertEq(mockHooks.beforeRemoveLiquidityData(), new bytes(222));\n        assertEq(mockHooks.afterRemoveLiquidityData(), new bytes(222));\n    }\n\n    function test_beforeAfterRemoveLiquidity_calledWithPositiveLiquidityDelta() public {\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(0, 60, 1e18, 0), new bytes(111));\n        MockERC20(Currency.unwrap(key.currency0)).mint(address(this), 1e18);\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(modifyLiquidityRouter), 1e18);\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(0, 60, -1e18, 0), new bytes(111));\n        assertEq(mockHooks.beforeRemoveLiquidityData(), new bytes(111));\n        assertEq(mockHooks.afterRemoveLiquidityData(), new bytes(111));\n    }\n\n    function test_beforeAddLiquidity_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.beforeAddLiquidity.selector, bytes4(0xdeadbeef));\n        MockERC20(Currency.unwrap(key.currency0)).mint(address(this), 1e18);\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(modifyLiquidityRouter), 1e18);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_beforeRemoveLiquidity_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.beforeRemoveLiquidity.selector, bytes4(0xdeadbeef));\n        MockERC20(Currency.unwrap(key.currency0)).mint(address(this), 1e18);\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(modifyLiquidityRouter), 1e18);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_afterAddLiquidity_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.afterAddLiquidity.selector, bytes4(0xdeadbeef));\n        MockERC20(Currency.unwrap(key.currency0)).mint(address(this), 1e18);\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(modifyLiquidityRouter), 1e18);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_afterRemoveLiquidity_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.afterRemoveLiquidity.selector, bytes4(0xdeadbeef));\n        MockERC20(Currency.unwrap(key.currency0)).mint(address(this), 1e18);\n        MockERC20(Currency.unwrap(key.currency0)).approve(address(modifyLiquidityRouter), 1e18);\n        modifyLiquidityRouter.modifyLiquidity(key, LIQUIDITY_PARAMS, ZERO_BYTES);\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        modifyLiquidityRouter.modifyLiquidity(key, REMOVE_LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function test_swap_succeedsWithHook() public {\n        SwapParams memory swapParams =\n            SwapParams({zeroForOne: true, amountSpecified: 100, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        swapRouter.swap(key, swapParams, testSettings, new bytes(222));\n        assertEq(mockHooks.beforeSwapData(), new bytes(222));\n        assertEq(mockHooks.afterSwapData(), new bytes(222));\n    }\n\n    function test_beforeSwap_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.beforeSwap.selector, bytes4(0xdeadbeef));\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        swapRouter.swap(\n            key, SwapParams(false, 100, SQRT_PRICE_1_1 + 60), PoolSwapTest.TestSettings(true, true), ZERO_BYTES\n        );\n    }\n\n    function test_afterSwap_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.afterSwap.selector, bytes4(0xdeadbeef));\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        swapRouter.swap(\n            key, SwapParams(false, 100, SQRT_PRICE_1_1 + 60), PoolSwapTest.TestSettings(true, true), ZERO_BYTES\n        );\n    }\n\n    function test_donate_succeedsWithHook() public {\n        donateRouter.donate(key, 100, 200, new bytes(333));\n        assertEq(mockHooks.beforeDonateData(), new bytes(333));\n        assertEq(mockHooks.afterDonateData(), new bytes(333));\n    }\n\n    function test_beforeDonate_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.beforeDonate.selector, bytes4(0xdeadbeef));\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        donateRouter.donate(key, 100, 200, ZERO_BYTES);\n    }\n\n    function test_afterDonate_invalidReturn() public {\n        mockHooks.setReturnValue(mockHooks.beforeDonate.selector, bytes4(0xdeadbeef));\n        vm.expectRevert(Hooks.InvalidHookResponse.selector);\n        donateRouter.donate(key, 100, 200, ZERO_BYTES);\n    }\n\n    // hook validation\n    function test_fuzz_validateHookPermissions_noHooks(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n\n        IHooks hookAddr = IHooks(address(preAddr));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeInitialize(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_INITIALIZE_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: true,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_afterInitialize(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.AFTER_INITIALIZE_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: true,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeAndAfterInitialize(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_INITIALIZE_FLAG | Hooks.AFTER_INITIALIZE_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: true,\n                afterInitialize: true,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeAddLiquidity(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_ADD_LIQUIDITY_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: true,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_afterAddLiquidity(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.AFTER_ADD_LIQUIDITY_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: true,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeAndAfterAddLiquidity(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr =\n            IHooks(address(uint160(preAddr | Hooks.BEFORE_ADD_LIQUIDITY_FLAG | Hooks.AFTER_ADD_LIQUIDITY_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: true,\n                afterAddLiquidity: true,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeRemoveLiquidity(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: true,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_afterRemoveLiquidity(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.AFTER_REMOVE_LIQUIDITY_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: true,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeAfterRemoveLiquidity(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr =\n            IHooks(address(uint160(preAddr | Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG | Hooks.AFTER_REMOVE_LIQUIDITY_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: true,\n                afterRemoveLiquidity: true,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeInitializeAfterAddLiquidity(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr =\n            IHooks(address(uint160(preAddr | Hooks.BEFORE_INITIALIZE_FLAG | Hooks.AFTER_ADD_LIQUIDITY_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: true,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: true,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeSwap(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_SWAP_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: true,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_afterSwap(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.AFTER_SWAP_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: true,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeAndAfterSwap(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_SWAP_FLAG | Hooks.AFTER_SWAP_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: true,\n                afterSwap: true,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeDonate(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_DONATE_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: true,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_afterDonate(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.AFTER_DONATE_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: true,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_beforeAndAfterDonate(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_DONATE_FLAG | Hooks.AFTER_DONATE_FLAG)));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: true,\n                afterDonate: true,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertFalse(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookPermissions_allHooks(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        uint160 allHookBitsFlipped = uint160((1 << hookPermissionCount) - 1);\n        IHooks hookAddr = IHooks(address(uint160(preAddr) | allHookBitsFlipped));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: true,\n                afterInitialize: true,\n                beforeAddLiquidity: true,\n                afterAddLiquidity: true,\n                beforeRemoveLiquidity: true,\n                afterRemoveLiquidity: true,\n                beforeSwap: true,\n                afterSwap: true,\n                beforeDonate: true,\n                afterDonate: true,\n                beforeSwapReturnDelta: true,\n                afterSwapReturnDelta: true,\n                afterAddLiquidityReturnDelta: true,\n                afterRemoveLiquidityReturnDelta: true\n            })\n        );\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_INITIALIZE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_INITIALIZE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_ADD_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_REMOVE_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_SWAP_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_SWAP_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_DONATE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_DONATE_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG));\n        assertTrue(hookAddr.hasPermission(Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG));\n    }\n\n    function test_fuzz_validateHookAddress_failsAllHooks(uint160 addr, uint16 mask) public {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        // Set the upper `hooksPermissionCount` number of bits to get the full mask in uint16.\n        uint16 allHooksMask = uint16(~uint16(0));\n        // We want any combination except all hooks.\n        vm.assume(mask < (allHooksMask >> (16 - hookPermissionCount)));\n        IHooks hookAddr = IHooks(address(uint160(preAddr) | uint160(mask)));\n        vm.expectRevert(abi.encodeWithSelector(Hooks.HookAddressNotValid.selector, (address(hookAddr))));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: true,\n                afterInitialize: true,\n                beforeAddLiquidity: true,\n                afterAddLiquidity: true,\n                beforeRemoveLiquidity: true,\n                afterRemoveLiquidity: true,\n                beforeSwap: true,\n                afterSwap: true,\n                beforeDonate: true,\n                afterDonate: true,\n                beforeSwapReturnDelta: true,\n                afterSwapReturnDelta: true,\n                afterAddLiquidityReturnDelta: true,\n                afterRemoveLiquidityReturnDelta: true\n            })\n        );\n    }\n\n    function test_fuzz_validateHookAddress_failsNoHooks(uint160 addr, uint16 mask) public {\n        // we only want hookPermissionCount of mask\n        mask = mask >> (16 - hookPermissionCount);\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        // We want any combination except no hooks.\n        vm.assume(mask != 0);\n        IHooks hookAddr = IHooks(address(preAddr | uint160(mask)));\n        vm.expectRevert(abi.encodeWithSelector(Hooks.HookAddressNotValid.selector, (address(hookAddr))));\n        Hooks.validateHookPermissions(\n            hookAddr,\n            Hooks.Permissions({\n                beforeInitialize: false,\n                afterInitialize: false,\n                beforeAddLiquidity: false,\n                afterAddLiquidity: false,\n                beforeRemoveLiquidity: false,\n                afterRemoveLiquidity: false,\n                beforeSwap: false,\n                afterSwap: false,\n                beforeDonate: false,\n                afterDonate: false,\n                beforeSwapReturnDelta: false,\n                afterSwapReturnDelta: false,\n                afterAddLiquidityReturnDelta: false,\n                afterRemoveLiquidityReturnDelta: false\n            })\n        );\n    }\n\n    function test_isValidHookAddress_valid_anyFlags() public pure {\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000002000), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000001000), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000000800), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000000400), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000000200), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000000100), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000000080), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000000040), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000000020), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0x0000000000000000000000000000000000000010), 3000));\n        assertTrue(Hooks.isValidHookAddress(IHooks(0xF00040A85D5Af5BF1d1762f925BdAddc42013C00), 3000));\n    }\n\n    function test_isValidHookAddress_zeroAddress_fixedFee() public pure {\n        assertTrue(Hooks.isValidHookAddress(IHooks(address(0)), 3000));\n    }\n\n    function testIsValidHookAddress_invalid_zeroAddressWithDynamicFee() public pure {\n        assertFalse(Hooks.isValidHookAddress(IHooks(address(0)), LPFeeLibrary.DYNAMIC_FEE_FLAG));\n    }\n\n    function test_fuzz_isValidHookAddress_invalid_returnsDeltaWithoutHookFlag(uint160 addr) public view {\n        uint160 preAddr = addr & clearAllHookPermissionsMask;\n        IHooks hookAddr = IHooks(address(uint160(preAddr | Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG)));\n        assertFalse(Hooks.isValidHookAddress(hookAddr, 3000));\n        hookAddr = IHooks(address(uint160(preAddr | Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG)));\n        assertFalse(Hooks.isValidHookAddress(hookAddr, 3000));\n        hookAddr = IHooks(address(uint160(preAddr | Hooks.AFTER_ADD_LIQUIDITY_RETURNS_DELTA_FLAG)));\n        assertFalse(Hooks.isValidHookAddress(hookAddr, 3000));\n        hookAddr = IHooks(address(uint160(preAddr | Hooks.AFTER_REMOVE_LIQUIDITY_RETURNS_DELTA_FLAG)));\n        assertFalse(Hooks.isValidHookAddress(hookAddr, 3000));\n    }\n\n    function test_isValidHookAddress_valid_noFlagsWithDynamicFee() public pure {\n        assertTrue(\n            Hooks.isValidHookAddress(IHooks(0x1000000000000000000000000000000000000000), LPFeeLibrary.DYNAMIC_FEE_FLAG)\n        );\n    }\n\n    function test_isValidHookAddress_invalid_noFlagsNoDynamicFee() public pure {\n        assertFalse(Hooks.isValidHookAddress(IHooks(0x1000000000000000000000000000000000000000), 3000));\n        assertFalse(Hooks.isValidHookAddress(IHooks(0x0001000000000000000000000000000000004000), 3000));\n        assertFalse(Hooks.isValidHookAddress(IHooks(0x003840A85D5AF5bf1D1762F925BDaDdc42010000), 3000));\n        // not dynamic as another bit is dirty in the fee\n        assertFalse(\n            Hooks.isValidHookAddress(\n                IHooks(0x1000000000000000000000000000000000000000), LPFeeLibrary.DYNAMIC_FEE_FLAG | uint24(3000)\n            )\n        );\n    }\n\n    function test_callHook_revertsWithBubbleUp() public {\n        // This test executes _callHook through beforeSwap.\n        address beforeSwapFlag = address(uint160(Hooks.BEFORE_SWAP_FLAG));\n        vm.etch(beforeSwapFlag, address(revertingHookImpl).code);\n        BaseTestHooks revertingHook = BaseTestHooks(beforeSwapFlag);\n\n        PoolKey memory key = PoolKey(currency0, currency1, 0, 60, IHooks(revertingHook));\n        manager.initialize(key, SQRT_PRICE_1_1);\n\n        SwapParams memory swapParams =\n            SwapParams({zeroForOne: true, amountSpecified: 100, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                CustomRevert.WrappedError.selector,\n                address(revertingHook),\n                IHooks.beforeSwap.selector,\n                abi.encodeWithSelector(BaseTestHooks.HookNotImplemented.selector),\n                abi.encodeWithSelector(Hooks.HookCallFailed.selector)\n            )\n        );\n        swapRouter.swap(key, swapParams, testSettings, new bytes(0));\n    }\n\n    function test_callHook_revertsWithInternalErrorFailedHookCall() public {\n        // This test executes _callHook through beforeSwap.\n        EmptyRevertContract emptyRevertingHookImpl = new EmptyRevertContract();\n        address beforeSwapFlag = address(uint160(Hooks.BEFORE_SWAP_FLAG));\n        vm.etch(beforeSwapFlag, address(emptyRevertingHookImpl).code);\n        EmptyRevertContract revertingHook = EmptyRevertContract(beforeSwapFlag);\n\n        PoolKey memory key = PoolKey(currency0, currency1, 0, 60, IHooks(address(revertingHook)));\n        manager.initialize(key, SQRT_PRICE_1_1);\n\n        SwapParams memory swapParams =\n            SwapParams({zeroForOne: true, amountSpecified: 100, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n\n        PoolSwapTest.TestSettings memory testSettings =\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false});\n\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                CustomRevert.WrappedError.selector,\n                address(beforeSwapFlag),\n                IHooks.beforeSwap.selector,\n                \"\",\n                abi.encodeWithSelector(Hooks.HookCallFailed.selector)\n            )\n        );\n        swapRouter.swap(key, swapParams, testSettings, new bytes(0));\n    }\n}\n"
  },
  {
    "path": "test/libraries/LPFeeLibrary.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport \"../../src/libraries/LPFeeLibrary.sol\";\nimport \"forge-std/Test.sol\";\n\ncontract LPFeeLibraryTest is Test {\n    function test_isDynamicFee_returnsTrue() public pure {\n        uint24 dynamicFee = 0x800000;\n        assertTrue(LPFeeLibrary.isDynamicFee(dynamicFee));\n    }\n\n    function test_isDynamicFee_returnsFalse_forOtherValues() public pure {\n        uint24 dynamicFee = 0xFFFFFF;\n        assertFalse(LPFeeLibrary.isDynamicFee(dynamicFee));\n        dynamicFee = 0x7FFFFF;\n        assertFalse(LPFeeLibrary.isDynamicFee(dynamicFee));\n        dynamicFee = 0;\n        assertFalse(LPFeeLibrary.isDynamicFee(dynamicFee));\n        dynamicFee = 0x800001;\n        assertFalse(LPFeeLibrary.isDynamicFee(dynamicFee));\n    }\n\n    function test_fuzz_isDynamicFee(uint24 fee) public pure {\n        assertEq(fee == LPFeeLibrary.DYNAMIC_FEE_FLAG, LPFeeLibrary.isDynamicFee(fee));\n    }\n\n    function test_validate_doesNotRevertWithNoFee() public pure {\n        uint24 fee = 0;\n        LPFeeLibrary.validate(fee);\n    }\n\n    function test_validate_doesNotRevert() public pure {\n        uint24 fee = 500000; // 50%\n        LPFeeLibrary.validate(fee);\n    }\n\n    function test_validate_doesNotRevertWithMaxFee() public pure {\n        uint24 maxFee = 1000000; // 100%\n        LPFeeLibrary.validate(maxFee);\n    }\n\n    function test_validate_revertsWithLPFeeTooLarge() public {\n        uint24 fee = 1000001;\n        vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, fee));\n        LPFeeLibrary.validate(fee);\n    }\n\n    function test_fuzz_validate(uint24 fee) public {\n        if (fee > 1000000) {\n            vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, fee));\n        }\n        LPFeeLibrary.validate(fee);\n    }\n\n    function test_getInitialLPFee_forStaticFeeIsCorrect() public pure {\n        uint24 staticFee = 3000; // 30 bps\n        assertEq(LPFeeLibrary.getInitialLPFee(staticFee), staticFee);\n    }\n\n    function test_getInitialLPFee_revertsWithLPFeeTooLarge_forStaticFee() public {\n        uint24 staticFee = 1000001;\n        vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, staticFee));\n        LPFeeLibrary.getInitialLPFee(staticFee);\n    }\n\n    function test_getInitialLPFee_forDynamicFeeIsZero() public pure {\n        uint24 dynamicFee = 0x800000;\n        assertEq(LPFeeLibrary.getInitialLPFee(dynamicFee), 0);\n    }\n\n    function test_getInitialLpFee_revertsWithNonExactDynamicFee() public {\n        uint24 dynamicFee = 0x800001;\n        vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, dynamicFee));\n        LPFeeLibrary.getInitialLPFee(dynamicFee);\n    }\n\n    function test_fuzz_getInitialLPFee(uint24 fee) public {\n        if (fee == LPFeeLibrary.DYNAMIC_FEE_FLAG) {\n            assertEq(LPFeeLibrary.getInitialLPFee(fee), 0);\n        } else if (fee > 1000000) {\n            vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, fee));\n            LPFeeLibrary.getInitialLPFee(fee);\n        } else {\n            assertEq(LPFeeLibrary.getInitialLPFee(fee), fee);\n        }\n    }\n}\n"
  },
  {
    "path": "test/libraries/LiquidityMath.t.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SafeCast} from \"src/libraries/SafeCast.sol\";\nimport {LiquidityMathTest as LiquidityMath} from \"src/test/LiquidityMathTest.sol\";\n\ncontract LiquidityMathRef {\n    function addDelta(uint128 x, int128 y) external pure returns (uint128) {\n        return y < 0 ? x - uint128(-y) : x + uint128(y);\n    }\n}\n\ncontract LiquidityMathTest is Test {\n    LiquidityMath internal liquidityMath;\n    LiquidityMathRef internal liquidityMathRef;\n\n    function setUp() public {\n        liquidityMath = new LiquidityMath();\n        liquidityMathRef = new LiquidityMathRef();\n    }\n\n    /// @notice Test the revert reason for underflow\n    function test_addDelta_throwsForUnderflow() public {\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        liquidityMath.addDelta(0, -1);\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        liquidityMath.addDelta(uint128(type(int128).max), type(int128).min);\n    }\n\n    /// @notice Test the revert reason for overflow\n    function test_addDelta_throwsForOverflow() public {\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        liquidityMath.addDelta(type(uint128).max, 1);\n    }\n\n    function test_addDelta_sub_int128min_throwsForReferenceOnly() public {\n        assertEq(liquidityMath.addDelta(uint128(type(int128).min), type(int128).min), 0);\n        vm.expectRevert(abi.encodeWithSignature(\"Panic(uint256)\", 0x11));\n        liquidityMathRef.addDelta(uint128(type(int128).min), type(int128).min);\n    }\n\n    function test_addDelta_sub_int128min_fuzz(uint128 x) public view {\n        x = uint128(bound(x, uint128(type(int128).min), type(uint128).max));\n        assertEq(liquidityMath.addDelta(x, type(int128).min), x - uint128(type(int128).min));\n    }\n\n    /// @notice Test the equivalence of the new `addDelta` and the reference implementation\n    function test_addDelta_fuzz(uint128 x, int128 y) public {\n        vm.assume(y != type(int128).min);\n        try liquidityMath.addDelta(x, y) returns (uint128 z) {\n            assertEq(z, liquidityMathRef.addDelta(x, y));\n        } catch (bytes memory reason) {\n            assertEq(bytes4(reason), SafeCast.SafeCastOverflow.selector);\n            vm.expectRevert(abi.encodeWithSignature(\"Panic(uint256)\", 0x11));\n            liquidityMathRef.addDelta(x, y);\n        }\n    }\n}\n"
  },
  {
    "path": "test/libraries/Lock.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Lock} from \"../../src/libraries/Lock.sol\";\n\ncontract LockTest is Test {\n    function test_lock() public {\n        assertFalse(Lock.isUnlocked());\n\n        Lock.unlock();\n\n        assertTrue(Lock.isUnlocked());\n\n        Lock.lock();\n\n        assertFalse(Lock.isUnlocked());\n    }\n\n    function test_unlockedSlot() public pure {\n        assertEq(bytes32(uint256(keccak256(\"Unlocked\")) - 1), Lock.IS_UNLOCKED_SLOT);\n    }\n}\n"
  },
  {
    "path": "test/libraries/NonzeroDeltaCount.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {NonzeroDeltaCount} from \"../../src/libraries/NonzeroDeltaCount.sol\";\n\ncontract NonzeroDeltaCountTest is Test {\n    function test_incrementNonzeroDeltaCount() public {\n        assertEq(NonzeroDeltaCount.read(), 0);\n        NonzeroDeltaCount.increment();\n        assertEq(NonzeroDeltaCount.read(), 1);\n    }\n\n    function test_decrementNonzeroDeltaCount() public {\n        assertEq(NonzeroDeltaCount.read(), 0);\n        NonzeroDeltaCount.increment();\n        assertEq(NonzeroDeltaCount.read(), 1);\n        NonzeroDeltaCount.decrement();\n        assertEq(NonzeroDeltaCount.read(), 0);\n    }\n\n    // Reading from right to left. Bit of 0: call increase. Bit of 1: call decrease.\n    // The library allows over over/underflow so we dont check for that here\n    function test_fuzz_nonzeroDeltaCount(uint256 instructions) public {\n        assertEq(NonzeroDeltaCount.read(), 0);\n        uint256 expectedCount;\n        for (uint256 i = 0; i < 256; i++) {\n            if ((instructions & (1 << i)) == 0) {\n                NonzeroDeltaCount.increment();\n                unchecked {\n                    expectedCount++;\n                }\n            } else {\n                NonzeroDeltaCount.decrement();\n                unchecked {\n                    expectedCount--;\n                }\n            }\n            assertEq(NonzeroDeltaCount.read(), expectedCount);\n        }\n    }\n\n    function test_nonzeroDeltaCountSlot() public pure {\n        assertEq(bytes32(uint256(keccak256(\"NonzeroDeltaCount\")) - 1), NonzeroDeltaCount.NONZERO_DELTA_COUNT_SLOT);\n    }\n}\n"
  },
  {
    "path": "test/libraries/Pool.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {Pool} from \"../../src/libraries/Pool.sol\";\nimport {PoolManager} from \"../../src/PoolManager.sol\";\nimport {Position} from \"../../src/libraries/Position.sol\";\nimport {TickMath} from \"../../src/libraries/TickMath.sol\";\nimport {TickBitmap} from \"../../src/libraries/TickBitmap.sol\";\nimport {LiquidityAmounts} from \"../../test/utils/LiquidityAmounts.sol\";\nimport {Constants} from \"../../test/utils/Constants.sol\";\nimport {BalanceDelta} from \"../../src/types/BalanceDelta.sol\";\nimport {Slot0} from \"../../src/types/Slot0.sol\";\nimport {SafeCast} from \"../../src/libraries/SafeCast.sol\";\nimport {ProtocolFeeLibrary} from \"../../src/libraries/ProtocolFeeLibrary.sol\";\nimport {LPFeeLibrary} from \"../../src/libraries/LPFeeLibrary.sol\";\n\ncontract PoolTest is Test {\n    using Pool for Pool.State;\n    using LPFeeLibrary for uint24;\n    using ProtocolFeeLibrary for *;\n\n    Pool.State state;\n\n    uint24 constant MAX_PROTOCOL_FEE = ProtocolFeeLibrary.MAX_PROTOCOL_FEE; // 0.1%\n    uint24 constant MAX_LP_FEE = LPFeeLibrary.MAX_LP_FEE; // 100%\n\n    function test_pool_initialize(uint160 sqrtPriceX96, uint24 swapFee) public {\n        if (sqrtPriceX96 < TickMath.MIN_SQRT_PRICE || sqrtPriceX96 >= TickMath.MAX_SQRT_PRICE) {\n            vm.expectRevert(abi.encodeWithSelector(TickMath.InvalidSqrtPrice.selector, sqrtPriceX96));\n            state.initialize(sqrtPriceX96, swapFee);\n        } else {\n            state.initialize(sqrtPriceX96, swapFee);\n            assertEq(state.slot0.sqrtPriceX96(), sqrtPriceX96);\n            assertEq(state.slot0.protocolFee(), 0);\n            assertEq(state.slot0.tick(), TickMath.getTickAtSqrtPrice(sqrtPriceX96));\n            assertLt(state.slot0.tick(), TickMath.MAX_TICK);\n            assertGt(state.slot0.tick(), TickMath.MIN_TICK - 1);\n        }\n    }\n\n    function test_modifyLiquidity(uint160 sqrtPriceX96, uint24 lpFee, Pool.ModifyLiquidityParams memory params)\n        public\n    {\n        // Assumptions tested in PoolManager.t.sol\n        params.tickSpacing = int24(bound(params.tickSpacing, TickMath.MIN_TICK_SPACING, TickMath.MAX_TICK_SPACING));\n\n        test_pool_initialize(sqrtPriceX96, lpFee);\n\n        if (params.tickLower >= params.tickUpper) {\n            vm.expectRevert(abi.encodeWithSelector(Pool.TicksMisordered.selector, params.tickLower, params.tickUpper));\n        } else if (params.tickLower < TickMath.MIN_TICK) {\n            vm.expectRevert(abi.encodeWithSelector(Pool.TickLowerOutOfBounds.selector, params.tickLower));\n        } else if (params.tickUpper > TickMath.MAX_TICK) {\n            vm.expectRevert(abi.encodeWithSelector(Pool.TickUpperOutOfBounds.selector, params.tickUpper));\n        } else if (params.liquidityDelta < 0) {\n            vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        } else if (params.liquidityDelta == 0) {\n            vm.expectRevert(Position.CannotUpdateEmptyPosition.selector);\n        } else if (params.liquidityDelta > int128(Pool.tickSpacingToMaxLiquidityPerTick(params.tickSpacing))) {\n            vm.expectRevert(abi.encodeWithSelector(Pool.TickLiquidityOverflow.selector, params.tickLower));\n        } else if (params.tickLower % params.tickSpacing != 0) {\n            vm.expectRevert(\n                abi.encodeWithSelector(TickBitmap.TickMisaligned.selector, params.tickLower, params.tickSpacing)\n            );\n        } else if (params.tickUpper % params.tickSpacing != 0) {\n            vm.expectRevert(\n                abi.encodeWithSelector(TickBitmap.TickMisaligned.selector, params.tickUpper, params.tickSpacing)\n            );\n        } else {\n            // We need the assumptions above to calculate this\n            uint256 maxInt128InTypeU256 = uint256(uint128(Constants.MAX_UINT128));\n            (uint256 amount0, uint256 amount1) = LiquidityAmounts.getAmountsForLiquidity(\n                sqrtPriceX96,\n                TickMath.getSqrtPriceAtTick(params.tickLower),\n                TickMath.getSqrtPriceAtTick(params.tickUpper),\n                uint128(params.liquidityDelta)\n            );\n\n            if ((amount0 > maxInt128InTypeU256) || (amount1 > maxInt128InTypeU256)) {\n                vm.expectRevert(abi.encodeWithSelector(SafeCast.SafeCastOverflow.selector));\n            }\n        }\n\n        params.owner = address(this);\n        state.modifyLiquidity(params);\n    }\n\n    function test_fuzz_swap(\n        uint160 sqrtPriceX96,\n        uint24 lpFee,\n        uint16 protocolFee0,\n        uint16 protocolFee1,\n        Pool.SwapParams memory params\n    ) public {\n        // Assumptions tested in PoolManager.t.sol\n        params.tickSpacing = int24(bound(params.tickSpacing, TickMath.MIN_TICK_SPACING, TickMath.MAX_TICK_SPACING));\n        lpFee = uint24(bound(lpFee, 0, MAX_LP_FEE));\n        protocolFee0 = uint16(bound(protocolFee0, 0, MAX_PROTOCOL_FEE));\n        protocolFee1 = uint16(bound(protocolFee1, 0, MAX_PROTOCOL_FEE));\n        uint24 protocolFee = protocolFee1 << 12 | protocolFee0;\n\n        // initialize and add liquidity\n        test_modifyLiquidity(\n            sqrtPriceX96,\n            lpFee,\n            Pool.ModifyLiquidityParams({\n                owner: address(this),\n                tickLower: -120,\n                tickUpper: 120,\n                liquidityDelta: 1e18,\n                tickSpacing: 60,\n                salt: 0\n            })\n        );\n        Slot0 slot0 = state.slot0;\n\n        assertEq(slot0.protocolFee(), 0);\n        slot0 = slot0.setProtocolFee(protocolFee);\n        assertEq(slot0.protocolFee(), protocolFee);\n        state.slot0 = slot0;\n\n        uint16 expectedProtocolFee = params.zeroForOne ? protocolFee0 : protocolFee1;\n\n        uint24 _lpFee = params.lpFeeOverride.isOverride() ? params.lpFeeOverride.removeOverrideFlag() : lpFee;\n        uint24 swapFee = expectedProtocolFee == 0 ? _lpFee : expectedProtocolFee.calculateSwapFee(_lpFee);\n\n        if (params.amountSpecified >= 0 && swapFee == MAX_LP_FEE) {\n            vm.expectRevert(Pool.InvalidFeeForExactOut.selector);\n            state.swap(params);\n        } else if (!_lpFee.isValid()) {\n            vm.expectRevert(abi.encodeWithSelector(LPFeeLibrary.LPFeeTooLarge.selector, _lpFee));\n            state.swap(params);\n        } else if (params.zeroForOne && params.amountSpecified != 0) {\n            if (params.sqrtPriceLimitX96 >= slot0.sqrtPriceX96()) {\n                vm.expectRevert(\n                    abi.encodeWithSelector(\n                        Pool.PriceLimitAlreadyExceeded.selector, slot0.sqrtPriceX96(), params.sqrtPriceLimitX96\n                    )\n                );\n                state.swap(params);\n            } else if (params.sqrtPriceLimitX96 < TickMath.MIN_SQRT_PRICE) {\n                vm.expectRevert(abi.encodeWithSelector(Pool.PriceLimitOutOfBounds.selector, params.sqrtPriceLimitX96));\n                state.swap(params);\n            }\n        } else if (!params.zeroForOne && params.amountSpecified != 0) {\n            if (params.sqrtPriceLimitX96 <= slot0.sqrtPriceX96()) {\n                vm.expectRevert(\n                    abi.encodeWithSelector(\n                        Pool.PriceLimitAlreadyExceeded.selector, slot0.sqrtPriceX96(), params.sqrtPriceLimitX96\n                    )\n                );\n                state.swap(params);\n            } else if (params.sqrtPriceLimitX96 >= TickMath.MAX_SQRT_PRICE) {\n                vm.expectRevert(abi.encodeWithSelector(Pool.PriceLimitOutOfBounds.selector, params.sqrtPriceLimitX96));\n                state.swap(params);\n            }\n        } else {\n            uint160 sqrtPriceBefore = state.slot0.sqrtPriceX96();\n            state.swap(params);\n\n            if (params.amountSpecified == 0) {\n                assertEq(sqrtPriceBefore, state.slot0.sqrtPriceX96(), \"amountSpecified == 0\");\n            } else if (params.zeroForOne) {\n                assertGe(state.slot0.sqrtPriceX96(), params.sqrtPriceLimitX96, \"zeroForOne\");\n            } else {\n                assertLe(state.slot0.sqrtPriceX96(), params.sqrtPriceLimitX96, \"oneForZero\");\n            }\n        }\n    }\n\n    function test_fuzz_tickSpacingToMaxLiquidityPerTick(int24 tickSpacing) public pure {\n        tickSpacing = int24(bound(tickSpacing, TickMath.MIN_TICK_SPACING, TickMath.MAX_TICK_SPACING));\n        // v3 math\n        int24 minTick = (TickMath.MIN_TICK / tickSpacing) * tickSpacing;\n        int24 maxTick = (TickMath.MAX_TICK / tickSpacing) * tickSpacing;\n        uint24 numTicks = uint24((maxTick - minTick) / tickSpacing) + 1;\n        // assert that the result is the same as the v3 math or lower\n        assertGe(type(uint128).max / numTicks, Pool.tickSpacingToMaxLiquidityPerTick(tickSpacing));\n    }\n}\n"
  },
  {
    "path": "test/libraries/PoolId.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolId} from \"../../src/types/PoolId.sol\";\nimport {PoolKey} from \"../../src/types/PoolKey.sol\";\n\ncontract PoolIdTest is Test {\n    function test_fuzz_toId(PoolKey memory poolKey) public pure {\n        bytes memory encodedKey = abi.encode(poolKey);\n        bytes32 expectedHash = keccak256(encodedKey);\n        assertEq(PoolId.unwrap(poolKey.toId()), expectedHash, \"hashes not equal\");\n    }\n}\n"
  },
  {
    "path": "test/libraries/Position.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Position} from \"../../src/libraries/Position.sol\";\nimport {SafeCast} from \"../../src/libraries/SafeCast.sol\";\n\ncontract PositionTest is Test {\n    using Position for mapping(bytes32 => Position.State);\n\n    mapping(bytes32 => Position.State) internal positions;\n\n    function test_fuzz_get(address owner, int24 tickLower, int24 tickUpper, bytes32 salt) public view {\n        bytes32 positionKey = keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt));\n        Position.State storage expectedPosition = positions[positionKey];\n        Position.State storage position = positions.get(owner, tickLower, tickUpper, salt);\n        bytes32 expectedPositionSlot;\n        bytes32 positionSlot;\n        assembly (\"memory-safe\") {\n            expectedPositionSlot := expectedPosition.slot\n            positionSlot := position.slot\n        }\n        assertEq(positionSlot, expectedPositionSlot, \"slots not equal\");\n    }\n\n    function test_fuzz_update(\n        int128 liquidityDelta,\n        Position.State memory pos,\n        uint256 newFeeGrowthInside0X128,\n        uint256 newFeeGrowthInside1X128\n    ) public {\n        Position.State storage position = positions[0];\n        position.liquidity = pos.liquidity;\n        position.feeGrowthInside0LastX128 = pos.feeGrowthInside0LastX128;\n        position.feeGrowthInside1LastX128 = pos.feeGrowthInside1LastX128;\n\n        uint128 oldLiquidity = position.liquidity;\n\n        if (position.liquidity == 0 && liquidityDelta == 0) {\n            vm.expectRevert(Position.CannotUpdateEmptyPosition.selector);\n        }\n\n        // new liquidity cannot overflow/underflow uint128\n        uint256 absLiquidityDelta;\n        if (liquidityDelta > 0) {\n            absLiquidityDelta = uint256(uint128(liquidityDelta));\n            uint256 newLiquidity = position.liquidity + absLiquidityDelta;\n            if (newLiquidity > type(uint128).max) {\n                vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n            }\n        } else if (liquidityDelta < 0) {\n            if (liquidityDelta == type(int128).min) {\n                absLiquidityDelta = uint256(uint128(type(int128).max)) + 1;\n            } else {\n                absLiquidityDelta = uint256(uint128(-liquidityDelta));\n            }\n            if (position.liquidity < absLiquidityDelta) {\n                vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n            }\n        }\n\n        Position.update(position, liquidityDelta, newFeeGrowthInside0X128, newFeeGrowthInside1X128);\n        if (liquidityDelta == 0) {\n            assertEq(position.liquidity, oldLiquidity);\n        } else if (liquidityDelta > 0) {\n            assertEq(position.liquidity, oldLiquidity + absLiquidityDelta);\n        } else {\n            assertEq(position.liquidity, oldLiquidity - absLiquidityDelta);\n        }\n\n        assertEq(position.feeGrowthInside0LastX128, newFeeGrowthInside0X128);\n        assertEq(position.feeGrowthInside1LastX128, newFeeGrowthInside1X128);\n    }\n\n    function test_fuzz_calculatePositionKey(address owner, int24 tickLower, int24 tickUpper, bytes32 salt)\n        public\n        pure\n    {\n        bytes32 positionKey = Position.calculatePositionKey(owner, tickLower, tickUpper, salt);\n        assertEq(positionKey, keccak256(abi.encodePacked(owner, tickLower, tickUpper, salt)));\n    }\n}\n"
  },
  {
    "path": "test/libraries/ProtocolFeeLibrary.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {LPFeeLibrary} from \"../../src/libraries/LPFeeLibrary.sol\";\nimport {ProtocolFeeLibrary} from \"../../src/libraries/ProtocolFeeLibrary.sol\";\n\ncontract ProtocolFeeLibraryTest is Test {\n    function test_getZeroForOneFee() public pure {\n        uint24 fee = uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE - 1) << 12 | ProtocolFeeLibrary.MAX_PROTOCOL_FEE;\n        assertEq(ProtocolFeeLibrary.getZeroForOneFee(fee), uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE));\n    }\n\n    function test_fuzz_getZeroForOneFee(uint24 fee) public pure {\n        assertEq(ProtocolFeeLibrary.getZeroForOneFee(fee), fee % 4096);\n    }\n\n    function test_getOneForZeroFee() public pure {\n        uint24 fee = uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE - 1) << 12 | ProtocolFeeLibrary.MAX_PROTOCOL_FEE;\n        assertEq(ProtocolFeeLibrary.getOneForZeroFee(fee), uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE - 1));\n    }\n\n    function test_fuzz_getOneForZeroFee(uint24 fee) public pure {\n        assertEq(ProtocolFeeLibrary.getOneForZeroFee(fee), fee >> 12);\n    }\n\n    function test_isValidProtocolFee_fee() public pure {\n        uint24 fee = uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE + 1) << 12 | ProtocolFeeLibrary.MAX_PROTOCOL_FEE;\n        assertFalse(ProtocolFeeLibrary.isValidProtocolFee(fee));\n\n        fee = uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE) << 12 | (ProtocolFeeLibrary.MAX_PROTOCOL_FEE + 1);\n        assertFalse(ProtocolFeeLibrary.isValidProtocolFee(fee));\n\n        fee = uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE + 1) << 12 | (ProtocolFeeLibrary.MAX_PROTOCOL_FEE + 1);\n        assertFalse(ProtocolFeeLibrary.isValidProtocolFee(fee));\n\n        fee = uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE) << 12 | ProtocolFeeLibrary.MAX_PROTOCOL_FEE;\n        assertTrue(ProtocolFeeLibrary.isValidProtocolFee(fee));\n\n        fee = uint24(ProtocolFeeLibrary.MAX_PROTOCOL_FEE - 1) << 12 | ProtocolFeeLibrary.MAX_PROTOCOL_FEE - 1;\n        assertTrue(ProtocolFeeLibrary.isValidProtocolFee(fee));\n\n        fee = uint24(0) << 12 | uint24(0);\n        assertTrue(ProtocolFeeLibrary.isValidProtocolFee(fee));\n    }\n\n    function test_fuzz_isValidProtocolFee(uint24 fee) public pure {\n        if ((fee >> 12 > ProtocolFeeLibrary.MAX_PROTOCOL_FEE) || (fee % 4096 > ProtocolFeeLibrary.MAX_PROTOCOL_FEE)) {\n            assertFalse(ProtocolFeeLibrary.isValidProtocolFee(fee));\n        } else {\n            assertTrue(ProtocolFeeLibrary.isValidProtocolFee(fee));\n        }\n    }\n\n    function test_calculateSwapFee() public pure {\n        assertEq(\n            ProtocolFeeLibrary.calculateSwapFee(uint16(ProtocolFeeLibrary.MAX_PROTOCOL_FEE), LPFeeLibrary.MAX_LP_FEE),\n            LPFeeLibrary.MAX_LP_FEE\n        );\n        assertEq(ProtocolFeeLibrary.calculateSwapFee(uint16(ProtocolFeeLibrary.MAX_PROTOCOL_FEE), 3000), 3997);\n        assertEq(\n            ProtocolFeeLibrary.calculateSwapFee(uint16(ProtocolFeeLibrary.MAX_PROTOCOL_FEE), 0),\n            ProtocolFeeLibrary.MAX_PROTOCOL_FEE\n        );\n        assertEq(ProtocolFeeLibrary.calculateSwapFee(0, 0), 0);\n        assertEq(ProtocolFeeLibrary.calculateSwapFee(0, 1000), 1000);\n    }\n\n    function test_fuzz_calculateSwapFee(uint16 protocolFee, uint24 lpFee) public pure {\n        protocolFee = uint16(bound(protocolFee, 0, ProtocolFeeLibrary.MAX_PROTOCOL_FEE));\n        lpFee = uint24(bound(lpFee, 0, LPFeeLibrary.MAX_LP_FEE));\n        uint24 swapFee = ProtocolFeeLibrary.calculateSwapFee(protocolFee, lpFee);\n        if (lpFee < LPFeeLibrary.MAX_LP_FEE) {\n            assertLe(swapFee, LPFeeLibrary.MAX_LP_FEE);\n        } else {\n            // if lp fee is equal to max, swap fee can never be larger\n            assertEq(swapFee, LPFeeLibrary.MAX_LP_FEE);\n        }\n\n        // protocolFee + lpFee(1_000_000 - protocolFee) / 1_000_000 (rounded up)\n        uint256 expectedSwapFee = protocolFee + (1e6 - protocolFee) * uint256(lpFee) / 1e6;\n        if (((1e6 - protocolFee) * uint256(lpFee)) % 1e6 != 0) expectedSwapFee++;\n\n        assertGe(swapFee, lpFee);\n        assertEq(swapFee, uint24(expectedSwapFee));\n    }\n}\n"
  },
  {
    "path": "test/libraries/SafeCast.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {SafeCast} from \"../../src/libraries/SafeCast.sol\";\n\ncontract SafeCastTest is Test {\n    function test_fuzz_toUint160(uint256 x) public {\n        if (x <= type(uint160).max) {\n            assertEq(uint256(SafeCast.toUint160(x)), x);\n        } else {\n            vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n            SafeCast.toUint160(x);\n        }\n    }\n\n    function test_toUint160() public {\n        assertEq(uint256(SafeCast.toUint160(0)), 0);\n        assertEq(uint256(SafeCast.toUint160(type(uint160).max)), type(uint160).max);\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        SafeCast.toUint160(type(uint160).max + uint256(1));\n    }\n\n    function test_fuzz_toUint128_fromUint256(uint256 x) public {\n        if (x <= type(uint128).max) {\n            assertEq(uint256(SafeCast.toUint128(x)), x);\n        } else {\n            vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n            SafeCast.toUint128(x);\n        }\n    }\n\n    function test_fuzz_toUint128_fromInt128(int128 x) public {\n        if (x < 0) {\n            vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n            SafeCast.toUint128(x);\n        } else {\n            assertEq(SafeCast.toUint128(x), uint128(x));\n        }\n    }\n\n    function test_toUint128_fromUint256() public {\n        assertEq(uint256(SafeCast.toUint128(uint256(0))), 0);\n        assertEq(uint256(SafeCast.toUint128(type(uint128).max)), type(uint128).max);\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        SafeCast.toUint128(type(uint128).max + uint256(1));\n    }\n\n    function test_fuzz_toInt128_fromInt256(int256 x) public {\n        if (x <= type(int128).max && x >= type(int128).min) {\n            assertEq(int256(SafeCast.toInt128(x)), x);\n        } else {\n            vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n            SafeCast.toInt128(x);\n        }\n    }\n\n    function test_toInt128_fromInt256() public {\n        assertEq(int256(SafeCast.toInt128(int256(0))), 0);\n        assertEq(int256(SafeCast.toInt128(type(int128).max)), type(int128).max);\n        assertEq(int256(SafeCast.toInt128(type(int128).min)), type(int128).min);\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        SafeCast.toInt128(type(int128).max + int256(1));\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        SafeCast.toInt128(type(int128).min - int256(1));\n    }\n\n    function test_fuzz_toInt256(uint256 x) public {\n        if (x <= uint256(type(int256).max)) {\n            assertEq(uint256(SafeCast.toInt256(x)), x);\n        } else {\n            vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n            SafeCast.toInt256(x);\n        }\n    }\n\n    function test_toInt256() public {\n        assertEq(uint256(SafeCast.toInt256(0)), 0);\n        assertEq(uint256(SafeCast.toInt256(uint256(type(int256).max))), uint256(type(int256).max));\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        SafeCast.toInt256(uint256(type(int256).max) + uint256(1));\n    }\n\n    function test_fuzz_toInt128_fromUint256(uint256 x) public {\n        if (x <= uint128(type(int128).max)) {\n            assertEq(uint128(SafeCast.toInt128(x)), x);\n        } else {\n            vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n            SafeCast.toInt128(x);\n        }\n    }\n\n    function test_toInt128_fromUint256() public {\n        assertEq(uint128(SafeCast.toInt128(uint256(0))), 0);\n        assertEq(uint128(SafeCast.toInt128(uint256(uint128(type(int128).max)))), uint128(type(int128).max));\n        vm.expectRevert(SafeCast.SafeCastOverflow.selector);\n        SafeCast.toInt128(uint256(uint128(type(int128).max)) + uint256(1));\n    }\n}\n"
  },
  {
    "path": "test/libraries/SqrtPriceMath.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {SqrtPriceMath} from \"../../src/libraries/SqrtPriceMath.sol\";\nimport {Constants} from \"../../test/utils/Constants.sol\";\n\ncontract SqrtPriceMathTest is Test {\n    function test_getNextSqrtPriceFromInput_revertsIfPriceIsZero() public {\n        vm.expectRevert(SqrtPriceMath.InvalidPriceOrLiquidity.selector);\n        SqrtPriceMath.getNextSqrtPriceFromInput(0, 1, 0.1 ether, false);\n    }\n\n    function test_getNextSqrtPriceFromInput_revertsIfLiquidityIsZero() public {\n        vm.expectRevert(SqrtPriceMath.InvalidPriceOrLiquidity.selector);\n        SqrtPriceMath.getNextSqrtPriceFromInput(1, 0, 0.1 ether, true);\n    }\n\n    function test_getNextSqrtPriceFromInput_revertsIfInputAmountOverflowsThePrice() public {\n        uint160 price = Constants.MAX_UINT160 - 1;\n        uint128 liquidity = 1024;\n        uint256 amountIn = 1024;\n\n        vm.expectRevert();\n        SqrtPriceMath.getNextSqrtPriceFromInput(price, liquidity, amountIn, false);\n    }\n\n    function test_getNextSqrtPriceFromInput_anyInputAmountCannotUnderflowThePrice() public pure {\n        uint160 price = 1;\n        uint128 liquidity = 1;\n        uint256 amountIn = 2 ** 255;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromInput(price, liquidity, amountIn, true);\n\n        assertEq(sqrtQ, 1);\n    }\n\n    function test_getNextSqrtPriceFromInput_returnsInputPriceIfAmountInIsZeroAndZeroForOneEqualsTrue() public pure {\n        uint160 price = Constants.SQRT_PRICE_1_1;\n        uint128 liquidity = 1;\n\n        assertEq(SqrtPriceMath.getNextSqrtPriceFromInput(price, liquidity, 0, true), price);\n    }\n\n    function test_getNextSqrtPriceFromInput_returnsInputPriceIfAmountInIsZeroAndZeroForOneEqualsFalse() public pure {\n        uint160 price = Constants.SQRT_PRICE_1_1;\n        uint128 liquidity = 1;\n\n        assertEq(SqrtPriceMath.getNextSqrtPriceFromInput(price, liquidity, 0, false), price);\n    }\n\n    function test_getNextSqrtPriceFromInput_returnsTheMinimumPriceForMaxInputs() public pure {\n        uint160 sqrtP = Constants.MAX_UINT160 - 1;\n        uint128 liquidity = Constants.MAX_UINT128;\n        uint256 maxAmountNoOverflow = Constants.MAX_UINT256 - Constants.MAX_UINT128 << 96 / sqrtP;\n\n        assertEq(SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, liquidity, maxAmountNoOverflow, true), 1);\n    }\n\n    function test_getNextSqrtPriceFromInput_inputAmountOf0_1Currency1() public pure {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, uint128(1 ether), 0.1 ether, false);\n\n        assertEq(sqrtQ, Constants.SQRT_PRICE_121_100);\n    }\n\n    function test_getNextSqrtPriceFromInput_inputAmountOf0_1Currency0() public pure {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, uint128(1 ether), 0.1 ether, true);\n\n        assertEq(sqrtQ, 72025602285694852357767227579);\n    }\n\n    function test_getNextSqrtPriceFromInput_amountInGreaterThanType_uint96_maxAndZeroForOneEqualsTrue() public pure {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, uint128(10 ether), 2 ** 100, true);\n\n        // perfect answer:\n        // https://www.wolframalpha.com/input/?i=624999999995069620+-+%28%281e19+*+1+%2F+%281e19+%2B+2%5E100+*+1%29%29+*+2%5E96%29\n        assertEq(sqrtQ, 624999999995069620);\n    }\n\n    function test_getNextSqrtPriceFromInput_canReturn1WithEnoughAmountInAndZeroForOneEqualsTrue() public pure {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, 1, Constants.MAX_UINT256 / 2, true);\n\n        assertEq(sqrtQ, 1);\n    }\n\n    //\n    function test_getNextSqrtPriceFromInput_zeroForOneEqualsTrueGas() public {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        vm.startSnapshotGas(\"getNextSqrtPriceFromInput_zeroForOneEqualsTrueGas\");\n        SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, uint128(1 ether), 0.1 ether, true);\n        vm.stopSnapshotGas();\n    }\n\n    function test_getNextSqrtPriceFromInput_zeroForOneEqualsFalseGas() public {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        vm.startSnapshotGas(\"getNextSqrtPriceFromInput_zeroForOneEqualsFalseGas\");\n        SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, uint128(1 ether), 0.1 ether, false);\n        vm.stopSnapshotGas();\n    }\n\n    function test_getNextSqrtPriceFromOutput_revertsIfPriceIsZero() public {\n        vm.expectRevert(SqrtPriceMath.InvalidPriceOrLiquidity.selector);\n        SqrtPriceMath.getNextSqrtPriceFromOutput(0, 1, 0.1 ether, false);\n    }\n\n    function test_getNextSqrtPriceFromOutput_revertsIfLiquidityIsZero() public {\n        vm.expectRevert(SqrtPriceMath.InvalidPriceOrLiquidity.selector);\n        SqrtPriceMath.getNextSqrtPriceFromOutput(1, 0, 0.1 ether, true);\n    }\n\n    function test_getNextSqrtPriceFromOutput_revertsIfOutputAmountIsExactlyTheVirtualReservesOfCurrency0() public {\n        uint160 price = 20282409603651670423947251286016;\n        uint128 liquidity = 1024;\n        uint256 amountOut = 4;\n\n        vm.expectRevert(SqrtPriceMath.PriceOverflow.selector);\n        SqrtPriceMath.getNextSqrtPriceFromOutput(price, liquidity, amountOut, false);\n    }\n\n    function test_getNextSqrtPriceFromOutput_revertsIfOutputAmountIsGreaterThanTheVirtualReservesOfCurrency0() public {\n        uint160 price = 20282409603651670423947251286016;\n        uint128 liquidity = 1024;\n        uint256 amountOut = 5;\n\n        vm.expectRevert(SqrtPriceMath.PriceOverflow.selector);\n        SqrtPriceMath.getNextSqrtPriceFromOutput(price, liquidity, amountOut, false);\n    }\n\n    function test_getNextSqrtPriceFromOutput_revertsIfOutputAmountIsGreaterThanTheVirtualReservesOfCurrency1() public {\n        uint160 price = 20282409603651670423947251286016;\n        uint128 liquidity = 1024;\n        uint256 amountOut = 262145;\n\n        vm.expectRevert(SqrtPriceMath.NotEnoughLiquidity.selector);\n        SqrtPriceMath.getNextSqrtPriceFromOutput(price, liquidity, amountOut, true);\n    }\n\n    function test_getNextSqrtPriceFromOutput_revertsIfOutputAmountIsExactlyTheVirtualReservesOfCurrency1() public {\n        uint160 price = 20282409603651670423947251286016;\n        uint128 liquidity = 1024;\n        uint256 amountOut = 262144;\n\n        vm.expectRevert(SqrtPriceMath.NotEnoughLiquidity.selector);\n        SqrtPriceMath.getNextSqrtPriceFromOutput(price, liquidity, amountOut, true);\n    }\n\n    function test_getNextSqrtPriceFromOutput_succeedsIfOutputAmountIsJustLessThanTheVirtualReservesOfCurrency1()\n        public\n        pure\n    {\n        uint160 price = 20282409603651670423947251286016;\n        uint128 liquidity = 1024;\n        uint256 amountOut = 262143;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromOutput(price, liquidity, amountOut, true);\n\n        assertEq(sqrtQ, 77371252455336267181195264);\n    }\n\n    function test_getNextSqrtPriceFromOutput_puzzlingEchidnaTest() public {\n        uint160 price = 20282409603651670423947251286016;\n        uint128 liquidity = 1024;\n        uint256 amountOut = 4;\n\n        vm.expectRevert(SqrtPriceMath.PriceOverflow.selector);\n        SqrtPriceMath.getNextSqrtPriceFromOutput(price, liquidity, amountOut, false);\n    }\n\n    function test_getNextSqrtPriceFromOutput_returnsInputPriceIfAmountInIsZeroAndZeroForOneEqualsTrue() public pure {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        uint256 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, uint128(0.1 ether), 0, true);\n\n        assertEq(sqrtP, sqrtQ);\n    }\n\n    function test_getNextSqrtPriceFromOutput_returnsInputPriceIfAmountInIsZeroAndZeroForOneEqualsFalse() public pure {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        uint256 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, uint128(0.1 ether), 0, false);\n\n        assertEq(sqrtP, sqrtQ);\n    }\n\n    function test_getNextSqrtPriceFromOutput_outputAmountOf0_1Currency1() public pure {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, uint128(1 ether), 0.1 ether, false);\n\n        assertEq(sqrtQ, 88031291682515930659493278152);\n    }\n\n    function test_getNextSqrtPriceFromOutput_outputAmountOf0_1Currency0() public pure {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, uint128(1 ether), 0.1 ether, true);\n\n        assertEq(sqrtQ, 71305346262837903834189555302);\n    }\n\n    function test_getNextSqrtPriceFromOutput_revertsIfAmountOutIsImpossibleInZeroForOneDirection() public {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        vm.expectRevert();\n        SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, 1, Constants.MAX_UINT256, true);\n    }\n\n    function test_getNextSqrtPriceFromOutput_revertsIfAmountOutIsImpossibleInOneForZeroDirection() public {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        vm.expectRevert(SqrtPriceMath.PriceOverflow.selector);\n        SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, 1, Constants.MAX_UINT256, false);\n    }\n\n    function test_getNextSqrtPriceFromOutput_zeroForOneEqualsTrueGas() public {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        vm.startSnapshotGas(\"getNextSqrtPriceFromOutput_zeroForOneEqualsTrueGas\");\n        SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, uint128(1 ether), 0.1 ether, true);\n        vm.stopSnapshotGas();\n    }\n\n    function test_getNextSqrtPriceFromOutput_zeroForOneEqualsFalseGas() public {\n        uint160 sqrtP = Constants.SQRT_PRICE_1_1;\n\n        vm.startSnapshotGas(\"getNextSqrtPriceFromOutput_zeroForOneEqualsFalseGas\");\n        SqrtPriceMath.getNextSqrtPriceFromOutput(sqrtP, uint128(1 ether), 0.1 ether, false);\n        vm.stopSnapshotGas();\n    }\n\n    function test_getAmount0Delta_returns0IfLiquidityIs0() public pure {\n        uint256 amount0 = SqrtPriceMath.getAmount0Delta(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_2_1, 0, true);\n\n        assertEq(amount0, 0);\n    }\n\n    function test_getAmount0Delta_returns0IfPricesAreEqual() public pure {\n        uint256 amount0 = SqrtPriceMath.getAmount0Delta(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_1_1, 0, true);\n\n        assertEq(amount0, 0);\n    }\n\n    function test_getAmount0Delta_revertsIfPriceIsZero() public {\n        vm.expectRevert(SqrtPriceMath.InvalidPrice.selector);\n        SqrtPriceMath.getAmount0Delta(0, 1, 1, true);\n    }\n\n    function test_getAmount0Delta_1Amount1ForPriceOf1To1_21() public pure {\n        uint256 amount0 = SqrtPriceMath.getAmount0Delta(\n            Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_121_100, uint128(1 ether), true\n        );\n\n        assertEq(amount0, 90909090909090910);\n\n        uint256 amount0RoundedDown = SqrtPriceMath.getAmount0Delta(\n            Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_121_100, uint128(1 ether), false\n        );\n\n        assertEq(amount0RoundedDown, amount0 - 1);\n    }\n\n    function test_getAmount0Delta_worksForPricesThatOverflow() public pure {\n        // sqrtP_1 = encodeSqrtPriceX96(2^90, 1)\n        uint160 sqrtP_1 = 2787593149816327892691964784081045188247552;\n        // sqrtP_2 = encodeSqrtPriceX96(2^96, 1)\n        uint160 sqrtP_2 = 22300745198530623141535718272648361505980416;\n\n        uint256 amount0Up = SqrtPriceMath.getAmount0Delta(sqrtP_1, sqrtP_2, uint128(1 ether), true);\n\n        uint256 amount0Down = SqrtPriceMath.getAmount0Delta(sqrtP_1, sqrtP_2, uint128(1 ether), false);\n\n        assertEq(amount0Up, amount0Down + 1);\n    }\n\n    function test_getAmount0Delta_gasCostForAmount0WhereRoundUpIsTrue() public {\n        vm.startSnapshotGas(\"getAmount0Delta_gasCostForAmount0WhereRoundUpIsTrue\");\n        SqrtPriceMath.getAmount0Delta(Constants.SQRT_PRICE_121_100, Constants.SQRT_PRICE_1_1, uint128(1 ether), true);\n        vm.stopSnapshotGas();\n    }\n\n    function test_getAmount0Delta_gasCostForAmount0WhereRoundUpIsFalse() public {\n        vm.startSnapshotGas(\"getAmount0Delta_gasCostForAmount0WhereRoundUpIsFalse\");\n        SqrtPriceMath.getAmount0Delta(Constants.SQRT_PRICE_121_100, Constants.SQRT_PRICE_1_1, uint128(1 ether), false);\n        vm.stopSnapshotGas();\n    }\n\n    function test_getAmount1Delta_returns0IfLiquidityIs0() public pure {\n        uint256 amount1 = SqrtPriceMath.getAmount1Delta(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_2_1, 0, true);\n\n        assertEq(amount1, 0);\n    }\n\n    function test_getAmount1Delta_returns0IfPricesAreEqual() public pure {\n        uint256 amount1 = SqrtPriceMath.getAmount1Delta(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_1_1, 0, true);\n\n        assertEq(amount1, 0);\n    }\n\n    function test_getAmount1Delta_1Amount1ForPriceOf1To1_21() public pure {\n        uint256 amount1 = SqrtPriceMath.getAmount1Delta(\n            Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_121_100, uint128(1 ether), true\n        );\n\n        assertEq(amount1, 100000000000000000);\n\n        uint256 amount1RoundedDown = SqrtPriceMath.getAmount1Delta(\n            Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_121_100, uint128(1 ether), false\n        );\n\n        assertEq(amount1RoundedDown, amount1 - 1);\n    }\n\n    function test_getAmount1Delta_gasCostForAmount1WhereRoundUpIsTrue() public {\n        vm.startSnapshotGas(\"getAmount1Delta_gasCostForAmount1WhereRoundUpIsTrue\");\n        SqrtPriceMath.getAmount1Delta(Constants.SQRT_PRICE_121_100, Constants.SQRT_PRICE_1_1, uint128(1 ether), true);\n        vm.stopSnapshotGas();\n    }\n\n    function test_getAmount1Delta_gasCostForAmount1WhereRoundUpIsFalse() public {\n        vm.startSnapshotGas(\"getAmount1Delta_gasCostForAmount1WhereRoundUpIsFalse\");\n        SqrtPriceMath.getAmount1Delta(Constants.SQRT_PRICE_121_100, Constants.SQRT_PRICE_1_1, uint128(1 ether), false);\n        vm.stopSnapshotGas();\n    }\n\n    function test_swapComputation_sqrtPTimessqrtQOverflows() public pure {\n        // getNextSqrtPriceInvariants(1025574284609383690408304870162715216695788925244,50015962439936049619261659728067971248,406,true)\n        uint160 sqrtP = 1025574284609383690408304870162715216695788925244;\n        uint128 liquidity = 50015962439936049619261659728067971248;\n        bool zeroForOne = true;\n        uint128 amountIn = 406;\n\n        uint160 sqrtQ = SqrtPriceMath.getNextSqrtPriceFromInput(sqrtP, liquidity, amountIn, zeroForOne);\n        assertEq(sqrtQ, 1025574284609383582644711336373707553698163132913);\n\n        uint256 amount0Delta = SqrtPriceMath.getAmount0Delta(sqrtQ, sqrtP, liquidity, true);\n        assertEq(amount0Delta, 406);\n    }\n}\n"
  },
  {
    "path": "test/libraries/StateLibrary.t.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.19;\n\nimport \"forge-std/Test.sol\";\nimport {IHooks} from \"../../src/interfaces/IHooks.sol\";\nimport {Hooks} from \"../../src/libraries/Hooks.sol\";\nimport {TickMath} from \"../../src/libraries/TickMath.sol\";\nimport {IPoolManager} from \"../../src/interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams} from \"../../src/types/PoolOperation.sol\";\nimport {PoolKey} from \"../../src/types/PoolKey.sol\";\nimport {BalanceDelta} from \"../../src/types/BalanceDelta.sol\";\nimport {PoolId} from \"../../src/types/PoolId.sol\";\nimport {Currency} from \"../../src/types/Currency.sol\";\nimport {Deployers} from \"../utils/Deployers.sol\";\nimport {FixedPointMathLib} from \"solmate/src/utils/FixedPointMathLib.sol\";\nimport {Pool} from \"../../src/libraries/Pool.sol\";\nimport {TickBitmap} from \"../../src/libraries/TickBitmap.sol\";\nimport {FixedPoint128} from \"../../src/libraries/FixedPoint128.sol\";\n\nimport {StateLibrary} from \"../../src/libraries/StateLibrary.sol\";\nimport {Fuzzers} from \"../../src/test/Fuzzers.sol\";\n\ncontract StateLibraryTest is Test, Deployers, Fuzzers {\n    using FixedPointMathLib for uint256;\n\n    PoolId poolId;\n\n    function setUp() public {\n        // creates the pool manager, utility routers, and test tokens\n        Deployers.deployFreshManagerAndRouters();\n        (currency0, currency1) = Deployers.deployMintAndApprove2Currencies();\n\n        // Create the pool\n        key = PoolKey(currency0, currency1, 3000, 60, IHooks(address(0x0)));\n        poolId = key.toId();\n        manager.initialize(key, SQRT_PRICE_1_1);\n    }\n\n    function test_getSlot0() public {\n        // create liquidity\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 10_000 ether, 0), ZERO_BYTES);\n\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-600, 600, 10_000 ether, 0), ZERO_BYTES);\n\n        // swap to create fees, crossing a tick\n        uint256 swapAmount = 100 ether;\n        swap(key, true, -int256(swapAmount), ZERO_BYTES);\n        (uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 swapFee) = StateLibrary.getSlot0(manager, poolId);\n        vm.snapshotGasLastCall(\"extsload getSlot0\");\n        assertEq(tick, -139);\n\n        // magic number verified against a native getter\n        assertEq(sqrtPriceX96, 78680104762184586858280382455);\n        assertEq(tick, -139);\n        assertEq(protocolFee, 0); // tested in protocol fee tests\n        assertEq(swapFee, 3000);\n    }\n\n    function test_getTickLiquidity() public {\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 10 ether, 0), ZERO_BYTES);\n\n        (uint128 liquidityGrossLower, int128 liquidityNetLower) = StateLibrary.getTickLiquidity(manager, poolId, -60);\n        vm.snapshotGasLastCall(\"extsload getTickLiquidity\");\n        assertEq(liquidityGrossLower, 10 ether);\n        assertEq(liquidityNetLower, 10 ether);\n\n        (uint128 liquidityGrossUpper, int128 liquidityNetUpper) = StateLibrary.getTickLiquidity(manager, poolId, 60);\n        assertEq(liquidityGrossUpper, 10 ether);\n        assertEq(liquidityNetUpper, -10 ether);\n    }\n\n    function test_fuzz_getTickLiquidity(ModifyLiquidityParams memory params) public {\n        (ModifyLiquidityParams memory _params,) =\n            Fuzzers.createFuzzyLiquidity(modifyLiquidityRouter, key, params, SQRT_PRICE_1_1, ZERO_BYTES);\n        uint128 liquidityDelta = uint128(uint256(_params.liquidityDelta));\n\n        (uint128 liquidityGrossLower, int128 liquidityNetLower) =\n            StateLibrary.getTickLiquidity(manager, poolId, _params.tickLower);\n        assertEq(liquidityGrossLower, liquidityDelta);\n        assertEq(liquidityNetLower, int128(_params.liquidityDelta));\n\n        (uint128 liquidityGrossUpper, int128 liquidityNetUpper) =\n            StateLibrary.getTickLiquidity(manager, poolId, _params.tickUpper);\n        assertEq(liquidityGrossUpper, liquidityDelta);\n        assertEq(liquidityNetUpper, -int128(_params.liquidityDelta));\n\n        // confirm agreement with getTickInfo()\n        (uint128 _liquidityGrossLower, int128 _liquidityNetLower,,) =\n            StateLibrary.getTickInfo(manager, poolId, _params.tickLower);\n        assertEq(_liquidityGrossLower, liquidityGrossLower);\n        assertEq(_liquidityNetLower, liquidityNetLower);\n\n        (uint128 _liquidityGrossUpper, int128 _liquidityNetUpper,,) =\n            StateLibrary.getTickInfo(manager, poolId, _params.tickUpper);\n        assertEq(_liquidityGrossUpper, liquidityGrossUpper);\n        assertEq(_liquidityNetUpper, liquidityNetUpper);\n    }\n\n    function test_fuzz_getTickLiquidity_two_positions(\n        ModifyLiquidityParams memory paramsA,\n        ModifyLiquidityParams memory paramsB\n    ) public {\n        (ModifyLiquidityParams memory _paramsA,) = Fuzzers.createFuzzyLiquidityWithTightBound(\n            modifyLiquidityRouter, key, paramsA, SQRT_PRICE_1_1, ZERO_BYTES, 2\n        );\n        (ModifyLiquidityParams memory _paramsB,) = Fuzzers.createFuzzyLiquidityWithTightBound(\n            modifyLiquidityRouter, key, paramsB, SQRT_PRICE_1_1, ZERO_BYTES, 2\n        );\n\n        uint128 liquidityDeltaA = uint128(uint256(_paramsA.liquidityDelta));\n        uint128 liquidityDeltaB = uint128(uint256(_paramsB.liquidityDelta));\n\n        (uint128 liquidityGrossLowerA, int128 liquidityNetLowerA) =\n            StateLibrary.getTickLiquidity(manager, poolId, _paramsA.tickLower);\n        (uint128 liquidityGrossLowerB, int128 liquidityNetLowerB) =\n            StateLibrary.getTickLiquidity(manager, poolId, _paramsB.tickLower);\n        (uint256 liquidityGrossUpperA, int256 liquidityNetUpperA) =\n            StateLibrary.getTickLiquidity(manager, poolId, _paramsA.tickUpper);\n        (uint256 liquidityGrossUpperB, int256 liquidityNetUpperB) =\n            StateLibrary.getTickLiquidity(manager, poolId, _paramsB.tickUpper);\n\n        // when tick lower is shared between two positions, the gross liquidity is the sum\n        if (_paramsA.tickLower == _paramsB.tickLower || _paramsA.tickLower == _paramsB.tickUpper) {\n            assertEq(liquidityGrossLowerA, liquidityDeltaA + liquidityDeltaB);\n\n            // when tick lower is shared with an upper tick, the net liquidity is the difference\n            (_paramsA.tickLower == _paramsB.tickLower)\n                ? assertEq(liquidityNetLowerA, int128(liquidityDeltaA + liquidityDeltaB))\n                : assertApproxEqAbs(liquidityNetLowerA, int128(liquidityDeltaA) - int128(liquidityDeltaB), 1 wei);\n        } else {\n            assertEq(liquidityGrossLowerA, liquidityDeltaA);\n            assertEq(liquidityNetLowerA, int128(liquidityDeltaA));\n        }\n\n        if (_paramsA.tickUpper == _paramsB.tickLower || _paramsA.tickUpper == _paramsB.tickUpper) {\n            assertEq(liquidityGrossUpperA, liquidityDeltaA + liquidityDeltaB);\n            (_paramsA.tickUpper == _paramsB.tickUpper)\n                ? assertEq(liquidityNetUpperA, -int128(liquidityDeltaA + liquidityDeltaB))\n                : assertApproxEqAbs(liquidityNetUpperA, int128(liquidityDeltaB) - int128(liquidityDeltaA), 2 wei);\n        } else {\n            assertEq(liquidityGrossUpperA, liquidityDeltaA);\n            assertEq(liquidityNetUpperA, -int128(liquidityDeltaA));\n        }\n\n        if (_paramsB.tickLower == _paramsA.tickLower || _paramsB.tickLower == _paramsA.tickUpper) {\n            assertEq(liquidityGrossLowerB, liquidityDeltaA + liquidityDeltaB);\n            (_paramsB.tickLower == _paramsA.tickLower)\n                ? assertEq(liquidityNetLowerB, int128(liquidityDeltaA + liquidityDeltaB))\n                : assertApproxEqAbs(liquidityNetLowerB, int128(liquidityDeltaB) - int128(liquidityDeltaA), 1 wei);\n        } else {\n            assertEq(liquidityGrossLowerB, liquidityDeltaB);\n            assertEq(liquidityNetLowerB, int128(liquidityDeltaB));\n        }\n\n        if (_paramsB.tickUpper == _paramsA.tickLower || _paramsB.tickUpper == _paramsA.tickUpper) {\n            assertEq(liquidityGrossUpperB, liquidityDeltaA + liquidityDeltaB);\n            (_paramsB.tickUpper == _paramsA.tickUpper)\n                ? assertEq(liquidityNetUpperB, -int128(liquidityDeltaA + liquidityDeltaB))\n                : assertApproxEqAbs(liquidityNetUpperB, int128(liquidityDeltaA) - int128(liquidityDeltaB), 2 wei);\n        } else {\n            assertEq(liquidityGrossUpperB, liquidityDeltaB);\n            assertEq(liquidityNetUpperB, -int128(liquidityDeltaB));\n        }\n    }\n\n    function test_getFeeGrowthGlobals0() public {\n        // create liquidity\n        uint256 liquidity = 10_000 ether;\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, int256(liquidity), 0), ZERO_BYTES);\n\n        (uint256 feeGrowthGlobal0, uint256 feeGrowthGlobal1) = StateLibrary.getFeeGrowthGlobals(manager, poolId);\n        assertEq(feeGrowthGlobal0, 0);\n        assertEq(feeGrowthGlobal1, 0);\n\n        // swap to create fees on the input token (currency0)\n        uint256 swapAmount = 10 ether;\n        swap(key, true, -int256(swapAmount), ZERO_BYTES);\n\n        (feeGrowthGlobal0, feeGrowthGlobal1) = StateLibrary.getFeeGrowthGlobals(manager, poolId);\n        vm.snapshotGasLastCall(\"extsload getFeeGrowthGlobals\");\n\n        uint256 feeGrowthGlobalCalc = swapAmount.mulWadDown(0.003e18).mulDivDown(FixedPoint128.Q128, liquidity);\n        assertEq(feeGrowthGlobal0, feeGrowthGlobalCalc);\n        assertEq(feeGrowthGlobal1, 0);\n    }\n\n    function test_getFeeGrowthGlobals1() public {\n        // create liquidity\n        uint256 liquidity = 10_000 ether;\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, int256(liquidity), 0), ZERO_BYTES);\n\n        (uint256 feeGrowthGlobal0, uint256 feeGrowthGlobal1) = StateLibrary.getFeeGrowthGlobals(manager, poolId);\n        assertEq(feeGrowthGlobal0, 0);\n        assertEq(feeGrowthGlobal1, 0);\n\n        // swap to create fees on the input token (currency1)\n        uint256 swapAmount = 10 ether;\n        swap(key, false, -int256(swapAmount), ZERO_BYTES);\n\n        (feeGrowthGlobal0, feeGrowthGlobal1) = StateLibrary.getFeeGrowthGlobals(manager, poolId);\n\n        assertEq(feeGrowthGlobal0, 0);\n        uint256 feeGrowthGlobalCalc = swapAmount.mulWadDown(0.003e18).mulDivDown(FixedPoint128.Q128, liquidity);\n        assertEq(feeGrowthGlobal1, feeGrowthGlobalCalc);\n    }\n\n    function test_getLiquidity() public {\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 10 ether, 0), ZERO_BYTES);\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-120, 120, 10 ether, 0), ZERO_BYTES);\n\n        uint128 liquidity = StateLibrary.getLiquidity(manager, poolId);\n        vm.snapshotGasLastCall(\"extsload getLiquidity\");\n        assertEq(liquidity, 20 ether);\n    }\n\n    function test_fuzz_getLiquidity(ModifyLiquidityParams memory params) public {\n        (ModifyLiquidityParams memory _params,) =\n            Fuzzers.createFuzzyLiquidity(modifyLiquidityRouter, key, params, SQRT_PRICE_1_1, ZERO_BYTES);\n        (, int24 tick,,) = StateLibrary.getSlot0(manager, poolId);\n        uint128 liquidity = StateLibrary.getLiquidity(manager, poolId);\n\n        // out of range liquidity is not added to Pool.State.liquidity\n        if (tick < _params.tickLower || tick >= _params.tickUpper) {\n            assertEq(liquidity, 0);\n        } else {\n            assertEq(liquidity, uint128(uint256(_params.liquidityDelta)));\n        }\n    }\n\n    function test_getTickBitmap() public {\n        int24 tickLower = -300;\n        int24 tickUpper = 300;\n        // create liquidity\n        modifyLiquidityRouter.modifyLiquidity(\n            key, ModifyLiquidityParams(tickLower, tickUpper, 10_000 ether, 0), ZERO_BYTES\n        );\n\n        (int16 wordPos, uint8 bitPos) = TickBitmap.position(tickLower / key.tickSpacing);\n        uint256 tickBitmap = StateLibrary.getTickBitmap(manager, poolId, wordPos);\n        vm.snapshotGasLastCall(\"extsload getTickBitmap\");\n        assertNotEq(tickBitmap, 0);\n        assertEq(tickBitmap, 1 << bitPos);\n\n        (wordPos, bitPos) = TickBitmap.position(tickUpper / key.tickSpacing);\n        tickBitmap = StateLibrary.getTickBitmap(manager, poolId, wordPos);\n        assertNotEq(tickBitmap, 0);\n        assertEq(tickBitmap, 1 << bitPos);\n    }\n\n    function test_fuzz_getTickBitmap(ModifyLiquidityParams memory params) public {\n        (ModifyLiquidityParams memory _params,) =\n            Fuzzers.createFuzzyLiquidity(modifyLiquidityRouter, key, params, SQRT_PRICE_1_1, ZERO_BYTES);\n\n        (int16 wordPos, uint8 bitPos) = TickBitmap.position(_params.tickLower / key.tickSpacing);\n        (int16 wordPosUpper, uint8 bitPosUpper) = TickBitmap.position(_params.tickUpper / key.tickSpacing);\n\n        uint256 tickBitmap = StateLibrary.getTickBitmap(manager, poolId, wordPos);\n        assertNotEq(tickBitmap, 0);\n\n        // in fuzz tests, the tickLower and tickUpper might exist on the same word\n        if (wordPos == wordPosUpper) {\n            assertEq(tickBitmap, (1 << bitPos) | (1 << bitPosUpper));\n        } else {\n            assertEq(tickBitmap, 1 << bitPos);\n        }\n    }\n\n    function test_getPositionInfo() public {\n        // create liquidity\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 10_000 ether, 0), ZERO_BYTES);\n\n        // swap to create fees, crossing a tick\n        uint256 swapAmount = 10 ether;\n        swap(key, true, -int256(swapAmount), ZERO_BYTES);\n        (, int24 currentTick,,) = StateLibrary.getSlot0(manager, poolId);\n        assertNotEq(currentTick, -139);\n\n        // poke the LP so that fees are updated\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 0, 0), ZERO_BYTES);\n\n        bytes32 positionId =\n            keccak256(abi.encodePacked(address(modifyLiquidityRouter), int24(-60), int24(60), bytes32(0)));\n\n        (uint128 liquidity, uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) =\n            StateLibrary.getPositionInfo(manager, poolId, positionId);\n        vm.snapshotGasLastCall(\"extsload getPositionInfo\");\n\n        assertEq(liquidity, 10_000 ether);\n\n        assertNotEq(feeGrowthInside0X128, 0);\n        assertEq(feeGrowthInside1X128, 0);\n    }\n\n    function test_fuzz_getPositionInfo(ModifyLiquidityParams memory params, uint256 swapAmount, bool zeroForOne)\n        public\n    {\n        (ModifyLiquidityParams memory _params, BalanceDelta delta) =\n            createFuzzyLiquidity(modifyLiquidityRouter, key, params, SQRT_PRICE_1_1, ZERO_BYTES);\n\n        uint256 delta0 = uint256(int256(-delta.amount0()));\n        uint256 delta1 = uint256(int256(-delta.amount1()));\n        // if one of the deltas is zero, ensure to swap in the right direction\n        if (delta0 == 0) {\n            zeroForOne = true;\n        } else if (delta1 == 0) {\n            zeroForOne = false;\n        }\n        swapAmount = bound(swapAmount, 1, uint256(int256(type(int128).max)));\n        swap(key, zeroForOne, -int256(swapAmount), ZERO_BYTES);\n\n        // poke the LP so that fees are updated\n        modifyLiquidityRouter.modifyLiquidity(\n            key, ModifyLiquidityParams(_params.tickLower, _params.tickUpper, 0, 0), ZERO_BYTES\n        );\n\n        bytes32 positionId = keccak256(\n            abi.encodePacked(address(modifyLiquidityRouter), _params.tickLower, _params.tickUpper, bytes32(0))\n        );\n\n        (uint128 liquidity, uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) =\n            StateLibrary.getPositionInfo(manager, poolId, positionId);\n\n        assertEq(liquidity, uint128(uint256(_params.liquidityDelta)));\n        if (zeroForOne) {\n            assertNotEq(feeGrowthInside0X128, 0);\n            assertEq(feeGrowthInside1X128, 0);\n        } else {\n            assertEq(feeGrowthInside0X128, 0);\n            assertNotEq(feeGrowthInside1X128, 0);\n        }\n    }\n\n    function test_getTickFeeGrowthOutside() public {\n        // create liquidity\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 10_000 ether, 0), ZERO_BYTES);\n\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-600, 600, 10_000 ether, 0), ZERO_BYTES);\n\n        // swap to create fees, crossing a tick\n        uint256 swapAmount = 100 ether;\n        swap(key, true, -int256(swapAmount), ZERO_BYTES);\n        (, int24 currentTick,,) = StateLibrary.getSlot0(manager, poolId);\n        assertEq(currentTick, -139);\n\n        int24 tick = -60;\n        (uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128) =\n            StateLibrary.getTickFeeGrowthOutside(manager, poolId, tick);\n        vm.snapshotGasLastCall(\"extsload getTickFeeGrowthOutside\");\n\n        // magic number verified against a native getter on PoolManager\n        assertEq(feeGrowthOutside0X128, 3076214778951936192155253373200636);\n        assertEq(feeGrowthOutside1X128, 0);\n\n        tick = 60;\n        (feeGrowthOutside0X128, feeGrowthOutside1X128) = StateLibrary.getTickFeeGrowthOutside(manager, poolId, tick);\n        assertEq(feeGrowthOutside0X128, 0);\n        assertEq(feeGrowthOutside1X128, 0);\n    }\n\n    // also hard to fuzz because of feeGrowthOutside\n    function test_getTickInfo() public {\n        // create liquidity\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 10_000 ether, 0), ZERO_BYTES);\n\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-600, 600, 10_000 ether, 0), ZERO_BYTES);\n\n        // swap to create fees, crossing a tick\n        uint256 swapAmount = 100 ether;\n        swap(key, true, -int256(swapAmount), ZERO_BYTES);\n        (, int24 currentTick,,) = StateLibrary.getSlot0(manager, poolId);\n        assertEq(currentTick, -139);\n\n        int24 tick = -60;\n        (uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128) =\n            StateLibrary.getTickInfo(manager, poolId, tick);\n        vm.snapshotGasLastCall(\"extsload getTickInfo\");\n\n        (uint128 liquidityGross_, int128 liquidityNet_) = StateLibrary.getTickLiquidity(manager, poolId, tick);\n        (uint256 feeGrowthOutside0X128_, uint256 feeGrowthOutside1X128_) =\n            StateLibrary.getTickFeeGrowthOutside(manager, poolId, tick);\n\n        assertEq(liquidityGross, 10_000 ether);\n        assertEq(liquidityGross, liquidityGross_);\n        assertEq(liquidityNet, liquidityNet_);\n\n        assertNotEq(feeGrowthOutside0X128, 0);\n        assertEq(feeGrowthOutside1X128, 0);\n        assertEq(feeGrowthOutside0X128, feeGrowthOutside0X128_);\n        assertEq(feeGrowthOutside1X128, feeGrowthOutside1X128_);\n    }\n\n    function test_getFeeGrowthInside() public {\n        // create liquidity\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 10_000 ether, 0), ZERO_BYTES);\n\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-600, 600, 10_000 ether, 0), ZERO_BYTES);\n\n        // swap to create fees, crossing a tick\n        uint256 swapAmount = 100 ether;\n        swap(key, true, -int256(swapAmount), ZERO_BYTES);\n        (, int24 currentTick,,) = StateLibrary.getSlot0(manager, poolId);\n        assertEq(currentTick, -139);\n\n        // calculated live\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) =\n            StateLibrary.getFeeGrowthInside(manager, poolId, -60, 60);\n        vm.snapshotGasLastCall(\"extsload getFeeGrowthInside\");\n\n        // poke the LP so that fees are updated\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 0, 0), ZERO_BYTES);\n\n        bytes32 positionId =\n            keccak256(abi.encodePacked(address(modifyLiquidityRouter), int24(-60), int24(60), bytes32(0)));\n\n        (, uint256 feeGrowthInside0X128_, uint256 feeGrowthInside1X128_) =\n            StateLibrary.getPositionInfo(manager, poolId, positionId);\n\n        assertNotEq(feeGrowthInside0X128, 0);\n        assertEq(feeGrowthInside0X128, feeGrowthInside0X128_);\n        assertEq(feeGrowthInside1X128, feeGrowthInside1X128_);\n    }\n\n    function test_fuzz_getFeeGrowthInside(ModifyLiquidityParams memory params, bool zeroForOne) public {\n        modifyLiquidityRouter.modifyLiquidity(\n            key,\n            ModifyLiquidityParams(\n                TickMath.minUsableTick(key.tickSpacing), TickMath.maxUsableTick(key.tickSpacing), 10_000 ether, 0\n            ),\n            ZERO_BYTES\n        );\n\n        (ModifyLiquidityParams memory _params,) =\n            createFuzzyLiquidity(modifyLiquidityRouter, key, params, SQRT_PRICE_1_1, ZERO_BYTES);\n\n        swap(key, zeroForOne, -int256(100e18), ZERO_BYTES);\n\n        // calculated live\n        (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) =\n            StateLibrary.getFeeGrowthInside(manager, poolId, _params.tickLower, _params.tickUpper);\n\n        // poke the LP so that fees are updated\n        modifyLiquidityRouter.modifyLiquidity(\n            key, ModifyLiquidityParams(_params.tickLower, _params.tickUpper, 0, 0), ZERO_BYTES\n        );\n        bytes32 positionId = keccak256(\n            abi.encodePacked(address(modifyLiquidityRouter), _params.tickLower, _params.tickUpper, bytes32(0))\n        );\n\n        (, uint256 feeGrowthInside0X128_, uint256 feeGrowthInside1X128_) =\n            StateLibrary.getPositionInfo(manager, poolId, positionId);\n\n        assertEq(feeGrowthInside0X128, feeGrowthInside0X128_);\n        assertEq(feeGrowthInside1X128, feeGrowthInside1X128_);\n    }\n\n    function test_getPositionLiquidity() public {\n        // create liquidity\n        modifyLiquidityRouter.modifyLiquidity(key, ModifyLiquidityParams(-60, 60, 10_000 ether, 0), ZERO_BYTES);\n\n        bytes32 positionId =\n            keccak256(abi.encodePacked(address(modifyLiquidityRouter), int24(-60), int24(60), bytes32(0)));\n\n        uint128 liquidity = StateLibrary.getPositionLiquidity(manager, poolId, positionId);\n        vm.snapshotGasLastCall(\"extsload getPositionLiquidity\");\n\n        assertEq(liquidity, 10_000 ether);\n    }\n\n    function test_fuzz_getPositionLiquidity(ModifyLiquidityParams memory paramsA, ModifyLiquidityParams memory paramsB)\n        public\n    {\n        (ModifyLiquidityParams memory _paramsA) = Fuzzers.createFuzzyLiquidityParams(key, paramsA, SQRT_PRICE_1_1);\n\n        (ModifyLiquidityParams memory _paramsB) = Fuzzers.createFuzzyLiquidityParams(key, paramsB, SQRT_PRICE_1_1);\n\n        // Assume there are no overlapping positions\n        vm.assume(\n            _paramsA.tickLower != _paramsB.tickLower && _paramsA.tickLower != _paramsB.tickUpper\n                && _paramsB.tickLower != _paramsA.tickUpper && _paramsA.tickUpper != _paramsB.tickUpper\n        );\n\n        modifyLiquidityRouter.modifyLiquidity(key, _paramsA, ZERO_BYTES);\n        modifyLiquidityRouter.modifyLiquidity(key, _paramsB, ZERO_BYTES);\n\n        bytes32 positionIdA = keccak256(\n            abi.encodePacked(address(modifyLiquidityRouter), _paramsA.tickLower, _paramsA.tickUpper, bytes32(0))\n        );\n        uint128 liquidityA = StateLibrary.getPositionLiquidity(manager, poolId, positionIdA);\n        assertEq(liquidityA, uint128(uint256(_paramsA.liquidityDelta)));\n\n        bytes32 positionIdB = keccak256(\n            abi.encodePacked(address(modifyLiquidityRouter), _paramsB.tickLower, _paramsB.tickUpper, bytes32(0))\n        );\n        uint128 liquidityB = StateLibrary.getPositionLiquidity(manager, poolId, positionIdB);\n        assertEq(liquidityB, uint128(uint256(_paramsB.liquidityDelta)));\n    }\n}\n"
  },
  {
    "path": "test/libraries/SwapMath.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {SqrtPriceMath} from \"../../src/libraries/SqrtPriceMath.sol\";\nimport {SwapMath} from \"../../src/libraries/SwapMath.sol\";\nimport {Constants} from \"../utils/Constants.sol\";\n\ncontract SwapMathTest is Test {\n    function test_fuzz_getSqrtPriceTarget(bool zeroForOne, uint160 sqrtPriceNextX96, uint160 sqrtPriceLimitX96)\n        public\n        pure\n    {\n        assertEq(\n            SwapMath.getSqrtPriceTarget(zeroForOne, sqrtPriceNextX96, sqrtPriceLimitX96),\n            (zeroForOne ? sqrtPriceNextX96 < sqrtPriceLimitX96 : sqrtPriceNextX96 > sqrtPriceLimitX96)\n                ? sqrtPriceLimitX96\n                : sqrtPriceNextX96\n        );\n    }\n\n    function test_computeSwapStep_exactAmountIn_oneForZero_thatGetsCappedAtPriceTargetIn() public pure {\n        uint160 priceTarget = Constants.SQRT_PRICE_101_100;\n        uint160 price = Constants.SQRT_PRICE_1_1;\n        uint128 liquidity = 2 ether;\n        int256 amount = (1 ether) * -1;\n        uint24 lpFee = 600;\n        bool zeroForOne = false;\n\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(price, priceTarget, liquidity, amount, lpFee);\n\n        assertEq(amountIn, 9975124224178055);\n        assertEq(amountOut, 9925619580021728);\n        assertEq(feeAmount, 5988667735148);\n        assert(amountIn + feeAmount < uint256(amount * -1));\n\n        uint256 priceAfterWholeInputAmount =\n            SqrtPriceMath.getNextSqrtPriceFromInput(price, liquidity, uint256(amount * -1), zeroForOne);\n\n        assertEq(sqrtQ, priceTarget);\n        assert(sqrtQ < priceAfterWholeInputAmount);\n    }\n\n    function test_computeSwapStep_exactAmountOut_oneForZero_thatGetsCappedAtPriceTargetIn() public pure {\n        uint160 priceTarget = Constants.SQRT_PRICE_101_100;\n        uint160 price = Constants.SQRT_PRICE_1_1;\n        uint128 liquidity = 2 ether;\n        int256 amount = 1 ether;\n        uint24 lpFee = 600;\n        bool zeroForOne = false;\n\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(price, priceTarget, liquidity, amount, lpFee);\n\n        assertEq(amountIn, 9975124224178055);\n        assertEq(amountOut, 9925619580021728);\n        assertEq(feeAmount, 5988667735148);\n        assert(amountOut < uint256(amount));\n\n        uint256 priceAfterWholeOutputAmount =\n            SqrtPriceMath.getNextSqrtPriceFromOutput(price, liquidity, uint256(amount), zeroForOne);\n\n        assertEq(sqrtQ, priceTarget);\n        assert(sqrtQ < priceAfterWholeOutputAmount);\n    }\n\n    function test_computeSwapStep_exactAmountIn_oneForZero_thatIsFullySpentIn() public pure {\n        uint160 priceTarget = Constants.SQRT_PRICE_1000_100;\n        uint160 price = Constants.SQRT_PRICE_1_1;\n        uint128 liquidity = 2 ether;\n        int256 amount = 1 ether * -1;\n        uint24 lpFee = 600;\n        bool zeroForOne = false;\n\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(price, priceTarget, liquidity, amount, lpFee);\n\n        assertEq(amountIn, 999400000000000000);\n        assertEq(amountOut, 666399946655997866);\n        assertEq(feeAmount, 600000000000000);\n        assertEq(amountIn + feeAmount, uint256(-amount));\n\n        uint256 priceAfterWholeInputAmountLessFee =\n            SqrtPriceMath.getNextSqrtPriceFromInput(price, liquidity, uint256(uint256(-amount) - feeAmount), zeroForOne);\n\n        assert(sqrtQ < priceTarget);\n        assertEq(sqrtQ, priceAfterWholeInputAmountLessFee);\n    }\n\n    function test_computeSwapStep_exactAmountOut_oneForZero_thatIsFullyReceivedIn() public pure {\n        uint160 priceTarget = Constants.SQRT_PRICE_10000_100;\n        uint160 price = Constants.SQRT_PRICE_1_1;\n        uint128 liquidity = 2 ether;\n        int256 amount = (1 ether);\n        uint24 lpFee = 600;\n        bool zeroForOne = false;\n\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(price, priceTarget, liquidity, amount, lpFee);\n\n        assertEq(amountIn, 2000000000000000000);\n        assertEq(feeAmount, 1200720432259356);\n        assertEq(amountOut, uint256(amount));\n\n        uint256 priceAfterWholeOutputAmount =\n            SqrtPriceMath.getNextSqrtPriceFromOutput(price, liquidity, uint256(amount), zeroForOne);\n\n        assert(sqrtQ < priceTarget);\n        assertEq(sqrtQ, priceAfterWholeOutputAmount);\n    }\n\n    function test_computeSwapStep_amountOut_isCappedAtTheDesiredAmountOut() public pure {\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) = SwapMath.computeSwapStep(\n            417332158212080721273783715441582, 1452870262520218020823638996, 159344665391607089467575320103, 1, 1\n        );\n\n        assertEq(amountIn, 1);\n        assertEq(feeAmount, 1);\n        assertEq(amountOut, 1); // would be 2 if not capped\n        assertEq(sqrtQ, 417332158212080721273783715441581);\n    }\n\n    function test_computeSwapStep_targetPriceOf1UsesPartialInputAmount() public pure {\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(2, 1, 1, -3915081100057732413702495386755767, 1);\n        assertEq(amountIn, Constants.SQRT_PRICE_1_4);\n        assertEq(feeAmount, 39614120871253040049813);\n        assert(amountIn + feeAmount <= 3915081100057732413702495386755767);\n        assertEq(amountOut, 0);\n        assertEq(sqrtQ, 1);\n    }\n\n    function test_computeSwapStep_notEntireInputAmountTakenAsFee() public pure {\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(2413, 79887613182836312, 1985041575832132834610021537970, -10, 1872);\n\n        assertEq(amountIn, 9);\n        assertEq(feeAmount, 1);\n        assertEq(amountOut, 0);\n        assertEq(sqrtQ, 2413);\n    }\n\n    function test_computeSwapStep_zeroForOne_handlesIntermediateInsufficientLiquidityInExactOutputCase() public pure {\n        uint160 sqrtP = 20282409603651670423947251286016;\n        uint160 sqrtPTarget = (sqrtP * 11) / 10;\n        uint128 liquidity = 1024;\n        // virtual reserves of one are only 4\n        // https://www.wolframalpha.com/input/?i=1024+%2F+%2820282409603651670423947251286016+%2F+2**96%29\n        int256 amountRemaining = 4;\n        uint24 feePips = 3000;\n\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(sqrtP, sqrtPTarget, liquidity, amountRemaining, feePips);\n\n        assertEq(amountOut, 0);\n        assertEq(sqrtQ, sqrtPTarget);\n        assertEq(amountIn, 26215);\n        assertEq(feeAmount, 79);\n    }\n\n    function test_computeSwapStep_oneForZero_handlesIntermediateInsufficientLiquidityInExactOutputCase() public pure {\n        uint160 sqrtP = 20282409603651670423947251286016;\n        uint160 sqrtPTarget = (sqrtP * 9) / 10;\n        uint128 liquidity = 1024;\n        // virtual reserves of zero are only 262144\n        // https://www.wolframalpha.com/input/?i=1024+*+%2820282409603651670423947251286016+%2F+2**96%29\n        int256 amountRemaining = 263000;\n        uint24 feePips = 3000;\n\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(sqrtP, sqrtPTarget, liquidity, amountRemaining, feePips);\n\n        assertEq(amountOut, 26214);\n        assertEq(sqrtQ, sqrtPTarget);\n        assertEq(amountIn, 1);\n        assertEq(feeAmount, 1);\n    }\n\n    function test_fuzz_computeSwapStep(\n        uint160 sqrtPriceRaw,\n        uint160 sqrtPriceTargetRaw,\n        uint128 liquidity,\n        int256 amountRemaining,\n        uint24 feePips\n    ) public pure {\n        vm.assume(sqrtPriceRaw > 0);\n        vm.assume(sqrtPriceTargetRaw > 0);\n        vm.assume(feePips >= 0);\n\n        if (amountRemaining >= 0) {\n            vm.assume(feePips < 1e6);\n        } else {\n            vm.assume(feePips <= 1e6);\n        }\n\n        (uint160 sqrtQ, uint256 amountIn, uint256 amountOut, uint256 feeAmount) =\n            SwapMath.computeSwapStep(sqrtPriceRaw, sqrtPriceTargetRaw, liquidity, amountRemaining, feePips);\n\n        assertLe(amountIn, type(uint256).max - feeAmount);\n\n        unchecked {\n            if (amountRemaining >= 0) {\n                assertLe(amountOut, uint256(amountRemaining));\n            } else {\n                assertLe(amountIn + feeAmount, uint256(-amountRemaining));\n            }\n        }\n\n        if (sqrtPriceRaw == sqrtPriceTargetRaw) {\n            assertEq(amountIn, 0);\n            assertEq(amountOut, 0);\n            assertEq(feeAmount, 0);\n            assertEq(sqrtQ, sqrtPriceTargetRaw);\n        }\n\n        // didn't reach price target, entire amount must be consumed\n        if (sqrtQ != sqrtPriceTargetRaw) {\n            uint256 absAmtRemaining;\n            if (amountRemaining == type(int256).min) {\n                absAmtRemaining = uint256(type(int256).max) + 1;\n            } else if (amountRemaining < 0) {\n                absAmtRemaining = uint256(-amountRemaining);\n            } else {\n                absAmtRemaining = uint256(amountRemaining);\n            }\n            if (amountRemaining > 0) assertEq(amountOut, absAmtRemaining);\n            else assertEq(amountIn + feeAmount, absAmtRemaining);\n        }\n\n        // next price is between price and price target\n        if (sqrtPriceTargetRaw <= sqrtPriceRaw) {\n            assertLe(sqrtQ, sqrtPriceRaw);\n            assertGe(sqrtQ, sqrtPriceTargetRaw);\n        } else {\n            assertGe(sqrtQ, sqrtPriceRaw);\n            assertLe(sqrtQ, sqrtPriceTargetRaw);\n        }\n    }\n\n    function test_computeSwapStep_swapOneForZero_exactInCapped() public {\n        vm.startSnapshotGas(\"SwapMath_oneForZero_exactInCapped\");\n        SwapMath.computeSwapStep(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_101_100, 2 ether, (1 ether) * -1, 600);\n        vm.stopSnapshotGas();\n    }\n\n    function test_computeSwapStep_swapZeroForOne_exactInCapped() public {\n        vm.startSnapshotGas(\"SwapMath_zeroForOne_exactInCapped\");\n        SwapMath.computeSwapStep(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_99_100, 2 ether, (1 ether) * -1, 600);\n        vm.stopSnapshotGas();\n    }\n\n    function test_computeSwapStep_swapOneForZero_exactOutCapped() public {\n        vm.startSnapshotGas(\"SwapMath_oneForZero_exactOutCapped\");\n        SwapMath.computeSwapStep(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_101_100, 2 ether, 1 ether, 600);\n        vm.stopSnapshotGas();\n    }\n\n    function test_computeSwapStep_swapZeroForOne_exactOutCapped() public {\n        vm.startSnapshotGas(\"SwapMath_zeroForOne_exactOutCapped\");\n        SwapMath.computeSwapStep(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_99_100, 2 ether, 1 ether, 600);\n        vm.stopSnapshotGas();\n    }\n\n    function test_computeSwapStep_swapOneForZero_exactInPartial() public {\n        vm.startSnapshotGas(\"SwapMath_oneForZero_exactInPartial\");\n        SwapMath.computeSwapStep(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_1010_100, 2 ether, 1_000 * -1, 600);\n        vm.stopSnapshotGas();\n    }\n\n    function test_computeSwapStep_swapZeroForOne_exactInPartial() public {\n        vm.startSnapshotGas(\"SwapMath_zeroForOne_exactInPartial\");\n        SwapMath.computeSwapStep(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_99_1000, 2 ether, 1_000 * -1, 600);\n        vm.stopSnapshotGas();\n    }\n\n    function test_computeSwapStep_swapOneForZero_exactOutPartial() public {\n        vm.startSnapshotGas(\"SwapMath_oneForZero_exactOutPartial\");\n        SwapMath.computeSwapStep(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_1010_100, 2 ether, 1_000, 600);\n        vm.stopSnapshotGas();\n    }\n\n    function test_computeSwapStep_swapZeroForOne_exactOutPartial() public {\n        vm.startSnapshotGas(\"SwapMath_zeroForOne_exactOutPartial\");\n        SwapMath.computeSwapStep(Constants.SQRT_PRICE_1_1, Constants.SQRT_PRICE_99_1000, 2 ether, 1_000, 600);\n        vm.stopSnapshotGas();\n    }\n}\n"
  },
  {
    "path": "test/libraries/TickBitmap.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {TickBitmap} from \"../../src/libraries/TickBitmap.sol\";\nimport {TickMath} from \"../../src/libraries/TickMath.sol\";\n\ncontract TickBitmapTest is Test {\n    using TickBitmap for mapping(int16 => uint256);\n\n    int24 constant INITIALIZED_TICK = 70;\n    int24 constant TICK_IN_UNINITIALZIED_WORD = 10000;\n    int24 constant SOLO_INITIALIZED_TICK_IN_WORD = -10000;\n\n    mapping(int16 => uint256) public bitmap;\n    mapping(int16 => uint256) internal emptyBitmap;\n\n    function setUp() public {\n        // set dirty slots beforehand for certain gas tests\n        int24[10] memory ticks = [SOLO_INITIALIZED_TICK_IN_WORD, -200, -55, -4, INITIALIZED_TICK, 78, 84, 139, 240, 535];\n        for (uint256 i; i < ticks.length - 1; i++) {\n            flipTick(ticks[i]);\n        }\n    }\n\n    function test_fuzz_compress(int24 tick, int24 tickSpacing) public pure {\n        tickSpacing = int24(bound(tickSpacing, 1, type(int24).max));\n        int24 compressed = tick / tickSpacing;\n        if (tick < 0 && tick % tickSpacing != 0) compressed--;\n        assertEq(TickBitmap.compress(tick, tickSpacing), compressed);\n    }\n\n    function test_fuzz_position(int24 tick) public pure {\n        (int16 wordPos, uint8 bitPos) = TickBitmap.position(tick);\n        assertEq(wordPos, tick >> 8);\n        assertEq(bitPos, uint8(int8(tick % 256)));\n    }\n\n    function test_isInitialized_isFalseAtFirst() public view {\n        assertEq(isInitialized(1), false);\n    }\n\n    function test_isInitialized_isFlippedByFlipTick() public {\n        flipTick(1);\n        assertEq(isInitialized(1), true);\n    }\n\n    function test_isInitialized_isFlippedBackByFlipTick() public {\n        flipTick(1);\n        flipTick(1);\n        assertEq(isInitialized(1), false);\n    }\n\n    function test_isInitialized_isNotChangedByAnotherFlipToADifferentTick() public {\n        flipTick(2);\n        assertEq(isInitialized(1), false);\n    }\n\n    function test_isInitialized_isNotChangedByAnotherFlipToADifferentTickOnAnotherWord() public {\n        flipTick(1 + 256);\n        assertEq(isInitialized(257), true);\n        assertEq(isInitialized(1), false);\n    }\n\n    function test_flipTick_flipsOnlyTheSpecifiedTick() public {\n        flipTick(-230);\n        assertEq(isInitialized(-230), true);\n        assertEq(isInitialized(-231), false);\n        assertEq(isInitialized(-229), false);\n        assertEq(isInitialized(-230 + 256), false);\n        assertEq(isInitialized(-230 - 256), false);\n\n        flipTick(-230);\n        assertEq(isInitialized(-230), false);\n        assertEq(isInitialized(-231), false);\n        assertEq(isInitialized(-229), false);\n        assertEq(isInitialized(-230 + 256), false);\n        assertEq(isInitialized(-230 - 256), false);\n\n        assertEq(isInitialized(1), false);\n    }\n\n    function test_flipTick_revertsOnlyItself() public {\n        flipTick(-230);\n        flipTick(-259);\n        flipTick(-229);\n        flipTick(500);\n        flipTick(-259);\n        flipTick(-229);\n        flipTick(-259);\n        assertEq(isInitialized(-259), true);\n        assertEq(isInitialized(-229), false);\n    }\n\n    function test_flipTick_flippingFirstTickInWordToInitialized_gas() public {\n        vm.startSnapshotGas(\"flipTick_flippingFirstTickInWordToInitialized\");\n        flipTick(TICK_IN_UNINITIALZIED_WORD);\n        vm.stopSnapshotGas();\n    }\n\n    function test_flipTick_flippingSecondTickInWordToInitialized_gas() public {\n        vm.startSnapshotGas(\"flipTick_flippingSecondTickInWordToInitialized\");\n        flipTick(INITIALIZED_TICK + 1);\n        vm.stopSnapshotGas();\n    }\n\n    function test_flipTick_flippingATickThatResultsInDeletingAWord_gas() public {\n        vm.startSnapshotGas(\"flipTick_flippingATickThatResultsInDeletingAWord\");\n        flipTick(SOLO_INITIALIZED_TICK_IN_WORD);\n        vm.stopSnapshotGas();\n    }\n\n    function test_fuzz_flipTick(int24 tick, int24 tickSpacing) public {\n        tickSpacing = int24(bound(tickSpacing, 1, type(int24).max));\n\n        if (tick % tickSpacing != 0) {\n            vm.expectRevert(abi.encodeWithSelector(TickBitmap.TickMisaligned.selector, tick, tickSpacing));\n            bitmap.flipTick(tick, tickSpacing);\n        } else {\n            bool initialized = isInitialized(tick, tickSpacing);\n            bitmap.flipTick(tick, tickSpacing);\n            assertEq(isInitialized(tick, tickSpacing), !initialized);\n            // flip again\n            bitmap.flipTick(tick, tickSpacing);\n            assertEq(isInitialized(tick, tickSpacing), initialized);\n        }\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_returnsTickToRightIfAtInitializedTick() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(78, 1, false);\n        assertEq(next, 84);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_returnsTickToRightIfAtInitializedTick2() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(-55, 1, false);\n\n        assertEq(next, -4);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_returnsTheTickDirectlyToTheRight() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(77, 1, false);\n        assertEq(next, 78);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_returnsTheTickDirectlyToTheRight2() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(-56, 1, false);\n        assertEq(next, -55);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_returnsTheNextWordsInitializedTickIfOnTheRightBoundary()\n        public\n        view\n    {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(255, 1, false);\n        assertEq(next, 511);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_returnsTheNextWordsInitializedTickIfOnTheRightBoundary2()\n        public\n        view\n    {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(-257, 1, false);\n        assertEq(next, -200);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_returnsTheNextInitializedTickFromTheNextWord() public {\n        flipTick(340);\n\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(328, 1, false);\n        assertEq(next, 340);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_doesNotExceedBoundary() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(508, 1, false);\n        assertEq(next, 511);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_skipsEntireWord() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(255, 1, false);\n        assertEq(next, 511);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_skipsHalfWord() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(383, 1, false);\n        assertEq(next, 511);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_onBoundary_gas() public {\n        vm.startSnapshotGas(\"nextInitializedTickWithinOneWord_lteFalse_onBoundary\");\n        bitmap.nextInitializedTickWithinOneWord(255, 1, false);\n        vm.stopSnapshotGas();\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_justBelowBoundary_gas() public {\n        vm.startSnapshotGas(\"nextInitializedTickWithinOneWord_lteFalse_justBelowBoundary\");\n        bitmap.nextInitializedTickWithinOneWord(254, 1, false);\n        vm.stopSnapshotGas();\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteFalse_forEntireWord_gas() public {\n        vm.startSnapshotGas(\"nextInitializedTickWithinOneWord_lteFalse_forEntireWord\");\n        bitmap.nextInitializedTickWithinOneWord(768, 1, false);\n        vm.stopSnapshotGas();\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_returnsSameTickIfInitialized() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(78, 1, true);\n        assertEq(next, 78);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_returnsTickDirectlyToTheLeftOfInputTickIfNotInitialized()\n        public\n        view\n    {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(79, 1, true);\n        assertEq(next, 78);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_willNotExceedTheWordBoundary() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(258, 1, true);\n        assertEq(next, 256);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_atTheWordBoundary() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(256, 1, true);\n        assertEq(next, 256);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_wordBoundaryLess1nextInitializedTickInNextWord()\n        public\n        view\n    {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(72, 1, true);\n        assertEq(next, 70);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_wordBoundary() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(-257, 1, true);\n        assertEq(next, -512);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_entireEmptyWord() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(1023, 1, true);\n        assertEq(next, 768);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_halfwayThroughEmptyWord() public view {\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(900, 1, true);\n        assertEq(next, 768);\n        assertEq(initialized, false);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_boundaryIsInitialized() public {\n        flipTick(329);\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(456, 1, true);\n        assertEq(next, 329);\n        assertEq(initialized, true);\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_onBoundary_gas() public {\n        vm.startSnapshotGas(\"nextInitializedTickWithinOneWord_lteTrue_onBoundary_gas\");\n        bitmap.nextInitializedTickWithinOneWord(256, 1, true);\n        vm.stopSnapshotGas();\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_justBelowBoundary_gas() public {\n        vm.startSnapshotGas(\"nextInitializedTickWithinOneWord_lteTrue_justBelowBoundary\");\n        bitmap.nextInitializedTickWithinOneWord(255, 1, true);\n        vm.stopSnapshotGas();\n    }\n\n    function test_nextInitializedTickWithinOneWord_lteTrue_forEntireWord_gas() public {\n        vm.startSnapshotGas(\"nextInitializedTickWithinOneWord_lteTrue_forEntireWord\");\n        bitmap.nextInitializedTickWithinOneWord(1024, 1, true);\n        vm.stopSnapshotGas();\n    }\n\n    function test_fuzz_nextInitializedTickWithinOneWord(int24 tick, bool lte) public view {\n        // assume tick is at least one word inside type(int24).(max | min)\n        vm.assume(lte ? tick >= -8388352 : tick < 8388351);\n\n        (int24 next, bool initialized) = bitmap.nextInitializedTickWithinOneWord(tick, 1, lte);\n\n        if (lte) {\n            assertLe(next, tick);\n            assertLe(tick - next, 256);\n            // all the ticks between the input tick and the next tick should be uninitialized\n            for (int24 i = tick; i > next; i--) {\n                assertTrue(!isInitialized(i));\n            }\n            assertEq(isInitialized(next), initialized);\n        } else {\n            assertGt(next, tick);\n            assertLe(next - tick, 256);\n            // all the ticks between the input tick and the next tick should be uninitialized\n            for (int24 i = tick + 1; i < next; i++) {\n                assertTrue(!isInitialized(i));\n            }\n            assertEq(isInitialized(next), initialized);\n        }\n    }\n\n    function test_fuzz_nextInitializedTickWithinOneWord_onEmptyBitmap(\n        int24 tick,\n        int24 tickSpacing,\n        uint8 nextBitPos,\n        bool lte\n    ) public {\n        tick = int24(bound(tick, TickMath.MIN_TICK, TickMath.MAX_TICK));\n        tickSpacing = int24(bound(tickSpacing, TickMath.MIN_TICK_SPACING, TickMath.MAX_TICK_SPACING));\n        int24 compressed = TickBitmap.compress(tick, tickSpacing);\n        if (!lte) ++compressed;\n        (int16 wordPos, uint8 bitPos) = TickBitmap.position(compressed);\n\n        if (lte) {\n            nextBitPos = uint8(bound(nextBitPos, 0, bitPos));\n        } else {\n            nextBitPos = uint8(bound(nextBitPos, bitPos, 255));\n        }\n        // Choose the next initialized tick within one word at random and flip it.\n        int24 nextInitializedTick = ((int24(wordPos) << 8) + int24(uint24(nextBitPos))) * tickSpacing;\n        emptyBitmap.flipTick(nextInitializedTick, tickSpacing);\n        (int24 next, bool initialized) = emptyBitmap.nextInitializedTickWithinOneWord(tick, tickSpacing, lte);\n        assertEq(initialized, true);\n        assertEq(next, nextInitializedTick);\n    }\n\n    function isInitialized(int24 tick, int24 tickSpacing) internal view returns (bool) {\n        unchecked {\n            if (tick % tickSpacing != 0) return false;\n            (int16 wordPos, uint8 bitPos) = TickBitmap.position(tick / tickSpacing);\n            return bitmap[wordPos] & (1 << bitPos) != 0;\n        }\n    }\n\n    function isInitialized(int24 tick) internal view returns (bool) {\n        return isInitialized(tick, 1);\n    }\n\n    function flipTick(int24 tick) internal {\n        bitmap.flipTick(tick, 1);\n    }\n}\n"
  },
  {
    "path": "test/libraries/TickMath.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {TickMathTest} from \"src/test/TickMathTest.sol\";\nimport {TickMath} from \"src/libraries/TickMath.sol\";\nimport {JavascriptFfi} from \"test/utils/JavascriptFfi.sol\";\n\ncontract TickMathTestTest is Test, JavascriptFfi {\n    int24 constant MIN_TICK = TickMath.MIN_TICK;\n    int24 constant MAX_TICK = TickMath.MAX_TICK;\n\n    uint160 constant MIN_SQRT_PRICE = TickMath.MIN_SQRT_PRICE;\n    uint160 constant MAX_SQRT_PRICE = TickMath.MAX_SQRT_PRICE;\n\n    uint256 constant ONE_PIP = 1e6;\n\n    uint160[] getSqrtPriceAtTickFuzzResults;\n    int24[] getTickAtSqrtPriceFuzzResults;\n\n    TickMathTest tickMath;\n\n    function setUp() public {\n        tickMath = new TickMathTest();\n        delete getSqrtPriceAtTickFuzzResults;\n        delete getTickAtSqrtPriceFuzzResults;\n    }\n\n    function test_MIN_TICK_equalsNegativeMAX_TICK() public view {\n        // this invariant is required in the Tick#tickSpacingToMaxLiquidityPerTick formula\n        int24 minTick = tickMath.MIN_TICK();\n        assertEq(minTick, tickMath.MAX_TICK() * -1);\n        assertEq(minTick, MIN_TICK);\n    }\n\n    function test_MAX_TICK_equalsNegativeMIN_TICK() public view {\n        // this invariant is required in the Tick#tickSpacingToMaxLiquidityPerTick formula\n        // this test is redundant with the above MIN_TICK test\n        int24 maxTick = tickMath.MAX_TICK();\n        assertEq(maxTick, tickMath.MIN_TICK() * -1);\n        assertEq(maxTick, MAX_TICK);\n    }\n\n    function test_getSqrtPriceAtTick_throwsForInt24Min() public {\n        int24 tick = type(int24).min;\n        vm.expectRevert(abi.encodeWithSelector(TickMath.InvalidTick.selector, tick));\n        tickMath.getSqrtPriceAtTick(tick);\n    }\n\n    function test_getSqrtPriceAtTick_throwsForTooLow() public {\n        int24 tick = MIN_TICK - 1;\n        vm.expectRevert(abi.encodeWithSelector(TickMath.InvalidTick.selector, tick));\n        tickMath.getSqrtPriceAtTick(tick);\n    }\n\n    function test_getSqrtPriceAtTick_throwsForTooHigh() public {\n        int24 tick = MAX_TICK + 1;\n        vm.expectRevert(abi.encodeWithSelector(TickMath.InvalidTick.selector, tick));\n        tickMath.getSqrtPriceAtTick(tick);\n    }\n\n    function test_fuzz_getSqrtPriceAtTick_throwsForTooLarge(int24 tick) public {\n        if (tick > 0) {\n            tick = int24(bound(tick, MAX_TICK + 1, type(int24).max));\n        } else {\n            tick = int24(bound(tick, type(int24).min, MIN_TICK - 1));\n        }\n        vm.expectRevert(abi.encodeWithSelector(TickMath.InvalidTick.selector, tick));\n        tickMath.getSqrtPriceAtTick(tick);\n    }\n\n    function test_getSqrtPriceAtTick_isValidMinTick() public view {\n        assertEq(tickMath.getSqrtPriceAtTick(MIN_TICK), tickMath.MIN_SQRT_PRICE());\n        assertEq(tickMath.getSqrtPriceAtTick(MIN_TICK), 4295128739);\n    }\n\n    function test_getSqrtPriceAtTick_isValidMinTickAddOne() public view {\n        assertEq(tickMath.getSqrtPriceAtTick(MIN_TICK + 1), 4295343490);\n    }\n\n    function test_getSqrtPriceAtTick_isValidMaxTick() public view {\n        assertEq(tickMath.getSqrtPriceAtTick(MAX_TICK), tickMath.MAX_SQRT_PRICE());\n        assertEq(tickMath.getSqrtPriceAtTick(MAX_TICK), 1461446703485210103287273052203988822378723970342);\n    }\n\n    function test_getSqrtPriceAtTick_isValidMaxTickSubOne() public view {\n        assertEq(tickMath.getSqrtPriceAtTick(MAX_TICK - 1), 1461373636630004318706518188784493106690254656249);\n    }\n\n    function test_getSqrtPriceAtTick_isLessThanJSImplMinTick() public view {\n        // sqrt(1 / 2 ** 127) * 2 ** 96\n        uint160 jsMinSqrtPrice = 6085630636;\n        uint160 solMinSqrtPrice = tickMath.getSqrtPriceAtTick(MIN_TICK);\n        assertLt(solMinSqrtPrice, jsMinSqrtPrice);\n    }\n\n    function test_getSqrtPriceAtTick_isGreaterThanJSImplMaxTick() public view {\n        // sqrt(2 ** 127) * 2 ** 96\n        uint160 jsMaxSqrtPrice = 1033437718471923706666374484006904511252097097914;\n        uint160 solMaxSqrtPrice = tickMath.getSqrtPriceAtTick(MAX_TICK);\n        assertGt(solMaxSqrtPrice, jsMaxSqrtPrice);\n    }\n\n    function test_getTickAtSqrtPrice_throwsForTooLow() public {\n        uint160 sqrtPriceX96 = MIN_SQRT_PRICE - 1;\n        vm.expectRevert(abi.encodeWithSelector(TickMath.InvalidSqrtPrice.selector, sqrtPriceX96));\n        tickMath.getTickAtSqrtPrice(sqrtPriceX96);\n    }\n\n    function test_getTickAtSqrtPrice_throwsForTooHigh() public {\n        uint160 sqrtPriceX96 = MAX_SQRT_PRICE;\n        vm.expectRevert(abi.encodeWithSelector(TickMath.InvalidSqrtPrice.selector, sqrtPriceX96));\n        tickMath.getTickAtSqrtPrice(sqrtPriceX96);\n    }\n\n    function test_fuzz_getTickAtSqrtPrice_throwsForInvalid(uint160 sqrtPriceX96, bool gte) public {\n        if (gte) {\n            sqrtPriceX96 = uint160(bound(sqrtPriceX96, MAX_SQRT_PRICE, type(uint160).max));\n        } else {\n            sqrtPriceX96 = uint160(bound(sqrtPriceX96, 0, MIN_SQRT_PRICE - 1));\n        }\n        vm.expectRevert(abi.encodeWithSelector(TickMath.InvalidSqrtPrice.selector, sqrtPriceX96));\n        tickMath.getTickAtSqrtPrice(sqrtPriceX96);\n    }\n\n    function test_getTickAtSqrtPrice_isValidMinSqrtPrice() public view {\n        assertEq(tickMath.getTickAtSqrtPrice(MIN_SQRT_PRICE), MIN_TICK);\n    }\n\n    function test_getTickAtSqrtPrice_isValidMinSqrtPricePlusOne() public view {\n        assertEq(tickMath.getTickAtSqrtPrice(4295343490), MIN_TICK + 1);\n    }\n\n    function test_getTickAtSqrtPrice_isValidPriceClosestToMaxTick() public view {\n        assertEq(tickMath.getTickAtSqrtPrice(MAX_SQRT_PRICE - 1), MAX_TICK - 1);\n    }\n\n    function test_getTickAtSqrtPrice_isValidMaxSqrtPriceMinusOne() public view {\n        assertEq(tickMath.getTickAtSqrtPrice(1461373636630004318706518188784493106690254656249), MAX_TICK - 1);\n    }\n\n    function test_getSqrtPriceAtTick_matchesJavaScriptImplByOneHundrethOfABip() public {\n        string memory jsParameters = \"\";\n\n        int24 tick = 50;\n\n        while (true) {\n            if (tick > MAX_TICK) break;\n            // test negative and positive tick\n            for (uint256 i = 0; i < 2; i++) {\n                tick = tick * -1;\n                if (tick != -50) jsParameters = string(abi.encodePacked(jsParameters, \",\")); // do not leave comma in front of first number\n                // add tick to javascript parameters to be calculated inside script\n                jsParameters = string(abi.encodePacked(jsParameters, vm.toString(int256(tick))));\n                // track solidity result for tick\n                getSqrtPriceAtTickFuzzResults.push(tickMath.getSqrtPriceAtTick(tick));\n            }\n            tick = tick * 2;\n        }\n\n        bytes memory jsResult = runScript(\"forge-test-getSqrtPriceAtTick\", jsParameters);\n        uint160[] memory jsSqrtPrices = abi.decode(jsResult, (uint160[]));\n\n        for (uint256 i = 0; i < jsSqrtPrices.length; i++) {\n            uint160 jsSqrtPrice = jsSqrtPrices[i];\n            uint160 solResult = getSqrtPriceAtTickFuzzResults[i];\n            (uint160 gtResult, uint160 ltResult) =\n                jsSqrtPrice > solResult ? (jsSqrtPrice, solResult) : (solResult, jsSqrtPrice);\n            uint160 resultsDiff = gtResult - ltResult;\n\n            // assert solc/js result is at most off by 1/100th of a bip (aka one pip)\n            assertEq(resultsDiff * ONE_PIP / jsSqrtPrice, 0);\n        }\n    }\n\n    function test_getTickAtSqrtPrice_matchesJavascriptImplWithin1() public {\n        string memory jsParameters = \"\";\n\n        uint160 sqrtPrice = MIN_SQRT_PRICE;\n        unchecked {\n            while (sqrtPrice < sqrtPrice * 16) {\n                if (sqrtPrice != MIN_SQRT_PRICE) jsParameters = string(abi.encodePacked(jsParameters, \",\")); // do not leave comma in front of first number\n                // add tick to javascript parameters to be calculated inside script\n                jsParameters = string(abi.encodePacked(jsParameters, vm.toString(sqrtPrice)));\n                // track solidity result for sqrtPrice\n                getTickAtSqrtPriceFuzzResults.push(tickMath.getTickAtSqrtPrice(sqrtPrice));\n                sqrtPrice = sqrtPrice * 16;\n            }\n        }\n\n        bytes memory jsResult = runScript(\"forge-test-getTickAtSqrtPrice\", jsParameters);\n        int24[] memory jsTicks = abi.decode(jsResult, (int24[]));\n\n        for (uint256 i = 0; i < jsTicks.length; i++) {\n            int24 jsTick = jsTicks[i];\n            int24 solTick = getTickAtSqrtPriceFuzzResults[i];\n\n            (int24 gtResult, int24 ltResult) = jsTick > solTick ? (jsTick, solTick) : (solTick, jsTick);\n            int24 resultsDiff = gtResult - ltResult;\n            assertLt(resultsDiff, 2);\n        }\n    }\n\n    function test_fuzz_getTickAtSqrtPrice_getSqrtPriceAtTick_relation(int24 tick) public pure {\n        tick = int24(bound(tick, TickMath.MIN_TICK, TickMath.MAX_TICK - 1));\n        int24 nextTick = tick + 1;\n        uint160 priceAtTick = TickMath.getSqrtPriceAtTick(tick);\n        uint160 priceAtNextTick = TickMath.getSqrtPriceAtTick(nextTick);\n\n        // check lowest price of tick\n        assertEq(TickMath.getTickAtSqrtPrice(priceAtTick), tick, \"lower price\");\n        // check mid price of tick\n        assertEq(\n            TickMath.getTickAtSqrtPrice(uint160((uint256(priceAtTick) + uint256(priceAtNextTick)) / 2)),\n            tick,\n            \"mid price\"\n        );\n        // check upper price of tick\n        assertEq(TickMath.getTickAtSqrtPrice(priceAtNextTick - 1), tick, \"upper price\");\n        // check lower price of next tick\n        assertEq(TickMath.getTickAtSqrtPrice(priceAtNextTick), nextTick, \"lower price next tick\");\n    }\n\n    /// @notice Benchmark the gas cost of `getSqrtPriceAtTick`\n    function test_getSqrtPriceAtTick_gasCost() public {\n        vm.startSnapshotGas(\"TickMathGetSqrtPriceAtTick\");\n        unchecked {\n            for (int24 tick = -50; tick < 50;) {\n                TickMath.getSqrtPriceAtTick(tick++);\n            }\n        }\n        vm.stopSnapshotGas();\n    }\n\n    /// @notice Benchmark the gas cost of `getTickAtSqrtPrice`\n    function test_getTickAtSqrtPrice_gasCost() public {\n        vm.startSnapshotGas(\"TickMathGetTickAtSqrtPrice\");\n        unchecked {\n            uint160 sqrtPriceX96 = 1 << 33;\n            for (uint256 i; i++ < 100; sqrtPriceX96 <<= 1) {\n                TickMath.getTickAtSqrtPrice(sqrtPriceX96);\n            }\n        }\n        vm.stopSnapshotGas();\n    }\n}\n"
  },
  {
    "path": "test/libraries/UnsafeMath.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {UnsafeMath} from \"../../src/libraries/UnsafeMath.sol\";\n\ncontract UnsafeMathTest is Test {\n    using UnsafeMath for uint256;\n\n    uint256 constant Q128 = 2 ** 128;\n    uint256 constant MAX_UINT256 = type(uint256).max;\n\n    function test_divRoundingUp_zeroDoesNotRevert(uint256 x) public pure {\n        x.divRoundingUp(0);\n    }\n\n    function test_divRoundingUp_maxInput() public pure {\n        assertEq(MAX_UINT256.divRoundingUp(MAX_UINT256), 1);\n    }\n\n    function test_divRoundingUp_RoundsUp() public pure {\n        uint256 result = Q128 / 3 + 1;\n        assertEq(Q128.divRoundingUp(3), result);\n    }\n\n    function test_fuzz_divRoundingUp(uint256 x, uint256 y) public pure {\n        vm.assume(y != 0);\n        uint256 result = x.divRoundingUp(y);\n        assertTrue(result == x / y || result == x / y + 1);\n    }\n\n    function test_invariant_divRoundingUp(uint256 x, uint256 y) public pure {\n        vm.assume(y != 0);\n        uint256 z = x.divRoundingUp(y);\n        uint256 diff = z - (x / y);\n        if (x % y == 0) {\n            assertEq(diff, 0);\n        } else {\n            assertEq(diff, 1);\n        }\n    }\n\n    function test_simpleMulDiv_zeroDoesNotRevert(uint256 a, uint256 b) public pure {\n        a.simpleMulDiv(b, 0);\n    }\n\n    function test_simpleMulDiv_succeeds() public pure {\n        assertEq(Q128.simpleMulDiv(3, 2), Q128 * 3 / 2);\n    }\n\n    function test_simpleMulDiv_noOverflow() public pure {\n        assertLe(uint256(int256(type(int128).max)) * Q128, type(uint256).max);\n    }\n\n    function test_fuzz_simpleMulDiv_succeeds(uint256 a, uint256 b, uint256 denominator) public pure {\n        vm.assume(denominator != 0);\n        uint256 result = a.simpleMulDiv(b, denominator);\n        unchecked {\n            assertTrue(result == a * b / denominator);\n        }\n    }\n\n    function test_fuzz_simpleMulDiv_bounded(uint256 a, uint256 denominator) public pure {\n        a = bound(a, 0, uint256(int256(type(int128).max)));\n        denominator = bound(denominator, 1, uint256(type(uint128).max));\n        uint256 result = a.simpleMulDiv(Q128, denominator);\n        assertTrue(result == a * Q128 / denominator);\n    }\n}\n"
  },
  {
    "path": "test/types/BalanceDelta.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {BalanceDelta, toBalanceDelta} from \"../../src/types/BalanceDelta.sol\";\n\ncontract TestBalanceDelta is Test {\n    function test_toBalanceDelta() public pure {\n        BalanceDelta balanceDelta = toBalanceDelta(0, 0);\n        assertEq(balanceDelta.amount0(), 0);\n        assertEq(balanceDelta.amount1(), 0);\n\n        balanceDelta = toBalanceDelta(0, 1);\n        assertEq(balanceDelta.amount0(), 0);\n        assertEq(balanceDelta.amount1(), 1);\n\n        balanceDelta = toBalanceDelta(1, 0);\n        assertEq(balanceDelta.amount0(), 1);\n        assertEq(balanceDelta.amount1(), 0);\n\n        balanceDelta = toBalanceDelta(type(int128).max, type(int128).max);\n        assertEq(balanceDelta.amount0(), type(int128).max);\n        assertEq(balanceDelta.amount1(), type(int128).max);\n\n        balanceDelta = toBalanceDelta(type(int128).min, type(int128).min);\n        assertEq(balanceDelta.amount0(), type(int128).min);\n        assertEq(balanceDelta.amount1(), type(int128).min);\n    }\n\n    function test_fuzz_toBalanceDelta(int128 x, int128 y) public pure {\n        BalanceDelta balanceDelta = toBalanceDelta(x, y);\n        int256 expectedBD = int256(uint256(bytes32(abi.encodePacked(x, y))));\n        assertEq(BalanceDelta.unwrap(balanceDelta), expectedBD);\n    }\n\n    function test_fuzz_amount0_amount1(int128 x, int128 y) public pure {\n        BalanceDelta balanceDelta = toBalanceDelta(x, y);\n        assertEq(balanceDelta.amount0(), x);\n        assertEq(balanceDelta.amount1(), y);\n    }\n\n    function test_add() public pure {\n        BalanceDelta balanceDelta = toBalanceDelta(0, 0) + toBalanceDelta(0, 0);\n        assertEq(balanceDelta.amount0(), 0);\n        assertEq(balanceDelta.amount1(), 0);\n\n        balanceDelta = toBalanceDelta(-1000, 1000) + toBalanceDelta(1000, -1000);\n        assertEq(balanceDelta.amount0(), 0);\n        assertEq(balanceDelta.amount1(), 0);\n\n        balanceDelta =\n            toBalanceDelta(type(int128).min, type(int128).max) + toBalanceDelta(type(int128).max, type(int128).min);\n        assertEq(balanceDelta.amount0(), -1);\n        assertEq(balanceDelta.amount1(), -1);\n\n        balanceDelta = toBalanceDelta(type(int128).max / 2 + 1, type(int128).max / 2 + 1)\n            + toBalanceDelta(type(int128).max / 2, type(int128).max / 2);\n        assertEq(balanceDelta.amount0(), type(int128).max);\n        assertEq(balanceDelta.amount1(), type(int128).max);\n    }\n\n    function test_add_revertsOnOverflow() public {\n        // should revert because type(int128).max + 1 is not possible\n        vm.expectRevert();\n        toBalanceDelta(type(int128).max, 0) + toBalanceDelta(1, 0);\n\n        vm.expectRevert();\n        toBalanceDelta(0, type(int128).max) + toBalanceDelta(0, 1);\n    }\n\n    function test_fuzz_add(int128 a, int128 b, int128 c, int128 d) public {\n        int256 ac = int256(a) + c;\n        int256 bd = int256(b) + d;\n\n        // if the addition overflows it should revert\n        if (ac != int128(ac) || bd != int128(bd)) {\n            vm.expectRevert();\n        }\n\n        BalanceDelta balanceDelta = toBalanceDelta(a, b) + toBalanceDelta(c, d);\n        assertEq(balanceDelta.amount0(), ac);\n        assertEq(balanceDelta.amount1(), bd);\n    }\n\n    function test_sub() public pure {\n        BalanceDelta balanceDelta = toBalanceDelta(0, 0) - toBalanceDelta(0, 0);\n        assertEq(balanceDelta.amount0(), 0);\n        assertEq(balanceDelta.amount1(), 0);\n\n        balanceDelta = toBalanceDelta(-1000, 1000) - toBalanceDelta(1000, -1000);\n        assertEq(balanceDelta.amount0(), -2000);\n        assertEq(balanceDelta.amount1(), 2000);\n\n        balanceDelta =\n            toBalanceDelta(-1000, -1000) - toBalanceDelta(-(type(int128).min + 1000), -(type(int128).min + 1000));\n        assertEq(balanceDelta.amount0(), type(int128).min);\n        assertEq(balanceDelta.amount1(), type(int128).min);\n\n        balanceDelta = toBalanceDelta(type(int128).min / 2, type(int128).min / 2)\n            - toBalanceDelta(-(type(int128).min / 2), -(type(int128).min / 2));\n        assertEq(balanceDelta.amount0(), type(int128).min);\n        assertEq(balanceDelta.amount1(), type(int128).min);\n    }\n\n    function test_sub_revertsOnUnderflow() public {\n        // should revert because type(int128).min - 1 is not possible\n        vm.expectRevert();\n        toBalanceDelta(type(int128).min, 0) - toBalanceDelta(1, 0);\n\n        vm.expectRevert();\n        toBalanceDelta(0, type(int128).min) - toBalanceDelta(0, 1);\n    }\n\n    function test_fuzz_sub(int128 a, int128 b, int128 c, int128 d) public {\n        int256 ac = int256(a) - c;\n        int256 bd = int256(b) - d;\n\n        // if the subtraction underflows it should revert\n        if (ac != int128(ac) || bd != int128(bd)) {\n            vm.expectRevert();\n        }\n\n        BalanceDelta balanceDelta = toBalanceDelta(a, b) - toBalanceDelta(c, d);\n        assertEq(balanceDelta.amount0(), ac);\n        assertEq(balanceDelta.amount1(), bd);\n    }\n\n    function test_fuzz_eq(int128 a, int128 b, int128 c, int128 d) public pure {\n        bool isEqual = (toBalanceDelta(a, b) == toBalanceDelta(c, d));\n        if (a == c && b == d) assertTrue(isEqual);\n        else assertFalse(isEqual);\n    }\n\n    function test_fuzz_neq(int128 a, int128 b, int128 c, int128 d) public pure {\n        bool isNotEqual = (toBalanceDelta(a, b) != toBalanceDelta(c, d));\n        if (a != c || b != d) assertTrue(isNotEqual);\n        else assertFalse(isNotEqual);\n    }\n}\n"
  },
  {
    "path": "test/types/Currency.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {stdError} from \"forge-std/StdError.sol\";\nimport {MockERC20, ERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {Currency, CurrencyLibrary} from \"../../src/types/Currency.sol\";\nimport {CurrencyTest} from \"../../src/test/CurrencyTest.sol\";\nimport {EmptyRevertContract} from \"../../src/test/EmptyRevertContract.sol\";\nimport {CustomRevert} from \"../../src/libraries/CustomRevert.sol\";\n\ncontract TestCurrency is Test {\n    uint256 constant initialERC20Balance = 1000 ether;\n    address otherAddress;\n\n    Currency nativeCurrency;\n    Currency erc20Currency;\n    CurrencyTest currencyTest;\n\n    function setUp() public {\n        otherAddress = makeAddr(\"otherAddress\");\n        currencyTest = new CurrencyTest();\n        vm.deal(address(currencyTest), 30 ether);\n        nativeCurrency = Currency.wrap(address(0));\n        MockERC20 token = new MockERC20(\"TestA\", \"A\", 18);\n        token.mint(address(currencyTest), initialERC20Balance);\n        erc20Currency = Currency.wrap(address(token));\n    }\n\n    function test_fuzz_equals(address a, address b) public pure {\n        assertEq(a == b, Currency.wrap(a) == Currency.wrap(b));\n    }\n\n    function test_fuzz_greaterThan(address a, address b) public pure {\n        assertEq(a > b, Currency.wrap(a) > Currency.wrap(b));\n    }\n\n    function test_fuzz_lessThan(address a, address b) public pure {\n        assertEq(a < b, Currency.wrap(a) < Currency.wrap(b));\n    }\n\n    function test_fuzz_greaterThanOrEqualTo(address a, address b) public pure {\n        assertEq(a >= b, Currency.wrap(a) >= Currency.wrap(b));\n    }\n\n    function test_fuzz_balanceOfSelf_native(uint256 amount) public {\n        uint256 balanceBefore = address(currencyTest).balance;\n        amount = bound(amount, 0, balanceBefore);\n        currencyTest.transfer(nativeCurrency, otherAddress, amount);\n        assertEq(balanceBefore - amount, address(currencyTest).balance);\n        assertEq(currencyTest.balanceOfSelf(nativeCurrency), address(currencyTest).balance);\n    }\n\n    function test_fuzz_balanceOfSelf_token(uint256 amount) public {\n        amount = bound(amount, 0, initialERC20Balance);\n        currencyTest.transfer(erc20Currency, otherAddress, amount);\n        assertEq(currencyTest.balanceOfSelf(erc20Currency), initialERC20Balance - amount);\n        assertEq(\n            currencyTest.balanceOfSelf(erc20Currency),\n            MockERC20(Currency.unwrap(erc20Currency)).balanceOf(address(currencyTest))\n        );\n    }\n\n    function test_fuzz_balanceOf_native(uint256 amount) public {\n        uint256 currencyBalanceBefore = address(currencyTest).balance;\n        amount = bound(amount, 0, address(currencyTest).balance);\n        currencyTest.transfer(nativeCurrency, otherAddress, amount);\n\n        assertEq(otherAddress.balance, amount);\n        assertEq(address(currencyTest).balance, currencyBalanceBefore - amount);\n        assertEq(otherAddress.balance, currencyTest.balanceOf(nativeCurrency, otherAddress));\n    }\n\n    function test_fuzz_balanceOf_token(uint256 amount) public {\n        amount = bound(amount, 0, initialERC20Balance);\n        currencyTest.transfer(erc20Currency, otherAddress, amount);\n        assertEq(currencyTest.balanceOf(erc20Currency, otherAddress), amount);\n        assertEq(currencyTest.balanceOfSelf(erc20Currency), initialERC20Balance - amount);\n        assertEq(\n            MockERC20(Currency.unwrap(erc20Currency)).balanceOf(otherAddress),\n            currencyTest.balanceOf(erc20Currency, otherAddress)\n        );\n    }\n\n    function test_isAddressZero_native_returnsTrue() public view {\n        assertEq(currencyTest.isAddressZero(nativeCurrency), true);\n    }\n\n    function test_isAddressZero_token_returnsFalse() public view {\n        assertEq(currencyTest.isAddressZero(erc20Currency), false);\n    }\n\n    function test_fuzz_isAddressZero(Currency currency) public view {\n        assertEq(currencyTest.isAddressZero(currency), (Currency.unwrap(currency) == address(0)));\n    }\n\n    function test_toId_nativeReturns0() public view {\n        assertEq(currencyTest.toId(nativeCurrency), uint256(0));\n    }\n\n    function test_fuzz_toId_returnsCurrencyAsUint256(Currency currency) public view {\n        assertEq(currencyTest.toId(currency), uint256(uint160(Currency.unwrap(currency))));\n    }\n\n    function test_fromId_0ReturnsNative() public view {\n        assertEq(Currency.unwrap(currencyTest.fromId(0)), Currency.unwrap(nativeCurrency));\n    }\n\n    function test_fuzz_fromId_returnsUint256AsCurrency(uint256 id) public view {\n        uint160 expectedCurrency = uint160(uint256(type(uint160).max) & id);\n        assertEq(Currency.unwrap(currencyTest.fromId(id)), address(expectedCurrency));\n    }\n\n    function test_fuzz_fromId_toId_opposites(Currency currency) public view {\n        assertEq(Currency.unwrap(currency), Currency.unwrap(currencyTest.fromId(currencyTest.toId(currency))));\n    }\n\n    function test_fuzz_toId_fromId_opposites(uint256 id) public view {\n        assertEq(id & 0x00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, currencyTest.toId(currencyTest.fromId(id)));\n    }\n\n    function test_transfer_noReturnData() public {\n        // This contract reverts with no data\n        EmptyRevertContract emptyRevertingToken = new EmptyRevertContract();\n        // the token reverts with no data, so our custom error will be emitted instead\n        vm.expectRevert(\n            abi.encodeWithSelector(\n                CustomRevert.WrappedError.selector,\n                address(emptyRevertingToken),\n                ERC20.transfer.selector,\n                \"\",\n                abi.encodeWithSelector(CurrencyLibrary.ERC20TransferFailed.selector)\n            )\n        );\n        currencyTest.transfer(Currency.wrap(address(emptyRevertingToken)), otherAddress, 100);\n    }\n\n    function test_fuzz_transfer_native(uint256 amount) public {\n        uint256 balanceBefore = otherAddress.balance;\n        uint256 contractBalanceBefore = address(currencyTest).balance;\n\n        if (amount <= contractBalanceBefore) {\n            currencyTest.transfer(nativeCurrency, otherAddress, amount);\n            assertEq(otherAddress.balance, balanceBefore + amount);\n            assertEq(address(currencyTest).balance, contractBalanceBefore - amount);\n        } else {\n            vm.expectRevert(\n                abi.encodeWithSelector(\n                    CustomRevert.WrappedError.selector,\n                    otherAddress,\n                    bytes4(0),\n                    new bytes(0),\n                    abi.encodeWithSelector(CurrencyLibrary.NativeTransferFailed.selector)\n                )\n            );\n            currencyTest.transfer(nativeCurrency, otherAddress, amount);\n            assertEq(otherAddress.balance, balanceBefore);\n        }\n    }\n\n    function test_fuzz_transfer_token(uint256 amount) public {\n        uint256 balanceBefore = currencyTest.balanceOf(erc20Currency, otherAddress);\n\n        if (amount <= initialERC20Balance) {\n            currencyTest.transfer(erc20Currency, otherAddress, amount);\n            assertEq(currencyTest.balanceOf(erc20Currency, otherAddress), balanceBefore + amount);\n            assertEq(\n                MockERC20(Currency.unwrap(erc20Currency)).balanceOf(address(currencyTest)), initialERC20Balance - amount\n            );\n        } else {\n            // the token reverts with an overflow error message, so this is bubbled up\n            vm.expectRevert(\n                abi.encodeWithSelector(\n                    CustomRevert.WrappedError.selector,\n                    Currency.unwrap(erc20Currency),\n                    ERC20.transfer.selector,\n                    stdError.arithmeticError,\n                    abi.encodeWithSelector(CurrencyLibrary.ERC20TransferFailed.selector)\n                )\n            );\n            currencyTest.transfer(erc20Currency, otherAddress, amount);\n            assertEq(currencyTest.balanceOf(erc20Currency, otherAddress), balanceBefore);\n        }\n    }\n}\n"
  },
  {
    "path": "test/types/Slot0.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Slot0, Slot0Library} from \"../../src/types/Slot0.sol\";\n\ncontract TestSlot0 is Test {\n    function test_slot0_constants_masks() public pure {\n        assertEq(Slot0Library.MASK_160_BITS, type(uint160).max);\n        assertEq(Slot0Library.MASK_24_BITS, type(uint24).max);\n    }\n\n    function test_fuzz_slot0_pack_unpack(uint160 sqrtPriceX96, int24 tick, uint24 protocolFee, uint24 lpFee)\n        public\n        pure\n    {\n        // pack starting from \"lowest\" field\n        Slot0 _slot0 = Slot0.wrap(bytes32(0)).setSqrtPriceX96(sqrtPriceX96).setTick(tick).setProtocolFee(protocolFee)\n            .setLpFee(lpFee);\n\n        assertEq(_slot0.sqrtPriceX96(), sqrtPriceX96);\n        assertEq(_slot0.tick(), tick);\n        assertEq(_slot0.protocolFee(), protocolFee);\n        assertEq(_slot0.lpFee(), lpFee);\n\n        // pack starting from \"highest\" field\n        _slot0 = Slot0.wrap(bytes32(0)).setLpFee(lpFee).setProtocolFee(protocolFee).setTick(tick).setSqrtPriceX96(\n            sqrtPriceX96\n        );\n\n        assertEq(_slot0.sqrtPriceX96(), sqrtPriceX96);\n        assertEq(_slot0.tick(), tick);\n        assertEq(_slot0.protocolFee(), protocolFee);\n        assertEq(_slot0.lpFee(), lpFee);\n    }\n}\n"
  },
  {
    "path": "test/utils/AmountHelpers.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {LiquidityAmounts} from \"./LiquidityAmounts.sol\";\nimport {IPoolManager} from \"../../src/interfaces/IPoolManager.sol\";\nimport {ModifyLiquidityParams} from \"../../src/types/PoolOperation.sol\";\nimport {PoolId} from \"../../src/types/PoolId.sol\";\nimport {TickMath} from \"../../src/libraries/TickMath.sol\";\nimport {PoolKey} from \"../../src/types/PoolKey.sol\";\nimport {StateLibrary} from \"../../src/libraries/StateLibrary.sol\";\n\n/// @title Calculate token<>liquidity\n/// @notice Helps calculate amounts for bounding fuzz tests\nlibrary AmountHelpers {\n    function getMaxAmountInForPool(IPoolManager manager, ModifyLiquidityParams memory params, PoolKey memory key)\n        public\n        view\n        returns (uint256 amount0, uint256 amount1)\n    {\n        PoolId id = key.toId();\n        uint128 liquidity = StateLibrary.getLiquidity(manager, id);\n        (uint160 sqrtPriceX96,,,) = StateLibrary.getSlot0(manager, id);\n\n        uint160 sqrtPriceX96Lower = TickMath.getSqrtPriceAtTick(params.tickLower);\n        uint160 sqrtPriceX96Upper = TickMath.getSqrtPriceAtTick(params.tickUpper);\n\n        amount0 = LiquidityAmounts.getAmount0ForLiquidity(sqrtPriceX96Lower, sqrtPriceX96, liquidity);\n        amount1 = LiquidityAmounts.getAmount1ForLiquidity(sqrtPriceX96Upper, sqrtPriceX96, liquidity);\n    }\n}\n"
  },
  {
    "path": "test/utils/Constants.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nlibrary Constants {\n    /// @dev All sqrtPrice calculations are calculated as\n    /// sqrtPriceX96 = floor(sqrt(A / B) * 2 ** 96) where A and B are the currency reserves\n    uint160 public constant SQRT_PRICE_1_1 = 79228162514264337593543950336;\n    uint160 public constant SQRT_PRICE_1_2 = 56022770974786139918731938227;\n    uint160 public constant SQRT_PRICE_1_4 = 39614081257132168796771975168;\n    uint160 public constant SQRT_PRICE_2_1 = 112045541949572279837463876454;\n    uint160 public constant SQRT_PRICE_4_1 = 158456325028528675187087900672;\n    uint160 public constant SQRT_PRICE_121_100 = 87150978765690771352898345369;\n    uint160 public constant SQRT_PRICE_99_100 = 78831026366734652303669917531;\n    uint160 public constant SQRT_PRICE_99_1000 = 24928559360766947368818086097;\n    uint160 public constant SQRT_PRICE_101_100 = 79623317895830914510639640423;\n    uint160 public constant SQRT_PRICE_1000_100 = 250541448375047931186413801569;\n    uint160 public constant SQRT_PRICE_1010_100 = 251791039410471229173201122529;\n    uint160 public constant SQRT_PRICE_10000_100 = 792281625142643375935439503360;\n\n    uint256 constant MAX_UINT256 = type(uint256).max;\n    uint128 constant MAX_UINT128 = type(uint128).max;\n    uint160 constant MAX_UINT160 = type(uint160).max;\n\n    address constant ADDRESS_ZERO = address(0);\n\n    /// 0011 1111 1111 1111\n    address payable constant ALL_HOOKS = payable(0x0000000000000000000000000000000000003fFF);\n\n    uint256 constant TICKS_OFFSET = 4;\n\n    uint24 constant FEE_LOW = 500;\n    uint24 constant FEE_MEDIUM = 3000;\n    uint24 constant FEE_HIGH = 10000;\n\n    bytes constant ZERO_BYTES = new bytes(0);\n}\n"
  },
  {
    "path": "test/utils/CurrencySettler.sol",
    "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Currency} from \"../../src/types/Currency.sol\";\nimport {IERC20Minimal} from \"../../src/interfaces/external/IERC20Minimal.sol\";\nimport {IPoolManager} from \"../../src/interfaces/IPoolManager.sol\";\n\n/// @notice Library used to interact with PoolManager.sol to settle any open deltas.\n/// To settle a positive delta (a credit to the user), a user may take or mint.\n/// To settle a negative delta (a debt on the user), a user make transfer or burn to pay off a debt.\n/// @dev Note that sync() is called before any erc-20 transfer in `settle`.\nlibrary CurrencySettler {\n    /// @notice Settle (pay) a currency to the PoolManager\n    /// @param currency Currency to settle\n    /// @param manager IPoolManager to settle to\n    /// @param payer Address of the payer, the token sender\n    /// @param amount Amount to send\n    /// @param burn If true, burn the ERC-6909 token, otherwise ERC20-transfer to the PoolManager\n    function settle(Currency currency, IPoolManager manager, address payer, uint256 amount, bool burn) internal {\n        // for native currencies or burns, calling sync is not required\n        // short circuit for ERC-6909 burns to support ERC-6909-wrapped native tokens\n        if (burn) {\n            manager.burn(payer, currency.toId(), amount);\n        } else if (currency.isAddressZero()) {\n            manager.settle{value: amount}();\n        } else {\n            manager.sync(currency);\n            if (payer != address(this)) {\n                IERC20Minimal(Currency.unwrap(currency)).transferFrom(payer, address(manager), amount);\n            } else {\n                IERC20Minimal(Currency.unwrap(currency)).transfer(address(manager), amount);\n            }\n            manager.settle();\n        }\n    }\n\n    /// @notice Take (receive) a currency from the PoolManager\n    /// @param currency Currency to take\n    /// @param manager IPoolManager to take from\n    /// @param recipient Address of the recipient, the token receiver\n    /// @param amount Amount to receive\n    /// @param claims If true, mint the ERC-6909 token, otherwise ERC20-transfer from the PoolManager to recipient\n    function take(Currency currency, IPoolManager manager, address recipient, uint256 amount, bool claims) internal {\n        claims ? manager.mint(recipient, currency.toId(), amount) : manager.take(currency, recipient, amount);\n    }\n}\n"
  },
  {
    "path": "test/utils/Deployers.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport \"forge-std/Test.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {Hooks} from \"../../src/libraries/Hooks.sol\";\nimport {Currency, CurrencyLibrary} from \"../../src/types/Currency.sol\";\nimport {IHooks} from \"../../src/interfaces/IHooks.sol\";\nimport {IPoolManager} from \"../../src/interfaces/IPoolManager.sol\";\nimport {PoolManager} from \"../../src/PoolManager.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"../../src/types/PoolOperation.sol\";\nimport {PoolId} from \"../../src/types/PoolId.sol\";\nimport {LPFeeLibrary} from \"../../src/libraries/LPFeeLibrary.sol\";\nimport {PoolKey} from \"../../src/types/PoolKey.sol\";\nimport {BalanceDelta} from \"../../src/types/BalanceDelta.sol\";\nimport {TickMath} from \"../../src/libraries/TickMath.sol\";\nimport {Constants} from \"../utils/Constants.sol\";\nimport {SortTokens} from \"./SortTokens.sol\";\nimport {PoolModifyLiquidityTest} from \"../../src/test/PoolModifyLiquidityTest.sol\";\nimport {PoolModifyLiquidityTestNoChecks} from \"../../src/test/PoolModifyLiquidityTestNoChecks.sol\";\nimport {PoolSwapTest} from \"../../src/test/PoolSwapTest.sol\";\nimport {SwapRouterNoChecks} from \"../../src/test/SwapRouterNoChecks.sol\";\nimport {PoolDonateTest} from \"../../src/test/PoolDonateTest.sol\";\nimport {PoolNestedActionsTest} from \"../../src/test/PoolNestedActionsTest.sol\";\nimport {PoolTakeTest} from \"../../src/test/PoolTakeTest.sol\";\nimport {PoolClaimsTest} from \"../../src/test/PoolClaimsTest.sol\";\nimport {ActionsRouter} from \"../../src/test/ActionsRouter.sol\";\nimport {LiquidityAmounts} from \"../../test/utils/LiquidityAmounts.sol\";\nimport {StateLibrary} from \"../../src/libraries/StateLibrary.sol\";\n\ncontract Deployers is Test {\n    using LPFeeLibrary for uint24;\n    using StateLibrary for IPoolManager;\n\n    // Helpful test constants\n    bytes constant ZERO_BYTES = Constants.ZERO_BYTES;\n    uint160 constant SQRT_PRICE_1_1 = Constants.SQRT_PRICE_1_1;\n    uint160 constant SQRT_PRICE_1_2 = Constants.SQRT_PRICE_1_2;\n    uint160 constant SQRT_PRICE_2_1 = Constants.SQRT_PRICE_2_1;\n    uint160 constant SQRT_PRICE_1_4 = Constants.SQRT_PRICE_1_4;\n    uint160 constant SQRT_PRICE_4_1 = Constants.SQRT_PRICE_4_1;\n\n    uint160 public constant MIN_PRICE_LIMIT = TickMath.MIN_SQRT_PRICE + 1;\n    uint160 public constant MAX_PRICE_LIMIT = TickMath.MAX_SQRT_PRICE - 1;\n\n    ModifyLiquidityParams public LIQUIDITY_PARAMS =\n        ModifyLiquidityParams({tickLower: -120, tickUpper: 120, liquidityDelta: 1e18, salt: 0});\n    ModifyLiquidityParams public REMOVE_LIQUIDITY_PARAMS =\n        ModifyLiquidityParams({tickLower: -120, tickUpper: 120, liquidityDelta: -1e18, salt: 0});\n    SwapParams public SWAP_PARAMS =\n        SwapParams({zeroForOne: true, amountSpecified: -100, sqrtPriceLimitX96: SQRT_PRICE_1_2});\n\n    // Global variables\n    Currency internal currency0;\n    Currency internal currency1;\n    IPoolManager manager;\n    PoolModifyLiquidityTest modifyLiquidityRouter;\n    PoolModifyLiquidityTestNoChecks modifyLiquidityNoChecks;\n    SwapRouterNoChecks swapRouterNoChecks;\n    PoolSwapTest swapRouter;\n    PoolDonateTest donateRouter;\n    PoolTakeTest takeRouter;\n    ActionsRouter actionsRouter;\n\n    PoolClaimsTest claimsRouter;\n    PoolNestedActionsTest nestedActionRouter;\n    address feeController;\n\n    PoolKey key;\n    PoolKey nativeKey;\n    PoolKey uninitializedKey;\n    PoolKey uninitializedNativeKey;\n\n    // Update this value when you add a new hook flag.\n    uint160 hookPermissionCount = 14;\n    uint160 clearAllHookPermissionsMask = ~uint160(0) << (hookPermissionCount);\n\n    modifier noIsolate() {\n        if (msg.sender != address(this)) {\n            (bool success,) = address(this).call(msg.data);\n            require(success);\n        } else {\n            _;\n        }\n    }\n\n    function deployFreshManager() internal virtual {\n        manager = new PoolManager(address(this));\n    }\n\n    function deployFreshManagerAndRouters() internal {\n        deployFreshManager();\n        swapRouter = new PoolSwapTest(manager);\n        swapRouterNoChecks = new SwapRouterNoChecks(manager);\n        modifyLiquidityRouter = new PoolModifyLiquidityTest(manager);\n        modifyLiquidityNoChecks = new PoolModifyLiquidityTestNoChecks(manager);\n        donateRouter = new PoolDonateTest(manager);\n        takeRouter = new PoolTakeTest(manager);\n        claimsRouter = new PoolClaimsTest(manager);\n        nestedActionRouter = new PoolNestedActionsTest(manager);\n        feeController = makeAddr(\"feeController\");\n        actionsRouter = new ActionsRouter(manager);\n\n        manager.setProtocolFeeController(feeController);\n    }\n\n    // You must have first initialised the routers with deployFreshManagerAndRouters\n    // If you only need the currencies (and not approvals) call deployAndMint2Currencies\n    function deployMintAndApprove2Currencies() internal returns (Currency, Currency) {\n        Currency _currencyA = deployMintAndApproveCurrency();\n        Currency _currencyB = deployMintAndApproveCurrency();\n\n        (currency0, currency1) =\n            SortTokens.sort(MockERC20(Currency.unwrap(_currencyA)), MockERC20(Currency.unwrap(_currencyB)));\n        return (currency0, currency1);\n    }\n\n    function deployMintAndApproveCurrency() internal returns (Currency currency) {\n        MockERC20 token = deployTokens(1, 2 ** 255)[0];\n\n        address[9] memory toApprove = [\n            address(swapRouter),\n            address(swapRouterNoChecks),\n            address(modifyLiquidityRouter),\n            address(modifyLiquidityNoChecks),\n            address(donateRouter),\n            address(takeRouter),\n            address(claimsRouter),\n            address(nestedActionRouter.executor()),\n            address(actionsRouter)\n        ];\n\n        for (uint256 i = 0; i < toApprove.length; i++) {\n            token.approve(toApprove[i], Constants.MAX_UINT256);\n        }\n\n        return Currency.wrap(address(token));\n    }\n\n    function deployAndMint2Currencies() internal returns (Currency, Currency) {\n        MockERC20[] memory tokens = deployTokens(2, 2 ** 255);\n        return SortTokens.sort(tokens[0], tokens[1]);\n    }\n\n    function deployTokens(uint8 count, uint256 totalSupply) internal returns (MockERC20[] memory tokens) {\n        tokens = new MockERC20[](count);\n        for (uint8 i = 0; i < count; i++) {\n            tokens[i] = new MockERC20(\"TEST\", \"TEST\", 18);\n            tokens[i].mint(address(this), totalSupply);\n        }\n    }\n\n    function initPool(Currency _currency0, Currency _currency1, IHooks hooks, uint24 fee, uint160 sqrtPriceX96)\n        internal\n        returns (PoolKey memory _key, PoolId id)\n    {\n        _key = PoolKey(_currency0, _currency1, fee, fee.isDynamicFee() ? int24(60) : int24(fee / 100 * 2), hooks);\n        id = _key.toId();\n        manager.initialize(_key, sqrtPriceX96);\n    }\n\n    function initPool(\n        Currency _currency0,\n        Currency _currency1,\n        IHooks hooks,\n        uint24 fee,\n        int24 tickSpacing,\n        uint160 sqrtPriceX96\n    ) internal returns (PoolKey memory _key, PoolId id) {\n        _key = PoolKey(_currency0, _currency1, fee, tickSpacing, hooks);\n        id = _key.toId();\n        manager.initialize(_key, sqrtPriceX96);\n    }\n\n    function initPoolAndAddLiquidity(\n        Currency _currency0,\n        Currency _currency1,\n        IHooks hooks,\n        uint24 fee,\n        uint160 sqrtPriceX96\n    ) internal returns (PoolKey memory _key, PoolId id) {\n        (_key, id) = initPool(_currency0, _currency1, hooks, fee, sqrtPriceX96);\n        modifyLiquidityRouter.modifyLiquidity{value: msg.value}(_key, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    function initPoolAndAddLiquidityETH(\n        Currency _currency0,\n        Currency _currency1,\n        IHooks hooks,\n        uint24 fee,\n        uint160 sqrtPriceX96,\n        uint256 msgValue\n    ) internal returns (PoolKey memory _key, PoolId id) {\n        (_key, id) = initPool(_currency0, _currency1, hooks, fee, sqrtPriceX96);\n        modifyLiquidityRouter.modifyLiquidity{value: msgValue}(_key, LIQUIDITY_PARAMS, ZERO_BYTES);\n    }\n\n    // Deploys the manager, all test routers, and sets up 2 pools: with and without native\n    function initializeManagerRoutersAndPoolsWithLiq(IHooks hooks) internal {\n        deployFreshManagerAndRouters();\n        // sets the global currencies and key\n        deployMintAndApprove2Currencies();\n        (key,) = initPoolAndAddLiquidity(currency0, currency1, hooks, 3000, SQRT_PRICE_1_1);\n        nestedActionRouter.executor().setKey(key);\n        (nativeKey,) =\n            initPoolAndAddLiquidityETH(CurrencyLibrary.ADDRESS_ZERO, currency1, hooks, 3000, SQRT_PRICE_1_1, 1 ether);\n        uninitializedKey = key;\n        uninitializedNativeKey = nativeKey;\n        uninitializedKey.fee = 100;\n        uninitializedNativeKey.fee = 100;\n    }\n\n    /// @notice Helper function for a simple ERC20 swaps that allows for unlimited price impact\n    function swap(PoolKey memory _key, bool zeroForOne, int256 amountSpecified, bytes memory hookData)\n        internal\n        returns (BalanceDelta)\n    {\n        // allow native input for exact-input, guide users to the `swapNativeInput` function\n        bool isNativeInput = zeroForOne && _key.currency0.isAddressZero();\n        if (isNativeInput) require(0 > amountSpecified, \"Use swapNativeInput() for native-token exact-output swaps\");\n\n        uint256 value = isNativeInput ? uint256(-amountSpecified) : 0;\n\n        return swapRouter.swap{value: value}(\n            _key,\n            SwapParams({\n                zeroForOne: zeroForOne,\n                amountSpecified: amountSpecified,\n                sqrtPriceLimitX96: zeroForOne ? MIN_PRICE_LIMIT : MAX_PRICE_LIMIT\n            }),\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false}),\n            hookData\n        );\n    }\n\n    /// @notice Helper function to increase balance of pool manager.\n    /// Uses default LIQUIDITY_PARAMS range.\n    function seedMoreLiquidity(PoolKey memory _key, uint256 amount0, uint256 amount1) internal {\n        (uint160 sqrtPriceX96,,,) = manager.getSlot0(_key.toId());\n        uint128 liquidityDelta = LiquidityAmounts.getLiquidityForAmounts(\n            sqrtPriceX96,\n            TickMath.getSqrtPriceAtTick(LIQUIDITY_PARAMS.tickLower),\n            TickMath.getSqrtPriceAtTick(LIQUIDITY_PARAMS.tickUpper),\n            amount0,\n            amount1\n        );\n\n        ModifyLiquidityParams memory params = ModifyLiquidityParams({\n            tickLower: LIQUIDITY_PARAMS.tickLower,\n            tickUpper: LIQUIDITY_PARAMS.tickUpper,\n            liquidityDelta: int128(liquidityDelta),\n            salt: 0\n        });\n\n        modifyLiquidityRouter.modifyLiquidity(_key, params, ZERO_BYTES);\n    }\n\n    /// @notice Helper function for a simple Native-token swap that allows for unlimited price impact\n    function swapNativeInput(\n        PoolKey memory _key,\n        bool zeroForOne,\n        int256 amountSpecified,\n        bytes memory hookData,\n        uint256 msgValue\n    ) internal returns (BalanceDelta) {\n        require(_key.currency0.isAddressZero(), \"currency0 is not native. Use swap() instead\");\n        if (zeroForOne == false) require(msgValue == 0, \"msgValue must be 0 for oneForZero swaps\");\n\n        return swapRouter.swap{value: msgValue}(\n            _key,\n            SwapParams({\n                zeroForOne: zeroForOne,\n                amountSpecified: amountSpecified,\n                sqrtPriceLimitX96: zeroForOne ? MIN_PRICE_LIMIT : MAX_PRICE_LIMIT\n            }),\n            PoolSwapTest.TestSettings({takeClaims: false, settleUsingBurn: false}),\n            hookData\n        );\n    }\n\n    // to receive refunds of spare eth from test helpers\n    receive() external payable {}\n}\n"
  },
  {
    "path": "test/utils/JavascriptFfi.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {CommonBase} from \"forge-std/Base.sol\";\n\nabstract contract JavascriptFfi is CommonBase {\n    function runScript(string memory scriptName, string memory args) internal returns (bytes memory result) {\n        string[] memory inputs = new string[](8);\n\n        // build ffi command string\n        inputs[0] = \"npm\";\n        inputs[1] = \"--silent\";\n        inputs[2] = \"--prefix\";\n        inputs[3] = \"./test/js-scripts\";\n        inputs[4] = \"run\";\n        inputs[5] = scriptName;\n        inputs[6] = \"--\";\n        inputs[7] = args;\n        result = vm.ffi(inputs);\n    }\n}\n"
  },
  {
    "path": "test/utils/LiquidityAmounts.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport \"../../src/libraries/FullMath.sol\";\nimport \"../../src/libraries/FixedPoint96.sol\";\n\n/// @title Liquidity amount functions\n/// @notice Provides functions for computing liquidity amounts from token amounts and prices\nlibrary LiquidityAmounts {\n    /// @notice Downcasts uint256 to uint128\n    /// @param x The uint258 to be downcasted\n    /// @return y The passed value, downcasted to uint128\n    function toUint128(uint256 x) private pure returns (uint128 y) {\n        require((y = uint128(x)) == x, \"liquidity overflow\");\n    }\n\n    /// @notice Computes the amount of liquidity received for a given amount of token0 and price range\n    /// @dev Calculates amount0 * (sqrt(upper) * sqrt(lower)) / (sqrt(upper) - sqrt(lower))\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount0 The amount0 being sent in\n    /// @return liquidity The amount of returned liquidity\n    function getLiquidityForAmount0(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint256 amount0)\n        internal\n        pure\n        returns (uint128 liquidity)\n    {\n        if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n        uint256 intermediate = FullMath.mulDiv(sqrtPriceAX96, sqrtPriceBX96, FixedPoint96.Q96);\n        return toUint128(FullMath.mulDiv(amount0, intermediate, sqrtPriceBX96 - sqrtPriceAX96));\n    }\n\n    /// @notice Computes the amount of liquidity received for a given amount of token1 and price range\n    /// @dev Calculates amount1 / (sqrt(upper) - sqrt(lower)).\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount1 The amount1 being sent in\n    /// @return liquidity The amount of returned liquidity\n    function getLiquidityForAmount1(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint256 amount1)\n        internal\n        pure\n        returns (uint128 liquidity)\n    {\n        if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n        return toUint128(FullMath.mulDiv(amount1, FixedPoint96.Q96, sqrtPriceBX96 - sqrtPriceAX96));\n    }\n\n    /// @notice Computes the maximum amount of liquidity received for a given amount of token0, token1, the current\n    /// pool prices and the prices at the tick boundaries\n    /// @param sqrtPriceX96 A sqrt price representing the current pool prices\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param amount0 The amount of token0 being sent in\n    /// @param amount1 The amount of token1 being sent in\n    /// @return liquidity The maximum amount of liquidity received\n    function getLiquidityForAmounts(\n        uint160 sqrtPriceX96,\n        uint160 sqrtPriceAX96,\n        uint160 sqrtPriceBX96,\n        uint256 amount0,\n        uint256 amount1\n    ) internal pure returns (uint128 liquidity) {\n        if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n\n        if (sqrtPriceX96 <= sqrtPriceAX96) {\n            liquidity = getLiquidityForAmount0(sqrtPriceAX96, sqrtPriceBX96, amount0);\n        } else if (sqrtPriceX96 < sqrtPriceBX96) {\n            uint128 liquidity0 = getLiquidityForAmount0(sqrtPriceX96, sqrtPriceBX96, amount0);\n            uint128 liquidity1 = getLiquidityForAmount1(sqrtPriceAX96, sqrtPriceX96, amount1);\n\n            liquidity = liquidity0 < liquidity1 ? liquidity0 : liquidity1;\n        } else {\n            liquidity = getLiquidityForAmount1(sqrtPriceAX96, sqrtPriceBX96, amount1);\n        }\n    }\n\n    /// @notice Computes the amount of token0 for a given amount of liquidity and a price range\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param liquidity The liquidity being valued\n    /// @return amount0 The amount of token0\n    function getAmount0ForLiquidity(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity)\n        internal\n        pure\n        returns (uint256 amount0)\n    {\n        if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n\n        return FullMath.mulDiv(\n            uint256(liquidity) << FixedPoint96.RESOLUTION, sqrtPriceBX96 - sqrtPriceAX96, sqrtPriceBX96\n        ) / sqrtPriceAX96;\n    }\n\n    /// @notice Computes the amount of token1 for a given amount of liquidity and a price range\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param liquidity The liquidity being valued\n    /// @return amount1 The amount of token1\n    function getAmount1ForLiquidity(uint160 sqrtPriceAX96, uint160 sqrtPriceBX96, uint128 liquidity)\n        internal\n        pure\n        returns (uint256 amount1)\n    {\n        if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n\n        return FullMath.mulDiv(liquidity, sqrtPriceBX96 - sqrtPriceAX96, FixedPoint96.Q96);\n    }\n\n    /// @notice Computes the token0 and token1 value for a given amount of liquidity, the current\n    /// pool prices and the prices at the tick boundaries\n    /// @param sqrtPriceX96 A sqrt price representing the current pool prices\n    /// @param sqrtPriceAX96 A sqrt price representing the first tick boundary\n    /// @param sqrtPriceBX96 A sqrt price representing the second tick boundary\n    /// @param liquidity The liquidity being valued\n    /// @return amount0 The amount of token0\n    /// @return amount1 The amount of token1\n    function getAmountsForLiquidity(\n        uint160 sqrtPriceX96,\n        uint160 sqrtPriceAX96,\n        uint160 sqrtPriceBX96,\n        uint128 liquidity\n    ) internal pure returns (uint256 amount0, uint256 amount1) {\n        if (sqrtPriceAX96 > sqrtPriceBX96) (sqrtPriceAX96, sqrtPriceBX96) = (sqrtPriceBX96, sqrtPriceAX96);\n\n        if (sqrtPriceX96 <= sqrtPriceAX96) {\n            amount0 = getAmount0ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity);\n        } else if (sqrtPriceX96 < sqrtPriceBX96) {\n            amount0 = getAmount0ForLiquidity(sqrtPriceX96, sqrtPriceBX96, liquidity);\n            amount1 = getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceX96, liquidity);\n        } else {\n            amount1 = getAmount1ForLiquidity(sqrtPriceAX96, sqrtPriceBX96, liquidity);\n        }\n    }\n}\n"
  },
  {
    "path": "test/utils/Logger.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {ModifyLiquidityParams} from \"../../src/types/PoolOperation.sol\";\n\nimport \"forge-std/console2.sol\";\n\n// Useful for printing out the true values in a fuzz. For failing fuzzes, foundry logs the unsanitized params.\ncontract Logger {\n    function logParams(ModifyLiquidityParams memory params) public pure {\n        console2.log(\"ModifyLiquidity.tickLower\", params.tickLower);\n        console2.log(\"ModifyLiquidity.tickUpper\", params.tickUpper);\n        console2.log(\"ModifyLiquidity.liquidityDelta\", params.liquidityDelta);\n        console2.log(\"ModifyLiquidity.salt\");\n        console2.logBytes32(params.salt);\n    }\n}\n"
  },
  {
    "path": "test/utils/NestedActions.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Deployers} from \"test/utils/Deployers.sol\";\nimport {Action} from \"src/test/PoolNestedActionsTest.sol\";\nimport {IHooks} from \"src/interfaces/IHooks.sol\";\n\ncontract NestedActions is Test, Deployers {\n    Action[] actions;\n\n    function setUp() public {\n        initializeManagerRoutersAndPoolsWithLiq(IHooks(address(0)));\n    }\n\n    // Asserts and expected outcomes are tested inside the nestedActionRouter\n\n    function test_nestedSwap() public {\n        actions = [Action.SWAP_AND_SETTLE];\n        nestedActionRouter.unlock(abi.encode(actions));\n    }\n\n    function test_nestedAddLiquidity() public {\n        actions = [Action.ADD_LIQUIDITY_AND_SETTLE];\n        nestedActionRouter.unlock(abi.encode(actions));\n    }\n\n    function test_nestedRemoveLiquidity() public {\n        actions = [Action.ADD_LIQUIDITY_AND_SETTLE, Action.REMOVE_LIQUIDITY_AND_SETTLE];\n        nestedActionRouter.unlock(abi.encode(actions));\n    }\n\n    function test_nestedDonate() public {\n        actions = [Action.DONATE_AND_SETTLE];\n        nestedActionRouter.unlock(abi.encode(actions));\n    }\n\n    function test_nestedInitialize() public {\n        actions = [Action.INITIALIZE];\n        nestedActionRouter.unlock(abi.encode(actions));\n    }\n}\n"
  },
  {
    "path": "test/utils/SortTokens.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {Currency} from \"../../src/types/Currency.sol\";\n\nlibrary SortTokens {\n    function sort(MockERC20 tokenA, MockERC20 tokenB)\n        internal\n        pure\n        returns (Currency _currency0, Currency _currency1)\n    {\n        if (address(tokenA) < address(tokenB)) {\n            (_currency0, _currency1) = (Currency.wrap(address(tokenA)), Currency.wrap(address(tokenB)));\n        } else {\n            (_currency0, _currency1) = (Currency.wrap(address(tokenB)), Currency.wrap(address(tokenA)));\n        }\n    }\n}\n"
  },
  {
    "path": "test/utils/SwapHelper.t.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.20;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Vm} from \"forge-std/Vm.sol\";\nimport {Hooks} from \"../../src/libraries/Hooks.sol\";\nimport {MockHooks} from \"../../src/test/MockHooks.sol\";\nimport {IPoolManager} from \"../../src/interfaces/IPoolManager.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {IHooks} from \"../../src/interfaces/IHooks.sol\";\nimport {Currency} from \"../../src/types/Currency.sol\";\nimport {PoolManager} from \"../../src/PoolManager.sol\";\nimport {PoolSwapTest} from \"../../src/test/PoolSwapTest.sol\";\nimport {PoolDonateTest} from \"../../src/test/PoolDonateTest.sol\";\nimport {Deployers} from \"./Deployers.sol\";\nimport {ProtocolFees} from \"../../src/ProtocolFees.sol\";\nimport {PoolId} from \"../../src/types/PoolId.sol\";\nimport {PoolKey} from \"../../src/types/PoolKey.sol\";\nimport {IERC20Minimal} from \"../../src/interfaces/external/IERC20Minimal.sol\";\nimport {BalanceDelta} from \"../../src/types/BalanceDelta.sol\";\nimport {Constants} from \"../utils/Constants.sol\";\n\n/// @notice Testing Deployers.swap() and Deployers.swapNativeInput()\ncontract SwapHelperTest is Test, Deployers {\n    using Hooks for IHooks;\n\n    MockHooks mockHooks;\n\n    function setUp() public {\n        MockHooks impl = new MockHooks();\n        vm.etch(Constants.ALL_HOOKS, address(impl).code);\n        mockHooks = MockHooks(Constants.ALL_HOOKS);\n\n        initializeManagerRoutersAndPoolsWithLiq(mockHooks);\n    }\n\n    // --- Deployers.swap() tests --- //\n    function test_swap_helper_zeroForOne_exactInput() public {\n        int256 amountSpecified = -100;\n        BalanceDelta result = swap(key, true, amountSpecified, ZERO_BYTES);\n        assertEq(result.amount0(), amountSpecified);\n    }\n\n    function test_swap_helper_zeroForOne_exactOutput() public {\n        int256 amountSpecified = 100;\n        BalanceDelta result = swap(key, true, amountSpecified, ZERO_BYTES);\n        assertEq(result.amount1(), amountSpecified);\n    }\n\n    function test_swap_helper_oneForZero_exactInput() public {\n        int256 amountSpecified = -100;\n        BalanceDelta result = swap(key, false, amountSpecified, ZERO_BYTES);\n        assertEq(result.amount1(), amountSpecified);\n    }\n\n    function test_swap_helper_oneForZero_exactOutput() public {\n        int256 amountSpecified = 100;\n        BalanceDelta result = swap(key, false, amountSpecified, ZERO_BYTES);\n        assertEq(result.amount0(), amountSpecified);\n    }\n\n    function test_swap_helper_native_zeroForOne_exactInput() public {\n        int256 amountSpecified = -100;\n        BalanceDelta result = swap(nativeKey, true, amountSpecified, ZERO_BYTES);\n        assertEq(result.amount0(), amountSpecified);\n    }\n\n    function test_swap_helper_native_zeroForOne_exactOutput() public {\n        int256 amountSpecified = 100;\n        vm.expectRevert();\n        swap(nativeKey, true, amountSpecified, ZERO_BYTES);\n    }\n\n    function test_swap_helper_native_oneForZero_exactInput() public {\n        int256 amountSpecified = -100;\n        BalanceDelta result = swap(nativeKey, false, amountSpecified, ZERO_BYTES);\n        assertEq(result.amount1(), amountSpecified);\n    }\n\n    function test_swap_helper_native_oneForZero_exactOutput() public {\n        int256 amountSpecified = 100;\n        BalanceDelta result = swap(nativeKey, false, amountSpecified, ZERO_BYTES);\n        assertEq(result.amount0(), amountSpecified);\n    }\n\n    // --- Deployers.swapNativeInput() tests --- //\n    function test_swapNativeInput_helper_zeroForOne_exactInput() public {\n        int256 amountSpecified = -100;\n        BalanceDelta result = swapNativeInput(nativeKey, true, amountSpecified, ZERO_BYTES, 100 wei);\n        assertEq(result.amount0(), amountSpecified);\n    }\n\n    function test_swapNativeInput_helper_zeroForOne_exactOutput() public {\n        int256 amountSpecified = 100;\n        BalanceDelta result = swapNativeInput(nativeKey, true, amountSpecified, ZERO_BYTES, 200 wei); // overpay\n        assertEq(result.amount1(), amountSpecified);\n    }\n\n    function test_swapNativeInput_helper_oneForZero_exactInput() public {\n        int256 amountSpecified = -100;\n        BalanceDelta result = swapNativeInput(nativeKey, false, amountSpecified, ZERO_BYTES, 0 wei);\n        assertEq(result.amount1(), amountSpecified);\n    }\n\n    function test_swapNativeInput_helper_oneForZero_exactOutput() public {\n        int256 amountSpecified = 100;\n        BalanceDelta result = swapNativeInput(nativeKey, false, amountSpecified, ZERO_BYTES, 0 wei);\n        assertEq(result.amount0(), amountSpecified);\n    }\n\n    function test_swapNativeInput_helper_nonnative_zeroForOne_exactInput() public {\n        int256 amountSpecified = -100;\n        vm.expectRevert();\n        swapNativeInput(key, true, amountSpecified, ZERO_BYTES, 0 wei);\n    }\n\n    function test_swapNativeInput_helper_nonnative_zeroForOne_exactOutput() public {\n        int256 amountSpecified = 100;\n        vm.expectRevert();\n        swapNativeInput(key, true, amountSpecified, ZERO_BYTES, 0 wei);\n    }\n\n    function test_swapNativeInput_helper_nonnative_oneForZero_exactInput() public {\n        int256 amountSpecified = -100;\n        vm.expectRevert();\n        swapNativeInput(key, false, amountSpecified, ZERO_BYTES, 0 wei);\n    }\n\n    function test_swapNativeInput_helper_nonnative_oneForZero_exactOutput() public {\n        int256 amountSpecified = 100;\n        vm.expectRevert();\n        swapNativeInput(key, false, amountSpecified, ZERO_BYTES, 0 wei);\n    }\n}\n"
  },
  {
    "path": "test/utils/V3Helper.sol",
    "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.24;\n\nimport \"forge-std/Test.sol\";\n\ninterface IUniswapV3Factory {\n    function createPool(address tokenA, address tokenB, uint24 fee) external returns (address pool);\n    function enableFeeAmount(uint24 fee, int24 tickSpacing) external;\n}\n\ninterface IUniswapV3Pool {\n    function initialize(uint160 sqrtPriceX96) external;\n    function mint(address recipient, int24 tickLower, int24 tickUpper, uint128 amount, bytes calldata data)\n        external\n        returns (uint256 amount0, uint256 amount1);\n    function burn(int24 tickLower, int24 tickUpper, uint128 amount)\n        external\n        returns (uint256 amount0, uint256 amount1);\n    function swap(\n        address recipient,\n        bool zeroForOne,\n        int256 amountSpecified,\n        uint160 sqrtPriceLimitX96,\n        bytes calldata data\n    ) external returns (int256 amount0, int256 amount1);\n}\n\ninterface IUniswapV3MintCallback {\n    function uniswapV3MintCallback(uint256 amount0Owed, uint256 amount1Owed, bytes calldata data) external;\n}\n\ninterface IUniswapV3SwapCallback {\n    function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external;\n}\n\nabstract contract V3Helper is Test {\n    IUniswapV3Factory v3Factory;\n\n    function setUp() public virtual {\n        address deployedAddr;\n        bytes memory bytecode = vm.readFileBinary(\"test/bin/v3Factory.bytecode\");\n        assembly {\n            deployedAddr := create(0, add(bytecode, 0x20), mload(bytecode))\n        }\n        v3Factory = IUniswapV3Factory(deployedAddr);\n    }\n}\n"
  }
]